summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInnocent De Marchi <tangram.peces@gmail.com>2016-08-01 10:08:23 -0700
committerInnocent De Marchi <tangram.peces@gmail.com>2016-08-01 10:08:23 -0700
commitbef835256fde4a3d3a8cc05436e6862bfc2686bc (patch)
treef6ba148cf5d32f21a4e92e3e28be9c71a6051de9
Import gentoo_0.20.7.orig.tar.gz
[dgit import orig gentoo_0.20.7.orig.tar.gz]
-rw-r--r--ABOUT-NLS1379
-rw-r--r--AUTHORS2
-rw-r--r--BUGS92
-rw-r--r--CONFIG-CHANGES151
-rw-r--r--COPYING339
-rw-r--r--CREDITS54
-rw-r--r--ChangeLog20
-rw-r--r--INSTALL182
-rw-r--r--Makefile.am29
-rw-r--r--Makefile.in900
-rw-r--r--NEWS384
-rw-r--r--README96
-rw-r--r--README.NLS37
-rw-r--r--README.gtkrc68
-rw-r--r--TODO78
-rw-r--r--aclocal.m41684
-rwxr-xr-xcompile347
-rw-r--r--config.guess1535
-rw-r--r--config.h.in124
-rwxr-xr-xconfig.rpath684
-rw-r--r--config.sub1644
-rwxr-xr-xconfigure9688
-rw-r--r--configure.ac129
-rw-r--r--depcomp423
-rw-r--r--docs/FAQ86
-rw-r--r--docs/acks.html77
-rw-r--r--docs/buttons.html89
-rw-r--r--docs/columns.html64
-rw-r--r--docs/commands.html557
-rw-r--r--docs/config/cfg_dirpane.html171
-rw-r--r--docs/config/cfg_gui.html130
-rw-r--r--docs/config/cfg_styles.html236
-rw-r--r--docs/config/cfg_types.html186
-rw-r--r--docs/config/gentoorc.html104
-rw-r--r--docs/config/index.html91
-rw-r--r--docs/config/template.html63
-rw-r--r--docs/contribute.html100
-rw-r--r--docs/dirpanes.html204
-rw-r--r--docs/gentoo.1x525
-rw-r--r--docs/gentoo.css129
-rw-r--r--docs/gpl.html406
-rw-r--r--docs/history.html83
-rw-r--r--docs/images/bullet.gifbin0 -> 222 bytes
-rw-r--r--docs/images/cfg_dirpane.gifbin0 -> 13106 bytes
-rw-r--r--docs/images/cfg_gui.gifbin0 -> 12699 bytes
-rw-r--r--docs/images/cfg_styles.gifbin0 -> 7096 bytes
-rw-r--r--docs/images/cfg_styles2.gifbin0 -> 7514 bytes
-rw-r--r--docs/images/cfg_styles3.gifbin0 -> 9140 bytes
-rw-r--r--docs/images/cfg_types.gifbin0 -> 7303 bytes
-rw-r--r--docs/images/cfg_types2.gifbin0 -> 7163 bytes
-rw-r--r--docs/images/cmd_chmod.gifbin0 -> 5507 bytes
-rw-r--r--docs/images/cmd_dialog.gifbin0 -> 2384 bytes
-rw-r--r--docs/images/cmd_inp1.gifbin0 -> 2286 bytes
-rw-r--r--docs/images/cmd_inp2.gifbin0 -> 2488 bytes
-rw-r--r--docs/images/cmd_inp3.gifbin0 -> 2520 bytes
-rw-r--r--docs/images/cmd_inp4.gifbin0 -> 2317 bytes
-rw-r--r--docs/images/cmd_inp5.gifbin0 -> 2721 bytes
-rw-r--r--docs/images/cmd_selectre.gifbin0 -> 4026 bytes
-rw-r--r--docs/images/colsel.jpegbin0 -> 20470 bytes
-rw-r--r--docs/images/columnedit.gifbin0 -> 4076 bytes
-rw-r--r--docs/images/gentoo_logo.gifbin0 -> 3100 bytes
-rw-r--r--docs/images/gentoo_logo_g.gifbin0 -> 914 bytes
-rw-r--r--docs/images/gentoo_logo_g_small.gifbin0 -> 277 bytes
-rw-r--r--docs/images/gentoo_logo_small.gifbin0 -> 420 bytes
-rw-r--r--docs/images/gentoo_logo_text.gifbin0 -> 1309 bytes
-rw-r--r--docs/images/iconsel.gifbin0 -> 8760 bytes
-rw-r--r--docs/images/layout.gifbin0 -> 24832 bytes
-rw-r--r--docs/images/od__logo_small.gifbin0 -> 2883 bytes
-rw-r--r--docs/images/popupmenu.gifbin0 -> 1641 bytes
-rw-r--r--docs/images/popupmenu2.gifbin0 -> 1395 bytes
-rw-r--r--docs/images/status_error.gifbin0 -> 6586 bytes
-rw-r--r--docs/images/style_tree.gifbin0 -> 1830 bytes
-rw-r--r--docs/images/stylesel.gifbin0 -> 3637 bytes
-rw-r--r--docs/images/tone.gifbin0 -> 929 bytes
-rw-r--r--docs/images/tone2.gifbin0 -> 446 bytes
-rw-r--r--docs/images/tone3.gifbin0 -> 961 bytes
-rw-r--r--docs/index.btbin0 -> 8192 bytes
-rw-r--r--docs/index.html76
-rw-r--r--docs/intro.html109
-rw-r--r--docs/layout.html73
-rw-r--r--docs/menus.html109
-rw-r--r--docs/menus.txt41
-rw-r--r--docs/misc.html221
-rw-r--r--docs/quick.html110
-rw-r--r--docs/scratch/README4
-rw-r--r--docs/scratch/command_args.txt342
-rw-r--r--docs/scratch/command_howto.txt163
-rw-r--r--docs/scratch/command_options.txt124
-rw-r--r--docs/scratch/commands.txt232
-rw-r--r--docs/scratch/dirhistory.txt148
-rw-r--r--docs/scratch/filestyles.txt183
-rw-r--r--docs/scratch/filetypes.txt136
-rw-r--r--docs/scratch/focusing.txt80
-rw-r--r--docs/scratch/mount.txt103
-rw-r--r--docs/scratch/outline.txt144
-rw-r--r--docs/scratch/renamere.txt176
-rw-r--r--docs/scratch/search_howto.txt110
-rw-r--r--docs/scratch/symlinks.txt125
-rw-r--r--docs/status.html137
-rw-r--r--docs/styles.html219
-rw-r--r--docs/template.html103
-rw-r--r--docs/template_toc.html71
-rw-r--r--docs/types.html267
-rw-r--r--docs/usage.html78
-rw-r--r--gentoo.spec52
-rw-r--r--gentoo.spec.in52
-rw-r--r--gentoogtkrc.in22
-rw-r--r--gentoorc.in3072
-rw-r--r--icons/AbiWord.xpm41
-rw-r--r--icons/Amiga.xpm47
-rw-r--r--icons/Animation.xpm37
-rw-r--r--icons/Apple.xpm88
-rw-r--r--icons/BSD.xpm48
-rw-r--r--icons/Bad.xpm20
-rw-r--r--icons/Battery.xpm66
-rw-r--r--icons/CDROM.xpm125
-rw-r--r--icons/COPYING339
-rw-r--r--icons/Card.xpm39
-rw-r--r--icons/Database.xpm38
-rw-r--r--icons/Directory.xpm30
-rw-r--r--icons/Directory2.xpm50
-rw-r--r--icons/Document.xpm28
-rw-r--r--icons/EggTimer.xpm43
-rw-r--r--icons/ExcelCalcXLS.xpm54
-rw-r--r--icons/Executable.xpm27
-rw-r--r--icons/FIFO.xpm35
-rw-r--r--icons/Floppy.xpm38
-rw-r--r--icons/Font.xpm66
-rw-r--r--icons/GNUstep.xpm46
-rw-r--r--icons/Ghost.xpm27
-rw-r--r--icons/GnomeCalc.xpm109
-rw-r--r--icons/GnomeWord.xpm93
-rw-r--r--icons/Harddrive.xpm86
-rw-r--r--icons/Image.xpm67
-rw-r--r--icons/Internet.xpm135
-rw-r--r--icons/KDECalc.xpm46
-rw-r--r--icons/KDEWord.xpm44
-rw-r--r--icons/Kernel.xpm70
-rw-r--r--icons/Keymap.xpm85
-rw-r--r--icons/Lego.xpm85
-rw-r--r--icons/License.xpm40
-rw-r--r--icons/Linux.xpm54
-rw-r--r--icons/MSWordDoc.xpm30
-rw-r--r--icons/Makefile622
-rw-r--r--icons/Makefile.am128
-rw-r--r--icons/Makefile.in622
-rw-r--r--icons/Makefile.xpm34
-rw-r--r--icons/Maya.xpm76
-rw-r--r--icons/Mixer.xpm28
-rw-r--r--icons/Mouse.xpm20
-rw-r--r--icons/Mouse2.xpm44
-rw-r--r--icons/NetAmiga.xpm40
-rw-r--r--icons/NetApple.xpm93
-rw-r--r--icons/NetHD.xpm94
-rw-r--r--icons/NetSGI.xpm30
-rw-r--r--icons/NetSun.xpm35
-rw-r--r--icons/NetWindows.xpm60
-rw-r--r--icons/Package.xpm83
-rw-r--r--icons/Package2.xpm90
-rw-r--r--icons/Port.xpm29
-rw-r--r--icons/Port2.xpm32
-rw-r--r--icons/PowerButton.xpm39
-rw-r--r--icons/Printer.xpm50
-rw-r--r--icons/README50
-rw-r--r--icons/Readme.xpm32
-rw-r--r--icons/SCSI.xpm34
-rw-r--r--icons/SoundCard.xpm55
-rw-r--r--icons/Source.xpm30
-rw-r--r--icons/Speaker.xpm70
-rw-r--r--icons/Speaker2.xpm72
-rw-r--r--icons/Spreadsheet.xpm31
-rw-r--r--icons/Tape.xpm31
-rw-r--r--icons/VRML.xpm47
-rw-r--r--icons/Windows.xpm52
-rw-r--r--icons/aiff.xpm48
-rw-r--r--icons/au.xpm45
-rw-r--r--icons/avi.xpm55
-rw-r--r--icons/bmp.xpm29
-rw-r--r--icons/bmp2.xpm73
-rw-r--r--icons/c.xpm43
-rw-r--r--icons/class.xpm96
-rw-r--r--icons/conf.xpm84
-rw-r--r--icons/core.xpm26
-rw-r--r--icons/cpp.xpm45
-rw-r--r--icons/deb.xpm70
-rw-r--r--icons/eps.xpm43
-rw-r--r--icons/exe.xpm52
-rw-r--r--icons/gentoo.pngbin0 -> 4369 bytes
-rw-r--r--icons/gif.xpm30
-rw-r--r--icons/gif2.xpm71
-rw-r--r--icons/h.xpm38
-rw-r--r--icons/html.xpm56
-rw-r--r--icons/html2.xpm34
-rw-r--r--icons/iff.xpm28
-rw-r--r--icons/iff2.xpm66
-rw-r--r--icons/java.xpm100
-rw-r--r--icons/jpeg.xpm31
-rw-r--r--icons/jpeg2.xpm71
-rw-r--r--icons/log.xpm88
-rw-r--r--icons/m.xpm34
-rw-r--r--icons/man.xpm68
-rw-r--r--icons/midi.xpm33
-rw-r--r--icons/mod.xpm74
-rw-r--r--icons/mov.xpm60
-rw-r--r--icons/mov2.xpm62
-rw-r--r--icons/mp3.xpm33
-rw-r--r--icons/mpeg.xpm57
-rw-r--r--icons/o.xpm37
-rw-r--r--icons/pcx.xpm30
-rw-r--r--icons/pcx2.xpm68
-rw-r--r--icons/pdb.xpm56
-rw-r--r--icons/pdf.xpm32
-rw-r--r--icons/pl.xpm47
-rw-r--r--icons/png.xpm30
-rw-r--r--icons/png2.xpm70
-rw-r--r--icons/prc.xpm55
-rw-r--r--icons/ps.xpm29
-rw-r--r--icons/py.xpm98
-rw-r--r--icons/r.xpm37
-rw-r--r--icons/ra.xpm43
-rw-r--r--icons/rom.xpm28
-rw-r--r--icons/rpm.xpm32
-rw-r--r--icons/sh.xpm36
-rw-r--r--icons/sid.xpm38
-rw-r--r--icons/so.xpm49
-rw-r--r--icons/targa.xpm31
-rw-r--r--icons/targa2.xpm73
-rw-r--r--icons/tex.xpm29
-rw-r--r--icons/tiff.xpm28
-rw-r--r--icons/tiff2.xpm68
-rw-r--r--icons/txt.xpm29
-rw-r--r--icons/wav.xpm43
-rw-r--r--icons/xbm.xpm27
-rw-r--r--icons/xbm2.xpm70
-rw-r--r--icons/xcf.xpm101
-rw-r--r--icons/xpm.xpm31
-rw-r--r--icons/xpm2.xpm72
-rw-r--r--install-sh251
-rw-r--r--m4/Makefile.am1
-rw-r--r--m4/Makefile.in439
-rw-r--r--m4/codeset.m421
-rw-r--r--m4/gettext.m4405
-rw-r--r--m4/glibc2.m430
-rw-r--r--m4/glibc21.m430
-rw-r--r--m4/iconv.m4271
-rw-r--r--m4/intdiv0.m484
-rw-r--r--m4/intl.m4284
-rw-r--r--m4/intldir.m419
-rw-r--r--m4/intlmacosx.m451
-rw-r--r--m4/intmax.m433
-rw-r--r--m4/inttypes-pri.m436
-rw-r--r--m4/inttypes.m427
-rw-r--r--m4/inttypes_h.m426
-rw-r--r--m4/isc-posix.m426
-rw-r--r--m4/lcmessage.m430
-rw-r--r--m4/lib-ld.m4119
-rw-r--r--m4/lib-link.m4777
-rw-r--r--m4/lib-prefix.m4224
-rw-r--r--m4/lock.m4316
-rw-r--r--m4/longdouble.m431
-rw-r--r--m4/longlong.m4109
-rw-r--r--m4/nls.m432
-rw-r--r--m4/po.m4453
-rw-r--r--m4/printf-posix.m444
-rw-r--r--m4/progtest.m491
-rw-r--r--m4/size_max.m468
-rw-r--r--m4/stdint_h.m426
-rw-r--r--m4/uintmax_t.m430
-rw-r--r--m4/ulonglong.m448
-rw-r--r--m4/visibility.m452
-rw-r--r--m4/wchar_t.m420
-rw-r--r--m4/wint_t.m428
-rw-r--r--m4/xsize.m413
-rwxr-xr-xmissing215
-rw-r--r--po/ChangeLog9
-rw-r--r--po/LINGUAS2
-rw-r--r--po/Makefile.in.in483
-rw-r--r--po/Makevars41
-rw-r--r--po/POTFILES.in64
-rw-r--r--po/Rules-quot58
-rw-r--r--po/boldquot.sed10
-rw-r--r--po/ca.gmobin0 -> 44603 bytes
-rw-r--r--po/ca.po2955
-rw-r--r--po/de.gmobin0 -> 27300 bytes
-rw-r--r--po/de.po3029
-rw-r--r--po/en@boldquot.header25
-rw-r--r--po/en@quot.header22
-rw-r--r--po/es.gmobin0 -> 45215 bytes
-rw-r--r--po/es.po2958
-rw-r--r--po/es_MX.gmobin0 -> 30055 bytes
-rw-r--r--po/es_MX.po2983
-rw-r--r--po/fr.gmobin0 -> 25912 bytes
-rw-r--r--po/fr.po3014
-rw-r--r--po/gentoo.pot2557
-rw-r--r--po/insert-header.sin23
-rw-r--r--po/it.gmobin0 -> 31111 bytes
-rw-r--r--po/it.po3044
-rw-r--r--po/ja_JP.UTF-8.gmobin0 -> 13005 bytes
-rw-r--r--po/ja_JP.UTF-8.po2731
-rw-r--r--po/pl.gmobin0 -> 31755 bytes
-rw-r--r--po/pl.po3048
-rw-r--r--po/quot.sed6
-rw-r--r--po/remove-potcdate.sin19
-rw-r--r--po/ru_RU.CP1251.gmobin0 -> 37267 bytes
-rw-r--r--po/ru_RU.CP1251.po3005
-rw-r--r--po/ru_RU.KOI8-R.gmobin0 -> 37267 bytes
-rw-r--r--po/ru_RU.KOI8-R.po3005
-rw-r--r--po/ru_RU.UTF-8.gmobin0 -> 37266 bytes
-rw-r--r--po/ru_RU.UTF-8.po3005
-rw-r--r--po/ru_RU.cp1251.gmobin0 -> 37267 bytes
-rw-r--r--po/ru_RU.cp1251.po3005
-rw-r--r--po/ru_RU.koi8r.gmobin0 -> 37266 bytes
-rw-r--r--po/ru_RU.koi8r.po3005
-rw-r--r--po/ru_RU.utf8.gmobin0 -> 37265 bytes
-rw-r--r--po/ru_RU.utf8.po3005
-rw-r--r--po/stamp-po1
-rw-r--r--po/sv.gmobin0 -> 42920 bytes
-rw-r--r--po/sv.po2726
-rw-r--r--src/Makefile.am212
-rw-r--r--src/Makefile.in940
-rw-r--r--src/buttonlayout.c146
-rw-r--r--src/buttonlayout.h30
-rw-r--r--src/buttons.c1245
-rw-r--r--src/buttons.h90
-rw-r--r--src/cfg_buttonlayout.c169
-rw-r--r--src/cfg_buttonlayout.h5
-rw-r--r--src/cfg_buttons.c914
-rw-r--r--src/cfg_buttons.h5
-rw-r--r--src/cfg_cmdcfg.c167
-rw-r--r--src/cfg_cmdcfg.h5
-rw-r--r--src/cfg_cmdseq.c1294
-rw-r--r--src/cfg_cmdseq.h9
-rw-r--r--src/cfg_controls.c931
-rw-r--r--src/cfg_controls.h6
-rw-r--r--src/cfg_dialogs.c64
-rw-r--r--src/cfg_dialogs.h5
-rw-r--r--src/cfg_dirpane.c1816
-rw-r--r--src/cfg_dirpane.h5
-rw-r--r--src/cfg_errors.c158
-rw-r--r--src/cfg_errors.h5
-rw-r--r--src/cfg_menus.c86
-rw-r--r--src/cfg_menus.h6
-rw-r--r--src/cfg_module.h63
-rw-r--r--src/cfg_nag.c184
-rw-r--r--src/cfg_nag.h15
-rw-r--r--src/cfg_paths.c434
-rw-r--r--src/cfg_paths.h6
-rw-r--r--src/cfg_styles.c1000
-rw-r--r--src/cfg_styles.h8
-rw-r--r--src/cfg_types.c1026
-rw-r--r--src/cfg_types.h8
-rw-r--r--src/cfg_windows.c211
-rw-r--r--src/cfg_windows.h5
-rw-r--r--src/children.c235
-rw-r--r--src/children.h26
-rw-r--r--src/cmd_about.c175
-rw-r--r--src/cmd_about.h5
-rw-r--r--src/cmd_activate.c65
-rw-r--r--src/cmd_activate.h10
-rw-r--r--src/cmd_chmod.c275
-rw-r--r--src/cmd_chmod.h5
-rw-r--r--src/cmd_chown.c205
-rw-r--r--src/cmd_chown.h6
-rw-r--r--src/cmd_configure.c53
-rw-r--r--src/cmd_configure.h10
-rw-r--r--src/cmd_copy.c273
-rw-r--r--src/cmd_copy.h22
-rw-r--r--src/cmd_copyas.c238
-rw-r--r--src/cmd_copyas.h9
-rw-r--r--src/cmd_delete.c283
-rw-r--r--src/cmd_delete.h12
-rw-r--r--src/cmd_direnter.c121
-rw-r--r--src/cmd_direnter.h5
-rw-r--r--src/cmd_dirrescan.c27
-rw-r--r--src/cmd_dirrescan.h5
-rw-r--r--src/cmd_dpfocus.c27
-rw-r--r--src/cmd_dpfocus.h9
-rw-r--r--src/cmd_dpfocusisrch.c177
-rw-r--r--src/cmd_dpfocusisrch.h6
-rw-r--r--src/cmd_dpmisc.c155
-rw-r--r--src/cmd_dpmisc.h11
-rw-r--r--src/cmd_file.c70
-rw-r--r--src/cmd_file.h5
-rw-r--r--src/cmd_generic.c213
-rw-r--r--src/cmd_generic.h27
-rw-r--r--src/cmd_getsize.c137
-rw-r--r--src/cmd_getsize.h8
-rw-r--r--src/cmd_info.c394
-rw-r--r--src/cmd_info.h6
-rw-r--r--src/cmd_join.c286
-rw-r--r--src/cmd_join.h5
-rw-r--r--src/cmd_menupopup.c62
-rw-r--r--src/cmd_menupopup.h5
-rw-r--r--src/cmd_mkdir.c156
-rw-r--r--src/cmd_mkdir.h7
-rw-r--r--src/cmd_move.c167
-rw-r--r--src/cmd_move.h8
-rw-r--r--src/cmd_moveas.c115
-rw-r--r--src/cmd_moveas.h5
-rw-r--r--src/cmd_parent.c67
-rw-r--r--src/cmd_parent.h5
-rw-r--r--src/cmd_quit.c63
-rw-r--r--src/cmd_quit.h5
-rw-r--r--src/cmd_rename.c398
-rw-r--r--src/cmd_rename.h6
-rw-r--r--src/cmd_renamere.c534
-rw-r--r--src/cmd_renamere.h5
-rw-r--r--src/cmd_renameseq.c386
-rw-r--r--src/cmd_renameseq.h5
-rw-r--r--src/cmd_run.c52
-rw-r--r--src/cmd_run.h6
-rw-r--r--src/cmd_select.c777
-rw-r--r--src/cmd_select.h25
-rw-r--r--src/cmd_split.c669
-rw-r--r--src/cmd_split.h5
-rw-r--r--src/cmd_swap.c79
-rw-r--r--src/cmd_swap.h7
-rw-r--r--src/cmd_symlink.c274
-rw-r--r--src/cmd_symlink.h6
-rw-r--r--src/cmd_viewtext.c209
-rw-r--r--src/cmd_viewtext.h10
-rw-r--r--src/cmdarg.c278
-rw-r--r--src/cmdarg.h35
-rw-r--r--src/cmdgrab.c188
-rw-r--r--src/cmdgrab.h5
-rw-r--r--src/cmdparse.c846
-rw-r--r--src/cmdparse.h6
-rw-r--r--src/cmdseq.c794
-rw-r--r--src/cmdseq.h46
-rw-r--r--src/cmdseq_config.c859
-rw-r--r--src/cmdseq_config.h44
-rw-r--r--src/cmdseq_dialog.c267
-rw-r--r--src/cmdseq_dialog.h5
-rw-r--r--src/color_dialog.c54
-rw-r--r--src/color_dialog.h16
-rw-r--r--src/commands.h37
-rw-r--r--src/configure.c602
-rw-r--r--src/configure.h50
-rw-r--r--src/controls.c774
-rw-r--r--src/controls.h71
-rw-r--r--src/convstream.c150
-rw-r--r--src/convstream.h20
-rw-r--r--src/dialog.c321
-rw-r--r--src/dialog.h45
-rw-r--r--src/dirhistory.c488
-rw-r--r--src/dirhistory.h36
-rw-r--r--src/dirpane.c2154
-rw-r--r--src/dirpane.h115
-rw-r--r--src/dpformat.c801
-rw-r--r--src/dpformat.h22
-rw-r--r--src/errors.c112
-rw-r--r--src/errors.h9
-rw-r--r--src/events.c83
-rw-r--r--src/events.h7
-rw-r--r--src/file.c104
-rw-r--r--src/file.h5
-rw-r--r--src/fileutil.c818
-rw-r--r--src/fileutil.h59
-rw-r--r--src/gentoo.c638
-rw-r--r--src/gentoo.h509
-rw-r--r--src/gfam.c190
-rw-r--r--src/gfam.h13
-rw-r--r--src/gnu-gettext.h69
-rw-r--r--src/graphics/.xvpics/icon_gentoo-small.xpmbin0 -> 1090 bytes
-rw-r--r--src/graphics/.xvpics/icon_iconify.xpmbin0 -> 1090 bytes
-rw-r--r--src/graphics/README11
-rw-r--r--src/graphics/icon_empty.xpm19
-rw-r--r--src/graphics/icon_failed.xpm20
-rw-r--r--src/graphics/icon_gentoo.c336
-rw-r--r--src/graphics/icon_gentoo.pngbin0 -> 4326 bytes
-rw-r--r--src/graphics/icon_gentoo.xpm187
-rw-r--r--src/graphics/icon_gentoo_small.xpm155
-rw-r--r--src/graphics/icon_mouse0.xpm22
-rw-r--r--src/graphics/icon_mouse1.xpm22
-rw-r--r--src/graphics/icon_mouse2.xpm22
-rw-r--r--src/graphics/icon_mouse3.xpm22
-rw-r--r--src/graphics/icon_mouse4.xpm22
-rw-r--r--src/graphics/icon_mouse5.xpm22
-rw-r--r--src/guiutil.c324
-rw-r--r--src/guiutil.h29
-rw-r--r--src/hash_dialog.c102
-rw-r--r--src/hash_dialog.h5
-rw-r--r--src/icon_dialog.c133
-rw-r--r--src/icon_dialog.h6
-rw-r--r--src/iconutil.c196
-rw-r--r--src/iconutil.h20
-rw-r--r--src/keyboard.c313
-rw-r--r--src/keyboard.h47
-rw-r--r--src/list_dialog.c253
-rw-r--r--src/list_dialog.h11
-rw-r--r--src/menus.c638
-rw-r--r--src/menus.h44
-rw-r--r--src/miscutil.c16
-rw-r--r--src/miscutil.h7
-rw-r--r--src/mntent_wrap.c240
-rw-r--r--src/mntent_wrap.h53
-rw-r--r--src/nag_dialog.c51
-rw-r--r--src/nag_dialog.h7
-rw-r--r--src/odmultibutton.c554
-rw-r--r--src/odmultibutton.h62
-rw-r--r--src/overwrite.c143
-rw-r--r--src/overwrite.h13
-rw-r--r--src/progress.c384
-rw-r--r--src/progress.h35
-rw-r--r--src/queue.c97
-rw-r--r--src/queue.h16
-rw-r--r--src/sizeutil.c220
-rw-r--r--src/sizeutil.h25
-rw-r--r--src/strutil.c471
-rw-r--r--src/strutil.h35
-rw-r--r--src/style_dialog.c51
-rw-r--r--src/style_dialog.h5
-rw-r--r--src/styles.c1409
-rw-r--r--src/styles.h104
-rw-r--r--src/textview.c886
-rw-r--r--src/textview.h35
-rw-r--r--src/types.c591
-rw-r--r--src/types.h30
-rw-r--r--src/userinfo.c279
-rw-r--r--src/userinfo.h24
-rw-r--r--src/window.c787
-rw-r--r--src/window.h79
-rw-r--r--src/xmlutil.c877
-rw-r--r--src/xmlutil.h46
524 files changed, 132389 insertions, 0 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..1551426
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,1379 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international! The Free Translation Project is a
+way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages. A few packages already provide translations for their
+messages.
+
+ If you found this 'ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU 'gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU 'gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+1.1 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU 'gettext'. Other packages have their own ways to
+internationalization, predating GNU 'gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU 'gettext' functions. Installers may use special
+options at configuration time for changing the default behaviour. The
+command:
+
+ ./configure --disable-nls
+
+will _totally_ disable translation of messages.
+
+ When you already have GNU 'gettext' installed on your system and run
+configure without an option for your new package, 'configure' will
+probably detect the previously built and installed 'libintl' library and
+will decide to use it. If not, you may have to to use the
+'--with-libintl-prefix' option to tell 'configure' where to look for it.
+
+ Internationalized packages usually have many 'po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at 'configure' time by using the
+'--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable 'LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+'LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.2 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the 'LANG' environment variable to the appropriate
+'LL_CC' combination. If you happen to have the 'LC_ALL' or some other
+'LC_xxx' environment variables set, you should unset them before setting
+'LANG', otherwise the setting of 'LANG' will not have the desired
+effect. Here 'LL' is an ISO 639 two-letter language code, and 'CC' is
+an ISO 3166 two-letter country code. For example, let's suppose that
+you speak German and live in Germany. At the shell prompt, merely
+execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in
+'sh') or 'export LANG=de_DE' (in 'bash'). This can be done from your
+'.login' or '.profile' file, once and for all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of 'LL_CC', with 'LL' denoting the
+language and 'CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are used,
+such as 'LL' or 'LL_CC.ENCODING'. You can get the list of locales
+supported by your system for your language by running the command
+'locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+'LANGUAGE'. GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG'
+for the purpose of message handling, but you still need to have 'LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather read
+translations in German than English for when Swedish is not available,
+set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from 'no' to 'nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under 'nb' and some older ones under 'no', it's recommended
+for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and
+older translations are used.
+
+ In the 'LANGUAGE' environment variable, but not in the 'LANG'
+environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to
+denote the language's main dialect. For example, 'de' is equivalent to
+'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese
+as spoken in Portugal) in this context.
+
+1.3 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+'http://translationproject.org/', in the "Teams" area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+'-request' appended. For example, speakers of Swedish can send a
+message to 'sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate _actively_
+in translations, or at solving translational difficulties, rather than
+merely lurking around. If your team does not exist yet and you want to
+start one, or if you are unsure about what to do or how to get started,
+please write to 'coordinator@translationproject.org' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skills are praised more than
+programming skills, here.
+
+1.4 Available Packages
+======================
+
+Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of Jun 2014.
+The matrix shows, in regard of each package, for which languages PO
+files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files af am an ar as ast az be bg bn bn_IN bs ca crh cs
+ +---------------------------------------------------+
+ a2ps | [] [] [] |
+ aegis | |
+ anubis | |
+ aspell | [] [] [] |
+ bash | [] [] [] |
+ bfd | |
+ binutils | [] |
+ bison | |
+ bison-runtime | [] |
+ buzztrax | [] |
+ ccd2cue | |
+ ccide | |
+ cflow | |
+ clisp | |
+ coreutils | [] [] |
+ cpio | |
+ cppi | |
+ cpplib | [] |
+ cryptsetup | [] |
+ datamash | |
+ denemo | [] [] |
+ dfarc | [] |
+ dialog | [] [] [] |
+ dico | |
+ diffutils | [] |
+ dink | [] |
+ direvent | |
+ doodle | [] |
+ dos2unix | |
+ dos2unix-man | |
+ e2fsprogs | [] [] |
+ enscript | [] |
+ exif | [] |
+ fetchmail | [] [] |
+ findutils | [] |
+ flex | [] |
+ freedink | [] [] |
+ fusionforge | |
+ gas | |
+ gawk | [] |
+ gcal | [] |
+ gcc | |
+ gdbm | |
+ gettext-examples | [] [] [] [] [] |
+ gettext-runtime | [] [] [] |
+ gettext-tools | [] [] |
+ gjay | |
+ glunarclock | [] [] [] |
+ gnubiff | [] |
+ gnubik | [] |
+ gnucash | () () [] |
+ gnuchess | |
+ gnulib | [] |
+ gnunet | |
+ gnunet-gtk | |
+ gold | |
+ gphoto2 | [] |
+ gprof | [] |
+ gramadoir | |
+ grep | [] [] [] |
+ grub | [] |
+ gsasl | |
+ gss | |
+ gst-plugins-bad | [] |
+ gst-plugins-base | [] [] [] |
+ gst-plugins-good | [] [] [] |
+ gst-plugins-ugly | [] [] [] |
+ gstreamer | [] [] [] [] |
+ gtick | [] |
+ gtkam | [] [] |
+ gtkspell | [] [] [] [] [] |
+ guix | |
+ guix-packages | |
+ gutenprint | [] |
+ hello | [] |
+ help2man | |
+ help2man-texi | |
+ hylafax | |
+ idutils | |
+ iso_15924 | [] |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_4217 | [] |
+ iso_639 | [] [] [] [] [] [] [] [] [] |
+ iso_639_3 | [] [] |
+ iso_639_5 | |
+ jwhois | |
+ kbd | [] |
+ klavaro | [] [] [] [] [] |
+ latrine | |
+ ld | [] |
+ leafpad | [] [] [] [] |
+ libc | [] [] [] |
+ libexif | () |
+ libextractor | |
+ libgnutls | [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] |
+ libgsasl | |
+ libiconv | [] [] |
+ libidn | [] |
+ liferea | [] [] [] [] |
+ lilypond | [] [] |
+ lordsawar | [] |
+ lprng | |
+ lynx | [] [] |
+ m4 | [] |
+ mailfromd | |
+ mailutils | |
+ make | [] |
+ man-db | [] [] |
+ man-db-manpages | |
+ midi-instruments | [] [] [] |
+ minicom | [] |
+ mkisofs | [] |
+ myserver | [] |
+ nano | [] [] [] |
+ opcodes | |
+ parted | [] |
+ pies | |
+ popt | [] |
+ procps-ng | |
+ procps-ng-man | |
+ psmisc | [] |
+ pspp | [] |
+ pushover | [] |
+ pwdutils | |
+ pyspread | |
+ radius | [] |
+ recode | [] [] [] |
+ recutils | |
+ rpm | |
+ rush | |
+ sarg | |
+ sed | [] [] [] |
+ sharutils | [] |
+ shishi | |
+ skribilo | |
+ solfege | [] |
+ solfege-manual | |
+ spotmachine | |
+ sudo | [] [] |
+ sudoers | [] [] |
+ sysstat | [] |
+ tar | [] [] [] |
+ texinfo | [] [] |
+ texinfo_document | [] |
+ tigervnc | [] |
+ tin | |
+ tin-man | |
+ tracgoogleappsa... | |
+ trader | |
+ util-linux | [] |
+ ve | |
+ vice | |
+ vmm | |
+ vorbis-tools | [] |
+ wastesedge | |
+ wcd | |
+ wcd-man | |
+ wdiff | [] [] |
+ wget | [] |
+ wyslij-po | |
+ xboard | |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ +---------------------------------------------------+
+ af am an ar as ast az be bg bn bn_IN bs ca crh cs
+ 4 0 2 5 3 11 0 8 23 3 3 1 54 4 73
+
+ da de el en en_GB en_ZA eo es et eu fa fi fr
+ +--------------------------------------------------+
+ a2ps | [] [] [] [] [] [] [] [] [] |
+ aegis | [] [] [] [] |
+ anubis | [] [] [] [] [] |
+ aspell | [] [] [] [] [] [] [] |
+ bash | [] [] [] |
+ bfd | [] [] [] [] |
+ binutils | [] [] [] |
+ bison | [] [] [] [] [] [] [] [] |
+ bison-runtime | [] [] [] [] [] [] [] [] |
+ buzztrax | [] [] [] [] |
+ ccd2cue | [] [] [] |
+ ccide | [] [] [] [] [] [] |
+ cflow | [] [] [] [] [] |
+ clisp | [] [] [] [] [] |
+ coreutils | [] [] [] [] [] |
+ cpio | [] [] [] [] [] |
+ cppi | [] [] [] [] [] |
+ cpplib | [] [] [] [] [] [] |
+ cryptsetup | [] [] [] [] [] |
+ datamash | [] [] [] [] |
+ denemo | [] |
+ dfarc | [] [] [] [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] [] |
+ dico | [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ dink | [] [] [] [] [] [] |
+ direvent | [] [] [] [] |
+ doodle | [] [] [] [] |
+ dos2unix | [] [] [] [] [] |
+ dos2unix-man | [] [] [] |
+ e2fsprogs | [] [] [] [] [] |
+ enscript | [] [] [] [] [] [] |
+ exif | [] [] [] [] [] [] |
+ fetchmail | [] () [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] [] [] |
+ flex | [] [] [] [] [] [] |
+ freedink | [] [] [] [] [] [] [] [] |
+ fusionforge | [] [] [] |
+ gas | [] [] [] |
+ gawk | [] [] [] [] [] |
+ gcal | [] [] [] [] |
+ gcc | [] [] |
+ gdbm | [] [] [] [] [] |
+ gettext-examples | [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] |
+ gjay | [] [] [] [] |
+ glunarclock | [] [] [] [] [] |
+ gnubiff | () [] [] () |
+ gnubik | [] [] [] [] [] |
+ gnucash | [] () () () () () () |
+ gnuchess | [] [] [] [] |
+ gnulib | [] [] [] [] [] [] [] |
+ gnunet | [] |
+ gnunet-gtk | [] |
+ gold | [] [] [] |
+ gphoto2 | [] () [] [] |
+ gprof | [] [] [] [] [] [] |
+ gramadoir | [] [] [] [] [] |
+ grep | [] [] [] [] [] [] [] |
+ grub | [] [] [] [] [] |
+ gsasl | [] [] [] [] [] |
+ gss | [] [] [] [] [] |
+ gst-plugins-bad | [] [] |
+ gst-plugins-base | [] [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] [] [] |
+ gtick | [] () [] [] [] |
+ gtkam | [] () [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] [] |
+ guix | [] [] |
+ guix-packages | |
+ gutenprint | [] [] [] [] |
+ hello | [] [] [] [] [] [] [] [] |
+ help2man | [] [] [] [] [] [] [] |
+ help2man-texi | [] [] [] |
+ hylafax | [] [] |
+ idutils | [] [] [] [] [] |
+ iso_15924 | [] () [] [] () [] () |
+ iso_3166 | [] () [] [] [] [] () [] () |
+ iso_3166_2 | [] () () () |
+ iso_4217 | [] () [] [] [] () [] () |
+ iso_639 | [] () [] [] () [] () |
+ iso_639_3 | () () () |
+ iso_639_5 | () () () |
+ jwhois | [] [] [] [] [] |
+ kbd | [] [] [] [] [] [] |
+ klavaro | [] [] [] [] [] [] [] |
+ latrine | [] () [] [] |
+ ld | [] [] [] [] |
+ leafpad | [] [] [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] [] () [] [] |
+ libextractor | [] |
+ libgnutls | [] [] [] [] |
+ libgphoto2 | [] () [] |
+ libgphoto2_port | [] () [] [] [] [] |
+ libgsasl | [] [] [] [] [] |
+ libiconv | [] [] [] [] [] [] [] |
+ libidn | [] [] [] [] [] |
+ liferea | [] () [] [] [] [] [] |
+ lilypond | [] [] [] [] [] [] |
+ lordsawar | [] [] |
+ lprng | |
+ lynx | [] [] [] [] [] [] |
+ m4 | [] [] [] [] [] [] |
+ mailfromd | [] |
+ mailutils | [] [] [] [] |
+ make | [] [] [] [] [] |
+ man-db | [] [] [] [] |
+ man-db-manpages | [] [] |
+ midi-instruments | [] [] [] [] [] [] [] [] [] |
+ minicom | [] [] [] [] [] |
+ mkisofs | [] [] [] |
+ myserver | [] [] [] [] |
+ nano | [] [] [] [] [] [] [] |
+ opcodes | [] [] [] [] [] |
+ parted | [] [] [] |
+ pies | [] |
+ popt | [] [] [] [] [] [] |
+ procps-ng | [] [] |
+ procps-ng-man | [] [] |
+ psmisc | [] [] [] [] [] [] [] |
+ pspp | [] [] [] |
+ pushover | () [] [] [] |
+ pwdutils | [] [] [] |
+ pyspread | [] [] [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] |
+ recutils | [] [] [] [] |
+ rpm | [] [] [] [] [] |
+ rush | [] [] [] |
+ sarg | [] [] |
+ sed | [] [] [] [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | [] [] [] |
+ skribilo | [] [] |
+ solfege | [] [] [] [] [] [] [] [] |
+ solfege-manual | [] [] [] [] [] |
+ spotmachine | [] [] [] [] |
+ sudo | [] [] [] [] [] [] |
+ sudoers | [] [] [] [] [] [] |
+ sysstat | [] [] [] [] [] [] |
+ tar | [] [] [] [] [] [] [] |
+ texinfo | [] [] [] [] [] |
+ texinfo_document | [] [] [] [] |
+ tigervnc | [] [] [] [] [] [] |
+ tin | [] [] [] [] |
+ tin-man | [] |
+ tracgoogleappsa... | [] [] [] [] [] |
+ trader | [] [] [] [] [] [] |
+ util-linux | [] [] [] [] |
+ ve | [] [] [] [] [] |
+ vice | () () () |
+ vmm | [] [] |
+ vorbis-tools | [] [] [] [] |
+ wastesedge | [] () |
+ wcd | [] [] [] [] |
+ wcd-man | [] |
+ wdiff | [] [] [] [] [] [] [] |
+ wget | [] [] [] [] [] [] |
+ wyslij-po | [] [] [] [] |
+ xboard | [] [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] [] [] [] |
+ +--------------------------------------------------+
+ da de el en en_GB en_ZA eo es et eu fa fi fr
+ 120 130 32 1 6 0 94 95 22 13 4 103 136
+
+ ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+ +-------------------------------------------------+
+ a2ps | [] [] [] [] |
+ aegis | [] |
+ anubis | [] [] [] [] |
+ aspell | [] [] [] [] [] |
+ bash | [] [] [] |
+ bfd | [] [] |
+ binutils | [] [] [] |
+ bison | [] |
+ bison-runtime | [] [] [] [] [] [] [] [] |
+ buzztrax | |
+ ccd2cue | [] |
+ ccide | [] [] |
+ cflow | [] [] [] |
+ clisp | |
+ coreutils | [] [] [] |
+ cpio | [] [] [] [] [] [] |
+ cppi | [] [] [] [] [] |
+ cpplib | [] [] |
+ cryptsetup | [] |
+ datamash | |
+ denemo | [] |
+ dfarc | [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] [] [] |
+ dico | |
+ diffutils | [] [] [] [] |
+ dink | [] |
+ direvent | [] |
+ doodle | [] [] |
+ dos2unix | [] [] |
+ dos2unix-man | |
+ e2fsprogs | [] |
+ enscript | [] [] [] |
+ exif | [] [] [] [] [] [] |
+ fetchmail | [] [] [] |
+ findutils | [] [] [] [] [] [] [] |
+ flex | [] |
+ freedink | [] [] [] [] |
+ fusionforge | |
+ gas | [] |
+ gawk | [] () [] |
+ gcal | |
+ gcc | |
+ gdbm | |
+ gettext-examples | [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gjay | [] |
+ glunarclock | [] [] [] [] [] [] |
+ gnubiff | [] [] () |
+ gnubik | [] [] [] |
+ gnucash | () () () () () [] |
+ gnuchess | |
+ gnulib | [] [] [] [] [] |
+ gnunet | |
+ gnunet-gtk | |
+ gold | [] [] |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] [] [] |
+ gramadoir | [] [] [] |
+ grep | [] [] [] [] [] [] [] |
+ grub | [] [] [] |
+ gsasl | [] [] [] [] [] |
+ gss | [] [] [] [] [] |
+ gst-plugins-bad | [] |
+ gst-plugins-base | [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] |
+ gtick | [] [] [] [] [] |
+ gtkam | [] [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] [] [] [] |
+ guix | |
+ guix-packages | |
+ gutenprint | [] [] [] |
+ hello | [] [] [] [] [] |
+ help2man | [] [] [] |
+ help2man-texi | |
+ hylafax | [] |
+ idutils | [] [] |
+ iso_15924 | [] [] [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_2 | [] [] |
+ iso_4217 | [] [] [] [] [] [] |
+ iso_639 | [] [] [] [] [] [] [] [] [] |
+ iso_639_3 | [] [] |
+ iso_639_5 | |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ klavaro | [] [] [] [] [] |
+ latrine | [] |
+ ld | [] [] [] [] |
+ leafpad | [] [] [] [] [] [] [] () |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | |
+ libgnutls | [] |
+ libgphoto2 | [] [] |
+ libgphoto2_port | [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | [] [] [] [] [] [] [] |
+ libidn | [] [] [] [] |
+ liferea | [] [] [] [] [] |
+ lilypond | [] |
+ lordsawar | |
+ lprng | [] |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailfromd | |
+ mailutils | |
+ make | [] [] [] [] |
+ man-db | [] [] |
+ man-db-manpages | [] [] |
+ midi-instruments | [] [] [] [] [] [] [] [] [] |
+ minicom | [] [] [] |
+ mkisofs | [] [] |
+ myserver | [] |
+ nano | [] [] [] [] [] |
+ opcodes | [] [] [] |
+ parted | [] [] [] [] |
+ pies | |
+ popt | [] [] [] [] [] [] [] [] [] [] |
+ procps-ng | |
+ procps-ng-man | |
+ psmisc | [] [] [] [] |
+ pspp | [] [] |
+ pushover | [] |
+ pwdutils | [] |
+ pyspread | |
+ radius | [] |
+ recode | [] [] [] [] [] [] [] |
+ recutils | |
+ rpm | [] |
+ rush | [] |
+ sarg | |
+ sed | [] [] [] [] [] [] [] |
+ sharutils | |
+ shishi | |
+ skribilo | [] |
+ solfege | [] [] |
+ solfege-manual | |
+ spotmachine | |
+ sudo | [] [] [] [] |
+ sudoers | [] [] [] |
+ sysstat | [] [] [] |
+ tar | [] [] [] [] [] [] |
+ texinfo | [] [] [] |
+ texinfo_document | [] [] |
+ tigervnc | |
+ tin | |
+ tin-man | |
+ tracgoogleappsa... | [] [] [] [] |
+ trader | [] [] |
+ util-linux | [] |
+ ve | [] |
+ vice | () () |
+ vmm | |
+ vorbis-tools | [] [] |
+ wastesedge | () |
+ wcd | |
+ wcd-man | |
+ wdiff | [] [] [] |
+ wget | [] [] [] |
+ wyslij-po | [] [] [] |
+ xboard | |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] [] |
+ +-------------------------------------------------+
+ ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+ 35 2 47 4 8 2 53 69 2 6 80 11 86 58 0 3
+
+ kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl
+ +--------------------------------------------------+
+ a2ps | [] [] |
+ aegis | [] |
+ anubis | [] [] [] |
+ aspell | [] [] |
+ bash | [] [] |
+ bfd | |
+ binutils | |
+ bison | [] |
+ bison-runtime | [] [] [] [] [] [] |
+ buzztrax | |
+ ccd2cue | |
+ ccide | [] [] |
+ cflow | [] |
+ clisp | [] |
+ coreutils | [] [] |
+ cpio | [] |
+ cppi | |
+ cpplib | [] |
+ cryptsetup | [] |
+ datamash | [] [] |
+ denemo | |
+ dfarc | [] [] |
+ dialog | [] [] [] [] [] [] |
+ dico | |
+ diffutils | [] [] [] |
+ dink | [] |
+ direvent | [] |
+ doodle | [] |
+ dos2unix | [] [] |
+ dos2unix-man | [] |
+ e2fsprogs | [] |
+ enscript | [] |
+ exif | [] [] |
+ fetchmail | [] |
+ findutils | [] [] |
+ flex | [] |
+ freedink | [] [] |
+ fusionforge | |
+ gas | |
+ gawk | [] |
+ gcal | |
+ gcc | |
+ gdbm | |
+ gettext-examples | [] [] [] [] [] [] |
+ gettext-runtime | [] [] |
+ gettext-tools | [] |
+ gjay | |
+ glunarclock | [] [] |
+ gnubiff | [] |
+ gnubik | [] [] |
+ gnucash | () () () () () () () [] |
+ gnuchess | [] [] |
+ gnulib | [] |
+ gnunet | |
+ gnunet-gtk | |
+ gold | |
+ gphoto2 | [] |
+ gprof | [] [] |
+ gramadoir | [] |
+ grep | [] [] |
+ grub | [] [] [] |
+ gsasl | [] |
+ gss | |
+ gst-plugins-bad | [] [] |
+ gst-plugins-base | [] [] [] |
+ gst-plugins-good | [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] |
+ gstreamer | [] [] |
+ gtick | [] |
+ gtkam | [] [] |
+ gtkspell | [] [] [] [] [] [] [] |
+ guix | |
+ guix-packages | |
+ gutenprint | [] |
+ hello | [] [] [] |
+ help2man | [] |
+ help2man-texi | |
+ hylafax | [] |
+ idutils | [] |
+ iso_15924 | () [] [] |
+ iso_3166 | [] [] [] () [] [] [] [] [] [] |
+ iso_3166_2 | () [] |
+ iso_4217 | () [] [] [] |
+ iso_639 | [] [] () [] [] [] [] |
+ iso_639_3 | [] () [] |
+ iso_639_5 | () |
+ jwhois | [] [] |
+ kbd | [] |
+ klavaro | [] [] |
+ latrine | |
+ ld | |
+ leafpad | [] [] [] [] [] |
+ libc | [] [] |
+ libexif | [] |
+ libextractor | [] |
+ libgnutls | [] [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] |
+ libgsasl | [] |
+ libiconv | [] [] |
+ libidn | [] |
+ liferea | [] [] [] |
+ lilypond | [] |
+ lordsawar | |
+ lprng | |
+ lynx | [] |
+ m4 | [] |
+ mailfromd | |
+ mailutils | |
+ make | [] [] |
+ man-db | [] |
+ man-db-manpages | [] |
+ midi-instruments | [] [] [] [] [] [] [] |
+ minicom | [] |
+ mkisofs | [] |
+ myserver | |
+ nano | [] [] [] |
+ opcodes | [] |
+ parted | [] |
+ pies | |
+ popt | [] [] [] [] [] |
+ procps-ng | |
+ procps-ng-man | |
+ psmisc | [] |
+ pspp | [] [] |
+ pushover | |
+ pwdutils | [] |
+ pyspread | |
+ radius | [] |
+ recode | [] [] |
+ recutils | [] |
+ rpm | [] |
+ rush | [] |
+ sarg | |
+ sed | [] [] |
+ sharutils | [] |
+ shishi | |
+ skribilo | |
+ solfege | [] [] |
+ solfege-manual | [] |
+ spotmachine | [] |
+ sudo | [] [] |
+ sudoers | [] [] |
+ sysstat | [] [] |
+ tar | [] [] [] |
+ texinfo | [] |
+ texinfo_document | [] |
+ tigervnc | [] |
+ tin | |
+ tin-man | |
+ tracgoogleappsa... | [] [] [] |
+ trader | [] |
+ util-linux | [] |
+ ve | [] |
+ vice | [] |
+ vmm | [] |
+ vorbis-tools | [] |
+ wastesedge | [] |
+ wcd | [] |
+ wcd-man | [] |
+ wdiff | [] |
+ wget | [] [] |
+ wyslij-po | [] |
+ xboard | [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ +--------------------------------------------------+
+ kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl
+ 5 11 4 6 0 13 22 3 3 3 4 11 2 40 1 124
+
+ nn or os pa pl ps pt pt_BR ro ru rw sk sl sq sr
+ +--------------------------------------------------+
+ a2ps | [] [] [] [] [] [] [] |
+ aegis | [] [] |
+ anubis | [] [] [] |
+ aspell | [] [] [] [] [] [] [] |
+ bash | [] [] [] [] [] |
+ bfd | [] |
+ binutils | [] [] |
+ bison | [] [] [] |
+ bison-runtime | [] [] [] [] [] [] [] [] |
+ buzztrax | |
+ ccd2cue | [] |
+ ccide | [] [] [] |
+ cflow | [] [] |
+ clisp | [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ cppi | [] [] [] |
+ cpplib | [] [] [] |
+ cryptsetup | [] [] |
+ datamash | [] [] |
+ denemo | |
+ dfarc | [] [] [] |
+ dialog | [] [] [] [] [] [] [] |
+ dico | [] |
+ diffutils | [] [] |
+ dink | |
+ direvent | [] [] |
+ doodle | [] [] |
+ dos2unix | [] [] [] [] |
+ dos2unix-man | [] [] |
+ e2fsprogs | [] |
+ enscript | [] [] [] [] [] [] |
+ exif | [] [] [] [] [] [] |
+ fetchmail | [] [] [] |
+ findutils | [] [] [] [] [] |
+ flex | [] [] [] [] [] |
+ freedink | [] [] [] [] [] |
+ fusionforge | |
+ gas | |
+ gawk | [] |
+ gcal | |
+ gcc | |
+ gdbm | [] [] [] |
+ gettext-examples | [] [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] [] [] |
+ gjay | [] |
+ glunarclock | [] [] [] [] [] [] |
+ gnubiff | [] |
+ gnubik | [] [] [] [] |
+ gnucash | () () () () [] |
+ gnuchess | [] [] |
+ gnulib | [] [] [] [] [] |
+ gnunet | |
+ gnunet-gtk | |
+ gold | |
+ gphoto2 | [] [] [] [] [] |
+ gprof | [] [] [] [] |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] |
+ grub | [] [] [] [] [] |
+ gsasl | [] [] [] |
+ gss | [] [] [] [] |
+ gst-plugins-bad | [] [] [] [] |
+ gst-plugins-base | [] [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] [] [] |
+ gtick | [] [] [] [] [] |
+ gtkam | [] [] [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] [] [] |
+ guix | |
+ guix-packages | |
+ gutenprint | [] [] |
+ hello | [] [] [] [] [] [] |
+ help2man | [] [] [] [] |
+ help2man-texi | [] |
+ hylafax | |
+ idutils | [] [] [] |
+ iso_15924 | [] () [] [] [] [] |
+ iso_3166 | [] [] [] [] () [] [] [] [] [] [] [] [] |
+ iso_3166_2 | [] () [] |
+ iso_4217 | [] [] () [] [] [] [] [] |
+ iso_639 | [] [] [] () [] [] [] [] [] [] |
+ iso_639_3 | [] () |
+ iso_639_5 | () [] |
+ jwhois | [] [] [] [] |
+ kbd | [] [] |
+ klavaro | [] [] [] [] [] |
+ latrine | [] |
+ ld | |
+ leafpad | [] [] [] [] [] [] [] [] [] |
+ libc | [] [] [] |
+ libexif | [] () [] |
+ libextractor | [] |
+ libgnutls | [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] [] [] [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | [] [] [] [] [] |
+ libidn | [] [] [] |
+ liferea | [] [] [] [] () [] [] |
+ lilypond | |
+ lordsawar | |
+ lprng | [] |
+ lynx | [] [] |
+ m4 | [] [] [] [] [] |
+ mailfromd | [] |
+ mailutils | [] |
+ make | [] [] [] |
+ man-db | [] [] [] |
+ man-db-manpages | [] [] [] |
+ midi-instruments | [] [] [] [] [] [] [] [] |
+ minicom | [] [] [] [] |
+ mkisofs | [] [] [] |
+ myserver | [] [] |
+ nano | [] [] [] [] [] [] |
+ opcodes | |
+ parted | [] [] [] [] [] [] |
+ pies | [] |
+ popt | [] [] [] [] [] [] |
+ procps-ng | [] |
+ procps-ng-man | [] |
+ psmisc | [] [] [] [] |
+ pspp | [] [] |
+ pushover | |
+ pwdutils | [] |
+ pyspread | [] [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] [] |
+ recutils | [] |
+ rpm | [] |
+ rush | [] [] [] |
+ sarg | [] [] |
+ sed | [] [] [] [] [] [] [] [] |
+ sharutils | [] [] [] |
+ shishi | [] [] |
+ skribilo | |
+ solfege | [] [] [] |
+ solfege-manual | [] [] |
+ spotmachine | [] [] |
+ sudo | [] [] [] [] [] [] |
+ sudoers | [] [] [] [] |
+ sysstat | [] [] [] [] [] |
+ tar | [] [] [] [] [] |
+ texinfo | [] [] [] |
+ texinfo_document | [] [] |
+ tigervnc | [] |
+ tin | [] |
+ tin-man | |
+ tracgoogleappsa... | [] [] [] [] |
+ trader | [] |
+ util-linux | [] [] |
+ ve | [] [] [] |
+ vice | |
+ vmm | |
+ vorbis-tools | [] [] [] |
+ wastesedge | |
+ wcd | |
+ wcd-man | |
+ wdiff | [] [] [] [] [] |
+ wget | [] [] [] [] |
+ wyslij-po | [] [] [] [] |
+ xboard | [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] |
+ +--------------------------------------------------+
+ nn or os pa pl ps pt pt_BR ro ru rw sk sl sq sr
+ 7 3 1 6 114 1 12 83 32 80 3 38 45 7 94
+
+ sv sw ta te tg th tr uk ur vi wa wo zh_CN zh_HK
+ +---------------------------------------------------+
+ a2ps | [] [] [] [] [] |
+ aegis | [] |
+ anubis | [] [] [] [] |
+ aspell | [] [] [] [] |
+ bash | [] [] [] [] |
+ bfd | [] [] |
+ binutils | [] [] [] |
+ bison | [] [] [] [] |
+ bison-runtime | [] [] [] [] [] [] |
+ buzztrax | [] [] [] |
+ ccd2cue | [] [] [] |
+ ccide | [] [] [] [] |
+ cflow | [] [] [] [] |
+ clisp | |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] [] [] |
+ cppi | [] [] [] [] |
+ cpplib | [] [] [] [] [] |
+ cryptsetup | [] [] [] |
+ datamash | [] [] [] |
+ denemo | |
+ dfarc | [] |
+ dialog | [] [] [] [] [] [] |
+ dico | [] |
+ diffutils | [] [] [] [] [] |
+ dink | |
+ direvent | [] [] |
+ doodle | [] [] |
+ dos2unix | [] [] [] [] |
+ dos2unix-man | [] [] [] |
+ e2fsprogs | [] [] [] [] |
+ enscript | [] [] [] [] |
+ exif | [] [] [] [] [] |
+ fetchmail | [] [] [] [] |
+ findutils | [] [] [] [] [] |
+ flex | [] [] [] [] |
+ freedink | [] [] |
+ fusionforge | |
+ gas | [] |
+ gawk | [] [] |
+ gcal | [] [] |
+ gcc | [] [] |
+ gdbm | [] [] |
+ gettext-examples | [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] |
+ gjay | [] [] |
+ glunarclock | [] [] [] [] |
+ gnubiff | [] [] |
+ gnubik | [] [] [] [] |
+ gnucash | () () () () [] |
+ gnuchess | [] [] |
+ gnulib | [] [] [] [] |
+ gnunet | |
+ gnunet-gtk | |
+ gold | [] [] |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] [] [] |
+ gramadoir | [] [] [] |
+ grep | [] [] [] [] [] |
+ grub | [] [] [] [] |
+ gsasl | [] [] [] [] |
+ gss | [] [] [] |
+ gst-plugins-bad | [] [] [] [] |
+ gst-plugins-base | [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] |
+ gtick | [] [] [] |
+ gtkam | [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] [] |
+ guix | [] |
+ guix-packages | |
+ gutenprint | [] [] [] [] |
+ hello | [] [] [] [] [] [] |
+ help2man | [] [] [] |
+ help2man-texi | [] |
+ hylafax | [] |
+ idutils | [] [] [] |
+ iso_15924 | [] () [] [] () [] |
+ iso_3166 | [] [] () [] [] () [] [] [] |
+ iso_3166_2 | () [] [] () [] |
+ iso_4217 | [] () [] [] () [] [] |
+ iso_639 | [] [] [] () [] [] () [] [] [] |
+ iso_639_3 | [] () [] [] () |
+ iso_639_5 | () [] () |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ klavaro | [] [] [] [] [] [] |
+ latrine | [] [] |
+ ld | [] [] [] [] [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] () |
+ libextractor | [] [] |
+ libgnutls | [] [] [] [] |
+ libgphoto2 | [] [] |
+ libgphoto2_port | [] [] [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | [] [] [] [] [] |
+ libidn | () [] [] [] |
+ liferea | [] [] [] [] [] |
+ lilypond | [] |
+ lordsawar | |
+ lprng | [] |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] |
+ mailfromd | [] [] |
+ mailutils | [] |
+ make | [] [] [] [] |
+ man-db | [] [] |
+ man-db-manpages | [] |
+ midi-instruments | [] [] [] [] [] [] |
+ minicom | [] [] |
+ mkisofs | [] [] [] |
+ myserver | [] |
+ nano | [] [] [] [] |
+ opcodes | [] [] [] |
+ parted | [] [] [] [] [] |
+ pies | [] [] |
+ popt | [] [] [] [] [] [] [] |
+ procps-ng | [] [] |
+ procps-ng-man | [] |
+ psmisc | [] [] [] [] |
+ pspp | [] [] [] |
+ pushover | [] |
+ pwdutils | [] [] |
+ pyspread | [] |
+ radius | [] [] |
+ recode | [] [] [] [] |
+ recutils | [] [] [] |
+ rpm | [] [] [] [] |
+ rush | [] [] |
+ sarg | |
+ sed | [] [] [] [] [] |
+ sharutils | [] [] [] |
+ shishi | [] [] |
+ skribilo | [] |
+ solfege | [] [] [] |
+ solfege-manual | [] |
+ spotmachine | [] [] [] |
+ sudo | [] [] [] [] |
+ sudoers | [] [] [] |
+ sysstat | [] [] [] [] [] |
+ tar | [] [] [] [] [] |
+ texinfo | [] [] [] |
+ texinfo_document | [] |
+ tigervnc | [] [] |
+ tin | [] |
+ tin-man | |
+ tracgoogleappsa... | [] [] [] [] [] |
+ trader | [] |
+ util-linux | [] [] [] |
+ ve | [] [] [] [] |
+ vice | () () |
+ vmm | |
+ vorbis-tools | [] [] |
+ wastesedge | |
+ wcd | [] [] [] |
+ wcd-man | [] |
+ wdiff | [] [] [] [] |
+ wget | [] [] [] |
+ wyslij-po | [] [] |
+ xboard | [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] |
+ +---------------------------------------------------+
+ sv sw ta te tg th tr uk ur vi wa wo zh_CN zh_HK
+ 91 1 4 3 0 13 50 113 1 126 7 1 95 7
+
+ zh_TW
+ +-------+
+ a2ps | | 30
+ aegis | | 9
+ anubis | | 19
+ aspell | | 28
+ bash | [] | 21
+ bfd | | 9
+ binutils | | 12
+ bison | [] | 18
+ bison-runtime | [] | 38
+ buzztrax | | 8
+ ccd2cue | | 8
+ ccide | | 17
+ cflow | | 15
+ clisp | | 10
+ coreutils | | 20
+ cpio | | 20
+ cppi | | 17
+ cpplib | [] | 19
+ cryptsetup | | 13
+ datamash | | 11
+ denemo | | 4
+ dfarc | | 16
+ dialog | [] | 42
+ dico | | 6
+ diffutils | | 21
+ dink | | 9
+ direvent | | 10
+ doodle | | 12
+ dos2unix | [] | 18
+ dos2unix-man | | 9
+ e2fsprogs | | 14
+ enscript | | 21
+ exif | | 26
+ fetchmail | | 19
+ findutils | | 28
+ flex | [] | 19
+ freedink | | 23
+ fusionforge | | 3
+ gas | | 5
+ gawk | | 12
+ gcal | | 7
+ gcc | | 4
+ gdbm | | 10
+ gettext-examples | [] | 40
+ gettext-runtime | [] | 34
+ gettext-tools | [] | 24
+ gjay | | 8
+ glunarclock | [] | 27
+ gnubiff | | 9
+ gnubik | | 19
+ gnucash | () | 7
+ gnuchess | | 10
+ gnulib | | 23
+ gnunet | | 1
+ gnunet-gtk | | 1
+ gold | | 7
+ gphoto2 | [] | 19
+ gprof | | 21
+ gramadoir | | 14
+ grep | [] | 31
+ grub | | 21
+ gsasl | [] | 19
+ gss | | 17
+ gst-plugins-bad | | 14
+ gst-plugins-base | | 27
+ gst-plugins-good | | 32
+ gst-plugins-ugly | | 34
+ gstreamer | [] | 31
+ gtick | | 19
+ gtkam | | 24
+ gtkspell | [] | 48
+ guix | | 3
+ guix-packages | | 0
+ gutenprint | | 15
+ hello | [] | 30
+ help2man | | 18
+ help2man-texi | | 5
+ hylafax | | 5
+ idutils | | 14
+ iso_15924 | [] | 23
+ iso_3166 | [] | 58
+ iso_3166_2 | | 9
+ iso_4217 | [] | 28
+ iso_639 | [] | 46
+ iso_639_3 | | 10
+ iso_639_5 | | 2
+ jwhois | [] | 20
+ kbd | | 16
+ klavaro | | 30
+ latrine | | 7
+ ld | [] | 15
+ leafpad | [] | 40
+ libc | [] | 24
+ libexif | | 9
+ libextractor | | 5
+ libgnutls | | 13
+ libgphoto2 | | 9
+ libgphoto2_port | [] | 19
+ libgsasl | | 18
+ libiconv | [] | 29
+ libidn | | 17
+ liferea | | 29
+ lilypond | | 11
+ lordsawar | | 3
+ lprng | | 3
+ lynx | | 19
+ m4 | [] | 22
+ mailfromd | | 4
+ mailutils | | 6
+ make | | 19
+ man-db | | 14
+ man-db-manpages | | 9
+ midi-instruments | [] | 43
+ minicom | [] | 17
+ mkisofs | | 13
+ myserver | | 9
+ nano | [] | 29
+ opcodes | | 12
+ parted | [] | 21
+ pies | | 4
+ popt | [] | 36
+ procps-ng | | 5
+ procps-ng-man | | 4
+ psmisc | [] | 22
+ pspp | | 13
+ pushover | | 6
+ pwdutils | | 8
+ pyspread | | 6
+ radius | | 9
+ recode | | 31
+ recutils | | 9
+ rpm | [] | 13
+ rush | | 10
+ sarg | | 4
+ sed | [] | 34
+ sharutils | | 12
+ shishi | | 7
+ skribilo | | 4
+ solfege | | 19
+ solfege-manual | | 9
+ spotmachine | | 10
+ sudo | | 24
+ sudoers | | 20
+ sysstat | | 22
+ tar | [] | 30
+ texinfo | | 17
+ texinfo_document | | 11
+ tigervnc | | 11
+ tin | [] | 7
+ tin-man | | 1
+ tracgoogleappsa... | [] | 22
+ trader | | 11
+ util-linux | | 12
+ ve | | 14
+ vice | | 1
+ vmm | | 3
+ vorbis-tools | | 13
+ wastesedge | | 2
+ wcd | | 8
+ wcd-man | | 3
+ wdiff | [] | 23
+ wget | | 19
+ wyslij-po | | 14
+ xboard | | 9
+ xdg-user-dirs | [] | 68
+ xkeyboard-config | [] | 27
+ +-------+
+ 90 teams zh_TW
+ 166 domains 42 2748
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and distributed
+as such by its maintainer. There might be an observable lag between the
+mere existence a PO file and its wide availability in a distribution.
+
+ If Jun 2014 seems to be old, you may fetch a more recent copy of this
+'ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix
+with full percentage details can be found at
+'http://translationproject.org/extra/matrix.html'.
+
+1.5 Using 'gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU 'gettext' in your
+package. Of course you have to respect the GNU Lesser General Public
+License which covers the use of the GNU 'gettext' library. This means
+in particular that even non-free programs can use 'libintl' as a shared
+library, whereas only free software can use 'libintl' as a static
+library or use modified versions of 'libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of 'gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+'coordinator@translationproject.org' to make the '.pot' files available
+to the translation teams.
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..1468856
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Emil Brink <emil at obsession.se>
+Custom widgets by Johan Hanson <johan at tiq.com>
diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..c2df867
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,92 @@
+ Known gentoo bugs & problems
+
+gentoo 0.15.1 note: This file is (very) old. It probably needs
+some serious pruning, to make sure it's accurate. That has not
+been done, though.
+
+For new bugs, please use the issue tracker on SourceForge.net at:
+<http://sourceforge.net/tracker/?atid=406763&group_id=32880&func=browse>.
+
+This file contains notes on known bugs and problems with the gentoo
+file manager program. Its main use is to help me remember things I
+may need to redo.
+
+The file is formatted into "records"; each record begins with a
+date and contains a bulleted list of items.
+
+1998-08-23
+* This file is incomplete, since I created it too late.
+
+1998-08-31
+* Sneakily assumes machine is ASCII, for example in xmlutil.c and
+ sizeutil.c. These things should be easy to fix, I'm just kind of
+ skeptical against the whole idea of non-ASCII machines. I really
+ don't think they exist. :)
+
+1998-09-28
+* The option menu used in the commands editor seems to have some
+ problems with its sensitivity. Very weird.
+* The command sequence selection dialog tree sometimes opens up
+ not looking proper at all.
+
+1998-11-21
+* If you start a program in a command, and that program in turn
+ starts other processes, chances are that when gentoo quits, only
+ the root process will be killed (this is the case with x11amp,
+ for example). I know of no easy way to fix this...
+
+1999-01-29
+* If you try to use a non-existant command for mounting or un-
+ mounting, gentoo will die with a SIGPIPE in GTK+. I cannot
+ figure this one out, and don't feel like doing a work-around
+ (yet).
+
+1999-03-20
+* GTK+ seems to spew out random warnings (possibly shm-related) on
+ Solaris. I don't know if that's my fault, but I (naively?) don't
+ think so...
+
+1999-04-22
+* Command output grabbing takes a long time if there's a lot of
+ output (try grabbing the output of "tar tvf linux-2.2.x.tar.gz":).
+ I've noted that the chunks of data fed to gentoo by the GDK I/O
+ routines are very small; only 80-300 bytes at a time.
+
+1999-05-16
+* Various parts of gentoo now deal explicitly with 64-bit variables
+ and constants. The code that does this has been protected using
+ glib's G_GNUC_EXTENSION macro, but that will only work with gcc.
+ If you use another compiler, you might need to alter options to
+ soften the ANSI-ness requirements. If your compiler and/or system
+ simply doesn't support 64-bit integers, I'm afraid you're out
+ of luck. :(
+
+2000-02-26
+* The integration between the new window tracking system and gentoo's
+ global idea about the changed status of the config is not completely
+ accurate. Should be pretty easy to fix, though.
+
+2000-03-04
+* Saving position of windows doesn't quite work: windows will "slide"
+ a couple of pixels in some direction between each close and reopen.
+ This is because of some misreporting of positions from GDK. To fix
+ this, I need to determine if the error is consistent across all (?)
+ window managers, or something. In the meantime, you might want to
+ disable position-setting (or updating) on all windows. Size works
+ fine, I think.
+
+2000-03-29
+* A couple of people have reported getting a mysterious error 84
+ (Illegal byte sequence) when just using gentoo to browse around
+ in their filesystems. I can't reproduce it, and don't understand
+ it at all. It might possibly be related to other system upgrades,
+ like libc and/or XFree86... I still don't understand it.
+
+2000-09-14
+* The textviewer doesn't react well when asked to read "/dev/zero".
+ Don't do that. :)
+* Dirpane focus page up/down might be somewhat incorrect. Tricky.
+
+2003-11-23
+* You can't have a directory named e.g. $HOME, since gentoo does not
+ allow escaping the $ sign it will always do a env-var lookup.
diff --git a/CONFIG-CHANGES b/CONFIG-CHANGES
new file mode 100644
index 0000000..8e1c297
--- /dev/null
+++ b/CONFIG-CHANGES
@@ -0,0 +1,151 @@
+ 2002-06-03
+ Emil Brink
+
+ gentoo
+ CONFIGURATION FILE FORMAT CHANGES
+
+0. INTRODUCTION
+Notes to help me maintain (or at least minimize loss of) config
+file compatibility between various gentoo releases.
+
+Note that I always try to make gentoo auto-convert the configuration
+file. This means that the format loaded is not always the same as
+the one saved, i.e. gentoo will (silently) "convert" the configuration
+file. As always, gentoo will not save the config file unless you tell
+it to, so there is never any risk of "losing" your old config.
+
+When a config file format change occurs, it is recommended to simply
+start the version of gentoo in which the change occured, and let it
+load your old config. Then check around to see if you've lost any
+important settings. If not, just click "Save" in the configuration
+window, to convert the file into the new format. If there are losses,
+read below for possible tips on how to recreate relevant data...
+
+With 0.11.24, one disruptive change is that the "Smart Size" (also
+known as "IQSize") content type is no longer supported, and not
+properly detected on load either. gentoo will map *any* unknown
+content type into a Size column.
+
+0.11.25 adds another disruptive change. Shortcuts are transformed
+from being a separate feature to being just another sheet of good
+old buttons. This means they get saved among the buttons, too. There
+is no support for loading the old-style Shortcut information, so
+you will simply lose your shortcuts. Luckily, redefining them should
+be fairly straight-forward.
+
+To minimize excess baggage in the code, I would like to get rid of
+the loading code for old-style config formats at some point in the
+future. Therefore, please convert your config file, even if it
+doesn't seem strictly necessary. Of course, once you make a config
+change and click "Save", the file is converted. There is no way to
+make gentoo *write* an old-style configuration file.
+
+
+I. FILE STYLES
+
+VERSION
+any pre-0.11.7 to 0.11.7
+
+NESTING
+ <FileStyles>
+
+NAME TYPE FUNCTION
+Style Style description The entire style description format
+ has changed.
+
+CHANGES
+The entire <Styles> tag has a completely new internal format.
+Properties are now identified by name, rather than weird hard-
+coded index integers as they were before.
+
+COMPATIBILITY TACTICS
+The current code loads old-style (pre-0.11.7) config files just
+fine, and silently converts them into the new format the next
+time you save.
+
+
+II. BUTTON FIELDS
+
+VERSION
+any pre-0.11.6 to 0.11.6
+
+NESTING
+ <ButtonSheets>
+ <ButtonSheet>
+ <ButtonSheetRows>
+ <ButtonRow>
+ <ButtonRowButtons>
+ <Button>
+ <narrow> AND <show_tooltip>
+
+NAME TYPE FUNCTION
+narrow boolean Flag: is button narrow?
+show_tooltip boolean Flag: show button's tooltip?
+
+CHANGES
+These two flags are no longer stored as individual boolean XML
+nodes. Rather, their data is packed into a binary flags word,
+which is then stored as a single unsigned integer. This makes
+the config file less readable, but also makes it smaller and
+lets the code be slightly more efficient. I think it's OK.
+
+COMPATIBILITY TACTICS :)
+Keep old-style parsing code in for a while. This will allow
+old config files (containing the "narrow" and "show_tooltip"
+XML tags explicitly) to still be read in. Stop writing these
+fields; just write the binary-packed version.
+
+In a few releases, I hope that enough people have upgraded "in
+the correct way", so this redundant config parsing code is no
+longer required.
+
+
+III. STYLE COLORS
+
+VERSION
+any pre-0.11.6 to 0.11.6
+
+NESTING
+ <FileStyles>
+ <Style>
+ <Properties>
+ <Property>
+ <Color>, <red>, <green> AND <blue>
+
+NAME TYPE FUNCTION
+Color RGB color info A style's color.
+
+CHANGES
+There is now a leaf-type XML node for colors, so these four nodes
+have been replaced by a single one, in this case called <color>.
+
+COMPATIBILITY TACTICS
+The old-style style-loading code is still in there, and will remain
+for the next few releases.
+
+
+IV. DIRPANE SORTING
+
+VERSION
+any pre-0.11.14 to 0.11.14
+
+NESTING
+ <DirPanes>
+ <DirPaneLeft> and <DirPaneRight>
+ <DPSort>
+ <column>
+
+NAME TYPE FUNCTION
+column a dirpane column index Which column to sort by.
+
+CHANGES
+As of gentoo 0.11.14, it is possible to sort on any type of
+*content*, not only those actually displayed in a given pane.
+ This field has simply been removed, and replaced by a
+field called "content", whose (textual) value is the name of the
+content type to sort by.
+ This is a very minimal, yet somewhat disruptive, change,
+since the loading code in 0.11.14 makes no attempt to translate
+an incoming "old-style" column index to a content type. On the
+other hand, all you need to do to get back in shape is click the
+column you wish to sort by, and save the config...
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..ee0775e
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 0000000..a4073e9
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,54 @@
+ 2004-12-29
+ Emil Brink
+
+ Credits for gentoo
+
+This file lists names of people who have helped with the devel-
+opment of gentoo in one way or another.
+
+Since it was created too late (after about one year of development),
+it is not 100% complete. If you feel you should be mentioned here,
+drop me a note.
+
+
+gentoo was created by Emil Brink. I am still the maintainer of it,
+and up to now I've written all the main code as well as the docu-
+mentation. Any and all bugs in the code are due to me (but there
+is NO warranty!).
+
+The custom widget code in widgets/ was written by Johan Hanson
+(<johan@tiq.com>). Johan is also the man behind all icon graphics
+in gentoo. He has stuff at <http://www.bahnhof.se/~misagon/>. One
+icon (Python) contributed by "eike".
+
+Ulf Petersson (<ulf@obsession.se>) has done the HTML design for
+the (incredibly outdated) documentation and the main gentoo logo
+shown in the About dialog.
+
+Jonas Minnberg (<jonas@nightmode.org>) has provided much valuable
+input on the design of various features.
+
+Help with getting gentoo to compile and run under OpenBSD was
+provided by Alexander Moss Tahk <tahk@mit.edu>. Alexander Leidinger
+<A.Leidinger@WJPServer.CS.Uni-SB.de> then came along and got it
+running on FreeBSD systems, as well. Jesse Perry <jap@unx.dec.com>
+provided help and patches to get gentoo compiling and running on
+Alpha Tru64 systems. Thanks.
+
+A patch to make gentoo run on Alpha/Linux boxes was provided by
+Christopher C. Chimelis, after input from Paul Slootman and
+Josip Rodin. Thanks.
+
+A patch to include the RPM-magic "spec"-file was provided by
+Ryan Weaver, after input from Mads Villandsen. Thank you.
+
+Initial autoconfig support provided by Andreas Kloeckner.
+
+Packages for Red Hat Linux (RPMs) of gentoo are made available
+thanks to the efforts of Ryan Weaver and Matthias Saou. Packages
+for the Debian distribution are available courtesy of Josip Rodin.
+Thank you.
+
+TRANSLATORS
+French translation by Philippe Rossi.
+Polish translation by S. Mikula ("[zorba]").
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..f66fb1e
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,20 @@
+2016-06-14 gettextize <bug-gnu-gettext@gnu.org>
+
+ * configure.ac (AC_OUTPUT): Add po/Makefile.in.
+
+2016-06-14 gettextize <bug-gnu-gettext@gnu.org>
+
+ * m4/gettext.m4: Upgrade to gettext-0.19.7.
+ * m4/iconv.m4: Upgrade to gettext-0.19.7.
+ * m4/lib-ld.m4: Upgrade to gettext-0.19.7.
+ * m4/lib-link.m4: Upgrade to gettext-0.19.7.
+ * m4/lib-prefix.m4: Upgrade to gettext-0.19.7.
+ * m4/nls.m4: Upgrade to gettext-0.19.7.
+ * m4/po.m4: Upgrade to gettext-0.19.7.
+ * m4/progtest.m4: Upgrade to gettext-0.19.7.
+ * configure.ac (AC_OUTPUT): Remove intl/Makefile.
+ (AM_GNU_GETTEXT_VERSION): Bump to 0.19.7.
+
+(This file is largely ignored, it's just included because it has to
+be, to comply with autoconf's expectations. See NEWS for actual info
+on changes. /Emil)
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..b42a17a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..49010c9
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,29 @@
+# -----------------------------------------------------------------------------
+# gentoo root Makefile.am
+# -----------------------------------------------------------------------------
+
+EXTRA_DIST=config.rpath BUGS CONFIG-CHANGES CREDITS README.NLS README.gtkrc docs icons gentoo.spec
+SUBDIRS=m4 icons po src
+
+sysconf_DATA=gentoorc gentoogtkrc
+
+# Get my personal config, and massage it into a gentoorc.in template. This should
+# make things better. It abstracts my config by replacing hard-coded stuff with
+# autoconf symbols and other generics. This should be run prior to "make dist".
+config:
+ cp gentoorc.in gentoorc.in.bak
+ sed -e 's/<version>\"[0-9.a-z]*\"<\/version>/<version>"\@VERSION\@"<\/version>/' \
+ -e 's/<path>\"icons\"<\/path>/<path>\"\@prefix\@\/share\/\@PACKAGE\@\/icons\/\"<\/path>/' \
+ -e 's/<defpath>\"[-0-9.a-zA-Z_~/]*\"<\/defpath>/<defpath>"~"<\/defpath>/' \
+ -e 's/<w>\([8-9][0-9]*\)/<w>800/' \
+ -e 's/<h>\([6-9][0-9]*\)/<h>600/' \
+ -e 's/<ignore>\("[a-z-]*"\)<\/ignore>//' \
+ < ~/.config/gentoo/gentoorc >gentoorc.in
+
+ACLOCAL_AMFLAGS=-I m4
+
+#
+# Remove any Subversion files, since we don't want those to be distributed.
+#
+dist-hook:
+ find $(top_distdir) -name .svn -type d | xargs rm -rf
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..69562ef
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,900 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -----------------------------------------------------------------------------
+# gentoo root Makefile.am
+# -----------------------------------------------------------------------------
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = gentoorc gentoogtkrc gentoo.spec
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(sysconfdir)"
+DATA = $(sysconf_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+ $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/gentoo.spec.in $(srcdir)/gentoogtkrc.in \
+ $(srcdir)/gentoorc.in ABOUT-NLS AUTHORS COPYING ChangeLog \
+ INSTALL NEWS README TODO compile config.guess config.rpath \
+ config.sub depcomp install-sh missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATE = @DATE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENTOO_CFLAGS = @GENTOO_CFLAGS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MODULES_CFLAGS = @MODULES_CFLAGS@
+MODULES_LIBS = @MODULES_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = config.rpath BUGS CONFIG-CHANGES CREDITS README.NLS README.gtkrc docs icons gentoo.spec
+SUBDIRS = m4 icons po src
+sysconf_DATA = gentoorc gentoogtkrc
+ACLOCAL_AMFLAGS = -I m4
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+gentoorc: $(top_builddir)/config.status $(srcdir)/gentoorc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gentoogtkrc: $(top_builddir)/config.status $(srcdir)/gentoogtkrc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gentoo.spec: $(top_builddir)/config.status $(srcdir)/gentoo.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-sysconfDATA: $(sysconf_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \
+ done
+
+uninstall-sysconfDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(sysconfdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-sysconfDATA
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-sysconfDATA
+
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am clean clean-cscope clean-generic \
+ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \
+ dist-zip distcheck distclean distclean-generic distclean-hdr \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ install-sysconfDATA installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
+ tags-am uninstall uninstall-am uninstall-sysconfDATA
+
+.PRECIOUS: Makefile
+
+
+# Get my personal config, and massage it into a gentoorc.in template. This should
+# make things better. It abstracts my config by replacing hard-coded stuff with
+# autoconf symbols and other generics. This should be run prior to "make dist".
+config:
+ cp gentoorc.in gentoorc.in.bak
+ sed -e 's/<version>\"[0-9.a-z]*\"<\/version>/<version>"\@VERSION\@"<\/version>/' \
+ -e 's/<path>\"icons\"<\/path>/<path>\"\@prefix\@\/share\/\@PACKAGE\@\/icons\/\"<\/path>/' \
+ -e 's/<defpath>\"[-0-9.a-zA-Z_~/]*\"<\/defpath>/<defpath>"~"<\/defpath>/' \
+ -e 's/<w>\([8-9][0-9]*\)/<w>800/' \
+ -e 's/<h>\([6-9][0-9]*\)/<h>600/' \
+ -e 's/<ignore>\("[a-z-]*"\)<\/ignore>//' \
+ < ~/.config/gentoo/gentoorc >gentoorc.in
+
+#
+# Remove any Subversion files, since we don't want those to be distributed.
+#
+dist-hook:
+ find $(top_distdir) -name .svn -type d | xargs rm -rf
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..fbc8ea2
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,384 @@
+This file documents additions, changes, and fixes made to gentoo.
+ Entries are grouped by the version of gentoo they apply to.
+The most recent fixes appear closer to the top of the file.
+ Entries for older versions of gentoo (the 0.15.x, 0.11.x
+and 0.9.x series) have been dropped from this document.
+
+0.20.7
+* Fixed bug that prevented setting the colors for a command button's
+ secondary (right-click) function. Reported by RickTee.
+* Tiny rewrite to how list entries are stored when reading directories
+ which on my system improved speed by around 30X. Suggested by RickTee.
+* Updated the GNU gettext machinery. Now requires gettext on your system
+ to support internationalization, instead of including the code in a
+ intl/ subdir in gentoo's code. Makes sense?
+* Fixed a bug that made gentoo's progress-reporting dialogs lack a
+ parent window, whch in turn made GTK+ emit warnings.
+
+
+0.20.6
+* Stopped using GtkAlignment widgets, since they are already dead in
+ some distro's GTK+ version. Reported by I. De Marchi.
+* Spanish and Catalan translations updated, thanks to I. De Marchi.
+* EPIC bug fix: there was a delay (!) call in the progress-reporting
+ dialog, which absolutely *murdered* gentoo's file I/O performance.
+ Of course, I didn't notice. But Matthias Haase (Fedora packager) did.
+ Thanks! I believe the bad code snuck in when I was working on the
+ progress dialog; it's actually useful then but should never have
+ been released. My apologies.
+
+
+0.20.5
+* We now require GTK+ 3.12. I've always aimed to stay current with GTK+,
+ and since development resources are very limited I can't afford to
+ track multiple release versions. "The latest in Ubuntu" is basically
+ how it works, and since my main workstation is on 14.10, that's it.
+* Fixed horrible bug with the width-tracking for pane columns, that
+ caused gentoo to consider the configuration changed every time you
+ started it.
+* Fixed crash bug when starting gentoo without a configuration, and
+ possibly other times as well.
+* Hunted down and fixed many cases of deprecated icon APIs used. Still
+ "lost" some icons due to GTK+ 3.x changes.
+* Noticed that the UI turns black in weird ways when running under
+ GTK+ 3.12.2 in Ubuntu 14.10. Cured by turning off GTK's hidden bars:
+ `gsettings set com.canonical.desktop.interface scrollbar-mode normal`.
+ I don't think this is a gentoo issue, it feels like a theme bug.
+* Cleaned up confused "Grab" button for the wrong window type on the
+ Windows configuration page. Grabbing works only for the main window.
+* Fixed bug that made GTK+ spew warnings when re-opening the Configuration
+ window. Harmless, but very annoying.
+* Tweaked how column widths are handled. We no longer support dragging
+ columns to change the width, you must change it numerically in the
+ settings. This is because it's hard to combine a fixed/tracked numerical
+ width with being able to manually resize the column.
+* Added some margin around the content of the Information window.
+* Added a new button labelled "Edit Command" on the Styles configuration
+ page, that (with a selected Action property using a custom command)
+ takes you to the "Definition" configuration page for that command.
+
+
+0.20.4
+* Updated Catalan and Spanish translations, thanks to I. De Marchi.
+* Did some code adjustments due to deprecations in the GTK+ 3.x APIs.
+
+
+0.20.3
+* Fixed fantastically silly mistake that broke the build, which I
+ failed to notice prior to releasing 0.20.2. Sometimes you really
+ get what you pay for, I guess. :|
+
+
+0.20.2
+* Fixed crash bug when adding a new Style. Reported by C. Herzog, thanks.
+* The DirSwap command wasn't changing the paths for each pane, which was
+ very confusing. Reported by C. Herzog.
+* Removed keybindings from the default config that used deprecated
+ commands, since that was kind of pointless. Reported by C. Herzog.
+* Fixed a bug that caused {Ix} checkboxes in command definition dialog
+ fields to fail (https://sourceforge.net/p/gentoo/bugs/79/). Herzog++!
+* Fixed bug that basically broke keybindings until the Configuration
+ window was opened and closed again.
+* Fixed bug with color-editing in the Configuration that made you have
+ to double-click to "activate" the selected color in order for the
+ selection to take. Now just clicking OK in the color dialog is enough.
+* Fixed sneaky bug (https://sourceforge.net/p/gentoo/bugs/78/) that
+ caused gentoo to crash when changing a File Style color. Reported by
+ C. Herzog.
+
+
+0.20.1
+* Ported gentoo to use (and require) GTK+ 3.0. This should not be a very
+ stringent requirement; GTK+ 3.0 is stable and the current main version
+ of the toolkit. There are some minor cosmetic changes as a result.
+* More reliance on GTK+'s styling, see "gentoogtkrc". In particular, the
+ main window is now named "gentoo", and the header buttons of the current
+ pane are all named "pane-current".
+* Command keyword matching is now case-sensitive, beware. This is because
+ the helpful insensitive comparison function has been deprecated in glib,
+ and doing it "properly" is somewhere between impossible and too much work.
+* Boolean command argument matching is also case-sensitive, now.
+* Command completion in the Run dialog now works slightly differently, more
+ in line with how GTK+ apps behave. No more in-place tab-completion, now
+ you get a pop-up and can use cursor keys to pick the match. This is due
+ to the GCompletion API that was used before now being deprecated in glib.
+* Removed some manually handled de-focusing of the active row for some
+ actions. Couldn't motivate that code any more, and at least one user found
+ it annoying. This resolves bug #3522441, reported by Skotlex. Thanks!
+* Added support for an 'E' selector in the {f} and {F} command interpolation
+ syntax, that removes the extensions from generated filenames. Extensions
+ are assumed to start at the first period. This resolves request #3519122,
+ suggested by Skotlex.
+* Added support for making a pane open up in the process' current directory,
+ as suggested in request #3486547. I'm a bit surprised that wasn't already
+ supported, heh.
+* Added support for optionally requesting "rules" in the pane trees, if the
+ GTK+ theme supports it. This will suppress any custom background color
+ in gentoo's Style. This addresses request #3231885.
+* The "Up/Down" arrow buttons used here and there in the UI now use GTK+'s
+ stock items instead, which look a bit nicer.
+* Fixed a GTK+ warning triggered by the SelectRE built-in command.
+* Added an option (--list-commands) that simply lists all built-in commands.
+ This is not very useful (the list was already visible in several places).
+* Removed the "DpFocus" command options page, since the focus-related things
+ are really changing and those flags could no longer be supported. Note that
+ the command itself is also a no-op, it will pop up a nag dialog if used.
+* More up-to-date paths shown for the --no-rc/--no-gtk-rc/--no-dir-history
+ options; wasn't mentioning the .config/ directory. This fixes #3534219.
+* Fixed some warnings found by compiling gentoo with LLVM's Clang compiler,
+ rather than GCC as I always have done.
+* Stopped escaping the Swedish national characters (å, ä and ö) in the XML
+ read and written by gentoo; this might break if you've used those in e.g.
+ labels, my apologies but it's for the best and should be quick to fix.
+* Changed the default icon search path to work better once gentoo is
+ installed. Suggested in http://sourceforge.net/p/gentoo/bugs/54/ by ManDay.
+
+
+0.19.14
+* Updated Spanish and Catalan translations, courtesy I. De Marchi.
+
+
+0.19.13
+* Made gentoo run better with all buttons (!) deleted, removing a
+ warning generated by GTK+.
+* Fixed bug that prevented the Information window from properly closing
+ when the window's close button was clicked. Could crash, instead.
+* Rewrote the core of the Move command; don't compute the size of the
+ items to move before trying the "fast" (same-device) move, since doing
+ so can take a very long time and totally kill the point of having a
+ fast move path in the first place. This greatly speeds up moving deep
+ hierarchies on the same device.
+* Fixed a typo that caused the Information window to show raw byte size
+ with periods as the thousands-separators, rather than commas.
+* Made the Goto popup in the text viewer go away when Return is pressed.
+
+
+0.19.12
+* The "Run" dialog didn't execute when Return was pressed.
+* Refactored the running of external commands, the check for requiring
+ a selection was done *after* the command definition was parsed,
+ causing use of e.g. {Fu} to fail since it unselects everything.
+ This addresses bug #3284458, thanks to Skotlex for analysis.
+* Added support for setting window "roles", a GTK+ feature which might
+ make it easier for window managers to position gentoo's windows.
+ This addresses bug #3406791, thanks to Skotlex for the suggestion.
+* Added quite hackish single-line code to force focus to the current
+ pane when gentoo comes back from being blocked by running an external
+ command. This makes the selection (if any) look correct.
+* Added a file chooser to the "list dialog" used for the Paths config
+ setting; double-click a path in the list to edit, then click the
+ magnifying glass to the right in the entry to access it.
+* Hard-coded a larger initial size for many of the dialog windows.
+* Pretty-printed the various byte sizes displayed by the Join command.
+* Implemented copying of "special files", i.e. character and block
+ devices, and FIFOs. Assumes the destination is in your local file
+ system, since ordinary POSIX calls are used. See bug #3239428.
+* Made the maximum buffer size used for copying files larger (16 MB).
+* Rewrote the core of the Join command to no longer block; now it's
+ possible to cancel an on-going join, and also to see its progress.
+* Updated Spanish and Catalan translations, courtesy I. De Marchi.
+
+
+0.19.11
+* Added a new configurable setting to the Rename command, which lets
+ you control the "pre-selection" of the old name that it does. You
+ can turn it off, or just have it select the part up to the first
+ dot which is often handy. Also, try Ctrl+Period when renaming.
+* Updated Spanish and Catalan translations, courtesy I. De Marchi.
+* Made most text-entry boxes automatically activate the default
+ choice in dialogs, so you can press Return to dismiss the dialog.
+ This addresses bug #3372329, reported by Skotlex.
+* Made the window used by the Information command configurable on
+ the Windows config page, so the size and position can be tracked.
+* When starting without a configuration file (and thus no configured
+ startup-path), default to file:/// to at least show something.
+* Made gentoo store its config files in ~/.config/gentoo, rather than
+ littering ~ with several dot-files. See bug #3174134.
+
+
+0.19.10
+* Updated gentoo to require GTK+ 2.24. This might be annoying to some
+ users, but upgrading GTK+ should be possible manually even if your
+ distribution doesn't yet ship it. I don't have the bandwidth to
+ support gentoo on multiple GTK+ versions, and Ubuntu uses 2.24.
+* Updated Catalan and Spanish translations, courtesy of Mr De Marchi.
+* Don't fail and abort if unable to monitor a folder for changes
+ (which happens easily when accessing e.g. remote smb:// folders).
+* When switching panes, make sure the newly activated pane also gets
+ the input focus. See bug #3232067.
+* Added an argument (select) to the DirParent command, that when will
+ (when set to true) select the just-left directory in the new view.
+ This addresses bug #3241286.
+* Re-introduced re-coloring of the pane headers to indicate which
+ pane is active. Currently the highlighting is hardcoded to be
+ toned-down version of the pane's selection color. See bug #3232136.
+* Added support for GTK+'s "rubber-band" selection mode, using which
+ you can click and drag to multi-select in a quite nice way.
+* Fixed horrible bug that made gentoo interpret Return in a dialog
+ as the left-most button, regardless of button focusing. This could
+ have nasty consequences in e.g. Delete (Skip -> OK). Reported in
+ bug #3285394 by Skotlex.
+* Fixed bug #3286621 (thanks to a patch by Skotlex) that crashed
+ gentoo when invoking SelectType and not doing so by direct mouse
+ binding. Neat.
+* Noticed that the Information command window actually didn't show
+ the size of the selected object(s), which was surprising. Fixed.
+* Also noticed that the file and directory counts in the Information
+ window weren't "pretty-printed" with thousands-separators. Fixed.
+* Made gentoo show the active pane's current directory in the main
+ window title bar. This addresses feature request #3232016.
+
+
+0.19.9
+* Bug fix: the introduction of rename in-place in 0.19.8 managed to
+ break double-click on directory and file names. Oops.
+* Made gentoo's configure.in script explicitly require a more recent
+ version of GTK+, to match the code. You need 2.18 or higher.
+* Added translations into Catalan (ca.po) and Spanish (es.po), from
+ (and by) Innocent De Marchi. Thanks a lot!
+* Added a previously forgotten string (the check button text of the
+ "nag" dialog that warns for some issues) translatable. Reported
+ as missing from the PO files by Mr De Marchi.
+* Incorporated a couple of spelling fixes to the German translation,
+ by Jens Seidel, sent in my Mr De Marchi. Thanks.
+* Fixed a few markup bugs in the manual page, reported by the ever-
+ vigilant Debian folks (again, through Mr De Marchi).
+* Made columns resizable directly in the pane, while tracking the
+ changes and updating the config. This fixes bug #3217499.
+
+
+0.19.8
+* Bug fix: gentoo sometimes failed to rescan directories in response
+ to change notifications from the GIO file-monitoring system. One
+ easily-triggered failure occurred when moving a file from the left
+ to the right pane; only the left would rescan.
+* Added a helpful dialog to the Split command that shows the various
+ codes available in the Name text entry box.
+* Added an option to the Rename command to make it support renaming
+ "in-place", i.e. by just editing the name directly in the pane.
+ This only works if there is exactly one selected item when Rename
+ is called.
+* Made the various sizes for command options display without useless
+ ".000" decimal part.
+* Fixed a bug that made some combo box labels not appear translated.
+* Fixes and improvements in the Swedish translation.
+
+
+0.19.7
+* The Split command was massively improved, now features a real-time
+ preview that shows the first and last names that will be generated.
+* Made error display a bit more flexible; now you can select that
+ all error (and status) messages be shown in the main window's
+ title bar, which suppresses the status bar altogether and thus will
+ let you save some vertical space. This addresses bug #3121230.
+* Improved window icon-setting, trying to make even more sure that all
+ gentoo windows have the same icon. Specifically, this makes the
+ command output capture window have an icon. See bug #3128013.
+* Moved the "CD Source?" and "CD Destination?" check boxes so they are
+ next to each other, saving some vertical space in the Commands config.
+* Re-implement "CD Source?" and "CD Destination?" using glib's spawn
+ API, but only for local paths. This addresses bug #3124829.
+* Bug fix: the RenameSeq command's UI code was a bit broken which
+ caused it to generate GTK+ warnings on the console.
+* Bug fix: the GetSize command's error handling was a bit shaky, it
+ often failed to properly report what went wrong.
+* The configuration window can now be shrunk to a lot smaller size than
+ before, and the right-hand side content will scroll as needed. This
+ addresses bug #3121235.
+* The "Nagging" configuration page was not hooked up to the gettext
+ system so it was untranslatable. Fixed, and translated to Swedish.
+
+
+0.19.6
+* Fixed a bug that caused position and size numbers to track badly on
+ the Window configuration page; especially typing values in went bad.
+* Add explicit GTK+ geometry hinting code to ensure that it's possible
+ to shrink the main window down to a very small (postage stamp) size.
+* Bug fix: the "Link Clone" command was broken, and generated a GIO
+ error to the console when used.
+* Bug fix: made the SymLinkEdit command behave properly if called with
+ no selection (it opens a dialog, letting you create a new link).
+* The ChOwn and ChMod commands now do an explicit refresh of the source
+ directory pane, since they failed to refresh automatically. This
+ addresses bug #3097322.
+* Converted a bunch of old constants from #defines into enums. Fresh.
+* Reworked handling of symbolic links, they should now work a whole
+ lot better (more like 0.15.x series). Links now behave more like their
+ targets when it comes to styling, sorting and so on.
+* The Information command shows a "yes" (green circle) or "no" (red)
+ icon next to the text box that holds the link target name, indicating
+ whether or not the target exists or not.
+
+
+0.19.5
+* Tweaked the command button layout a bit, so that buttons can now be
+ more narrow. See bug #3101048.
+* Fixed a bug that disabled the button row edit buttons, and made
+ them behave a bit erratically.
+* Fixed a bug that made it impossible to edit the "General" flags for
+ External-type command rows in the GUI.
+
+
+0.19.4
+* Replaced gentoo's custom command line parser with the one provided
+ by the glib library. This means much better support for help on the
+ options, and also for sub-group options for GTK+ itself.
+* Added support for the "changed" time content type. See for instance
+ man stat(2) for information about the differences between "changed"
+ and "modified", which are somewhat subtle. Also note that "created"
+ doesn't seem to work on regular EXT3 filesystems in Linux.
+* Implemented support for setting the font of the dir panes, with GUI
+ font picker and all. Maybe a bit late, but better late than never.
+* When expanding the {P} command code, hide any "file://" prefix that
+ might be present, since they confuse typical shell commands.
+
+
+0.19.3
+* A few build improvements that should make it easier to either figure
+ out why gentoo won't build, or simply make it work. Check for glib
+ version 2.24 or greater; check if -lm needed to find pow() function.
+* Remove use of GtkNotebookPage, helps building on GTK+ 2.22+.
+* Rewrote dirpane formatting for date (accessed, created, modified)
+ content, since it was completely broken. See Bug #3085097.
+* Translations actually work now, a very silly typo in the code had
+ accidentally disabled the gettext initialization code.
+* Added a few strings to the Swedish translation.
+
+
+0.19.2
+* Removed the "right click on path" command binding, since it didn't
+ actually work and I had forgotten it existed. Let's un-bloat a bit.
+* Added a DpMaximize builtin, which simply maximizes the current pane
+ (or the one given with the index=N argument).
+* Removed some uses of old GTK_WIDGET macros that have been finally
+ removed in GTK+ 2.20.0, preventing gentoo 0.19.1 from building.
+* The manual page (in docs/gentoo.1x in the source archive) is now
+ more correct regarding gentoo's command-line options.
+
+
+0.19.1
+* Ported gentoo to use GIO, a virtualizing file system layer that
+ is part of the GTK+/glib family of APIs. Note that there is no
+ mounting support in this release, mounting and auto-mounting are
+ in need of an overhaul, and there didn't seem to be any point in
+ keeping the legacy /etc/fstab-driven support.
+* gentoo is now totally GTK+ 2.x clean, there are no GTK+ 1.2 widgets
+ being used. This means the main panes are now GtkTreeViews.
+* Because of the port to GIO, case-sensitive sorting is weaker now.
+* Block sizes for files have been deemed legacy, and support is
+ largely removed.
+* Double-clicking the status bar at the top opens the About window.
+* There are new strings, but the translators have not been contacted
+ prior to the release. If you run gentoo in a non-English langauge,
+ feel free to get in touch with me about translation issues. Maybe
+ you can help out?
+* The built-in text viewer has been made encoding-aware; see the new
+ ViewText 'encoding' argument to specify source encoding. Note that
+ gentoo does not contain code to auto-detect encoding; that's hard.
+* The Information command has gained a secondary page, that shows all
+ GIO properties for the selected file.
+* There is a new Rerun command which re-runs the last command executed
+ by the Run command.
+* The Split command finally has had its missing other mode (fixed
+ number of parts) implemented, after ~12 years without it. The
+ other mode has also gained a few more built-in part sizes.
diff --git a/README b/README
new file mode 100644
index 0000000..289b062
--- /dev/null
+++ b/README
@@ -0,0 +1,96 @@
+ 2016-06-15
+ Emil Brink
+
+ gentoo v0.20.7
+
+INTRODUCTION
+gentoo is a graphical file management program, written from
+scratch in C. It uses the GTK+ toolkit for its interface.
+gentoo is developed and tested primarily under Linux, but is
+known to compile and work on many other Unix-like operating
+systems as well.
+ One of the design goals with gentoo has been to provide
+extensive customization and configuration abilities, and to do
+so from an integrated, graphic, interface. The user should not
+have to edit the configuration file directly "by hand", and
+especially not have to restart the program for changes to take
+effect.
+ gentoo features a fairly complex and powerful system
+for file type recognition, coupled to an object-oriented style
+system, which together give you a lot of control over how files
+of different types are displayed and acted upon.
+
+
+LICENSING
+This software is Copyright (c) 1998-2016 by Emil Brink.
+ You are free to distribute this software under the terms
+of the GNU General Public License, version 2. You should have
+received a copy of this license together with the software (in a
+file called COPYING). If not, and you have web access, check
+<http://www.gnu.org/>.
+ It is important to realize that this software comes
+without ANY form of warranty.
+
+
+THE AUTHOR
+gentoo was written by Emil Brink. It is my first program to use
+GTK+, my first major Linux application, and my first program
+released in source form under the GPL, but it's absolutely _not_
+my first program. ;^)
+ Work on gentoo started in May 1998, when I decided it
+would be fun to learn the GTK+ interface toolkit. The first
+actual release of gentoo was called version 0.9.0, and made
+its public appearance back in September 1998.
+ Please send questions, answers, bug reports, praise (?)
+and critique straight to <emil@obsession.se>. I am listening.
+Also, please do try to include the word "gentoo" in the subject
+of your e-mail, to help me manage my e-mail. Thank you.
+
+
+RELEASE NOTES
+This fixes directory reading which was very slow for any realistically
+sized directory. I can't believe I didn't find this earlier. Sorry.
+ As always, see the NEWS file for details.
+
+
+FOR INTERNATIONAL USERS
+The translations are more or less perpetually broken due to me not
+having very tight communications with the various people who have
+volunteered to do translations. My apologies. If you are a trans-
+lator, please feel free to send updated PO files at any time. Thanks.
+ This means that the only two languages recommeded for use right
+now are English, which is built-in, and Swedish, which is translated by
+me and kept up to date.
+ Feel free to contact the translators, or perhaps pick up the
+gauntlet yourself if the current situation annoys you.
+
+
+FOR MORE INFORMATION...
+* If you are a new user, *please* read the man page.
+* Instructions about how to build an executable are provided in
+ the file INSTALL, as usual.
+* For (sometimes very technical and code-centric) notes on
+ exactly what's happened in this release, check out the NEWS
+ file. I recommend reading it on each new release.
+* Details about gentoo's support for GUI customization through
+ the use of GTK+ RC files are in the README.gtkrc file.
+* For information about known problems, quirks and general
+ developer headaches, please see the BUGS file. To report a
+ bug, go to:
+ <http://sourceforge.net/tracker/?atid=406763&group_id=32880&func=browse>.
+* There is a TODO file, containing a few major things I have
+ planned/want to see implemented.
+
+
+DOCUMENTATION
+The documentation that is available is incomplete and sort of
+out of date. I'm sorry about that. Hopefully, I will find the
+time and energy in the future to do a complete rewrite of the
+documentation, since much has changed and been added since it
+was written.
+ There is a short manpage that touches the bare essentials,
+in "docs/gentoo.1x". Please read it.
+ There is some reasonably modern documentation in plain
+text format in some files in "docs/scratch/". Read those, too.
+
+/Emil
diff --git a/README.NLS b/README.NLS
new file mode 100644
index 0000000..bf5f7c9
--- /dev/null
+++ b/README.NLS
@@ -0,0 +1,37 @@
+ 2002-08-09
+ Emil Brink
+
+ Translating gentoo
+
+1. INTRODUCTION
+This document talks a bit about translating gentoo into languages other
+than English.
+
+The intended audience is people who are interested in doing the required
+work to actually translate gentoo into their native tongue, and work with
+me to get the translation into the distributed archive.
+
+
+2. BECOMING A TRANSLATOR
+It's easy. Decide which language you wish to translate gentoo into, surf
+up the standard code for that language (the GNU gettext docs has a list,
+here: http://www.gnu.org/manual/gettext/html_chapter/gettext_15.html#SEC221),
+and write me a mail.
+
+Do *NOT* just blindly start translating; *do* get in touch with me first,
+so that I know who is doing what, and can prevent unnecessary repeated
+efforts. Mail me at <emil at obsession.se>, and include the word "gentoo"
+in your Subject line. Thanks.
+
+
+3. THE TOOLS
+gentoo uses the GNU gettext package for its internationalization needs;
+you should be at least somewhat familiar with it. Read the manual, it's
+good if a bit long.
+
+
+4. RELEASES
+Since gentoo is "development"-status software, and releases are sometimes
+very frequent (like, two per week sometimes), I will not even attempt to
+synchronize with translators for every release. This means translations
+may easily become slightly out of date, but that's fine by me.
diff --git a/README.gtkrc b/README.gtkrc
new file mode 100644
index 0000000..c8173b2
--- /dev/null
+++ b/README.gtkrc
@@ -0,0 +1,68 @@
+ 1999-01-09
+ Emil Brink
+
+ GTK+ RC files in gentoo
+
+INTRODUCTION
+This little file introduces the use of GTK+ RC files in gentoo. If
+you don't know what "gentoo" or GTK+ is, you should ask yourself
+why you're reading this file in the first place. :^)
+ If you don't know what a "GTK+ RC file" is, you can either
+ignore this document, or, if you'd like to customize the look of all
+GTK+ widgets used by gentoo, read on!
+
+
+WHAT IS IMPLEMENTED
+As of version 0.9.15, gentoo knows about and loads a GTK+ RC file on
+startup. This allows you to customize the look (e.g. fonts, colors,
+and pixmaps) of widgets used in the program.
+ Release 0.9.18 adds names to the two column lists widgets
+used as the main directory panes, as well as the text widget used
+by command output capture and the ViewText command. A listing of
+widget names appears in the example GTK+ RC file.
+ Version 0.9.22 adds a name to the "Preview"-column list
+used in the File Styles config page. This should be set to the same
+style as the panes themselves, to get an accurate preview.
+ Except for the widgets mentioned above, no widgets in
+gentoo have names. To affect their look, you have to use the class
+name.
+
+
+NAMING THE FILE
+When starting up, gentoo will load a GTK+ RC file after reading its
+own config file (.gentoorc). This order allows you to control which
+GTK+ RC file is used, by giving its path in the ordinary config.
+ Currently, the name of the GTK+ RC file read by gentoo is
+always ".gentoogtkrc" (note the dot).
+ You can use the "GTK+ RC" path (on the Paths config tab) to
+control where gentoo will look for the GTK+ RC. The default value
+for this path is simply "$HOME", which will make gentoo look in your
+home directory for the file (yes, gentoo paths can contain environ-
+ment variable look-ups).
+ There is no notion of a site-wide GTK+ RC. If you want
+gentoo to look for one anyway, append ":/usr/local/lib/gentoo" to
+the path, and put the desired file there. Don't forget to name it
+WITH a dot (unlike the site-wide normal gentoorc).
+
+
+THE SUPPLIED EXAMPLE
+Included in the distribution archive is a sample of a GTK+ RC file,
+called "gentoogtkrc-example". It is very short and simple; it just
+sets the panes' fonts to Courier. To use this file, copy it to a
+dir included in gentoo's GTK+ RC search path. Don't forget to also
+rename it to ".gentoogtkrc", minding the dot as always.
+
+
+DISABLING GTK+ RC SUPPORT
+If you don't want gentoo to read any GTK+ RC file, there are two
+ways of accomplishing that.
+ One easy and permanent way is to remove the file. Since it's
+not considered an error by gentoo to fail to open the GTK+ RC file,
+this will not produce any annoying error messages or warnings. It
+will just quietly turn off GTK+ RC loading.
+ If you're after something less permanent, you could always
+use the command-line option "--no-gtkrc". If started with this
+option, gentoo will not load any GTK+ RC file.
+
+
+/Emil
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..f2fe94c
--- /dev/null
+++ b/TODO
@@ -0,0 +1,78 @@
+ 2012-06-02
+
+ Emil Brink
+
+
+ Things left to do in gentoo
+ (hey, it rhymes!)
+
+0. INTRODUCTION
+This little file lists things that I have planned for future
+versions of gentoo.
+ Please note that gentoo is free software, developed in
+my spare time, and distributed free of charge. Therefore, please
+don't take the things mentioned in here as promises: I might
+implement all of these, or I might implement none of them. Also,
+things are likely to be added/removed from this list as time
+passes by and I think things through more.
+ The purpose of this list is to allow users of gentoo a
+way of knowing what to expect from the program, not to generate
+mail of the form "when will feature X be implemented?". Please
+respect this. :)
+
+
+NOTE: Please also see the Feature Request tracker at
+<https://sourceforge.net/tracker/?group_id=32880&atid=406766>.
+
+
+1. IDEAS
+Here are the ideas, presented in one subsection each. Enjoy!
+
+1.1 Write a Menu Editor
+The buttons used in the button bank below the panes support
+individual pop-up menus; but there is currently no way of
+defining and attaching menus to them. Writing a fully-fledged
+menu editor is a lot of work, and I'm close to thinking of
+it as duplicated effort, since a menu editor exists in e.g.
+Glade already.
+ Having a menu editor would allow users to attach their
+own menus to every command button. Seldom used commands could
+be moved from a button of their own to a related button's
+menu, thus saving valuable screen real estate in the button
+bank.
+ The menu that is typically bound to the right mouse
+button in the panes would of course be editable as well, and
+the MenuPopup command would be extended to take the name of
+the menu to show as an argument. The latter would allow things
+like shift-RMB to pop up a different menu in the panes...
+UPDATE: As of gentoo 0.11.16, there actually is some general
+ code for menu management built into gentoo (it's in
+ the "menus.c" file). No editor has yet been designed,
+ though... I find I have conceptual problems with de-
+ ciding on just what a menu really *is*. Weird, huh?
+
+1.2 Generalize Buttons
+The command buttons displayed under the panes are very general
+internally, where they are represented as a specific "sheet"
+of buttons. I plan to add ways to add and delete button sheets,
+and also lay out the sheets in the window. The layout interface
+is what's currently holding this off.
+
+1.3 Drag and Drop
+This is perhaps the #1 requested feature, and it's still not
+there. This is because of several things. One is that I'm not
+at all sure how it should work. Should gentoo support DnD only
+internally, or also to/from the external environment? In that
+case, do I need to write specific code for the various kinds of
+environments in use? I hope not...
+ Furthermore, there's the practical problem of how to
+trigger a drag action. Clicking and dragging is already in use
+in gentoo to select files, and I really want to keep that. One
+idea is to use "horizontal" drags to trigger DnD, leaving the
+vertical ones for selection. Unfortunately, my investigations
+show that GTK+ won't support that. Next idea, please.
+ Another scary thing with DnD is semantics. What should
+happen if a set of files is dragged from one pane and dropped
+in the other? Should the files be copied, copied as, moved,
+moved as, symlinked, or what? What if you drop stuff on a
+button?
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..1b7e5ed
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1684 @@
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Configure paths for GTK+
+# Owen Taylor 1997-2001
+
+dnl AM_PATH_GTK_3_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES,
+dnl pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GTK_3_0],
+[m4_warn([obsolete], [AM_PATH_GTK_3_0 is deprecated, use PKG_CHECK_MODULES([GTK], [gtk+-3.0]) instead])
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(gtktest, [ --disable-gtktest do not try to compile and run a test GTK+ program],
+ , enable_gtktest=yes)
+ min_gtk_version=ifelse([$1], [], [3.0.0], [$1])
+
+ pkg_config_args="gtk+-3.0 >= $min_gtk_version"
+ for module in . $4
+ do
+ case "$module" in
+ gthread)
+ pkg_config_args="$pkg_config_args gthread-2.0"
+ ;;
+ esac
+ done
+
+ no_gtk=""
+
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+ if test x$PKG_CONFIG != xno ; then
+ if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+ :
+ else
+ echo "*** pkg-config too old; version 0.7 or better required."
+ no_gtk=yes
+ PKG_CONFIG=no
+ fi
+ else
+ no_gtk=yes
+ fi
+
+ AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version)
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+ enable_gtktest=no
+ fi
+
+ if $PKG_CONFIG $pkg_config_args; then
+ :
+ else
+ no_gtk=yes
+ fi
+ fi
+
+ if test x"$no_gtk" = x ; then
+ GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+ GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+ gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK+ is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+ rm -f conf.gtktest
+ AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ unsigned int major, minor, micro;
+
+ fclose (fopen ("conf.gtktest", "w"));
+
+ if (sscanf("$min_gtk_version", "%u.%u.%u", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'pkg-config --modversion gtk+-3.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
+ }
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%u.%u.%u) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %u.%u.%u. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version))
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://pkgconfig.sourceforge.net"
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK+ test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+ echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GTK_CFLAGS)
+ AC_SUBST(GTK_LIBS)
+ rm -f conf.gtktest
+])
+
+dnl GTK_CHECK_BACKEND(BACKEND-NAME [, MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Tests for BACKEND-NAME in the GTK targets list
+dnl
+AC_DEFUN([GTK_CHECK_BACKEND],
+[m4_warn([obsolete], [GTK_CHECK_BACKEND is deprecated, use PKG_CHECK_MODULES([GTK_X11], [gtk+-x11-3.0]) or similar instead])
+ pkg_config_args=ifelse([$1],,gtk+-3.0, gtk+-$1-3.0)
+ min_gtk_version=ifelse([$2],,3.0.0,$2)
+ pkg_config_args="$pkg_config_args >= $min_gtk_version"
+
+ AC_PATH_PROG(PKG_CONFIG, [pkg-config], [AC_MSG_ERROR([No pkg-config found])])
+
+ if $PKG_CONFIG $pkg_config_args ; then
+ target_found=yes
+ else
+ target_found=no
+ fi
+
+ if test "x$target_found" = "xno"; then
+ ifelse([$4],,[AC_MSG_ERROR([Backend $backend not found.])],[$4])
+ else
+ ifelse([$3],,[:],[$3])
+ fi
+])
+
+dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29.1)
+dnl
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_default([$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes ],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ AC_MSG_RESULT([no])
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+ ])
+elif test $pkg_failed = untried; then
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+ ])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+ [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+ [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.15'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.15], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.15])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# -*- Autoconf -*-
+# Obsolete and "removed" macros, that must however still report explicit
+# error messages when used, to smooth transition.
+#
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([AM_CONFIG_HEADER],
+[AC_DIAGNOSE([obsolete],
+['$0': this macro is obsolete.
+You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl
+AC_CONFIG_HEADERS($@)])
+
+AC_DEFUN([AM_PROG_CC_STDC],
+[AC_PROG_CC
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+AC_DIAGNOSE([obsolete],
+['$0': this macro is obsolete.
+You should simply use the 'AC][_PROG_CC' macro instead.
+Also, your code should no longer depend upon 'am_cv_prog_cc_stdc',
+but upon 'ac_cv_prog_cc_stdc'.])])
+
+AC_DEFUN([AM_C_PROTOTYPES],
+ [AC_FATAL([automatic de-ANSI-fication support has been removed])])
+AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/gettext.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..a85b723
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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, 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, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100644
index 0000000..34093cc
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1535 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-07-22'
+
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+if [ "${UNAME_SYSTEM}" = "Linux" ] ; then
+ eval $set_cc_for_build
+ cat << EOF > $dummy.c
+ #include <features.h>
+ #ifdef __UCLIBC__
+ # ifdef __UCLIBC_CONFIG_VERSION__
+ LIBC=uclibc __UCLIBC_CONFIG_VERSION__
+ # else
+ LIBC=uclibc
+ # endif
+ #else
+ LIBC=gnu
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'`
+fi
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:[3456]*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T | authenticamd)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-${LIBC}
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-${LIBC}
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-${LIBC}
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-${LIBC}
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-${LIBC}
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-${LIBC}
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+ *) echo hppa-unknown-linux-${LIBC} ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-${LIBC}
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-${LIBC}
+ exit ;;
+ xtensa:Linux:*:*)
+ echo xtensa-unknown-linux-${LIBC}
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld"
+ exit ;;
+ esac
+ # This should get integrated into the C code below, but now we hack
+ if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..18aa756
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,124 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Whether debug code should be compiled in. */
+#undef DEBUG
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Makes GTK+ disable old 1.0.6 compatibility. */
+#undef GTK_DISABLE_COMPAT_H
+
+/* Makes GTK+ disable all backward support for old widgets and API:s. */
+#undef GTK_DISABLE_DEPRECATED
+
+/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+ CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
+#undef HAVE_DCGETTEXT
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Whether the file command supports -f - -n options. */
+#undef HAVE_GOOD_FILE
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..a3e25c8
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2015 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ nagfor*)
+ wl='-Wl,-Wl,,'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ F* | *Sun*Fortran*)
+ wl=
+ ;;
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ newsos6)
+ ;;
+ *nto* | *qnx*)
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ wl='-Qoption ld '
+ ;;
+ *)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ haiku*)
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd2.[01]*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ *nto* | *qnx*)
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc*)
+ library_names_spec='$libname$shrext' ;;
+ m68k)
+ library_names_spec='$libname.a' ;;
+ esac
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ freebsd* | dragonfly*)
+ library_names_spec='$libname$shrext'
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ haiku*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ *nto* | *qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ tpf*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/config.sub b/config.sub
new file mode 100644
index 0000000..63cdd0a
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1644 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-06-28'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx | dvp \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mipsEE* | ee | ps2)
+ basic_machine=mips64r5900el-scei
+ case $os in
+ -linux*)
+ ;;
+ *)
+ os=-elf
+ ;;
+ esac
+ ;;
+ iop)
+ basic_machine=mipsel-scei
+ os=-irx
+ ;;
+ dvp)
+ basic_machine=dvp-scei
+ os=-elf
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..b0b888e
--- /dev/null
+++ b/configure
@@ -0,0 +1,9688 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for gentoo 0.20.7.
+#
+# Report bugs to <emil@obsession.se>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and emil@obsession.se
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gentoo'
+PACKAGE_TARNAME='gentoo'
+PACKAGE_VERSION='0.20.7'
+PACKAGE_STRING='gentoo 0.20.7'
+PACKAGE_BUGREPORT='emil@obsession.se'
+PACKAGE_URL='http://obsession.se/gentoo/'
+
+ac_unique_file="src/gentoo.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+gt_needs=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+POSUB
+LTLIBINTL
+LIBINTL
+INTLLIBS
+LTLIBICONV
+LIBICONV
+INTL_MACOSX_LIBS
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+XGETTEXT_EXTRA_OPTIONS
+MSGMERGE
+XGETTEXT_015
+XGETTEXT
+GMSGFMT_015
+MSGFMT_015
+GMSGFMT
+MSGFMT
+GETTEXT_MACRO_VERSION
+USE_NLS
+SED
+MODULES_LIBS
+MODULES_CFLAGS
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+GTK_LIBS
+GTK_CFLAGS
+PKG_CONFIG
+RANLIB
+GENTOO_CFLAGS
+DATE
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+enable_debug
+enable_gtktest
+enable_nls
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_libintl_prefix
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+MODULES_CFLAGS
+MODULES_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures gentoo 0.20.7 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/gentoo]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of gentoo 0.20.7:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-debug have debug info compiled in
+ --disable-gtktest do not try to compile and run a test GTK+ program
+ --disable-nls do not use Native Language Support
+ --disable-rpath do not hardcode runtime library paths
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
+ --without-libiconv-prefix don't search for libiconv in includedir and libdir
+ --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib
+ --without-libintl-prefix don't search for libintl in includedir and libdir
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+ MODULES_CFLAGS
+ C compiler flags for MODULES, overriding pkg-config
+ MODULES_LIBS
+ linker flags for MODULES, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <emil@obsession.se>.
+gentoo home page: <http://obsession.se/gentoo/>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+gentoo configure 0.20.7
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------- ##
+## Report this to emil@obsession.se ##
+## -------------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gentoo $as_me 0.20.7, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+gt_needs="$gt_needs "
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+am__api_version='1.15'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gentoo'
+ VERSION='0.20.7'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
+ MINIX=yes
+else
+ MINIX=
+fi
+
+
+ if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_safe_to_define___extensions__=yes
+else
+ ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+ test $ac_cv_safe_to_define___extensions__ = yes &&
+ $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+ $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+ $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+ $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+ $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+
+
+
+$as_echo "#define GTK_DISABLE_DEPRECATED 1" >>confdefs.h
+
+
+$as_echo "#define GTK_DISABLE_COMPAT_H 1" >>confdefs.h
+
+
+DATE=`date +%Y-%m-%d`
+
+
+
+# -----------------------------------------------------------------------------
+# Checks
+# -----------------------------------------------------------------------------
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+# Don't just call it CFLAGS, since it then gets inherited into intl/, and GNU
+# and I don't exactly code alike. Don't include CFLAGS as set by AC_PROG_CC
+# above, since it includes -g -O2 for gcc, for reasons unknown.
+GENTOO_CFLAGS="-Wall -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Werror-implicit-function-declaration"
+
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+ enableval=$enable_debug; if test "x$enableval" = "xyes"; then
+
+$as_echo "#define DEBUG 1" >>confdefs.h
+
+ GENTOO_CFLAGS="$GENTOO_CFLAGS -g -pg"
+ else
+
+$as_echo "#define DEBUG 0" >>confdefs.h
+
+ GENTOO_CFLAGS="$GENTOO_CFLAGS -O2"
+ fi
+fi
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+# Check whether --enable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then :
+ enableval=$enable_gtktest;
+else
+ enable_gtktest=yes
+fi
+
+ min_gtk_version=3.12.0
+
+ pkg_config_args="gtk+-3.0 >= $min_gtk_version"
+ for module in .
+ do
+ case "$module" in
+ gthread)
+ pkg_config_args="$pkg_config_args gthread-2.0"
+ ;;
+ esac
+ done
+
+ no_gtk=""
+
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ if test x$PKG_CONFIG != xno ; then
+ if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+ :
+ else
+ echo "*** pkg-config too old; version 0.7 or better required."
+ no_gtk=yes
+ PKG_CONFIG=no
+ fi
+ else
+ no_gtk=yes
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK+ - version >= $min_gtk_version" >&5
+$as_echo_n "checking for GTK+ - version >= $min_gtk_version... " >&6; }
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+ enable_gtktest=no
+ fi
+
+ if $PKG_CONFIG $pkg_config_args; then
+ :
+ else
+ no_gtk=yes
+ fi
+ fi
+
+ if test x"$no_gtk" = x ; then
+ GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+ GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+ gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+ gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+ gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+ rm -f conf.gtktest
+ if test "$cross_compiling" = yes; then :
+ echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ unsigned int major, minor, micro;
+
+ fclose (fopen ("conf.gtktest", "w"));
+
+ if (sscanf("$min_gtk_version", "%u.%u.%u", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'pkg-config --modversion gtk+-3.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
+ }
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%u.%u.%u) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %u.%u.%u. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ no_gtk=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&5
+$as_echo "yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&6; }
+ :
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://pkgconfig.sourceforge.net"
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK+ test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int
+main ()
+{
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+ echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+else
+ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ as_fn_error $? "Bad GTK+ version" "$LINENO" 5
+ fi
+
+
+ rm -f conf.gtktest
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MODULES" >&5
+$as_echo_n "checking for MODULES... " >&6; }
+
+if test -n "$MODULES_CFLAGS"; then
+ pkg_cv_MODULES_CFLAGS="$MODULES_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 gthread-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-2.0 gthread-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_MODULES_CFLAGS=`$PKG_CONFIG --cflags "gio-2.0 gthread-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$MODULES_LIBS"; then
+ pkg_cv_MODULES_LIBS="$MODULES_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 gthread-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-2.0 gthread-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_MODULES_LIBS=`$PKG_CONFIG --libs "gio-2.0 gthread-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ MODULES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gio-2.0 gthread-2.0" 2>&1`
+ else
+ MODULES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gio-2.0 gthread-2.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$MODULES_PKG_ERRORS" >&5
+
+ as_fn_error $? "GIO and gthread are both required" "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ as_fn_error $? "GIO and gthread are both required" "$LINENO" 5
+else
+ MODULES_CFLAGS=$pkg_cv_MODULES_CFLAGS
+ MODULES_LIBS=$pkg_cv_MODULES_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ dummy=yes
+fi
+
+
+
+
+# Let's try to test if the host supports "file -f - -n", i.e. if the file
+# command can read file names from stdin (-f -) and also flush (-n) its
+# answers as soon as possible. This is a highly desirable combination of
+# capabilities from gentoo's point of view. I encourage everyone to upgrade
+# their file commands if they fail this test.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether file understands -f - -n option combo" >&5
+$as_echo_n "checking whether file understands -f - -n option combo... " >&6; }
+if ( echo "." | file -f - -n >/dev/null 2>/dev/null ) ; then
+
+$as_echo "#define HAVE_GOOD_FILE 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"
+ This system's 'file' command (\`which file\`) doesn't seem to\"
+ support the '-f - -n' option combination. gentoo's 'file' usage\"
+ will be limited. Consider upgrading to the version of 'file'\"
+ from <ftp://ftp.astron.com/pub/file/>, version 3.35 or later.\"
+ At the moment, you will not lose any crucial functionality by\"
+ running gentoo with a different 'file' command, although this\"
+ may change in the future.\"" >&5
+$as_echo "$as_me: WARNING: \"
+ This system's 'file' command (\`which file\`) doesn't seem to\"
+ support the '-f - -n' option combination. gentoo's 'file' usage\"
+ will be limited. Consider upgrading to the version of 'file'\"
+ from <ftp://ftp.astron.com/pub/file/>, version 3.35 or later.\"
+ At the moment, you will not lose any crucial functionality by\"
+ running gentoo with a different 'file' command, although this\"
+ may change in the future.\"" >&2;}
+fi
+
+
+# For my next trick, let's see if _FILE_OFFSET_BITS can be played with for large file support.
+# We do this in two steps: first figure out struct stat's st_size member's size for a "plain
+# compile, and it that's just 32 we try again with _FILE_OFFSET_BITS=64 defined. If that works,
+# we simply build gentoo with it and hope for the best.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking number of bits in st_size field" >&5
+$as_echo_n "checking number of bits in st_size field... " >&6; }
+bits="test failed"
+# Put the entire testing program into a variable, for easier re-use below.
+bitstest=`cat <<TESTPROG_EOF
+ #include <limits.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+
+ int main(void)
+ {
+ struct stat stbuf;
+ FILE *out;
+
+ if((out = fopen("conftest.statbits", "wt")) != NULL)
+ {
+ fprintf(out, "%d\n", CHAR_BIT * sizeof stbuf.st_size);
+ fclose(out);
+ }
+ exit(out != NULL ? EXIT_SUCCESS : EXIT_FAILURE);
+ }
+TESTPROG_EOF`
+if test "$cross_compiling" = yes; then :
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$bitstest
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ bits=`cat conftest.statbits`
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bits" >&5
+$as_echo "$bits" >&6; }
+if test "x$bits" = "x32" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking again, with -D_FILE_OFFSET_BITS=64" >&5
+$as_echo_n "checking again, with -D_FILE_OFFSET_BITS=64... " >&6; }
+ oldflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE"
+ bits="test failed"
+ if test "$cross_compiling" = yes; then :
+ CPPFLAGS=$oldflags
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$bitstest
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ bits=`cat conftest.statbits`
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bits" >&5
+$as_echo "$bits" >&6; }
+fi
+
+# Check if the math library needs to be linked to explicitly in order to
+# get the pow() function.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5
+$as_echo_n "checking for pow in -lm... " >&6; }
+if ${ac_cv_lib_m_pow+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pow ();
+int
+main ()
+{
+return pow ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_m_pow=yes
+else
+ ac_cv_lib_m_pow=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5
+$as_echo "$ac_cv_lib_m_pow" >&6; }
+if test "x$ac_cv_lib_m_pow" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+
+
+
+# Kick the gettext subsystem into action.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+$as_echo_n "checking whether NLS is requested... " >&6; }
+ # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then :
+ enableval=$enable_nls; USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+
+
+
+
+ GETTEXT_MACRO_VERSION=0.19
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$MSGFMT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+ *) MSGFMT_015=$MSGFMT ;;
+ esac
+
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$XGETTEXT" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ rm -f messages.po
+
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case "$MSGMERGE" in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&5
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$localedir" || localedir='${datadir}/locale'
+
+
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+ ac_config_commands="$ac_config_commands po-directories"
+
+
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${acl_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${acl_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+$as_echo_n "checking for shared library run path origin... " >&6; }
+if ${acl_cv_rpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+$as_echo "$acl_cv_rpath" >&6; }
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then :
+ enableval=$enable_rpath; :
+else
+ enable_rpath=yes
+fi
+
+
+
+
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+ gl_cv_solaris_64bit=yes
+else
+ gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+ withval=$with_libiconv_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+
+fi
+
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ LIBICONV_PREFIX=
+ HAVE_LIBICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
+if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+ gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
+if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gt_cv_func_CFLocaleCopyCurrent=yes
+else
+ gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+
+
+
+
+
+
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+
+
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+$as_echo_n "checking for GNU gettext in libc... " >&6; }
+if eval \${$gt_func_gnugettext_libc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$gt_func_gnugettext_libc=yes"
+else
+ eval "$gt_func_gnugettext_libc=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$gt_func_gnugettext_libc
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+
+
+
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ if test "$cross_compiling" = yes; then :
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
+{
+int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ result |= 16;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then :
+ withval=$with_libintl_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+
+fi
+
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ LIBINTL_PREFIX=
+ HAVE_LIBINTL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='intl '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+$as_echo_n "checking for GNU gettext in libintl... " >&6; }
+if eval \${$gt_func_gnugettext_libintl+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$gt_func_gnugettext_libintl=yes"
+else
+ eval "$gt_func_gnugettext_libintl=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"
+fi
+eval ac_res=\$$gt_func_gnugettext_libintl
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ fi
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+
+
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+$as_echo "#define ENABLE_NLS 1" >>confdefs.h
+
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+$as_echo_n "checking whether to use NLS... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+ if test "$USE_NLS" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+$as_echo_n "checking where the gettext function comes from... " >&6; }
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+$as_echo "$gt_source" >&6; }
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+$as_echo_n "checking how to link with libintl... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+$as_echo "$LIBINTL" >&6; }
+
+ for element in $INCINTL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+ fi
+
+
+$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
+
+ fi
+
+ POSUB=po
+ fi
+
+
+
+ INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+
+# -----------------------------------------------------------------------------
+# Output
+# -----------------------------------------------------------------------------
+
+ac_config_headers="$ac_config_headers config.h"
+
+ac_config_files="$ac_config_files gentoorc gentoogtkrc gentoo.spec Makefile icons/Makefile src/Makefile po/Makefile.in m4/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gentoo $as_me 0.20.7, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <emil@obsession.se>.
+gentoo home page: <http://obsession.se/gentoo/>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+gentoo config.status 0.20.7
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake < 1.5.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "gentoorc") CONFIG_FILES="$CONFIG_FILES gentoorc" ;;
+ "gentoogtkrc") CONFIG_FILES="$CONFIG_FILES gentoogtkrc" ;;
+ "gentoo.spec") CONFIG_FILES="$CONFIG_FILES gentoo.spec" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "icons/Makefile") CONFIG_FILES="$CONFIG_FILES icons/Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ case $CONFIG_FILES in
+ *\'*) eval set x "$CONFIG_FILES" ;;
+ *) set x $CONFIG_FILES ;;
+ esac
+ shift
+ for mf
+ do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named 'Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+ dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running 'make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "$am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir=$dirpart/$fdir; as_fn_mkdir_p
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+ done
+}
+ ;;
+ "po-directories":C)
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..393665b
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,129 @@
+# -----------------------------------------------------------------------------
+# Initialize everything
+# -----------------------------------------------------------------------------
+
+AC_INIT([gentoo], [0.20.7], [emil@obsession.se], , http://obsession.se/gentoo/)
+AC_CONFIG_SRCDIR([src/gentoo.c])
+AM_INIT_AUTOMAKE
+
+AC_USE_SYSTEM_EXTENSIONS
+
+AC_DEFINE(GTK_DISABLE_DEPRECATED, [1], [Makes GTK+ disable all backward support for old widgets and API:s.])
+AC_DEFINE(GTK_DISABLE_COMPAT_H, [1], [Makes GTK+ disable old 1.0.6 compatibility.])
+
+DATE=`date +%Y-%m-%d`
+
+AC_SUBST(DATE)
+
+# -----------------------------------------------------------------------------
+# Checks
+# -----------------------------------------------------------------------------
+
+AC_PROG_CC
+
+# Don't just call it CFLAGS, since it then gets inherited into intl/, and GNU
+# and I don't exactly code alike. Don't include CFLAGS as set by AC_PROG_CC
+# above, since it includes -g -O2 for gcc, for reasons unknown.
+GENTOO_CFLAGS="-Wall -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Werror-implicit-function-declaration"
+
+AC_ARG_ENABLE(debug,
+ [ --enable-debug have debug info compiled in],
+ [ if test "x$enableval" = "xyes"; then
+ AC_DEFINE(DEBUG, 1, [Whether debug code should be compiled in.])
+ GENTOO_CFLAGS="$GENTOO_CFLAGS -g -pg"
+ else
+ AC_DEFINE(DEBUG, 0, [Whether debug code should be compiled in.])
+ GENTOO_CFLAGS="$GENTOO_CFLAGS -O2"
+ fi])
+
+AC_SUBST(GENTOO_CFLAGS)
+
+AC_PROG_CPP
+AC_PROG_RANLIB
+AM_PATH_GTK_3_0(3.12.0,,AC_MSG_ERROR(Bad GTK+ version))
+
+PKG_PROG_PKG_CONFIG()
+
+PKG_CHECK_MODULES(MODULES, gio-2.0 gthread-2.0, dummy=yes, AC_MSG_ERROR(GIO and gthread are both required))
+AC_SUBST(MODULES_CFLAGS)
+AC_SUBST(MODULES_LIBS)
+
+
+# Let's try to test if the host supports "file -f - -n", i.e. if the file
+# command can read file names from stdin (-f -) and also flush (-n) its
+# answers as soon as possible. This is a highly desirable combination of
+# capabilities from gentoo's point of view. I encourage everyone to upgrade
+# their file commands if they fail this test.
+AC_MSG_CHECKING([whether file understands -f - -n option combo])
+if ( echo "." | file -f - -n >/dev/null 2>/dev/null ) ; then
+ AC_DEFINE(HAVE_GOOD_FILE, 1, [Whether the file command supports -f - -n options.])
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN(["
+ This system's 'file' command (`which file`) doesn't seem to"
+ support the '-f - -n' option combination. gentoo's 'file' usage"
+ will be limited. Consider upgrading to the version of 'file'"
+ from <ftp://ftp.astron.com/pub/file/>, version 3.35 or later."
+ At the moment, you will not lose any crucial functionality by"
+ running gentoo with a different 'file' command, although this"
+ may change in the future."])
+fi
+
+
+# For my next trick, let's see if _FILE_OFFSET_BITS can be played with for large file support.
+# We do this in two steps: first figure out struct stat's st_size member's size for a "plain
+# compile, and it that's just 32 we try again with _FILE_OFFSET_BITS=64 defined. If that works,
+# we simply build gentoo with it and hope for the best.
+AC_MSG_CHECKING([number of bits in st_size field])
+bits="test failed"
+# Put the entire testing program into a variable, for easier re-use below.
+bitstest=`cat <<TESTPROG_EOF
+ #include <limits.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+
+ int main(void)
+ {
+ struct stat stbuf;
+ FILE *out;
+
+ if((out = fopen("conftest.statbits", "wt")) != NULL)
+ {
+ fprintf(out, "%d\n", CHAR_BIT * sizeof stbuf.st_size);
+ fclose(out);
+ }
+ exit(out != NULL ? EXIT_SUCCESS : EXIT_FAILURE);
+ }
+TESTPROG_EOF`
+AC_TRY_RUN([$bitstest], bits=`cat conftest.statbits`)
+AC_MSG_RESULT([$bits])
+if test "x$bits" = "x32" ; then
+ AC_MSG_CHECKING([again, with -D_FILE_OFFSET_BITS=64])
+ oldflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE"
+ bits="test failed"
+ AC_TRY_RUN([$bitstest], bits=`cat conftest.statbits`, , CPPFLAGS=$oldflags)
+ AC_MSG_RESULT([$bits])
+fi
+
+# Check if the math library needs to be linked to explicitly in order to
+# get the pow() function.
+AC_CHECK_LIB([m], [pow])
+
+
+
+# Kick the gettext subsystem into action.
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.19.7])
+
+# -----------------------------------------------------------------------------
+# Output
+# -----------------------------------------------------------------------------
+
+AM_CONFIG_HEADER(config.h)
+AC_OUTPUT([gentoorc gentoogtkrc gentoo.spec Makefile icons/Makefile\
+ src/Makefile po/Makefile.in m4/Makefile])
diff --git a/depcomp b/depcomp
new file mode 100644
index 0000000..807b991
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,423 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+if test -z "$depfile"; then
+ base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
+ dir=`echo "$object" | sed 's,/.*$,/,'`
+ if test "$dir" = "$object"; then
+ dir=
+ fi
+ # FIXME: should be _deps on DOS.
+ depfile="$dir.deps/$base"
+fi
+
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. This file always lives in the current directory.
+ # Also, the AIX compiler puts `$object:' at the start of each line;
+ # $object doesn't have directory information.
+ stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ outname="$stripped.o"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ tmpdepfile1="$dir.libs/$base.lo.d"
+ tmpdepfile2="$dir.libs/$base.d"
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1="$dir$base.o.d"
+ tmpdepfile2="$dir$base.d"
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile1"; then
+ tmpdepfile="$tmpdepfile1"
+ else
+ tmpdepfile="$tmpdepfile2"
+ fi
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a space and a tab in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'. We will use -o /dev/null later,
+ # however we can't do the remplacement now because
+ # `-o $object' might simply not be used
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ "$@" -o /dev/null $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ -*)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the proprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/docs/FAQ b/docs/FAQ
new file mode 100644
index 0000000..23082bb
--- /dev/null
+++ b/docs/FAQ
@@ -0,0 +1,86 @@
+ 2010-10-03
+ Emil Brink
+
+
+ gentoo: Frequently Asked Questions
+
+0. INTRODUCTION
+This file contains some frequently asked questions, and their
+answers, about the X11/GTK+ file manager "gentoo". None of
+these questions are actual, verbatim, questions asked by users.
+They've all been constructed by me, around questions and wishes
+sent to me by gentoo's users.
+
+
+Q1. Does gentoo support drag-and-drop ("DnD") ?
+A1: No, it currently does not. This is definitely the #1 most
+ asked for feature. However, there are some issues with it
+ that makes me hesitate in implementing it:
+ 1. Should DnD be between gentoo and other applications
+ (e.g. xmms), and/or in gentoo internally? What should
+ gentoo do if you drag a file from a desktop's file
+ manager and drop it in one of gentoo's panes?
+ Supporting DnD internally would require a pretty
+ pretty hefty amount of internal rewriting. :(
+ 2. Getting the GtkCList widget (which is what the panes
+ in gentoo are implemented with) to support DnD without
+ losing the possibility to drag to select multiple items
+ seems difficult. I am not willing to sacrifice the
+ multi-selection.
+
+
+Q2: How can I make the font used in file listings bigger?
+A2: By creating and editing the .gentoogtkrc file. See the
+ README.gtkrc for further instructions.
+
+
+Q3: Compiling gentoo fails because <errno.h> doesn't exist or has
+ problems, what's up?
+A3: You have an incorrectly or incompletely installed C compiler.
+ On some Linux varieties, you need to "make dep" in the Linux
+ kernel sources, since <errno.h> relies on kernel headers.
+
+
+Q4. I get a weird warning about case sensitivity and ASCII?!
+A4. Yes. This indicates that you have successfully built gentoo in a
+ localizable manner. It also indicates that gentoo has performed
+ tests on your host's strcoll(3) string comparison function, and is
+ letting you know of any limitations found.
+
+
+Q5. The selection mouse handling is all weird, why can't it just behave
+ like the rest of the world does it?
+A5. It behaves in the way it does since that's how DirOpus on the Amiga
+ did it, and the author happens to like being able to click and drag
+ and always add to the selection without having to touch the keyboard.
+ If you disagree, change the "Modify 'Control' Key State" dirpane
+ setting to "System Default".
+
+
+Q6. What is "Click-M-Click"? It doesn't do anything?! Aargh!
+A6. Sure it does, but it is a bit sneaky and hard to find by "mistake".
+ Basically, it's a simple mouse gesture. It stands for "click, then
+ move, and click again". It triggers if you click a file in one pane,
+ then move the mouse to the other pane and click again, all within
+ a pre-set time limit. It is useful for accessing frequently used
+ commands in a way that is more rapid(-feeling, at least) than using
+ a pop-up menu or even a keyboard shortcut. For example, by binding
+ it to archive extraction, you can extract an archive by just clicking
+ twice with a bit of (precise) mouse movement in between. Note that
+ Click-M-Click acts like a single global event, which you can only
+ bind to one action (on the "Controls" configuration page). To get
+ type-specific things to happen, just bind it to the FileAction command
+ using e.g. "FileAction action=cmc" and then define custom "cmc"
+ Actions in the appropriate Styles.
+
+
+Q7. How do I set the background color of the panes? The bright white is
+ hurting my eeeyes!
+A7. You need to go through the .gentoogtkrc file, and set the "base"
+ element in a style which then gets used by the "*mainPane0" and
+ "*mainPane1" widgets. See this page for more details:
+ http://developer.gnome.org/doc/API/gtk/gtk-resource-files.html.
+
+
+Q8. Any further questions?
+A8. No, it doesn't seem so. If you disagree, get in touch.
diff --git a/docs/acks.html b/docs/acks.html
new file mode 100644
index 0000000..f92ec25
--- /dev/null
+++ b/docs/acks.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Previous" HREF="history.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Acknowledgements</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Acknowledgements</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+Acknowledgements and general thanks to:
+</P>
+
+<UL>
+<li>All the folks who have contributed packages and translations for gentoo over the years.</li>
+<LI>Linus Torvalds and the entire GNU/Linux community for creating all this wonderful software, and then
+ just giving it away.</LI>
+<LI><A HREF="mailto:johan@tiq.com">Johan Hanson</A> for the original icons. They're great!</LI>
+<LI><A HREF="mailto:jonas@obsession.se">Jonas Minnberg</A>, <A HREF="mailto:ulf@obsession.se">Ulf Pettersson</A> and
+ <A HREF="mailto:eskil@obsession.se">Eskil Steenberg</A> (i.e., most of Obsession Development) for ideas,
+ suggestions, and testing.</LI>
+<LI><A HREF="mailto:erik@tiq.com">Erik Johansson</A> for testing and help with finding and reporting early bugs.</LI>
+<LI>The GTK+ Team for the great toolkit that GTK+ truly is.</LI>
+<LI><A HREF="http://www.canit.se/~verkstan/">Verkstan F&ouml;r Alla</A>, Stockholm, where much of the groundwork was done, all those years ago.
+</UL>
+
+
+
+
+</BODY>
+</HTML>
diff --git a/docs/buttons.html b/docs/buttons.html
new file mode 100644
index 0000000..1603e00
--- /dev/null
+++ b/docs/buttons.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="menus.html">
+<LINK REL="Previous" HREF="dirpanes.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: The Button Bank</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>The Button Bank</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+The button bank is the name given to the screen area below the directory panes. It is divided into
+two general areas; the shortcut box and the buttons themselves.
+</P>
+
+<H2>Buttons</H2>
+<P>
+The greater part of the button bank area is taken up by the buttons. There are three rows of buttons,
+with eight buttons per row. Currently, these 24 buttons are all you get. In the future, there will
+likely be any number of banks, and possibly banks of different sizes, too.
+</P>
+<P>
+There really isn't much to say about the buttons. Each button has a <EM>command sequence</EM> bound
+to it, and that command sequence is executed when the button is clicked. Many buttons have very
+simple command sequences, containing just a single built-in command (such as <B>Copy</B>, <B>Move</B>
+or <B>Rename</B>). To learn more about the buttons, please read the relevant configuration text.
+</P>
+
+<H2>Shortcuts</H2>
+<P>
+The shortcuts box is a vertical box containing any number of buttons. A scroll bar is provided to
+navigate, since there are generally more shortcuts than fit on the screen. A shortcut is very simple;
+it's just a named directory path. When you click on a shortcut, you are taken to the directory
+bound to the shortcut. When you define the shortcut, you can control which pane the directory
+should appear in, and some other details. It is worth noting that, just like when entering directory
+named manually, you can begin the path with a dollar and then the name of an environment variable. The
+value of that variable will then be used as the path. This is very handy for defining a shortcut to
+$HOME, i.e. your home directory.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/columns.html b/docs/columns.html
new file mode 100644
index 0000000..ccf57ed
--- /dev/null
+++ b/docs/columns.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF=".html">
+<LINK REL="Previous" HREF=".html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Column Content</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Column Content</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+This chapter contains a listing of all available forms of column content, along with each type's special
+options (if any). Column content is really at the core of <STRONG>gentoo</STRONG>, so this table is, too.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/commands.html b/docs/commands.html
new file mode 100644
index 0000000..95b7b2d
--- /dev/null
+++ b/docs/commands.html
@@ -0,0 +1,557 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="types.html">
+<LINK REL="Previous" HREF="menus.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Commands</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Commands</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+Commands are important. In fact, I would almost go as far as to say that much of the rest of <STRONG>gentoo</STRONG>
+is there just so you can get to a point where executing the right commands, at the right time, and on the
+right files, becomes easy...
+</P>
+<P>
+There are two different flavors of command: the <I>built-in</I> (sometimes called <I>native</I>) command,
+and the <I>user-defined</I> (external) commands. The difference is simple: built-in commands are written
+in C and compiled into the <STRONG>gentoo</STRONG> proper, while user-defined commands are defined by you, the user,
+at run time. It has been a goal to provide the most frequently used file operations as built-ins, in order to
+reduce the dependancies between <STRONG>gentoo</STRONG> and its host operating system.
+</P>
+
+<H2>The Built-In Commands</H2>
+<P>
+All built-in commands have names where the initial letter of each word is capitalized. There are never any
+spaces or any other non-alphanumerical characters in command names. In this document, built-in commands are
+generally rendered in <B>boldface</B> to make them stand out.
+</P>
+
+<H3>The Standard Dialog</H3>
+<P>
+Many of the built-in commands share the same dialog framework. This improves interface consistency, and
+cuts down on internal wheel reinvention. Such a dialog might look like this:
+</P>
+
+<DIV>
+<IMG SRC="images/cmd_dialog.gif" ALT="Image of standard command dialog">
+</DIV>
+
+<P>
+The area above the horizontal divider line in the window is known as the <I>body</I> of the dialog;
+it generally provides command-specific GUI controls. In this case, the "control" is just a text label
+asking you to confirm the <B>Delete</B> operation. The buttons have the following meanings:
+</P>
+
+<DL>
+<DT>OK</DT>
+<DD>Answer "yes, go ahead and do it" to whatever question is asked (or implied) by the body
+of the dialog. In this case, clicking OK (or hitting Return) would delete the named file.
+Note: deleting the OS kernel file is generally not a very wise thing to do!
+</DD>
+
+<DT>All</DT>
+<DD>Perform the action on <STRONG>all</STRONG> selected rows, and don't ask for confirmation again.
+</DD>
+<DT>Skip</DT>
+<DD>Skip the current row, and go ahead to the next one, repeating the dialog for that row. A safe
+choice.</DD>
+<DT>Cancel</DT>
+<DD>Stop executing the command, and return to the normal <STRONG>gentoo</STRONG> idle state. You can also press
+the Escape key on your keyboard, or close the window via your window manager, to get this effect.
+</DD>
+</DL>
+
+
+<P>
+For some commands, some of the buttons would be pointless; such as an "All" button for the <B>Rename</B>
+command. In those cases, the unwanted button is simply hidden from the dialog as to not confuse the
+user.
+</P>
+
+<H3>Command Input</H3>
+<P>
+All built-in commands make sure they have the input they require before doing anything. For many
+commands, the input is just the set of selected items in the current pane. Some commands are
+sensitive to mouse doubleclicks; if they are envoked as the result of a doubleclick, they will
+detect this and act accordingly. Other commands ignore both selections and doubleclicks, and
+pop up a dialog where you specify the input the command needs.
+</P>
+
+<H3>Built-In Command Reference</H3>
+<P>
+Here is a reference table of all currently available built-ins. For each command a brief and a detailed
+explanation of the command's actions are provided. In this table, the commands have been divided into
+various groups (directory, activation, file ops and so on). This division is not visible when you use the
+commands; they are all accessed just by the plain names listed here.
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="90%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="5%"></TH><TH WIDTH="10%">Name</TH><TH>Brief</TH><TH WIDTH="90%">Detailed</TH></TR>
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">Directory - Various dirpane operations</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>DirEnter</B></TD><TD>Enter a directory.</TD><TD>This command will
+make the current pane enter (CD into) a new directory. The directory chosen is either the one that was
+just doubleclicked upon by the user, or else the first selected directory found. This command is typically
+only used as the <A HREF="styles.html#ap">action property</A> binding in the directory style(s). Of course,
+you can bind it to a button (or whatever) just as any command, but doing so is seldom convenient.</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>DirOther</B></TD><TD>Copy contents of other directory to current.</TD>
+<TD>
+This command copies the path shown in the other pane to the current, and then does a rescan. The net
+effect is that both panes show the same thing.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>DirParent</B></TD><TD>Go to the parent directory.</TD>
+<TD>
+This changes the path of the current directory to its parent path. If you are already at the root
+of the filesystem (the path is "/"), nothing happens.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>DirRescan</B></TD><TD>Reread the current directory.</TD>
+<TD>
+Use this command to ensure that the display is up-to-date and in synch with what is actually
+in the filesystem. It flushes the current pane and then rebuilds it by reading in the directory
+from disk. It does not affect the set of selected rows, however.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>DirSwap</B></TD><TD>Swap contents of the two panes.</TD>
+<TD>
+This command will simply exchange the contents of the two panes. It is done without any
+rereading of the disk directories, and therefore is quite fast.
+</TD></TR>
+
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">Activation - Change current dirpane</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>ActivateLeft</B></TD><TD>Make the left pane the current.</TD>
+<TD>Not much to add.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>ActivateOther</B></TD><TD>Make the other pane the current.</TD>
+<TD>Which pane is activated by this pane depends on which one is the current when the command is
+envoked. If the left is current, the right is made the new current, and vice versa.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>ActivateRight</B></TD><TD>Make the left pane the current.</TD>
+<TD>Not much to add.
+</TD></TR>
+
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">Basic - Basic file operations</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>Copy</B></TD><TD>Copy selected files and directories to destination.</TD>
+<TD>
+This command does a straight copy of the selected files (and directories), placing byte-for-byte copies
+of the files in the destination directory. The copy is done recursively, so any directories in the
+selection will be copied in their entierity.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>Move</B></TD><TD>Move selected files and directories to destination.</TD>
+<TD>
+This command moves all selected files and directories, recursively, from the current directory
+into the destination dir. It is equivalent to first doing a <B>Copy</B>, then reselecting the same files
+and doing a <B>Delete</B>, but is implemented more efficiently.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>Delete</B></TD><TD>Delete selected files and directories.</TD>
+<TD>
+This command deletes the selected items from the disk. Directories are recursively deleted, and need
+not be empty in order to be removed. Please be careful with this operation, since it is potentially
+dangerous (it is hard to undo a delete).
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>Rename</B><TD>Rename files and directories.</TD>
+<TD>
+This command pops up a variant of the standard command dialog as shown above, but includes in
+the body of the dialog a text entry box where you enter a new name for each of the files. As you
+click OK in the dialog, <STRONG>gentoo</STRONG> changes the name of the file (or directory) to the name
+given. This process is repeated for every selected row.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>ChMod</B><TD>Change file permissions.</TD>
+<TD>
+This command pops up a big dialog which provides buttons for manipulating the various
+<I>permission bits</I> defined by the operating system. You can use this to make a file
+unreadable for any user but yourself (and root), for example. For an enlightening screenshot
+of the dialog in question, look <A HREF="images/cmd_chmod.gif">here</A>.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>ChOwn</B><TD>Change file user and group ownerships.</TD>
+<TD>
+This command allows you to change the user and group ownerships of files, just like the
+normal shell command of the same name. It is currently very lazily implemented, and not
+likely to be very useful on a large system. Expect a better implementation in future
+releases of <STRONG>gentoo</STRONG>. Currently this command sort of sucks.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>(Split)</B><TD>Split large file into smaller parts.</TD>
+<TD>
+This command is not fully implemented. Its intended purpose is to provide a graphical
+way of splitting (sometimes called <EM>segmenting</EM>) a file into several smaller
+parts. It is currently about 50% implemented, and actually works. In the future, it will
+be accompanied by a <B>Join</B> command to paste the parts back together, of course.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>MkDir</B><TD>Make a new directory.</TD>
+<TD>
+This command is used to create a new, empty, directory. It totally ignores the set of
+selected files, and thus runs perfectly well without any selection. It pops up a dialog
+asking you for the name of the directory to create, and creates it. It also allows you
+to specify that the directory should be read into the current pane immediately after
+being created, which is sometimes convenient.
+</TD></TR>
+
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">Selection - Modify the set of selected rows</TD><TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>SelectAll</B><TD>Select all rows in current pane.</TD>
+<TD>
+This command will select all rows in the current pane, no matter which rows are selected
+when it is run.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>SelectNone</B><TD>Deselect all currently selected rows.</TD>
+<TD>
+After this command has been run, the current pane will have no selected rows whatsoever.
+</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>SelectToggle</B><TD>Invert the selected set.</TD>
+<TD>
+This command, which might be classified as mildly silly, makes all rows selected when it
+is envoked become deselected, and vice versa. If all rows in the pane were selected, it acts
+like <B>SelectNone</B>; if no rows were selected it acts like <B>SelectAll</B>.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>SelectRE</B><TD>Select using regular expression.</TD>
+<TD>
+<P>
+This command pops up a special command dialog <A HREF="images/cmd_selectre.gif">window</A>,
+in which you can specify a set of rows, an action, and a regular expression. The expression
+is then matched against the name of each row of the specified set, and when a hit occurs,
+the action is applied to the row in question. For more information on the peculiar check
+button labeled "Treat RE as glob pattern?", check <A HREF="misc.html#glob">here</A>.
+</P>
+</TD></TR>
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">File Commands - Operate upon currently selected file(s)</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>DoubleClick</B><TD>Do canonical file operation.</TD>
+<TD>
+This command is used to make <STRONG>gentoo</STRONG> do "The Right Thing" when you doubleclick on a file.
+Behind the scenes, it merely triggers the "Doubleclick" <A HREF="styles.html#ap">action property</A>
+for the file being clicked. This can then be used to view, print, play, compress, or generally do
+just about anything with the file. The chain of events that involves this command is:
+<OL>
+<LI>User doubleclicks on a dirpane row</LI>
+<LI>A (currently hardcoded) binding executes <B>Doubleclick</B></LI>
+<LI><B>Doubleclick</B> executes the row's "Doubleclick" action property</LI>
+<LI>The action property executes its command sequence</LI>
+</OL>
+By default, the action command sequence for directories is just <B>DirEnter</B>, which is
+why doubleclicking on a directory enters it.
+</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>FileEdit</B></TD><TD>Edit selected files.</TD>
+<TD>
+This executes the "Edit" action property for the selected files (or the doubleclicked one,
+if one exists).
+</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>FilePrint</B></TD><TD>Print selected files.</TD>
+<TD>
+Just like <B>FileEdit</B>, but executes the "Print" action property.
+</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>FileView</B></TD><TD>View contents of selected files.</TD>
+<TD>
+Just like <B>FileEdit</B>, but executes the "View" action property.
+</TD></TR>
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="4">Miscellanous - Various other commands</TD><TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD><B>Configure</B><TD>Open up the configuration GUI.</TD>
+<TD>
+This command enters <A HREF="configure.html">configuration mode</A>, by opening up the modal
+configuration dialog. Until that dialog has closed, no other command is executed.
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD><B>Quit</B><TD>Quit <STRONG>gentoo</STRONG>.</TD>
+<TD>
+This command exits <STRONG>gentoo</STRONG> immediately. Currently it asks no questions, but this
+behavior might change in the future.
+</TD></TR>
+</TABLE>
+</DIV>
+
+<P>
+Note that you need never worry about providing a built-in command with any form of arguments
+textually. You just name the command, and it takes care of the rest. Since these commands
+are really built-in, they have full access to <STRONG>gentoo</STRONG>'s intenal state where the lists
+of selected files, current paths, and so on is easily available.
+</P>
+
+<H2>User Commands</H2>
+<P>
+Although sure important, the built-in commands are very limited. In order to make the most
+out of <STRONG>gentoo</STRONG>, you'll need to define your own commands to do the things you want.
+You use the mechanism provided by <EM>user commands</EM> to accomplish this. A user command is simply a call to
+an external program, which is provided with the correct file name arguments by <STRONG>gentoo</STRONG>.
+</P>
+<P>
+A user command has the following parts, all definable by you:
+</P>
+
+<DL>
+<DT>Name</DT>
+<DD>This is just the name with which you refer to the command. To keep user commands easily
+distinguishable (sp?) from the built-ins, I recommend naming all user commands in all lower
+case characters.</DD>
+<DT>Definition</DT>
+<DD>The definition is the most important part of a user command. It is a text string naming
+the external command you want to run, while using special symbols (described below) to get
+argument information from <STRONG>gentoo</STRONG>. For example, you can access the set of all selected
+file names and pass those as arguments to the command.</DD>
+<DT>General Flags</DT>
+<DD>The general flags consists of all flags from the "General" category listed below.</DD>
+<DT>Before Flags</DT>
+<DD>This group of flags is applied before the command starts to execute, and consists of all
+flags and options in the "Rescanning" and "Change Directory" groups below.</DD>
+<DT>After Flags</DT>
+<DD>This group is applied after the user command has executed, and consists of just the "Rescanning"
+group below. There is no need to include the "Change Directory" group, since the command has
+already executed.</DD>
+</DL>
+
+<H3>User Command Flags</H3>
+<P>
+These are the flags, available in various groupings as mentioned above:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="85%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="5%"></TH><TH>Name</TH><TH WIDTH="75%">Explanation</TH></TR>
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="3">General</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD>Run in Background?</TD><TD>When set, this flag causes the program
+started by the userco command to run in the background. When not set, the program runs in the
+foreground, thereby blocking <STRONG>gentoo</STRONG> while executing. For short one-shot commands (such as
+compressing all selected files), foreground operation is optimal. If you use user commands to
+start applications, however, you'll probably want to set this flag so you can continue to use
+<STRONG>gentoo</STRONG> while your application is running.</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD>Kill Previous Instance?</TD><TD>This flag, which can only be
+set when the "Run in Background?" flag is set too, causes <STRONG>gentoo</STRONG> to never start the program
+more than once. When you run the user command again, <STRONG>gentoo</STRONG> will kill the instance of the
+program that was started on the last envocation. This is useful when the program is (for example)
+some kind of music player, and you want to change the song, not listen to another simultaneously.</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD>Capture Output?</TD><TD>When you set this flag, <STRONG>gentoo</STRONG>
+will open up a text viewing window, capture any (textual) output the program generates, and then
+render it into the text window. Both <CODE>stdout</CODE> (ordinary output) and <CODE>stderr</CODE>
+(error messages) are captured, and rendered into the same window. This feature is very useful, for
+example when you want a user command to list the contents of an archive or some such.</TD></TR>
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="3">Rescanning</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD>Rescan Source?</TD><TD>This flag, if set, causes <STRONG>gentoo</STRONG> to
+rescan the currently selected pane's directory. It is useful if a command causes makes changes
+to the files in that directory. If you don't rescan it, <STRONG>gentoo</STRONG> will not be aware of the
+changes; this may lead to confusion.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD>Rescan Destination?</TD><TD>This causes <STRONG>gentoo</STRONG> to rescan
+to destination pane's directory.</TD></TR>
+
+<TR BGCOLOR="#B0B0C0"><TD COLSPAN="3">Change Directory</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD>No Change?</TD><TD>If this is set, <STRONG>gentoo</STRONG> will not set
+the working directory for the user command. This will cause the command to have a random directory
+as its notion of "current directory". Use this setting when you're just starting up an application,
+without giving it arguments.</TD>
+<TR BGCOLOR="#E0E0F0"><TD></TD><TD>CD Source?</TD><TD>If set, <STRONG>gentoo</STRONG> will make the user
+command start up believing that its current directory is that of the source pane. This is equivalent
+to opening a shell, doing a <CODE>cd</CODE> to that directory, and then running the command.</TD>
+<TR BGCOLOR="#C0C0E0"><TD></TD><TD>CD Destination?</TD><TD>If set, <STRONG>gentoo</STRONG> will make the
+user command run in the destination pane's directory.</TD>
+</TABLE>
+</DIV>
+
+
+<H3>User Command Definition</H3>
+<P>
+The simplest definition of a user command is just a string containing the name of an external program
+to run. For example, you could define a command to start up another copy of <STRONG>gentoo</STRONG> by just setting
+the <I>definition</I> part of a user command to "<CODE>gentoo</CODE>" (without the quotes). If you
+also set the "Run in Background?" flag, this new command will start up a new independent copy of <STRONG>gentoo</STRONG>
+which you'll be able to use simultaneously with the original. Note that since these two copies will use
+the same configuration file (both for reading and writing), evil things may occur...
+</P>
+<P>
+User commands aren't really interesting until you let <STRONG>gentoo</STRONG> provide the external program with
+some useful information through its arguments. The canonical example of such information is one or more file
+names, typically the names of the files currently selected in one of <STRONG>gentoo</STRONG>'s panes.
+</P>
+<P>
+To provide this information, you add special control sequences to the definition string. For example,
+to call the program <B>xv</B> (John Bradley's nifty X image viewer) with the name of the first
+selected file as an argument, enter "<CODE>xv {f}</CODE>" in a command definition. The part with the
+curly braces is a control sequence which <STRONG>gentoo</STRONG> parses and replaces with the relevant information
+before calling the external command.
+</P>
+<P>
+Without further ado, here's a table showing the available control sequences and their meanings:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" WIDTH="85%" CELLPADDING="8">
+<TR BGCOLOR="#E0E0F0"><TH>Sequence</TH><TH WIDTH="90%">Explanation</TH></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD><CODE>\{</CODE></TD><TD>This gets an opening brace in the output.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD><CODE>\}</CODE></TD><TD>Use this to get a closing brace in the output.</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD><CODE>{f}</CODE></TD><TD>This gets the name of the <STRONG>first</STRONG> selected
+row in the current directory pane. You can include zero or more of these modifiers:
+<TABLE WIDTH="90%">
+<TR><TD WIDTH="5%"><CODE>u</CODE></TD><TD>Causes the row to also be unselected.</TD></TR>
+<TR><TD><CODE>p</CODE></TD><TD>Prepends the full absolute path to the name.</TD></TR>
+</TABLE>
+<P>So, for example, the sequence <CODE>{fup}</CODE> will evaluate to the name of the first selected
+row, complete will full path. The row will also be unselected as the command executes.
+</P>
+<P>If a user command containing a <CODE>{f}</CODE> sequence is executed because of a double click
+on a dirpane row, it will behave as that row was the (only) selected row. This is very useful when
+you want to use a user command for e.g. viewing some filetype both by binding it to a button (in
+which case it will use the selection as usual) <STRONG>and</STRONG> by using it in a file style
+action.</P>
+</TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD><CODE>{F}</CODE></TD><TD>This gets <STRONG>all</STRONG> selected rows in
+the source directory. It handles the same set of modifiers as its baby brother <CODE>{f}</CODE>,
+and also shares its double click behaviour.</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD><CODE>{P}</CODE></TD><TD>This is used to get just a directory path, without
+filenames. You can specify zero or one of these modifiers:
+
+<TABLE WIDTH="90%">
+<TR><TD WIDTH="5%"><CODE>s</CODE></TD><TD>Get the path of the <STRONG>source</STRONG> (current)
+pane's directory. This is the default if no modifier is given.</TD></TR>
+<TR><TD><CODE>d</CODE></TD><TD>Get the path of the other pane, the <STRONG>destination</STRONG> one.</TD></TR>
+<TR><TD><CODE>h</CODE></TD><TD>Get the path of the user's <STRONG>home</STRONG> directory, as specified by the
+environment variable <CODE>$HOME</CODE>.</TD></TR>
+</TABLE></TD></TR>
+
+<TR BGCOLOR="#E0E0F0"><TD><CODE>{$name}</CODE></TD><TD>This sequence, which begins with a dollar sign immediately
+following the opening brace, is used to access environment variables. Following the dollar sign should be
+the name of an environment variable to look up the value of. The name ends with the closing brace. You
+could use the sequence <CODE>{$HOME}</CODE> as a longer synonym for <CODE>{ph}</CODE>; they are equivalent.</TD></TR>
+
+<TR BGCOLOR="#C0C0E0"><TD><CODE>{I?...}</CODE></TD><TD>This rather suspicious-looking sequence is the most powerful,
+but also the most complex. It is used to get <STRONG>input</STRONG> directly from the user, by popping up a dialog window! You can
+either ask the user for a random string (such as the name for a new file), or let him select from a set of predefined
+strings (such as options to a command). You specify what kind of input you want by putting a single modifier
+character immediately after the <CODE>I</CODE>. These are the allowed modifiers:
+<TABLE WIDTH="90%">
+<TR><TD WIDTH="5%"><CODE>s</CODE></TD><TD>User string; puts a text entry box in the dialog window. You can set the default
+text by entering an equals sign followed by the wanted default string surrounded in double quotes.</TD></TR>
+<TR><TD WIDTH="5%"><CODE>m</CODE></TD><TD>Menu of predefined strings. This will put a pop-up menu button in the dialog
+window, allowing the user to choose from a set of strings you define. Specify the strings by entering a list of
+comma-separated quoted strings.</TD></TR>
+<TR><TD WIDTH="5%"><CODE>t</CODE></TD><TD>This doesn't get any input, but rather specifies the <STRONG>title</STRONG> text
+of the input dialog. Very useful when you want to let the user know what is happening. Follow the <CODE>t</CODE> with
+an equals sign and then the string in double quotes. </TD></TR>
+</TABLE>
+
+<P>
+In addition to this, you can also specify a <EM>label</EM> for each input field. Unfortunately, the notation for doing
+this is somewhat unintuitive, I'm afraid. Such a label is specified by putting a colon (<CODE>:</CODE>) immediately after
+the type selection letter, and then entering the label in double quotes. This means that the order of things between the
+braces of an input command sequence is:
+</P>
+
+<OL>
+<LI>A capital <CODE>I</CODE> signifying input.</LI>
+<LI>A single lower-case letter specifying the type of input field wanted, or <CODE>t</CODE> to set title.
+<LI>Optionally a colon followed by a quoted string, setting the input field's label.</LI>
+<LI>The type-specific modifier as listed above.</LI>
+</OL>
+
+<P>
+You might wonder what happens if you have <STRONG>several</STRONG> <CODE>{I}</CODE>-groups in a single command
+definition. The answer is: you get several input fields in the same dialog! The <CODE>{It}</CODE>-construct
+sets the body text for the entire dialog, and need only appear once. Here are a few examples, with screenshots
+of the generated dialogs to make things clearer:
+</P>
+
+<TABLE BORDER="0" WIDTH="95%" CELLPADDING="8">
+<TR><TH ALIGN="left" WIDTH="50%">Example Definition</TH><TH WIDTH="10%">Screenshot</TH><TH ALIGN="right">Comment</TH></TR>
+
+<TR><TD><CODE>echo {Is}</CODE></TD><TD><A HREF="images/cmd_inp1.gif">Link</A></TD>
+<TD>Note how the window gets a default title and the input field gets a default label, too.</TD></TR>
+
+<TR><TD><CODE>echo {Is} {Is}</CODE></TD><TD><A HREF="images/cmd_inp2.gif">Link</A></TD>
+<TD>This just shows what happens if you have two field specifiers. Shouldn't come as a shock!</TD></TR>
+
+<TR><TD><CODE>echo {Is:"Name"} {Is:"Age"}</CODE></TD><TD><A HREF="images/cmd_inp3.gif">Link</A></TD>
+<TD>Now we're getting advanced, and showing off field label setting!</TD></TR>
+
+<TR><TD><CODE>echo {It:"gentoo rules!"} {Is:"Name"="Emil Brink"}</CODE></TD><TD><A HREF="images/cmd_inp4.gif">Link</A></TD>
+<TD>This one introduces the window title setting, and also shows how to specify a default string.</TD></TR>
+
+<TR><TD><CODE>echo {Is:"Name"} is {Im:"Description"="Silly","Cool"}</CODE></TD><TD><A HREF="images/cmd_inp5.gif">Link</A></TD>
+<TD>This shows how to use the menu field specifier. Incredibly silly.</TD></TR>
+</TABLE></TD></TR>
+
+</TABLE>
+</DIV>
+
+<P>
+This concludes the description of <STRONG>gentoo</STRONG>'s commands and their possibilities for now.
+</P>
+
+
+</BODY>
+</HTML>
diff --git a/docs/config/cfg_dirpane.html b/docs/config/cfg_dirpane.html
new file mode 100644
index 0000000..198e69a
--- /dev/null
+++ b/docs/config/cfg_dirpane.html
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF=".html">
+<LINK REL="Previous" HREF="cfg_types.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Directory Pane Configuration</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>Directory Pane Configuration</H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+The directory panes are possibly the most important single GUI elements in <STRONG>gentoo</STRONG>.
+It's in the directory panes that disk contents are shown; it's where you select and
+operate upon items; it's where all your glorious <A HREF="../styles.html">styles</A>
+get to show off their groovy colors and fancy icons. To put it short, the panes is where
+it all happens. So, what can you do about what is being displayed in these panes? As it
+turns out, you can do quite a lot. Read on!
+</P>
+
+<H3>Directory Pane Configuration in Pictures</H3>
+<P>
+To conserve some vertical space, the screenshot has been suppressed. It's all
+<A HREF="../images/cfg_dirpane.gif">here</A> though, if you really want to see it. It
+might be good to take a look (or, better, peek at a running <STRONG>gentoo</STRONG>'s config
+window) before reading the rest of this page.
+</P>
+
+<H2>Control Buttons</H2>
+<P>
+At the top of the dirpane config page, there's a row with some general control buttons
+making life easier. The single most important one is the option menu button to the left;
+it controls <STRONG>which</STRONG> pane you're editing. There are two panes, one called
+"Left" and one "Right" - each has its own set of completely independent settings.
+</P>
+<P>
+Besides the pane option menu, there are a couple of buttons that let you swap the
+configurations around and copy one to the other (and "the other to the one", sort of :).
+You don't need to use these often, but when you do, you typically really need them!
+</P>
+
+<H2>Defining Column Content</H2>
+<P>
+The major part of the dirpane config page is taken up by the a big frame labeled
+"Columns". This is where you control what gets shown in the panes, and where.
+</P>
+<P>
+The basic "unit" of pane output is the column. Each pane must have at least one column
+of content, but typically there's much more. You control what gets displayed by assigning
+<STRONG>content</STRONG> to the columns. You can do this assigning any way you please;
+there's nothing stopping you from letting a pane contain six columns of file names, then
+a column showing the name of the files' owners, and then another six columns of file names.
+Of course, such a display would probably look very silly and be next to useless, but you
+can do it!
+</P>
+<P>
+The number of columns in a pane can currently not exceed 32. This is a fairly arbitrary
+compile-time limitation, which only exists to make my life easier, and the program faster
+and less error-prone. If you <EM>really</EM> think that this sucks, you're very welcome to
+fix it yourself! <CODE>;^)</CODE>
+</P>
+
+<H2>Available and Selected Content</H2>
+<P>
+The columns frame consists of two lists arranged side by side. The one on the left,
+cleverly labeled "Available Column Content" contains just that. It lists the types of
+column content that <STRONG>gentoo</STRONG> supports. If it's not in that list, you can't have it.
+Examples of content types include file name, size (in bytes and blocks), file owner and
+group, modification dates, and so on.
+</P>
+
+<P>
+The list on the right, with the bunch of buttons underneath it, shows the currently selected
+content types for the current pane. Each row in this list corresponds exactly to one column in
+the pane. The order of the rows is the order of the columns. Each row shows two fields; a title
+and a content name. The title is the text that gets shown in the column button in the pane.
+The content controls what gets shown in the column.
+</P>
+
+<H3>Adding a Column</H3>
+<P>
+To add a new column to the current pane, locate the content type you want in the list on
+the left, and <STRONG>double click</STRONG> it. A new row is added to the list on the
+right.
+</P>
+
+<H3>Changing Column Details</H3>
+<P>
+There are some parameters that you might want to adjust for each column; things such as
+column width, adjustment (left, right, or center) and title text. Some content types
+even provide additional content-specific options for you to play with. To access all these
+fun things, select a column in the list on the right, and click the "Edit..." button
+below the list. This opens up the <A HREF="../images/columnedit.gif">column edit</A> window.
+The window is split in two parts; the top part contains the basic settings that all
+columns have (title, adjustment, and width), while the bottom part contains any content-specific
+options. If there are no special options available for the column's content, the bottom
+frame is not shown. For a run-down on all the various content types and their special
+options, <A HREF="columns.html">read here</A>.
+When done, click "OK" in the window to accept, or "Cancel" to abandon any changes you made.
+</P>
+
+<H3>Removing a Column</H3>
+<P>
+</P>
+
+<H3>Changing the Column Order</H3>
+<P>
+</P>
+
+<H2>Configuring the Sorting</H2>
+<H3>Sorting Column</H3>
+<P>
+</P>
+
+<H3>Sort Mode</H3>
+<P>
+</P>
+
+<H3>Sort Options</H3>
+<P>
+</P>
+<H2>Setting the Default Path</H2>
+
+</BODY>
+</HTML>
diff --git a/docs/config/cfg_gui.html b/docs/config/cfg_gui.html
new file mode 100644
index 0000000..7449147
--- /dev/null
+++ b/docs/config/cfg_gui.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="gentoorc.html">
+<LINK REL="Previous" HREF="index.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: The Configuration Window</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>The Configuration Window</H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+This section of the manual describes some general features about <STRONG>gentoo</STRONG>'s
+configuration window.
+</P>
+
+<H2>Accessing the Configuration Window</H2>
+<P>
+When you wish to make changes to <STRONG>gentoo</STRONG>'s configuration, you need to somehow
+execute the built-in command <B>Configure</B>. When this command is run, the configuration
+window is opened. With the default (built-in) configuration of <STRONG>gentoo</STRONG>, you can
+execute this command by either clicking the button labeled "Configure" in the top right
+corner of the button bank, or by selecting the menu item of the same name in the pop-up
+menu reached by right-clicking in a dir pane.
+</P>
+
+<H2>Config Window Layout</H2>
+<P>
+The configuration window has a very simple layout. It consists mainly of two parts:
+a big working area, which only contains a so called "notebook widget", and a strip of
+buttons along the bottom of the window. Here's a screenshot:
+</P>
+<DIV>
+ <IMG SRC="../images/cfg_gui.gif" WIDTH=522 HEIGHT=679 ALT="Configuration Window Screenshot">
+</DIV>
+
+<H3>The Notebook</H3>
+
+<P>
+The notebook widget is a container; it holds other widgets. It divides its contents
+into pages, and always displays exactly one page at any particular moment.
+The things at the top (labeled "File Styles", "File Types" and so on) are known as
+<EM>tabs</EM>. Each page has a tab: click on a page's tab to cause it to be displayed.
+</P>
+
+<H3>Configuration Widget Behaviour</H3>
+
+<P>
+Most configuration pages share some common features, to make them easier to use. A typical
+configuration page contains quite a lot of different widgets; it is easy to get confused
+about which widget to use (and when). In an attempt at reducing this confusion, most
+configuration pages make all widgets that are not immediately useful <EM>insensitive</EM>
+to user manipulation. Insensitive widgets are drawn in a distinct way, making them easy
+to spot. They also don't react to having the mouse pointer over them, like most other
+GTK+ widgets do. In the screenshot above, all widgets but two are insensitive.
+</P>
+<P>
+The "Add" and "Delete" buttons that appear near the bottom of the page in the picture
+are very common in config pages. Not all pages use these two buttons, but those that do
+always place them in the exact same position, thus making them easy to spot.
+</P>
+
+<H3>The Bottom Buttons</H3>
+<P>
+The three buttons along the bottom ("OK", "Save" and "Cancel") are not part of the
+current page, but are always visible. All three close down the configuration window,
+with various side effects:
+</P>
+
+<DL>
+<DT>OK</DT>
+<DD><STRONG>Accepts all</STRONG> changes and makes them current. As the config window
+closes, the new settings take effect and <STRONG>gentoo</STRONG> updates itself to reflect them.</DD>
+<DT>Save</DT>
+<DD>Accepts the changes, and then <STRONG>saves</STRONG> them out to disk. The configuration is always
+saved in <CODE>$HOME/~.gentoorc</CODE>. For more information about the configuration file format,
+<A HREF="gentoorc.html">read here</A>.</DD>
+<DT>Cancel</DT>
+<DD>Aborts the configuration option, <STRONG>abandoning all</STRONG> changes.</DD>
+</DL>
+
+
+</BODY>
+</HTML>
diff --git a/docs/config/cfg_styles.html b/docs/config/cfg_styles.html
new file mode 100644
index 0000000..3c52d42
--- /dev/null
+++ b/docs/config/cfg_styles.html
@@ -0,0 +1,236 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="cfg_types.html">
+<LINK REL="Previous" HREF="gentoorc.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: File Style Configuration</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>File Style Configuration</H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+You use <EM>file styles</EM> to control the way files of different <A HREF="../types.html">types</A> are
+displayed and generally dealt with. For more information about styles and their various properties,
+the tree structure applied to styles, and all other fun details, check out the <A HREF="../styles.html">
+styles</A> chapter!
+</P>
+<P>
+Configuring styles is important in order to get <STRONG>gentoo</STRONG> to look the way you want it to, and
+also to <EM>act</EM> the way you want it to.
+</P>
+
+<H2>Styles Configuration in Pictures</H2>
+<P>
+Here's two (cropped) pictures how what the file styles configuration page looks like. The picture
+to the left shows the page as it looks when no style has been selected, while the right hand picture
+shows it with a style ("Root") selected.
+</P>
+
+<DIV>
+ <IMG BORDER="0" SRC="../images/cfg_styles.gif" WIDTH=512 HEIGHT=429 ALT="The styles config page (no selection)">
+ &nbsp;
+ <IMG BORDER="0" SRC="../images/cfg_styles2.gif" WIDTH=511 HEIGHT=430 ALT="The same, but with a selection">
+</DIV>
+
+<H3>The Tree View</H3>
+<P>
+The dominant part of the style page is taken up by a single widget; a display of the style tree.
+The tree widget is hopefully more or less selfexplanatory; it shows the different styles and the
+parent-child relationships between them. You can click on the (tiny) boxes to the left of an item
+to show or hide its children. The default is to expand the tree fully, showing all styles.
+</P>
+<P>
+The styles are listed in alphabetical order on each tree level, to make finding a certain style
+a little easier.
+</P>
+
+<H3>The Name and Parent Fields</H3>
+<P>
+Right below the tree view, there's a text entry widget labeled "Name". Not surprisingly (I hope),
+that's where you enter the name of the style. The name of a style must always be unique, since
+the name is used to link styles to types. When you edit the style name, <STRONG>gentoo</STRONG> will ignore
+any changes that make the name a duplicate, keeping the last unique name. This might seem confusing,
+but chances are you'll never even notice it.
+</P>
+<P>
+Under the name entry widget, there's another text entry widget, this time labeled "Parent". Unlike
+the name, you can't edit the parent name directly; the widget is used just to display the name.
+To change the parent of a style, click the tiny button labeled with the ellipsis. This will open
+up a dialog window where you can choose a new parent style. None of the current style's children
+will be in the dialog, of course. Once you change the parent, the tree display changes to reflect
+the new hierarchy.
+</P>
+
+<H2>The Properties Frame</H2>
+<P>
+The rest of the page is taken up by a big frame labeled "Preperties". It gives you a chance to
+edit and view the style's properties. Properties are <EM>inherited</EM> from parent to child,
+so when editing a style high up in the hierarchy, the changes might be visible far down. You
+can always click on a style to see its current property values.
+</P>
+<P>
+Each property has a check button; if the button is active (I would say "checked", but GTK+ doesn't
+render check buttons with check marks in them), that means that the property in question is
+being <EM>overridden</EM> by the current style; i.e. the parent's value is <EM>not</EM> being used.
+When a property is overridden, the style provides its own value for the property. When you deactivate
+an override check button, the style reverts to using its parent's value for the property in question.
+</P>
+<P>
+In the right picture above, you can see that all the check buttons are indeed active, but also
+that they are "insensitive"; you can't manipulate them. This is simply because the style selected
+is the root style; it <STRONG>must</STRONG> always override all properties, since it has no parent
+to inherit values from.
+</P>
+
+<H2>Visual Properties</H2>
+<P>
+There are 6 different <EM>visual</EM> properties, divided into two groups: unselected and selected.
+Since the meaning and use of these has been covered in the <A HREF="../styles.html">styles</A>
+chapter, I won't repeat that here. I'll just tell you what you can do when configuring a style's
+visual properties.
+</P>
+
+<H3>Preview List</H3>
+<P>
+The list containing the rows "Unselected" and "Selected" is the <EM>style preview</EM>. It shows
+how the current visual property values would look in a pane. The preview is not interactive.
+</P>
+<P>
+Below the preview are two sets of property editing frames; one for the unselected state and one
+for the selected. Each frame contains widgets to control override and value of the three state-specific
+properties (background and foreground colors, and icon).
+</P>
+
+<H3>Setting a Color</H3>
+<P>
+To set a color property, first make sure its override button is active. When active, the "Edit..."
+button becomes available. Clicking it opens up the GTK+ standard <A HREF="../images/colsel.jpeg">
+color selection</A> window. Manipulate the widgetry in this window until you find a color you
+like, and accept the changes by clicking the "OK" button. While manipulating, watch the preview
+as it updates to show an accurate preview.
+</P>
+
+<H3>Setting an Icon</H3>
+<P>
+To set an icon property, click the "Pick..." button (after making sure that the style being edited
+actually does override the property in question, of course). This brings up (after a small delay
+during which you get to view a nice progress indicator) an <A HREF="../images/iconsel.gif">
+icon selection</A> window. Select an icon and click OK, and the style is modified. It's as simple
+as that. Currently, there's no "active preview" while choosing icons, but you really shouldn't
+need one IMO.
+</P>
+
+<H3>Convenient Copiers</H3>
+<P>
+Between the unselected and selected property frames is a narrow frame labaled "Copy&gt;&gt;". It
+contains some buttons that can be used to perform often-wanted operations a bit faster. The
+buttons are:
+</P>
+
+<DL>
+<DT>FG Invert</DT>
+<DD>This copies the unselected foreground color to the selected <STRONG>background</STRONG>,
+thus creating the normal inverted look used to indicate selection. It also activates the
+selected foreground override, of course.</DD>
+<DT>FG+BG Invert</DT>
+<DD>Clicking this first does a "FG Invert" as described above, then also copies the unselected
+background color to the selected <STRONG>foreground</STRONG>. This creates a "full inversion"
+of the colors.</DD>
+<DT>Icon</DT>
+<DD>This copies the setting of the unselected icon to the selected icon. You generally want
+to click this, unless you're being extravagant and use different icons for the two states.</DD>
+</DL>
+
+
+<H2>Action Properties</H2>
+<P>
+Again, the concept of action properties has been explained in the <A HREF="../styles.html">
+styles</A> chapter, here we'll concentrate on how you go about setting them to values you like.
+The first thing you need to do is access the action properties notebook page; you do this by
+clicking the tab labeled "Action". The display then changes to look something like <A HREF="../images/cfg_styles3.gif">
+this</A>.
+</P>
+<P>
+The action property notebook page contains one row for each available action property. To
+the left is a check button which you use to control override, as usual. Next on the row comes
+a simple "preview" of the action command sequence; it'st just a list of commands. Not very
+useful, but I wanted to put something there, to fill out the window a bit. <CODE>;^)</CODE>
+The last thing on the row is an "Edit" button, which when pressed brings up the standard
+command sequence editor.
+</P>
+<P>
+That's basically it.
+</P>
+
+<H2>Adding and Deleting Styles</H2>
+<P>
+Of course, style editing wouldn't be so interesting if you only had the two styles shown
+in the screenshots here to work upon. Of course, you want to add your own styles, and experiment.
+</P>
+
+<H3>Adding a Style</H3>
+<P>
+To add a new style to the tree, click the "Add" button (surprise!). If no style was selected
+when you clicked, the new style will be added with "Root" as its parent. If a style was
+selected, it will be used as the parent. The new style appears in the tree under the temporary
+name "(New Style") or something similar; make sure you change this to your wanted, unique, name
+as soon as possible.
+</P>
+
+<H3>Deleting a Style</H3>
+<P>
+To delete a style, select it in the tree, then hit the "Delete" button. If the style selected
+is a parent, a dialog box will appear requesting you to confirm that you really want to delete
+it, since deleting a parent style <EM>deletes all the children too</EM>! Beware. Of course,
+you cannot delete the Root style.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/config/cfg_types.html b/docs/config/cfg_types.html
new file mode 100644
index 0000000..95ae9df
--- /dev/null
+++ b/docs/config/cfg_types.html
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="cfg_dirpanes.html">
+<LINK REL="Previous" HREF="cfg_styles.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: File Type Configuration</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>File Type Configuration</H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+File types are used to identify the files on your disks, and classify them into different types.
+Before you read about how to set up your own types, I really recommend that you check out the
+<A HREF="../types.html">usage section on file types</A>, so you know what a type is, how they work et cetera.
+</P>
+
+<H2>Types Configuration in Pictures</H2>
+<P>
+Here's a couple of screenshots of the configuration for file types, cropped as usual. The
+one on the left shows the page when no type is selected, the one on the right with a type
+selected:
+</P>
+
+<DIV>
+ <IMG SRC="../images/cfg_types.gif" WIDTH=526 HEIGHT=430 ALT="Types page, no type selected" BORDER="0">
+ &nbsp;
+ <IMG SRC="../images/cfg_types2.gif" WIDTH=526 HEIGHT=430 ALT="Types page, 'Executable' type selected" BORDER="0">
+</DIV>
+
+
+<H2>The Types List</H2>
+<P>
+Dominating the page is a big list of all currently defined file types. They are listed
+in alphabetical order, to make finding a given type simpler. Also, if you name your types
+in the way suggested in the <A HREF="../types.html">types chapter</A>, the sorting helps
+keep related types together. Since there's no complex structure imposed on file types (as
+there is with file styles), this can really help keep things organized.
+</P>
+
+<H2>Naming a Type</H2>
+<P>
+Below the list is a text entry widget labeled "Name". Not surprisingly (I hope!), this is
+where you give the name of the selected type. Type names need not be unique, so you can
+just about enter anything you like.
+</P>
+
+<H2>Defining a Type's Identification Rules</H2>
+<P>
+Below the name field, there's a large frame labeled "Identification". This is where you
+control how the type attempts to identify files. There are five levels of identification
+available: intrinsic type, protection, suffix, name RE, and 'file' RE. Read all about it
+in the <A HREF="../types.html">types chapter</A>, as usual. Of these methods, all but the
+first are optional; you don't need to specify them. You can select any combination of the
+four latter; to include a rule, just click its check button and fill in any parameters
+required by the rule. Details on the parameters available:
+</P>
+
+<H3>Intrinsic Type</H3>
+<P>
+Defining the intrinsic type to require is pretty simple; just click one of the radio
+buttons. Note that each type must require exactly one intrinsic type. "Link" stands for
+soft (a.k.a. "symbolic") link, "B-Dev" and "C-Dev" are abbreviations for block and character
+device, respectively.
+</P>
+
+<H3>Protection</H3>
+<P>
+To use protection matching, first activate the rule by clicking its check button. Then
+operate the six toggle buttons on the right until the combination you want is shown.
+Remember that if you select a protection flag (such as "Sticky"), you are requiring
+files to have the Sticky bit <STRONG>set</STRONG>. There is no way of specifying negative
+protection requirements.
+</P>
+
+<H3>Require Suffix</H3>
+<P>
+If you wish to require files of this type to have a common suffix in their names, activate
+this rule and type the suffix in the text entry box. Remember that <STRONG>gentoo</STRONG> doesn't
+have a very complex notion of what a suffix is; it's just the last part of a name. Often,
+a dot (<CODE>.</CODE>) is used to separate a type-indicating suffix from the rest of the
+name. Since <STRONG>gentoo</STRONG> doesn't know about this, you simply need to include that dot in
+the suffix specification. For example, enter <CODE>.gif</CODE> to find GIF images.
+</P>
+
+<H3>Match Name (RE)</H3>
+<P>
+If a simple suffix isn't enough to identify the files you're after (Amiga tracker modules,
+anyone?), chances are this rule will do the job. It allows you to specify a full regular
+expression, and then attempts to match that against file names. This is incredibly powerful,
+since it can be used to find (quite) arbitrary names. The most typical use is pretty
+mundane, though; RE matching is very handy when you need more than one suffix. A classic
+example is <CODE>.+\.jpe?g</CODE>, which matches against file names that end in a dot
+followed by <CODE>jpeg</CODE> or <CODE>jpg</CODE>. For more information about regular
+expressions and what they can do, <A HREF="../misc.html#re">read on</A>.
+</P>
+<P>
+If you don't need quite the power of regular expressions, you can use patterns of the
+same type as used in many shells. These patterns are (for reasons unknown to me) called
+<EM>glob</EM> patterns. If you want <STRONG>gentoo</STRONG> to treat your RE as a glob pattern,
+click the check button labeled "Glob?" to the right of the input field. For the details
+on how the glob-&gt;RE translation is done, <A HREF="../misc.html#glob">read here</A>.
+</P>
+
+<H3>Match 'file' (RE)</H3>
+<P>
+The last kind of rule is the most powerful. This envokes the external command 'file' on
+files, and allows you to specify a regular expression which when checked against the
+output of 'file' must produce a match. As with the name matching, you can specify that
+the expression you entered is actually a glob pattern by activating the button next
+to the input field. For more information about 'file', see the <A HREF="../types.html">
+file types chapter</A>, and these manual pages: <CODE>file(1)</CODE> and <CODE>magic(4)
+</CODE> on your system.
+<P>
+
+<H2>Specifying a Type's Style</H2>
+<P>
+Once you have the type's identification rules nailed down, it's time to specify how
+you want matching files to be treated (displayed, viewed, etc). You do this by linking
+the type to a <A HREF="../styles.html">style</A>. Hopefully you have already defined
+the style you want, otherwise it's a good idea to do that now. When you know that the
+style you want for this type exists, click the big button in the "Type's Style" frame.
+This brings up a <A HREF="../images/stylesel.gif">simple dialog</A> where you can select
+the style you want. The name of the selected style is shown in the button. If no
+particular style has been selected, it says "Root".
+</P>
+
+<H2>Adding and Deleting Types</H2>
+<P>
+To add a new type, click the "Add" button. This creates a new, empty type, and makes
+it the current one. The first thing you should do after creating a new type is to
+rename it; therefore the name entry box is focused automatically.
+</P>
+<P>
+To delete a type, select it and then click the "Delete" button. The type is immediately
+killed, no questions asked. You cannot delete the "Unknown" type.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/config/gentoorc.html b/docs/config/gentoorc.html
new file mode 100644
index 0000000..3e42e3a
--- /dev/null
+++ b/docs/config/gentoorc.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="cfg_styles.html">
+<LINK REL="Previous" HREF="cfg_gui.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: The gentoo Configuration File</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>The <STRONG>gentoo</STRONG> Configuration File</H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+Like most applications, <STRONG>gentoo</STRONG> needs somewhere to store its settings when it is not
+running, so you don't need to reconfigure it every time. The natural choice is, of course,
+to store the settings in a file in the file system, and this is exactly what <STRONG>gentoo</STRONG>
+does. This page describes the location and format of this configuration file. Unless you're
+a system administrator, there should be no <STRONG>need</STRONG> to read this. Unless you
+have a special interest in config files, that is...
+</P>
+
+<H2>Name and Location</H2>
+<P>
+In keeping with good old Un*x tradition, <STRONG>gentoo</STRONG> calls its configuration file "<CODE>.gentoorc</CODE>".
+Starting the name with a period hides it from (most) shell file listings, which is convenient.
+Ending the name with "rc" identifies it (to Un*x people, anyway) as being a configuration file,
+which is also very convenient.
+</P>
+<P>
+When <STRONG>gentoo</STRONG> starts up, it tries to load a configuration from the file "<CODE>$HOME/.gentoorc</CODE>".
+That is, it looks in the home directory of the user who started it. If the <CODE>HOME</CODE> environment
+variable isn't set, or if there is no config file to be found, <STRONG>gentoo</STRONG> checks for a file
+in "<CODE>/usr/local/etc/.gentoorc</CODE>". It is convenient to place a site-wide standard configuration
+there, since it will be loaded the first time a "new" users runs <STRONG>gentoo</STRONG>. If none of these files
+can be found, <STRONG>gentoo</STRONG> complains and then uses a minimal built-in configuration.
+</P>
+<P>
+The configuration file is always written to the user's home directory - there is no way of specifying
+a different file name. If you're installing <STRONG>gentoo</STRONG> for use by several users, just copy your
+configuration file from your home directory to <CODE>/usr/local/etc/</CODE>, so it can be used as the
+default for users.
+</P>
+
+<H2>File Format</H2>
+<P>
+Again, like most other Un*x programs, <STRONG>gentoo</STRONG> uses a plain-text configuration file. Unlike
+some other programs though, the file format used is highly structural: it's (almost) <STRONG>XML</STRONG>!
+Actually, since the code that loads the file definitely doesn't qualify as being a full-blown
+XML loader, the file isn't really XML either. But is sure looks like it... Basically, the file
+uses tags plus a case-convention to define a tree of values for all configuration options.
+</P>
+<P>
+You are <STRONG>not</STRONG> encouraged to edit around in this file by hand; let <STRONG>gentoo</STRONG> be
+the only entity reading and writing it! The loader code is fairly armored, but still far from
+bullet-proof, so don't provoke it by hacking the file.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/config/index.html b/docs/config/index.html
new file mode 100644
index 0000000..9f03d27
--- /dev/null
+++ b/docs/config/index.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="cfg_gui.html">
+<LINK REL="Previous" HREF="../misc.html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Configuration</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>Configuring <STRONG>gentoo</STRONG></H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+This section covers <STRONG>gentoo</STRONG>'s considerable configuration options. All configuration is done in
+the same window, which is (rather ingeniously) called the configuration window. The configuration
+window consists of a number of <EM>pages</EM>. Below, all links except for the first two take you to
+the documentation for one such page.
+</P>
+
+<TABLE BORDER="0" CELLSPACING="5" CLASS="Note" WIDTH="100%">
+ <TR><TD WIDTH="3%"></TD><TD WIDTH="3%" NOWRAP><H2 CLASS="Note">Note!</H2></TD>
+ <TD WIDTH="94%">
+ <P>This early release of <STRONG>gentoo</STRONG> doesn't have the configuration system fully <EM>documented</EM>.
+ Very much has been implemented, though; each of the nonactive links below refers to a configuration
+ "page" that is fully implemented in the program today. I believe <STRONG>gentoo</STRONG> to be truly useful, if
+ you can figure out how to do it... There will be upcoming releases with more documentation and,
+ generally, more of everything else too. Hold on.</P>
+ </TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<TABLE BORDER="0" CELLSPACING="6">
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>1. <A HREF="cfg_gui.html">The Configuration Window</A></BIG></TD><TD WIDTH="5%"></TD><TD WIDTH="80%">More on the base configuration window, its stock buttons etc.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>2. <A HREF="gentoorc.html">The Configuration File</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Talks about the location and format of the <STRONG>gentoo</STRONG> config data file.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>3. <A HREF="cfg_styles.html">File Styles</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Describes the file style configuration page.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>4. <A HREF="cfg_types.html">File Types</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Talks about the file type page.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>5. <A HREF="cfg_dirpane.html">Directory Panes</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Tells you how to configure the contents of the directory panes, sorting, etc.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>6. User Commands</BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Describes how you set up your own commands.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>7. Buttons</BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Talks about the buttons page, where you can add/change/remove buttons from the button bank.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>8. Shortcuts</BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Information about how to set up your own shortcut buttons.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>9. Paths</BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Gives information about the program-wide paths settings.</TD></TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/config/template.html b/docs/config/template.html
new file mode 100644
index 0000000..94ec1ad
--- /dev/null
+++ b/docs/config/template.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF=".html">
+<LINK REL="Previous" HREF=".html">
+<LINK REL="Stylesheet" HREF="../gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Configuration</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="../index.html"><IMG SRC="../images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="../images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="../images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../relnotes.html" TITLE="Release Notes - Notes regarding this release">NOTES</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="../usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="../acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>Configuring <STRONG>gentoo</STRONG></H1>
+
+<IMG SRC="../images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+
+</P>
+
+
+</BODY>
+</HTML>
diff --git a/docs/contribute.html b/docs/contribute.html
new file mode 100644
index 0000000..2fb07e9
--- /dev/null
+++ b/docs/contribute.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="acks.html">
+<LINK REL="Previous" HREF="history.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Contributing to gentoo</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Contributing to <STRONG>gentoo</STRONG></H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+One of the advantages to open-source software such as <STRONG>gentoo</STRONG> is that the entire
+community can contribute to programs they like; since everyone has the source, there
+really isn't much to it, you can just hack away. I believe this model of software
+development is a Good Thing, which is why I chose to support it, of course.
+</P>
+
+<H2>Where Do I Send My Patch?</H2>
+<P>
+If you have done some important modification of the <STRONG>gentoo</STRONG> source code and
+want to share that with the world, you can just go ahead and distribute your own
+modified version directly. As long as you make your source code available, there's
+nothing wrong with this. Except for a minor practical detail: it might cause the world
+to be flooded by various <STRONG>gentoo</STRONG> "mutants". Therefore, one often sends such changes
+as patches to the maintainer of the package in question. Who is that, then?
+</P>
+<P>
+As the original author of it, I would like to maintain <STRONG>gentoo</STRONG> for the foreseeable
+future. Please send any patches to me. Well documented bug fixes are most welcome, followed
+by nothing, followed by nothing, followed by new features/extensions. The reason for this
+seemingly negative attitude towards community developing (as opposed to community bug
+hunting) is simple: <STRONG>gentoo</STRONG> is my pet project at the moment, and I would like to maintain
+control over what goes into the official version of it. Also, there are a number of features
+lined up for inclusion; this isn't version 1.0.0! Still, the source is open and the entire program
+GPL:ed, so there's nothing stopping you from releasing your own version if you find it necessary.
+</P>
+<P>
+As a matter of fact, I would probably prefer detailed descriptions of any bugs you find,
+as complete as you can make them, rather than actual code. I fear to loose control over the
+source code if I start applying other people's patches all over the place. Also, my coding
+style is seldom compatible with other people's, so any patch code would have to be hand-translated
+into "my" style before inclusion anyway.
+</P>
+
+<H3>OK, So Where <I>Do</I> I Send New Stuff, Then?</H3>
+<P>
+Please e-mail any <STRONG>gentoo</STRONG>-related things directly to me at <A HREF="mailto:emil@obsession.se">
+emil@obsession.se</A>. <STRONG>Please</STRONG> try to include the word "gentoo" in the subject
+line, so I can make some sense out of my mailbox! Thanks.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/dirpanes.html b/docs/dirpanes.html
new file mode 100644
index 0000000..1a49800
--- /dev/null
+++ b/docs/dirpanes.html
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="buttons.html">
+<LINK REL="Previous" HREF="status.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: The Directory Panes</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>The Directory Panes</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+In <STRONG>gentoo</STRONG>'s main window, there are always exactly two directories being shown.
+The directories are displayed in sub-windows inside the main window; each such sub-window
+is called a <EM>directory pane</EM>. Between the panes is a small handle which allows you
+to adjust the relative size of the two panes, this is sometimes useful when one pane is
+more interesting than the other.
+</P>
+<P>
+The pane also provides scrollbars for navigating inside it; these are only shown when
+actually needed. As soon as all information fits on-screen, the scrollbars disappear.
+</P>
+<P>
+Below the file listing, a text box showing the path to the displayed directory is shown.
+To move to another directory directly (without clicking through the hierarchy), you
+can click in this box and type the path. When you press &lt;Return&gt;, <STRONG>gentoo</STRONG>
+will attempt to go to the named directory. If you begin the path with a dollar sign ($)
+and then the name of an environment variable, <STRONG>gentoo</STRONG> will look up the value of
+the variable and use that instead. For example, on many systems you can enter $HOME to
+go to your own home directory.
+</P>
+
+<H2>Current Pane</H2>
+<P>
+One of the two panes is always the <EM>current</EM> one. The active pane has the
+background color of its column buttons set to some distinct color. In the <A HREF="layout.html">screenshot</A>,
+it should be easy to see that the pane on the left is current.
+</P>
+<P>
+To make a pane current, you can:
+</P>
+<OL>
+<LI>Click in it. This will also select the item hit, if any.</LI>
+<LI>Click on one of its scrollbars, if any is displayed.</LI>
+<LI>Click in its path entry text box.</LI>
+<LI>Envoke the <B>ActivateOther</B> built-in command, currently always bound to the &lt;Space Bar&gt; key.</LI>
+</OL>
+
+
+<H2>Pane Columns</H2>
+<P>
+For each row in a pane, <STRONG>gentoo</STRONG> displays a selection of information. Which information
+is displayed, in in what order, is fully user configurable, see the chapter on <A HREF="config/index.html">
+configuring</A> <STRONG>gentoo</STRONG> for details. The information is divided into <I>columns</I>; a column
+displays the same piece of information for all of the rows in a pane. Examples of columns include
+name, size, owner, various dates, and type. There are almost 20 different types of column content
+available for you to choose from! For a rundown on these, see the <A HREF="columns.html">column content</A>
+reference table.
+</P>
+
+<P>
+A directory listing in <STRONG>gentoo</STRONG> is always kept <EM>sorted</EM> in order to make it
+easier for you to locate the files of interest. Sorting is always done on a specific column of
+the pane. The default is to sort on file names. It is often helpful to sort on size, to quickly
+locate the largest files in a directory for example. You can change all about the sorting in the
+configuration window, but there's a quicker way: just click on a column heading (the gray boxes
+showing column content titles) and <STRONG>gentoo</STRONG> will switch the sorting of the pane to the column
+you clicked. Click again and the sorting becomes <EM>inverted</EM>, i.e. it sorts from Z-A rather
+than A-Z.
+</P>
+<P>
+Each pane can have its own sorting configuration.
+</P>
+
+<H2>Selecting Files</H2>
+<P>
+Before you can operate upon any files, you need to tell <STRONG>gentoo</STRONG> which files are of interest. This
+is done by <EM>selecting</EM> the files (or directories, links, devices...) in question. Each pane maintains
+its own set of selected files independently from the other.
+</P>
+<P>
+The simplest, and most commonly used, way to select a file is to place the mouse cursor anywhere in the
+file's row in a pane, and click the left mouse button (once). The display of the file then changes, generally
+inverting the colors, thus indicating that the file has been selected. The <A HREF="status.html">status line</A>
+updates to reflect the change, of course. Clicking on an already selected file causes it to be unselected.
+If you wish to select multiple neigboring rows rapidly, click the mouse on the first, hold the button down, and
+<STRONG>drag</STRONG> towards the last file to select. Then release the button. As you drag, <STRONG>gentoo</STRONG> selects
+all touched files. If you drag fast, <STRONG>gentoo</STRONG> uses a simple interpolation technique to select the intermediate files.
+At the moment, you can not drag outside the pane to cause scrolling, as is customary on e.g. Windows, since
+the GTK+ widget used to implement the dir panes does not support this, and I haven't found a nice (read: simple)
+way of doing it myself...
+</P>
+
+<H3>Power Clicking</H3>
+<P>
+By holding down a keyboard modifier key before clicking, you can alter the way in which <STRONG>gentoo</STRONG> handles
+the click:
+</P>
+
+<DL>
+<DT>Shift</DT>
+<DD>
+ Shift can be used to select a really large interval of files. When you click with a Shift key
+ held down, <STRONG>gentoo</STRONG> will select all files from the last one you clicked to the shift-clicked one. For
+ example, if you click (without Shift) on the first file in a pane, then use the scroll bar to reach
+ the bottom of the pane and Shift-click on the last file, all files will be selected.
+</DD>
+<DT>Control</DT>
+<DD>
+ Control acts just like Shift, but only does unselection. It is moderately useful, but included for completeness.
+</DD>
+<DT>Meta (Alt)</DT>
+<DD>
+ If you hold down the Meta modifier (which on my fairly standard PC keyboard is actually the key labeled "Alt")
+ and click a file, <STRONG>gentoo</STRONG> does something interesting: it <STRONG>toggles</STRONG> the selected/unselected state of
+ <STRONG>all</STRONG> files of the <STRONG>same type</STRONG> as the one clicked!
+ This is mighty useful when working with directories containing files of many different types: if you have
+ <STRONG>gentoo</STRONG> correctly configured, you can select all files of a certain type just by locating one file of
+ the type in question, nailing down that Alt (or whatever) key, and clicking! For more information about file
+ types, read the <A HREF="types.html">relevant chapter</A>.
+</DD>
+<DT>Meta + Shift</DT>
+<DD>
+ When used in combination with Shift, the Meta-click will always <STRONG>select</STRONG> all files of the same type as the
+ clicked one. This is useful if perhaps some of the files are already selected, and you wish to extend the
+ selection to really include them all. Shift+Meta-clicking on any of the files will extend the selection, and not
+ miss anything.
+</DD>
+<DT>Meta + Control</DT>
+<DD>
+ When used in combination with Control, the Meta-click will always <STRONG>unselect</STRONG> all files
+ having the same type as the one clicked. This can be useful if you're trying to reduce a selection down
+ to just a few interesting files, since it allows the removal of all files sharing type from the set
+ of selected files, with just once click.
+</DD>
+<DT>Meta + Shift + Control</DT>
+<DD>
+ If you click a row with all three of these modifiers held down, it indicates that your digital dexterity
+ is above average. It also instructs <STRONG>gentoo</STRONG> to something really cool: toggle the selected state of
+ all rows whose suffix (including the separating period) are equal to that of the clicked row! This can
+ be useful if you are working in a directory containing suffix-typed files, but haven't yet set up
+ <STRONG>gentoo</STRONG>'s <A HREF="types.html">own type-system</A> to handle it. If the clicked row doesn't contain
+ a period, nothing happens.
+</DD>
+</DL>
+
+<P>
+You can also select files based on their name, using Unix System V8 regular expressions. For more information
+on this, see the <B>SelectRE</B> built-in command.
+</P>
+
+<P>
+Once you have one or more files selected, you can perform some operation on them. The standard way to do
+this is to click one of the command button the <A HREF="buttons.html">button bank</A> shown below the directory panes.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/gentoo.1x b/docs/gentoo.1x
new file mode 100644
index 0000000..53b9b8d
--- /dev/null
+++ b/docs/gentoo.1x
@@ -0,0 +1,525 @@
+.\"
+.\" This is the manual page for gentoo. This page appeared first with
+.\" release 0.9.22, so it should at least be current to that release.
+.\"
+.\" As with all other documentation in the gentoo project, it might
+.\" end up being outdated pretty quickly...
+.\"
+.\" gentoo is (c) 1998-2016 by Emil Brink, Obsession Development.
+.\"
+.\" gentoo is freely distributable under the terms of the GNU General
+.\" Public License as specified in the COPYING file included with the
+.\" distribution.
+.\"
+.TH "gentoo" "1x" "June, 2016" "Obsession Development" ""
+.SH NAME
+gentoo \- A highly configurable file manager for X
+.\"
+.SH "SYNOPSIS"
+gentoo [\-\-version] [\-\-locale-info] [\-\-root\-ok] [\-\-no\-rc] [\-\-no\-gtkrc] [\-\-no\-dir\-history] [\-\-left=path] [\-\-right=path] [\-\-run=ARG]
+.\"
+.SH "DESCRIPTION"
+gentoo is a file manager for Linux and compatible systems. It allows you
+to interactively navigate your file system using the mouse, and also to
+perform various fairly standard operations (such as copy, move, rename, ...)
+on the files and directories contained therein.
+.PP
+.\"
+gentoo always shows you the contents of two directories at once. Each of these is
+displayed in its own scrollable list, called a pane. At any time, exactly one pane
+is the
+.I current
+pane, and has a highlighted bar running across its top region. The current pane acts
+as the source for all file operations, while the other pane is the destination. You can
+select rows in panes using selection methods of varying complexity (from simply clicking
+a row, to selecting rows by name using a regular expression). Once you have a selection,
+you can click a button to perform some command on the selected files.
+.PP
+.\"
+All file operations performed by gentoo are implemented natively. When you use gentoo
+to copy a file, for example, gentoo does
+.I not
+simply execute the system's
+.BR "cp" "(1L)"
+command. Rather, gentoo contains its own code for opening source and destination files,
+and then reading and writing the right amount of data between them. This way of doing
+things makes gentoo independent of the availability of shell commands to do things.
+.PP
+.\"
+gentoo incorporates a fairly powerful, object-oriented file typing and
+styling system. It can use a variety of ways to determine the
+.B type
+of the files it is displaying. Each type is then linked to something called a
+.B style,
+which controls how rows of that type are rendered in panes. You can use this
+system to control icons, colors, and various operations on the rows. For
+example, it is easy to make gentoo display all PNG images in red, and to
+invoke
+.BR "The GIMP" (1)
+on them when double-clicked.
+.PP
+.\"
+A design goal with gentoo has been to provide full GUI configurability,
+removing the need to edit a configuration file by hand and restart the program to
+see the changes, as is otherwise common in many programs for Un*x. As a result
+of this, gentoo features a Configuration dialog window where you can configure
+most aspects of its operation directly, using the mouse and standard GUI widgets.
+.PP
+gentoo borrows its basic look'n'feel from the classic Amiga file manager
+Directory OPUS, but is not a "clone" of any kind.
+.\"
+.SH "OPTIONS"
+gentoo is not primarily driven by command line arguments, but the following
+are available:
+.TP
+.B \-\-version
+Causes gentoo to print its version number (a string of the form MAJOR.MINOR.MICRO,
+like 0.20.7) to the standard output, and then exit successfully. Numbers having an
+odd MINOR component indicate development versions of the program. So far, all
+versions of gentoo have been classified as being development versions.
+.\"
+.TP
+.B \-\-locale-info
+Makes gentoo print a couple of localization settings, and then exit.
+This is mostly useful during development and debugging, and not of a
+lot of interest when just using the application.
+.\"
+.TP
+.B \-\-root\-ok
+Makes gentoo accept being run by the root user. Normally, this is not
+allowed since it is considered a big threat to system security. Note
+that gentoo has the ability to execute user-defined strings using the
+.BR "execvp" (3)
+function. This is generally considered harmful. However, if you
+.B "really"
+want to run gentoo while logged on as root, supplying this option
+allows you to. It is
+.B "not"
+recommended, though.
+.\"
+.TP
+.B \-\-no\-rc
+Starts up gentoo without loading any configuration file. This makes
+it run using the built-in defaults, which are
+.B very
+Spartan indeed. Seldom comfortable, but occasionally handy when trying
+to determine if a problem is with the configuration or with the core code.
+.\"
+.TP
+.B \-\-no\-gtkrc
+Avoids loading the GTK+ RC file, thus disabling any widget customizations,
+and forces all widgets to use the default GTK+ look.
+.\"
+.TP
+.B \-\-no\-dir\-history
+Avoids loading the file that holds the history, i.e. which directories have
+been previously visited by the two panes. Very rarely needed, included mostly
+for completeness' sake.
+.\"
+.TP
+.B \-\-left, \-\-right (or \-1, \-2)
+Sets the initial path for the left and right pane, respectively. If present,
+the path specified with one of these options overrides any other path for
+the pane in question. See below (Initial Directory Paths) for details.
+.\"
+.TP
+.B \-\-run ARG (or \-rARG)
+Runs ARG, a gentoo command. Commands specified this way are executed before
+gentoo accepts any user input through the graphical interface, but after the
+configuration file has been read in. You can use it many times in order to
+make gentoo run a whole series of commands. Remember that gentoo's command
+names are case-sensitive, and that built-in commands (like "About") always
+begin with a capital letter.
+\"
+.PP
+Any non-option command arguments will be silently ignored. If an argument "\-h" or
+"\-\-help" is given, gentoo will give a summary of its supported command line options
+and exit successfully. If an unknown option is given, or a option is missing a
+required argument, gentoo will whine and exit with a failure.
+.\"
+.\"
+.SH "BASIC USAGE"
+When gentoo starts up, it will open up its single main window, which is split vertically
+(or horizontally; it's configurable) down the middle, forming the two panes mentioned
+above. It also contains a bank of buttons along the bottom.
+.\"
+.\"
+.SS "Initial Directory Paths"
+The actual paths shown in the two panes upon start-up can be controlled in various
+ways. There are four ways of getting a path to show up in pane. In order of decreasing
+priority, they are:
+.TP
+1. Command-line Argument
+Using the \-\-left and \-\-right (or their short forms, \-1 and \-2) command-line arguments
+overrides any other setting.
+.TP
+2. Configured Default Directory
+If no command-line argument is present, and the "Default Directory" configuration option
+is set, that directory is used.
+.TP
+3. Most Recently Visited Directory
+If no default directory exists, the most recently visited directory is taken from the
+directory history for each pane. This only works if a directory history file has been
+found and loaded.
+.TP
+4. Current Directory
+If all else fails, gentoo uses the current directory (".").
+.\"
+.\"
+.SS "Navigating"
+Navigating around the file system using gentoo is very simple. The two panes act
+as independent views of the file system, and both are navigated in exactly the same way.
+.PP
+You can always see which directory a pane is showing by reading its path, shown in
+the entry box below (by default--you can change the position to above) the pane.
+.PP
+To enter a directory, locate it in the pane and double click it with the left mouse
+button. gentoo will read the directory's contents, and update the display accordingly.
+.PP
+There are several ways of going
+.B "up"
+in the directory structure. To enter the directory
+containing the one currently shown (the current dir's
+.BR "parent" "),"
+you can: click the
+parent button (to the left of the path entry box); hit
+.B "Backspace"
+on your keyboard; click the middle mouse button; select "Parent" from the pop-up
+menu on the right mouse button, or click the downward arrow to the right of the path
+box (this pops up the directory history menu), then select the second row from the top.
+.\"
+.\"
+.SS "Selecting Files"
+Before you can do anything to a file, you need to select it. All file-management commands
+in gentoo act upon the current selection (in the current pane). There are several ways
+of selecting files, but the most frequently used are mouse-based. Note that the word "file"
+used below really should be taken to mean "file or directory", since selection doesn't
+distinguish between the two.
+.PP
+.\"
+To select a file (or directory), just point the mouse at the name (anywhere in the row
+is fine), and click the left mouse button. The colors of the clicked row will change,
+indicating that it is currently selected. To select more rows, keep the mouse button down,
+and drag the mouse vertically. gentoo extends the selection, including all rows touched.
+If you drag across the top or bottom border, the pane will scroll, trying to keep up.
+This is a very quick and convenient way of selecting multiple files, as long as they are
+listed in succession.
+.PP
+If you click again on an already selected file, you will unselect it. You can drag to
+unselect several files, just as when selecting.
+.PP
+.\"
+To select a sequence of files without dragging, first click normally on the first file that
+you wish to select. Then release the mouse button, locate the last file in the sequence
+(it can be either above or below the first one), hold down
+.B "shift"
+on your keyboard, and click the wanted file. gentoo now adds all files between the first
+and the last to the current selection.
+.PP
+.\"
+If you follow the instructions given above to select a sequence, but press
+.B "control"
+rather than
+.B "shift"
+before clicking the second time, gentoo will
+.I "unselect"
+the range of files indicated.
+.PP
+.\"
+If you click on a file with the
+.B "meta"
+key held down (that's actually a key labeled
+.BR "Alt" ","
+located to the immediate left of the space bar, on my PC keyboard), gentoo will do something
+cool: it will select (or unselect, it's a toggle just like ordinary selection) all files,
+including the clicked one, that have the same
+.B "type"
+as the one you clicked. This can be used to select for example all PNG image files in a
+directory even if you can only see one. Occasionally very useful.
+.PP
+.\"
+If you click on a file with both the
+.BR "shift" " and " "control"
+keys held down, gentoo will toggle the selected state of all files having the same
+file name
+.I "extension"
+as the one you clicked. This can sometimes be useful to select files that you don't
+have a proper
+.B "type"
+defined for, as long as those files do share an extension, that is.
+.\"
+.SS "Changing Sort Order"
+The files and directories listed in each of gentoo's two panes are always sorted on some
+column: typically file name. You can chose to sort on some other field by clicking the appropriate
+column title once. If you click on the field that is already current, the sorting will be reversed
+(i.e., for names it will be Z-A rather than A-Z).
+.PP
+If your display includes icons, try sorting on that column: gentoo will then order each row according
+to its File Style, grouping the rows based on their parent styles, all the way up to the root of
+the Style tree. This means that, for example, JPEG and PNG pictures (both having an immediate parent
+style of Image) will be shown together, and before all Text files (HTML, man pages and so on). It's
+quite cool, really. :)
+.\"
+.SS "Executing Commands"
+Commands are used to make gentoo
+.B "do"
+stuff. The typical command operates upon the set of selected files in the current
+pane, so it's usually a good idea to first select some files. See the previous
+subsection for details on how to select files. Once you have a bunch of files selected,
+you need to tell gentoo which command to execute. There are several ways of doing
+this.
+.PP
+.\"
+Most basic file operations (e.g. copy, move, rename, and so on) are found on the (cleverly
+labeled) buttons along the bottom of gentoo's main window. To copy a file, just select it,
+then click the button labeled "Copy". It's really that simple. Most of these built-in
+(or
+.BR "native" ")"
+commands automatically operate recursively on directories, so you could copy (or move)
+a whole directory of files by just selecting it and then clicking "Copy".
+.PP
+.\"
+If you can't see a button that does what you want to do, there's a chance that the
+command exists, but isn't bound. Click the right mouse button in a pane, this opens up
+the "pane pop-up menu". Select the "Run..." item. This opens up a dialog window showing
+all available commands. Select a command, and click "OK" to execute it.
+.\"
+.\"
+.SH "CONFIGURATION"
+gentoo is a pretty complicated program; it has a rather large amount of configuration
+data that it needs in order to be really useful. For example, my current personal
+configuration file contains well over a thousand different configuration values.
+.PP
+.\"
+To store this hefty amount of configuration data, gentoo uses a heavily structured
+configuration file. In fact, the file is (or at least it should be) legal XML!
+.PP
+.\"
+When new features are added to gentoo, they will typically require some form
+of configuration data. This data is then simply added somewhere in the existing
+configuration file structure. Effort is made to assign reasonable built-in default values
+for all such new features, so older configuration files (that don't contain the
+values required by the new features) should still work. The first time you hit
+"Save" in the configuration window after changing your version of gentoo, your
+personal configuration file will be updated to match the version of gentoo.
+.PP
+.\"
+Describing how to go about configuring gentoo is too big a topic for a manual
+page to cover. I'll just say that the command to open up the configuration
+window is called "Configure". It is by default available on a button (typically
+the top-right one), in the pane pop-up menu, and also by pressing the
+.B "C"
+key on your keyboard.
+.PP
+.\"
+.\"
+.SH "FILES"
+.TP
+.I "~/.config/gentoo/gentoorc"
+A user's personal configuration file. When gentoo starts up, it will try to
+load this file. If the file isn't found, the old name
+.I "~/.gentoorc"
+is tested, and if that also fails a site-wide configuration (see below) will be tried instead.
+.\"
+.TP
+.I "/usr/local/etc/gentoorc"
+This is the site-wide configuration file. If a user doesn't have a configuration
+in his/her home directory, gentoo loads this file instead. The actual location
+of this file is slightly system-dependent, the above is the default. As an end
+user, you typically won't need to access this file manually.
+.\"
+.TP
+.I "~/.config/gentoo/dirhistory"
+This file contains lists of the most recently visited directories, for both
+panes. These are the lists that appear in the drop-down menu when the arrow
+next to the path entry box is clicked. Can be disabled in the Dir Pane configuration.
+.TP
+.I "~/.config/gentoo/gtkrc"
+This file allows you to control the look of the widgets used by gentoo,
+through the GTK+ style system. You can change the actual path in gentoo's
+Configuration window, the above is the typical default for a modern Linux-based
+system. If a file named gtkrc is not found in the configured path, the names
+.I "gentoogtkrc"
+and
+.I ".gentoogtkrc"
+(note the period), in that order, are also tested.
+.\"
+.TP
+.I "/etc/passwd," "/etc/group"
+These two files normally hold the system's password and group information.
+These are (probably) the ones gentoo uses to map user IDs to login names,
+to do tilde-expansion (mapping of user name to directory path), and to
+map group IDs to group names.
+.\"
+That is
+.I probably,
+because gentoo doesn't actually refer to these files by name. Instead, it
+uses the (BSD-style) API function calls
+.BR "getpwent" "(3)"
+and
+.BR "getgrent" "(3)"
+to access this information.
+.\"
+.TP
+.I "/etc/fstab," "/proc/mounts," "(or /etc/mtab)"
+These files contain data on available and mounted file systems. They
+are read by gentoo's auto-mounting code. You can configure the exact
+file names used, on the "Mounting" tab in the main configuration window.
+Note that using
+.I "/proc/mounts"
+rather than
+.I "/etc/mtab"
+is recommended on Linux systems; they contain roughly the same data,
+but the one in /proc is always up to date, and faster to read!
+\"
+.SH "BUGS"
+All releases of gentoo numbered 0.x.y, where x (the so called
+.B minor
+version number) is odd, are to be considered
+.B
+development
+releases, as opposed to
+.B
+stable
+ones. This means that the software will probably suffer from bugs. If you find something
+that you suspect is indeed a bug, please don't hesitate to contact the author!
+For details on how to do this, see below.
+.PP
+.\"
+If you're concerned about using potentially buggy and completely unwarranted
+software to manage your precious files, please feel free
+.B not
+to use gentoo. The world is full of alternatives.
+.PP
+.\"
+The chances that a bug gets fixed increase greatly if you report it. When reporting
+a bug, you must describe how to reproduce it, and also try to be as detailed and
+precise as possible in your description of the actual bug. If possible, perhaps
+you should include the output of
+.BR "gdb" "(1)"
+(or whatever your system's debugger is called). In some cases it might be
+helpful if you include the configuration file you were using when the problem
+occurred. Before reporting a bug, please make sure that you are running a
+reasonably recent version of the software, since otherwise "your" bug might
+already been fixed. See below for how to obtain new releases.
+.PP
+.\"
+Also, you should locate and read through the
+.B BUGS
+file distributed with gentoo, so you don't go through all this hassle just to
+report an already known bug, thereby wasting everybody's time...
+.\"
+.\"
+.SH "AUTHOR"
+gentoo was written, from scratch, by Emil Brink. The first line of code was written
+on May 15th, 1998. It is my first program to use the GTK+ GUI toolkit, my first
+program to be released under the GPL, and also my first really major Linux
+application.
+.PP
+.\"
+The only efficient way to contact me (to report bugs, give praise, suggest
+features/fixes/extensions/whatever) is by Internet e-mail. My address is
+.RB "<" emil@obsession.se ">."
+.B Please
+try and include the word "gentoo" in the Subject part of your e-mail,
+to help me organize my inbox. Thanks.
+.\"
+If you're really not in the mood for the direct feel of e-mail, the second best
+choice for reporting bugs and making suggestions is the use the web-based bug
+tracker at
+.RB "<" https://sourceforge.net/p/gentoo/bugs/ ">."
+Thanks for contributing.
+.\"
+.SH "ACKNOWLEDGMENTS"
+The author wishes to thank the following people for their various contributions
+to gentoo:
+.\"
+.TP
+Johan Hanson (<johan@tiq.com>)
+Johan is the man behind all icon graphics in gentoo, and also the author of
+the custom widgets used in it. He also comes up with plenty of ideas for new
+features and changes to old ones, some of which are even implemented. Johan
+has stuff at <http://www.bahnhof.se/~misagon/>.
+.\"
+.TP
+Jonas Minnberg (<sasq@nightmode.org>)
+Jonas did intensive testing of early versions of gentoo, and eventually
+persuaded me into releasing it (back around version 0.9.7 or so).
+.\"
+.TP
+Ulf Petterson (<ulf@obsession.se>)
+Ulf drew the main gentoo logo (the one shown in the About window), and also
+designed the main HTML documentation's layout.
+.\"
+.TP
+Josip Rodin (<jrodin@jagor.srce.hr>)
+Maintainer of the gentoo package for Debian Linux, and also a source
+of suggestions for improvements, as well as a relay for bug reports
+from Debian Linux users.
+.\"
+.TP
+Ryan Weaver (<ryanw@infohwy.com>)
+Maintainer of the gentoo packages for Red Hat Linux, and probably one of
+the fastest package creators out there. :)
+.\"
+.TP
+Oliver Braun, Jim Geovedi and Pehr Johansson
+Maintainers of gentoo ports to FreeBSD, OpenBSD, and NetBSD, respectively.
+.PP
+.\"
+Thanks also to all people who have mailed me about gentoo, providing bug
+reports, feature requests, and the occasional kind word. :^) It's because
+of people like yourselves that we have this wonderful computer platform to
+play with.
+.\"
+.\"
+.SH "COPYRIGHT"
+gentoo is released as free, open-source software, under the terms of the
+GNU General Public License (GNU GPL), version 2. This license is included in the
+distribution under the traditional name of
+.B
+COPYING,
+and I suggest that you read it if you're not familiar with it. If you can't
+find the file, but have Internet access, you could take a look at
+.B "<http://www.gnu.org/>."
+It is important to realize that the mentioned license means that there is
+.B "ABSOLUTELY NO WARRANTY"
+for this software.
+.\"
+.\"
+.SH "OTHER INFO"
+Some unfinished, outdated, but still pretty informative documentation is
+available, in HTML format, in the
+.B docs/
+subdirectory in the distribution archive. If you haven't installed gentoo
+from the original .tar.gz distribution archive, you might need to either
+inspect the distribution you
+.B "did"
+use (perhaps it came as some form of "package"), or contact a system
+administrator.
+.PP
+.\"
+The GTK+ GUI toolkit that gentoo requires is available at
+.B "<http://www.gtk.org/>."
+gentoo uses the slightly outdated stable series, called 1.2.x. The latest
+known release in that series is GTK+ 1.2.10. Because of severe performance
+problems, gentoo will probably not be ported to use the current (2.0.x)
+series of GTK+ any time soon.
+.PP
+.\"
+The latest version of gentoo is always available on the official
+gentoo home page, at
+.B "<http://www.obsession.se/gentoo/>."
+.\"
+.SH "SEE ALSO"
+.BR regex (7),
+.BR file (1),
+.BR magic (5),
+.BR fstab (5),
+.BR strftime (3)
+.PP
+.\"
+Manual page section numbers in this page refer to sections on (some?)
+Linux systems, your mileage will most likely vary. Try the
+.BR apropos (1)
+command, it might help you out.
diff --git a/docs/gentoo.css b/docs/gentoo.css
new file mode 100644
index 0000000..5e46919
--- /dev/null
+++ b/docs/gentoo.css
@@ -0,0 +1,129 @@
+BODY {margin-top: 0px;
+ margin-left: 0px;
+ margin-right: 0px;
+ margin-bottom: 0px;
+ background-color: #FFFFFF;
+ font-size: 12px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+P {margin-left: 60px;
+ font-size: 12px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+P:first-letter {}
+
+PRE {margin-left: 80px;
+ line-height: 24px;
+ font-weight: bold;
+ font-size: 12px;
+ font-family: Letter Gothic, Courier New, Courier, monospace;}
+
+DIV {margin-left: 60px;
+ text-align: Center;
+ font-size: 10px;
+ font-weight: bold;
+ font-family: Arial, Helvetica, sans-serif;}
+
+A {text-decoration: none;
+ font-weight: bold;
+ font-family: Arial, Helvetica, sans-serif;}
+
+A:link {color: #00EE00;
+ text-decoration: none;}
+
+A:visited {color: #FFCC66;}
+
+A:hover {color: #CCFF00;}
+
+A:active {color: #FFFF00;}
+
+BIG {font-weight: bold;
+ font-size: 14px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+UL,OL {margin-left: 80px;
+ font-size: 12px;
+ line-height: 24px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+DL {margin-left: 80px;
+ font-size: 12px;
+ line-height: 18px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+DT {font-weight: bold;
+ font-size: 14px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+TABLE {font-size: 12px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+TABLE.NavBar {background: #000000;
+ font-weight: bold;
+ font-size: 10px;
+ color: #FFFFFF;
+ font-family: Arial, Helvetica, sans-serif;}
+
+TD.Section {background: #DD6644;
+ text-align: center;}
+
+TD.Select {text-align: center;}
+
+H3 {font-weight: bold;
+ text-indent: 60px;
+ font-size: 14px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+H4 {font-weight: bold;
+ font-size: 14px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+H3 {text-indent: 60px;
+ font-weight: bold;
+ font-size: 14px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+H2 {color: #EF8210;
+ letter-spacing: -1px;
+ text-indent: 40px;
+ text-transform: uppercase;
+ font-weight: bold;
+ font-size: 15px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+H2:first-letter {font-size: 18px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+H2.Note {color: #DD6644;
+ border-right: 2px;
+ letter-spacing: -1px;
+ text-transform: uppercase;
+ font-weight: bold;
+ font-size: 18px;
+ font-family: Lucida Sans, Verdana, Arial, Helvetica, sans-serif;}
+
+H1 {color: #000000;
+ letter-spacing: -3px;
+ text-indent: 40px;
+ font-weight: bold;
+ font-size: 28px;
+ font-family: Lucida Sans, Verdana, Arial, Helvetica, sans-serif;}
+
+H1:first-letter {color: #000000;
+ letter-spacing: -3px;
+ text-indent: 40px;
+ font-weight: bold;
+ font-size: 28px;
+ font-family: Lucida Sans, Verdana, Arial, Helvetica, sans-serif;}
+
+H1.Index {color: #000000;
+ letter-spacing: -3px;
+ text-indent: 0px;
+ font-weight: bold;
+ font-size: 28px;
+ font-family: Lucida Sans, Verdana, Arial, Helvetica, sans-serif;}
+
+.Font {font-size: 12px;
+ font-family: Arial, Helvetica, sans-serif;}
+
+.Hemlig {visibility: hidden} \ No newline at end of file
diff --git a/docs/gpl.html b/docs/gpl.html
new file mode 100644
index 0000000..7d99163
--- /dev/null
+++ b/docs/gpl.html
@@ -0,0 +1,406 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="license.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Table of Contents</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>License - GPL</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+
+<P>
+This is just a plain HTML-ized version of the GNU General Public License.
+Hopefully, I can do this reformatting without violating anything...
+</P>
+<P>
+
+<PRE>
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ &lt;one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy &lt;name of author>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ &lt;signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+</PRE>
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/history.html b/docs/history.html
new file mode 100644
index 0000000..1edb948
--- /dev/null
+++ b/docs/history.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="contribute.html">
+<LINK REL="Previous" HREF="config/cfg_paths.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: History</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>History</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+This page will contain the release history for <STRONG>gentoo</STRONG>. The approximate date for each
+release is listed, together with some small notes on why the release was made, any big
+changes/fixes made to the code, and so on. I love reading stuff like this, so I might just
+write some of my own. :)
+</P>
+
+<TABLE BORDER="0" CELLSPACING="6">
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP STYLE="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">
+ <BIG STYLE="font-weight: bold; font-size: 18px"><STRONG>v0.0.0</STRONG></BIG><BR> 1998-05-17</TD>
+ <TD WIDTH="5%"></TD><TD WIDTH="80%" STYLE=" font-size: 12px; font-family: Arial, Helvetica, sans-serif;">
+ <SPAN STYLE="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">
+ <STRONG>Development begins</STRONG><BR>
+ Right out of the blue, I start playing around with GTK+, trying to put together something
+ that resembles a file manager. It's my first GTK+ program ever. It kind of grew, I guess...</SPAN></TD>
+ </TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP STYLE=" font-size: 12px; font-family: Arial, Helvetica, sans-serif;">
+ <BIG STYLE="font-weight: bold; font-size: 18px"><STRONG>v0.9.0</STRONG></BIG><BR> 1998-09-11</TD>
+ <TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">
+ <SPAN STYLE="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">
+ <STRONG>Initial release</STRONG><BR>
+ Autumn semester has started, so we got to get the code out to the people. :)</SPAN></TD>
+ </TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/images/bullet.gif b/docs/images/bullet.gif
new file mode 100644
index 0000000..98ff886
--- /dev/null
+++ b/docs/images/bullet.gif
Binary files differ
diff --git a/docs/images/cfg_dirpane.gif b/docs/images/cfg_dirpane.gif
new file mode 100644
index 0000000..ca22d78
--- /dev/null
+++ b/docs/images/cfg_dirpane.gif
Binary files differ
diff --git a/docs/images/cfg_gui.gif b/docs/images/cfg_gui.gif
new file mode 100644
index 0000000..eba1b5d
--- /dev/null
+++ b/docs/images/cfg_gui.gif
Binary files differ
diff --git a/docs/images/cfg_styles.gif b/docs/images/cfg_styles.gif
new file mode 100644
index 0000000..8a05895
--- /dev/null
+++ b/docs/images/cfg_styles.gif
Binary files differ
diff --git a/docs/images/cfg_styles2.gif b/docs/images/cfg_styles2.gif
new file mode 100644
index 0000000..184b181
--- /dev/null
+++ b/docs/images/cfg_styles2.gif
Binary files differ
diff --git a/docs/images/cfg_styles3.gif b/docs/images/cfg_styles3.gif
new file mode 100644
index 0000000..b079635
--- /dev/null
+++ b/docs/images/cfg_styles3.gif
Binary files differ
diff --git a/docs/images/cfg_types.gif b/docs/images/cfg_types.gif
new file mode 100644
index 0000000..341cbd1
--- /dev/null
+++ b/docs/images/cfg_types.gif
Binary files differ
diff --git a/docs/images/cfg_types2.gif b/docs/images/cfg_types2.gif
new file mode 100644
index 0000000..545b19f
--- /dev/null
+++ b/docs/images/cfg_types2.gif
Binary files differ
diff --git a/docs/images/cmd_chmod.gif b/docs/images/cmd_chmod.gif
new file mode 100644
index 0000000..592c67d
--- /dev/null
+++ b/docs/images/cmd_chmod.gif
Binary files differ
diff --git a/docs/images/cmd_dialog.gif b/docs/images/cmd_dialog.gif
new file mode 100644
index 0000000..73abb42
--- /dev/null
+++ b/docs/images/cmd_dialog.gif
Binary files differ
diff --git a/docs/images/cmd_inp1.gif b/docs/images/cmd_inp1.gif
new file mode 100644
index 0000000..6f0f532
--- /dev/null
+++ b/docs/images/cmd_inp1.gif
Binary files differ
diff --git a/docs/images/cmd_inp2.gif b/docs/images/cmd_inp2.gif
new file mode 100644
index 0000000..d16028b
--- /dev/null
+++ b/docs/images/cmd_inp2.gif
Binary files differ
diff --git a/docs/images/cmd_inp3.gif b/docs/images/cmd_inp3.gif
new file mode 100644
index 0000000..03faedc
--- /dev/null
+++ b/docs/images/cmd_inp3.gif
Binary files differ
diff --git a/docs/images/cmd_inp4.gif b/docs/images/cmd_inp4.gif
new file mode 100644
index 0000000..b7a8744
--- /dev/null
+++ b/docs/images/cmd_inp4.gif
Binary files differ
diff --git a/docs/images/cmd_inp5.gif b/docs/images/cmd_inp5.gif
new file mode 100644
index 0000000..b9ca56b
--- /dev/null
+++ b/docs/images/cmd_inp5.gif
Binary files differ
diff --git a/docs/images/cmd_selectre.gif b/docs/images/cmd_selectre.gif
new file mode 100644
index 0000000..dcd9bfd
--- /dev/null
+++ b/docs/images/cmd_selectre.gif
Binary files differ
diff --git a/docs/images/colsel.jpeg b/docs/images/colsel.jpeg
new file mode 100644
index 0000000..e9dd913
--- /dev/null
+++ b/docs/images/colsel.jpeg
Binary files differ
diff --git a/docs/images/columnedit.gif b/docs/images/columnedit.gif
new file mode 100644
index 0000000..f9b6e2f
--- /dev/null
+++ b/docs/images/columnedit.gif
Binary files differ
diff --git a/docs/images/gentoo_logo.gif b/docs/images/gentoo_logo.gif
new file mode 100644
index 0000000..6db32ac
--- /dev/null
+++ b/docs/images/gentoo_logo.gif
Binary files differ
diff --git a/docs/images/gentoo_logo_g.gif b/docs/images/gentoo_logo_g.gif
new file mode 100644
index 0000000..f8780b5
--- /dev/null
+++ b/docs/images/gentoo_logo_g.gif
Binary files differ
diff --git a/docs/images/gentoo_logo_g_small.gif b/docs/images/gentoo_logo_g_small.gif
new file mode 100644
index 0000000..5f2019b
--- /dev/null
+++ b/docs/images/gentoo_logo_g_small.gif
Binary files differ
diff --git a/docs/images/gentoo_logo_small.gif b/docs/images/gentoo_logo_small.gif
new file mode 100644
index 0000000..c0feae6
--- /dev/null
+++ b/docs/images/gentoo_logo_small.gif
Binary files differ
diff --git a/docs/images/gentoo_logo_text.gif b/docs/images/gentoo_logo_text.gif
new file mode 100644
index 0000000..6dea6c3
--- /dev/null
+++ b/docs/images/gentoo_logo_text.gif
Binary files differ
diff --git a/docs/images/iconsel.gif b/docs/images/iconsel.gif
new file mode 100644
index 0000000..57d3373
--- /dev/null
+++ b/docs/images/iconsel.gif
Binary files differ
diff --git a/docs/images/layout.gif b/docs/images/layout.gif
new file mode 100644
index 0000000..427d649
--- /dev/null
+++ b/docs/images/layout.gif
Binary files differ
diff --git a/docs/images/od__logo_small.gif b/docs/images/od__logo_small.gif
new file mode 100644
index 0000000..d20e5c5
--- /dev/null
+++ b/docs/images/od__logo_small.gif
Binary files differ
diff --git a/docs/images/popupmenu.gif b/docs/images/popupmenu.gif
new file mode 100644
index 0000000..af69c93
--- /dev/null
+++ b/docs/images/popupmenu.gif
Binary files differ
diff --git a/docs/images/popupmenu2.gif b/docs/images/popupmenu2.gif
new file mode 100644
index 0000000..6eb6732
--- /dev/null
+++ b/docs/images/popupmenu2.gif
Binary files differ
diff --git a/docs/images/status_error.gif b/docs/images/status_error.gif
new file mode 100644
index 0000000..9764301
--- /dev/null
+++ b/docs/images/status_error.gif
Binary files differ
diff --git a/docs/images/style_tree.gif b/docs/images/style_tree.gif
new file mode 100644
index 0000000..7fdcfd8
--- /dev/null
+++ b/docs/images/style_tree.gif
Binary files differ
diff --git a/docs/images/stylesel.gif b/docs/images/stylesel.gif
new file mode 100644
index 0000000..8ea05ef
--- /dev/null
+++ b/docs/images/stylesel.gif
Binary files differ
diff --git a/docs/images/tone.gif b/docs/images/tone.gif
new file mode 100644
index 0000000..275d0a0
--- /dev/null
+++ b/docs/images/tone.gif
Binary files differ
diff --git a/docs/images/tone2.gif b/docs/images/tone2.gif
new file mode 100644
index 0000000..9d71026
--- /dev/null
+++ b/docs/images/tone2.gif
Binary files differ
diff --git a/docs/images/tone3.gif b/docs/images/tone3.gif
new file mode 100644
index 0000000..e17c2a5
--- /dev/null
+++ b/docs/images/tone3.gif
Binary files differ
diff --git a/docs/index.bt b/docs/index.bt
new file mode 100644
index 0000000..2d4a160
--- /dev/null
+++ b/docs/index.bt
Binary files differ
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..b370164
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="gpl.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Table of Contents</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<TABLE WIDTH="100%" BORDER="0" CELLSPACING="6">
+ <TR><TD WIDTH="15%"></TD><TD><STRONG>Version 0.20.1</STRONG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">&nbsp;</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD><H1 CLASS="Index" STYLE="font-size: 28 px;"><STRONG>Table of Contents</STRONG></H1></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top"></TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>1. <a href="gpl.html">License Agreement</a></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%">Before you do <STRONG>anything</STRONG> with this software, read this! Four words: GNU GPL, <STRONG>no</STRONG> warranty.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>3. <A HREF="quick.html">Quick Guide</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Even if you don't generally read documentation, please try to read this anyway.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>4. <A HREF="intro.html">Introduction</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Introduction to <STRONG>gentoo</STRONG>.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>5. <A HREF="usage.html">Usage</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">The main text on how to actually use this program.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>6. <A HREF="config/index.html">Configuration</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">If you want to know more about configuring <STRONG>gentoo</STRONG>, and I believe you do, read here.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>7. <A HREF="history.html">History</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">History of changes between various versions.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>8. <A HREF="contribute.html">Contributing</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">If you feel like hacking...</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>9. <A HREF="acks.html">Acknowledgements</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Thanks.</TD></TR>
+</TABLE>
+
+<BR>
+
+<TABLE BORDER="0" CELLSPACING="5" CLASS="Note" WIDTH="100%">
+ <TR><TD WIDTH="3%"></TD><TD WIDTH="3%" NOWRAP><H2 CLASS="Note">Note!</H2></TD>
+ <TD WIDTH="94%">
+ <P>This documentation is rather incomplete, and seldom updated.</P>
+ </TD>
+ </TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/docs/intro.html b/docs/intro.html
new file mode 100644
index 0000000..725a7b5
--- /dev/null
+++ b/docs/intro.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="usage.html">
+<LINK REL="Previous" HREF="quick.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Introduction</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Introduction</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Why Another Filemanager?</H2>
+<P>
+Yeah, who am I to think I have the right to write yet another bloody filemanager? Haven't I checked the archives
+already for the heaps of proven alternatives? Why add yet another never-to-be-finished GPL project to the world?
+Don't I feel any kind of responsibility at all?
+</P>
+<P>
+Well... I guess I <EM>wanted</EM> to write a file manager. Sure, I've seen the discussions on <A HREF="http://www.slashdot.org/">
+slashdot</A> about the "problems" with Linux software; everyone writes file managers and IRC clients, and noone
+writes "useful productivity applications" like word processors, spread sheets, and data base apps. Someone (no
+names) even went so far as to suggest that the next person to release an IRC client should be shot! I dare not
+think about how that person feels toward people like me, who spend their time reinventing the file manager.
+</P>
+<P>
+Still, this is free software. I wrote it because I wanted to learn the GTK+ toolkit, and also because I wanted
+a nice, GUI-configurable file manager. I know there are hundreds of file managers already, but of those I've
+checked out, none felt "right" for me. So I wrote my own, and then decided to share it with the community.
+I believe that to still be my right, and if you seriously think otherwise, I suggest you reconsider the meaning
+of the word "free".
+</P>
+<P>
+If you don't like this program, don't use it. If you don't understand that, seek help.
+</P>
+
+<H2>Design Goals</H2>
+<P>
+It would be a lie to say that <STRONG>gentoo</STRONG> was designed with any specific goals in mind. I wanted to learn
+the GTK+ toolkit, and I have always wanted a file manager that somewhat resembled the Amiga classic "Directory Opus"
+under Linux. So I started hacking, and <STRONG>gentoo</STRONG> is the result. However, while writing it, some core ideas
+surfaced and (IMHO) managed to make into the code:
+<UL>
+<LI>A clean graphical interface. GTK+ provides that.</LI>
+<LI>A basic single-window, two-pane model, since I find it optimal.</LI>
+<LI>Full GUI configuration, no need to hack config files by hand.</LI>
+<LI>File typing and -styling, allowing user to configure the look of files.</LI>
+<LI>Provide basic file operations as built-in primitives; avoid depending on external commands.</LI>
+</UL>
+</P>
+
+<H2>Cool Features</H2>
+<P>
+These are some of the features I find make <STRONG>gentoo</STRONG> an interesting program, even considering
+the competition:
+<UL>
+<LI>Single-window split into two panes.</LI>
+<LI>Fairly small (executable is &lt;250KB, when stripped).</LI>
+<LI>Looks and feels modern, much thanks to the GTK+ interface.</LI>
+<LI>... more to come...</LI>
+</UL>
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/layout.html b/docs/layout.html
new file mode 100644
index 0000000..10aede7
--- /dev/null
+++ b/docs/layout.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="status.html">
+<LINK REL="Previous" HREF="usage.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Window Layout</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Window Layout</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+This screenshot shows the main <STRONG>gentoo</STRONG> window, along with some labels (in blue)
+showing names for various parts of it:
+</P>
+
+<DIV>
+<IMG SRC="images/layout.gif" WIDTH=650 HEIGHT=542 ALT="A screenshot showing the layout" BORDER="0">
+</DIV>
+
+<P>
+For details on what the various parts actually <I>do</I>, please check the following sections:
+<A HREF="status.html">status line</A>, <A HREF="dirpanes.html">dirpane</A> and <A HREF="buttons.html">button bank</A>
+(with <A HREF="buttons.html#shortcuts">shortcuts</A>).
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/menus.html b/docs/menus.html
new file mode 100644
index 0000000..c02623d
--- /dev/null
+++ b/docs/menus.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="commands.html">
+<LINK REL="Previous" HREF="buttons.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Menus</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Menus</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+This section describes the use of menus in <STRONG>gentoo</STRONG>. In this early release, the menu
+support is <EM>extremely</EM> limited; there's just one menu, and its contents are hard-coded...
+</P>
+
+<H2>The Dirpane Popup Menu</H2>
+<P>
+If you've only used <STRONG>gentoo</STRONG> for a couple of minutes, or perhaps just observed what
+it's supposed to look like on the <A HREF="layout.html">screenshot</A>, you might think
+that there are no menus. After all, there's no standard menu bar at the top of the window.
+</P>
+<P>
+This is because there are no normal menus! The only menu currently available in <STRONG>gentoo</STRONG>
+is a simple "pop-up menu". It is accessed by placing the mouse pointer somewhere inside
+a directory pane, and then clicking (and holding down) the right mouse button. A small menu
+with the following options appears:
+</P>
+
+<DIV>
+<IMG SRC="images/popupmenu.gif" WIDTH=89 HEIGHT=108 ALT="An image of the pop-up menu">
+</DIV>
+
+<P>
+The items are, in order of appearance:
+<DL>
+<DT>Parent</DT>
+<DD>This goes up one directory level in the current pane.</DD>
+<DT>Other</DT>
+<DD>Set the path of the current pane to that of the other one.</DD>
+<DT>Rescan</DT>
+<DD>Clear pane contents, and rescan the path from the file system.</DD>
+<DT>Select</DT>
+<DD>Presents a submenu (as hinted by the little right arrow) with the
+following options:
+
+
+<TABLE BORDER="0">
+<TR><TD ROWSPAN="4"><IMG SRC="images/popupmenu2.gif" WIDTH=57 HEIGHT=84 ALT="The select popup menu"></TD>
+ <TD><SPAN CLASS="Font">Select all items in current pane.</SPAN></TD></TR>
+<TR><TD><SPAN CLASS="Font">Unselect all items in the current pane, thus clearing the selection.</SPAN></TD></TR>
+<TR><TD><SPAN CLASS="Font">Toggle the selected/unselected state of each row. Inverts the set.</SPAN></TD></TR>
+<TR><TD><SPAN CLASS="Font">Opens up the <A HREF="images/cmd_selectre.gif">regular expression selection window</A>.</SPAN></TD></TR>
+</TABLE>
+
+</DD>
+<DT>Configure</DT>
+<DD>Opens up the <A HREF="config/index.html">configuration</A> window.</DD>
+</DL>
+
+</P>
+</BODY>
+</HTML>
diff --git a/docs/menus.txt b/docs/menus.txt
new file mode 100644
index 0000000..c019bd4
--- /dev/null
+++ b/docs/menus.txt
@@ -0,0 +1,41 @@
+ 2001-01-01
+ Emil Brink
+
+ Menus in gentoo
+
+ WARNING: (this is incomplete: don't read it!)
+
+
+1. INTRODUCTION
+This little document contains some thoughts about how menus are
+handled in gentoo. It was created for version 0.11.16, which is
+the first version of gentoo to include user-configurable menus.
+
+This document serves two purposes: it provides a place for me
+to organize my thoughts about the menu implementation, and it
+hopefully makes it easier to understand why the menus in gentoo
+work as they do.
+
+
+2. THE ORIGINAL MENU MODEL
+My original plan for the menu system were to implement a simple,
+yet flexible and pretty general solution. In that original model,
+a "menu" is a named list of menu items. An item is either a
+simple labeled command envocation, or a submenu.
+
+There are two ways in which a menu is made available in the user
+interface: it can be attached to a command button, in which case
+right-clicking the button opens up the menu. A menu can also be
+opened through the legacy MenuPopup command, which takes the name
+of a menu and pops it up under the mouse pointer.
+
+2.1 The Problem With the Original Model
+The problem created by the model described above is that is easy
+to use the same menu in several places; for example, one could
+attach a menu to a button, and then run a MenuPopup command on
+the very same menu. A menu must be mapped onto a GtkWidget data
+structure for GTK+ to handle, and then the issue of ownership
+enters the equation.
+
+3. THE SOLUTION
+Um, it's in the code.
diff --git a/docs/misc.html b/docs/misc.html
new file mode 100644
index 0000000..3367e03
--- /dev/null
+++ b/docs/misc.html
@@ -0,0 +1,221 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="config/index.html.html">
+<LINK REL="Previous" HREF="styles.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Miscellaneous</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Miscellaneous</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+This page contains various bits of information that doesn't fit somewhere else,
+or that are waiting to be inserted into some other context.
+</P>
+
+<A NAME="re"><H2>Regular Expressions</H2></A>
+<P>
+The regular expression implementation used in <STRONG>gentoo</STRONG> was written by Henry
+Spencer at the University of Toronto. It is "nearly-public-domain", and has not
+been modified in any way to fit into <STRONG>gentoo</STRONG>. I thank Mr Spencer for saving
+me a substantial amount of work. In fact, the description below on how to write
+regular expressions is greatly "inspired" by Mr Spencer's <CODE>man</CODE>-page...
+</P>
+<H3>What are Regular Expressions?</H3>
+<P>
+Regular expressions are a way of writing "patterns" of text strings. A regular
+expression can be <EM>matched</EM> against a string (called the <EM>input string</EM>),
+an operation that always produces one of two results: either a match, or a miss. The
+thing that makes regular expressions useful is that there is generally more than just
+one string against which a regular expression can actually match. Because of this,
+regular expressions can be used to classify strings by just looking for matches.
+</P>
+<H3>How to Write Regular Expressions</H3>
+<P>
+This will get a bit formal, because it is the easiest way to describe regular
+expressions, and I'm kinda lazy. There are several concrete examples below, though.
+</P>
+
+<UL>
+<LI>
+ A regular expression (RE) is zero or more <EM>branches</EM>, separated by <CODE>|</CODE>
+ (the vertical bar, or "pipe" character) . The expression matches anything that matches one
+ of the branches.</LI>
+<LI>
+ A branch is zero or more <EM>pieces</EM>, concatenated. The branch matches anything that
+ matches the first piece, followed by the second, and so on.</LI>
+<LI>A piece is an <EM>atom</EM> possibly followed by one of <CODE>*</CODE>, <CODE>+</CODE>
+ or <CODE>?</CODE>:
+ <UL>
+ <LI>An atom followed by <CODE>*</CODE> matches a sequence of 0 or more matches of the atom.</LI>
+ <LI>An atom followed by <CODE>+</CODE> matches a sequence of 1 or more matches of the atom.</LI>
+ <LI>An atom followed by <CODE>?</CODE> matches either the atom or nothing (the empty string).</LI>
+ </UL>
+<LI>An atom is either:
+ <UL>
+ <LI>A regular expression in parentheses, which matches a match for that regular expression,</LI>
+ <LI>A <EM>range</EM> (see below),</LI>
+ <LI>A period (<CODE>.</CODE>), which matches any single character,</LI>
+ <LI>A circumflex (<CODE>^</CODE>), which matches the null string at the <EM>start</EM> of the input,</LI>
+ <LI>A dollar (<CODE>$</CODE>), which matches the null string at the <EM>end</EM> of the input,</LI>
+ <LI>A backslash (<CODE>\</CODE>) followed by any character, which matches that character, or</LI>
+ <LI>Any single character not mentioned above, which matches that character.</LI>
+ </UL>
+<LI>A range is a sequence of characters enclosed in square brackets (<CODE>[</CODE> and <CODE>]</CODE>).
+ It normally matches any single character from the sequence. If the first character after the opening
+ bracket is ^, the range is "inverted" and matches any single character <EM>not</EM> not in the
+ sequence. If two characters in the range have a hyphen (<CODE>-</CODE>) between them, this is
+ shorthand notation for the range of all characters between them (according to ASCII). To include a
+ literal <CODE>[</CODE> character in the range, make it the first character after the actual opening
+ bracket. To include a hyphen, make it the first or last character.</LI>
+</UL>
+
+<H3>Examples of Regular Expressions</H3>
+<P>
+As promised above, here are a few examples of regular expressions of varying complexities:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="80%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="30%">Example Expression</TH><TH>Explanation</TH></TR>
+<TR BGCOLOR="#C0C0E0"><TD><CODE>abc</CODE></TD><TD>This matches the exact string "abc", and nothing else.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD><CODE>abc|def|ghi</CODE></TD><TD>This matches either "abc", "def", or "ghi".</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD><CODE>a+[b-y]z+</CODE></TD><TD>This matches any string that begins with one or more
+"a"'s, proceeds with any letter except "a" and "z", and then ends with one or more "z"'s. Examples of strings
+that match are "agzz", "aaaaaaaiz", "aabz".</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD><CODE>a+[^az]z+</CODE></TD><TD>Like the previous example, except it allows any character
+except for "a" or "z" to occur between the sequences of "a"'s and "z"'s. Examples, again: "aaa-zzz", "aa(aaz",
+"a+zzz".</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD><CODE>.+\..+</CODE></TD><TD>This suspicious-looking expression matches any string of
+length at least three with a period in the "middle". Examples: "aa.7", "...", "3.14".</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD><CODE>.+\.(jpeg|jpg)</CODE></TD><TD>This matches any string of characters that ends
+in a period followed by either "jpeg" or "jpg". The application should be obvious; this can be used in a file
+type to identify JPEG files that have been properly named.</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD><CODE>.+\.jpe?g</CODE></TD><TD>This matches exactly the same set of strings as the
+previous example, but using a simpler expression.</TD></TR>
+</TABLE>
+</DIV>
+
+
+<A NAME="glob"><H2>Glob to RE Translation</H2></A>
+<P>
+A "glob" expression is something similar to a regular expression; it's a pattern that can be used
+to check against matches with other strings. Glob patterns are often used in Un*x shells, when you
+type e.g. "<CODE>ls -l *.c</CODE>", the last part is a glob pattern. It can be seen that it is not
+a proper regular expression, because a RE cannot begin with an asterisk.
+</P>
+<P>
+Since glob patterns are generally easier to write than are REs, and many people already know how
+to write simple glob patterns, <STRONG>gentoo</STRONG> sometimes allows you to enter a glob pattern, while
+internally translating it to a RE which is then used just as above. The following translations
+are done to accomplish this:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="80%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="10%">Glob Pattern</TH><TH WIDTH="10%">Becomes</TH><TH>Comment</TH></TR>
+<TR BGCOLOR="#C0C0E0"><TD ALIGN="center"><CODE>.</CODE></TD><TD ALIGN="center"><CODE>\.</CODE></TD>
+<TD>The period is "magic" in REs, and needs to be escaped.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD ALIGN="center"><CODE>*</CODE></TD><TD ALIGN="center"><CODE>.*</CODE></TD>
+<TD>In glob patterns you use a single asterisk to mean "zero or more of any character". Not so
+in regular expressions.</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD ALIGN="center"><CODE>+</CODE></TD><TD ALIGN="center"><CODE>\+</CODE></TD>
+<TD>The plus symbol has a special meaning in REs, and therefore needs to be escaped.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD ALIGN="center"><CODE>?</CODE></TD><TD ALIGN="center"><CODE>.</CODE></TD>
+<TD>In glob patterns, the question mark means "any character". That is the meaning of the period
+in REs, so it is simply replaced.</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD ALIGN="center">other</TD><TD ALIGN="center">same</TD>
+<TD>Any other symbol is just copied straight over to the RE. This includes character ranges,
+which are copied as a whole.</TD></TR>
+</TABLE>
+</DIV>
+
+<P>
+Now, we can translate a glob pattern to its corresponding RE easily: the example "<CODE>*.c</CODE>"
+becomes "<CODE>.*\.c</CODE>".
+</P>
+
+<TABLE BORDER="0" CELLSPACING="5" CLASS="Note" WIDTH="100%">
+ <TR><TD WIDTH="3%"></TD><TD WIDTH="3%" NOWRAP><H2 CLASS="Note">Note!</H2></TD>
+ <TD WIDTH="96%">
+ <P>I don't have any documentation defining glob patterns more exactly. The above
+ is basically based on empirical research (read: loads of testing) and experience. No guarantees,
+ people.</P>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="icons"><H2>Icons and Icon Paths</H2></A>
+<P>
+When you specify an icon for <STRONG>gentoo</STRONG> to use, you don't include the search path. In stead,
+it is assumed that the icons will be collected in a common directory somewhere. This "somewhere"
+can be specified in the "Icons" text box on the "Paths" page in the config window. In fact, you
+can have any number of somewheres; just separate individual paths with colons as usual in Un*x.
+Paths that are specified as relative (i.e. their first character is <EM>not</EM> a slash) are
+treated as being relative to the directory that was current when <STRONG>gentoo</STRONG> was started.
+If this sounds arbitrary, it's probably because it is. However, having some kind of rule for this
+case makes things (feel) more robust, and I like that.
+</P>
+<P>
+Icon names are just plain filenames, without paths, and always end in ".xpm". Currently,
+<STRONG>gentoo</STRONG> doesn't use any fancy image-loading library but only plain GDK, and therefore
+only supports icons in the XPM pixmap format.
+</P>
+<P>
+When <STRONG>gentoo</STRONG> notices that an icon is required, for example because a row with a style
+specifying a certain icon is about to be rendered, it will search the given icon path one
+component at a time for the named icon. As soon as a match is found, it will be used. Therefore,
+you can never have icons of the same names, even if they reside in different directories; <STRONG>gentoo</STRONG>
+will only ever find the first one.
+</P>
+<BR>
+
+</BODY>
+</HTML>
diff --git a/docs/quick.html b/docs/quick.html
new file mode 100644
index 0000000..96990d1
--- /dev/null
+++ b/docs/quick.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="intro.html">
+<LINK REL="Previous" HREF="gpl.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Quick Guide</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Quick Guide</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Intro</H2>
+<P>
+This is a super-quick guide to <STRONG>gentoo</STRONG>. Its purpose is to provide, at a glance, some ideas
+about what kind of a program <STRONG>gentoo</STRONG> is, and how you use it.
+</P>
+
+<H2>General Principles</H2>
+<P>
+<STRONG>gentoo</STRONG> is a direct-manipulation, single-window, two-pane, mouse-oriented and graphically
+configurable file manager. It provides simultanous display of the contents of two directories in
+your file system, and allows you to operate upon the files (and directories, links, et cetera) shown.
+It can do file type recognition, and allows you to control how files of various types are displayed.
+</P>
+<P>
+When you start up <STRONG>gentoo</STRONG>, you will be presented with a single window. This is the
+main window, in which all file operations are carried out. The window is split vertically into
+two big areas, called <I>panes</I>. Each pane presents a vertical list of the the contents of a directory;
+the path to that directory is shown below the pane.
+</P>
+<P>
+One of the two panes is always the <STRONG>current</STRONG> pane, signified by it having a heavy black
+border. The current pane acts as the <EM>source</EM> directory for most file operations, while the
+other pane becomes the <EM>destination</EM>. To select a different pane, click it.
+</P>
+
+<H2>Basic Operations</H2>
+<H3>Selecting Files</H3>
+<P>
+Click the left mouse button on a row in a pane to select it. Its colors invert to indicate selection.
+Click it again to deselect. You can drag the mouse to (de)select mutiple rows quickly.
+</P>
+
+<H3>Operating Upon Selected Items</H3>
+<P>
+Once you have selected a few items, you can envoke various functions built into <STRONG>gentoo</STRONG> to
+do things to the selected items. For example, to copy the selected files (and directories) to the
+destination pane, click the "Copy" button in the button bank below the panes.
+</P>
+
+<H3>Configuring</H3>
+<P>
+<STRONG>gentoo</STRONG> has been designed to provide 100% graphical configurability. This means that <STRONG>all</STRONG>
+options recognized by the program can be set using the mouse and standard GUI controls such as buttons,
+lists, check boxes, and so on. To access the configuration GUI, click the button labeled "Configure".
+</P>
+
+<H3>Quitting</H3>
+<P>
+If <STRONG>gentoo</STRONG> isn't for you, and you want out; just close its window. The program will terminate
+immediately, no questions asked.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/scratch/README b/docs/scratch/README
new file mode 100644
index 0000000..c3e8a53
--- /dev/null
+++ b/docs/scratch/README
@@ -0,0 +1,4 @@
+These files contain various pieces of information about gentoo. The
+technical level might be very high in some of these.
+
+/Emil
diff --git a/docs/scratch/command_args.txt b/docs/scratch/command_args.txt
new file mode 100644
index 0000000..98ea797
--- /dev/null
+++ b/docs/scratch/command_args.txt
@@ -0,0 +1,342 @@
+ 2010-10-06
+ Emil Brink
+
+ Arguments to Built-In Commands
+
+1. INTRODUCTION
+This little text outlines gentoo's support for argument to its
+built-in commands. This support was first introduced in release
+0.11.6, but is likely to grow as more commands are added and/or
+old commands extended to support it.
+
+
+2. WHAT'S NEW
+In releases prior to 0.11.6, gentoo's built-in commands either did
+not accept any kind of information from the user, or popped up some
+sort of interactive GUI to get the required parameters. Good examples
+of these two "types" of built-ins are the DirEnter and SelectRE
+commands; the former always figured out for itself what it should
+do, while the latter always presented a dialog for parameters.
+ The addition of arguments to built-in commands changes this;
+now you can control commands directly from the invocation string. To
+take SelectRE as an example, you could now specify a command to toggle
+the selection state of all currently non-selected, non-directory
+items containing the word "foo" in their name, by giving a command
+such as:
+
+ "SelectRE set=unselected action=toggle glob=true *foo*"
+
+This will cause the SelectRE command to immediately perform the
+requested matching and selection action; there will be no dialog
+window.
+
+
+3. ARGUMENT SYNTAX
+The command argument system in gentoo is somewhat different from
+what is common in e.g. shells. There are two different kinds of
+arguments that can occur in a command line: keywords and non-
+keywords (also called "barewords").
+ Keywords use the keyword=value syntax. A bareword, on the
+other hand, is a string that does not contain an equals ("=") sign.
+ Commands generally take zero or one bareword argument as
+their main input on what to do, and then zero or more optional
+keyword arguments to further control the action. The SelectRE
+command shown above is a good example; it takes as a bareword arg
+the regular expression to match against, and up to seven different
+keyword arguments to modify the way the selection is done.
+ When compared to the syntax used in common command line
+interpreters like bash, this seems to be an extremely wordy and
+inefficient syntax. This might be true, but remember that commands
+in gentoo are generally not issued interactively, rather they are
+written once when configuring gentoo, and then executed by the click
+of a button or press of a key. Therefore, IMO, it is not as import-
+ant to optimize the command lines for speed of entry.
+
+3.1 OVERALL KEYWORD SYNTAX
+The "keyword" part should be a sequence of non-blank characters.
+Typically, it will consist of nothing but alphabetical symbols
+(letters). Keywords are case insensitive. Keyword VALUES are typically
+NOT case insensitive!
+ The "value" part will typically be an arbitrary string.
+Separating the two parts is an equals sign (=). There must not be
+any whitespace on either side of the equals, since that would separate
+the argument into multiple arguments.
+
+3.2 KEYWORD VALUE SYNTAX
+Currently, there are three (rather lazily defined) types of value
+arguments; strings, booleans, and enumerations.
+
+3.2.1 Strings
+A string is the simplest form of value: it has no special structure
+known to the command argument system. It's just a string of text.
+
+3.2.2 Booleans
+Booleans are to be interpreted as either TRUE or FALSE. To make a
+boolean argument evaluate to TRUE for the command, specify one of
+"yes", "true", "on" and "1" as the value part of the argument. In
+fact, "" (the empty string) works just as well. Any other string
+(like "no", "false", "foo", and "I_do_not_think_so_pal") will render
+a value of FALSE to the command.
+
+3.2.3 Enumerations
+Enumerations are arguments whose value part should be one of a small
+set of predefined strings. The "set" and "action" arguments shown in
+the SelectRE example above are enumeration arguments. Below, the
+legal enumerations for each command will be listed. Please note that
+enumerations are case-insensitive as well.
+
+
+4. COMMAND ARGUMENTS
+This section describes the arguments understood by each builtin
+command in gentoo. If a command is not listed, that means it does
+not take any arguments. Passing arguments to a command that doesn't
+take any, or passing the wrong arguments, will (in most cases) have
+no effect.
+ For each keyword argument below, its type is listed.
+Enumerations will have the valid set of strings listed. In most cases,
+these enumerations will have the exact same wording as some GUI
+controls for the same command, and will therefore (hopefully) be
+more or less self-explanatory.
+ Bareword arguments are shown as having type "bareN", where
+N is the index on the command line of the word (counting only the
+barewords). If N is missing, the command takes only one bareword
+argument. Keywords that appear in parentheses below are actually
+barewords (they all have "bare" in the Type column) !
+
+DirEnter
+Keyword Type Description
+dir string The path you want to enter. If relative
+ (not starting with a '/'), it will be
+ relative to the contents of the current
+ pane. If not specified, DirEnter will
+ check the selection as usual.
+(dir) bare You can also specify the path as a bare
+ word. This will not work if the path
+ contains the '=' symbol, though.
+
+
+DpFocus
+Keyword Type Description
+center bool Causes the currently focused row, if any,
+ to be vertically centered in the pane.
+select bool If TRUE, the row that is current BEFORE
+ any movement of the focus bar has its
+ selection status toggled.
+(command) bare Use this bareword to control what the
+ focus bar should do. There are several
+ different words available:
+ none Hide the focus bar.
+ same Leave the bar alone. This is the
+ default.
+ prev Move bar up one row.
+ next Move bar down one row.
+ pageprev Move bar up roughly one pageful
+ of rows.
+ pagenext Move the bar down a rough page.
+ first Move bar to first row in pane.
+ last Move bar to last row in pane.
+ activate Activate focused row; works like
+ a double-click of it would.
+
+NOTE The "pageprev" and "pagenext" movements are not exactly
+ well implemented. Consider them a rough hack, and use them
+ only with that in mind. Thanks.
+
+
+DpFocusISrch
+This command has new semantics; use arrow up/down to move between hits.
+Keyword Type Description
+start string The string is interpreted as an integer, and the
+ search will then require that the given string
+ occurs for the *first* time at that offset in a
+ filename for it to match. Defaults to "0", so if
+ you say "DpFocusISrch start" it will only match
+ to the start of filenames.
+text string Set the initial search string to the value, and
+ also do a search for it immediately.
+
+
+DpGotoRow
+Keyword Type Description
+re string This lets you specify a pattern using the
+ usual regular expression syntax. The first
+ row whose file name matches the pattern will
+ be scrolled into view. There is no requirement
+ that the expression matches the entire filename,
+ nor is there a requirement that it matches from
+ the start. To get the latter, just prefix the
+ RE with the circumflex (^) symbol, as usual. To
+ get the former, postfix a dollar ($) sign as
+ well.
+row integer This lets you specify the index of the row you
+ wich to go to, rather than using a regular
+ expression to select it. Only one of 're' and
+ 'row' may be used at a time. If both are specified,
+ 're' takes precendence.
+focus bool If TRUE, the target row will be focused in
+ addition to being made visible.
+nocase bool If TRUE, the regular expression matching is
+ done without regard for case differences. If
+ FALSE, as is the default, case matters.
+
+
+DpFocusPath
+Keyword Type Description
+clear bool If TRUE, the contents of the path text entry box
+ are removed before being focused.
+select bool If TRUE, the contents of the path text entry box
+ will be selected in addition to focused.
+
+
+DpMaximize
+Keyword Type Description
+index int Maximizes the pane with the given index. If the
+ index is negative, the current pane is maximized.
+
+
+FileAction
+Keyword Type Description
+action string The FileAction is used to operate upon files
+ in a pane. It runs commands specified in the
+ each file's style, as action properties.
+ The argument is the name of the action to
+ run. If no argument is given, the default
+ action ("Default") is executed. Note that
+ the property name is case sensitive: you must
+ use the exact same casing as when you defined
+ the property.
+ This command replaces the older FileDefault,
+ FileView, FileEdit etc. commands.
+
+
+DpReorient
+Keyword Type Description
+orient enum If value is "h", "horiz", or "horizontal", set
+ pane split to horizontal (the "classic" mode).
+ If it's "v", "vert" or "vertical", set it to
+ vertical. If absent, the mode is toggled to
+ whichever isn't the current one.
+quiet bare If present, the change of the orientation will
+ not "dirty" the configuration.
+
+
+MenuPopup
+Keyword Type Description
+atfocus bare If included, the gentoo will attempt to position
+ the menu over the currently focused row, rather
+ than at the mouse pointer position. If no focused
+ row exists, the menu is centered in the pane.
+menu string Name of menu to pop up. The only name currently
+ supported is the default, "DirPaneMenu".
+
+
+SelectRE
+Keyword Type Description
+set enum Determine the set of rows to do the
+ selection in, based on the rows' current
+ selection status. Valid values are "all
+ rows", "selected", and "unselected".
+type enum Further affect the set of affected rows,
+ this time based on the row's file system
+ type. Valid values are "all types",
+ "directories only", and "non-directories
+ only".
+action enum Controls what is done with rows that match
+ the expression. Should be one of "select",
+ "unselect" and "toggle".
+content enum Selects the content to match against. Must
+ be a single mnemonic word that signifies the
+ content type. The following types of content
+ are currently recognized:
+ name nlink devmin
+ size uid atime
+ smartsize uname mtime
+ blocks gid ctime
+ blocksize gname type
+ modenum device (icon)
+ modestr devmaj
+ The use of "icon" as content is not supported.
+ Hopefully, these shortened names should be
+ understandable.
+glob bool If TRUE, the regular expression will be
+ interpreted as a shell glob pattern. If
+ not, it will be taken as a true RE.
+invert bool If TRUE, invert the sense of the matching.
+full bool If TRUE, require the expression to match
+ full text of a row's name. If FALSE,
+ a partial match (e.g. "a" matches "abc")
+ will do.
+nocase bool When TRUE, the regular expression matcher
+ will ignore differences in case between the
+ expression and the filenames.
+(re) bare The actual regular expression to match. If
+ this word is not present, the dialog will appear.
+
+NOTE Arguments to the SelectRE command will retain their values
+ across invocations, and will also appear as defaults in the
+ GUI the next time it is used.
+
+
+SelectRow
+Keyword Type Description
+row number Specify the number of the row you wish to have
+ selected. Only a single row can be specified.
+ You can use the "0x" prefix for hexadecimal
+ row numbers, if you're so inclined.
+
+action enum Should be one of "select", "unselect", and
+ "toggle". Hopefully self-explanatory.
+
+NOTE If the "row" keyword is _not_ specified, gentoo will use whatever
+ row was last clicked (in any pane, not necessarily the current one).
+ This is kind of tricky to use correctly, but works well when put
+ in sequence with a "MenuPopup" and bound to the right mouse button
+ in panes. This emulates Windows right-clicking, which is sometimes
+ neat.
+
+
+SelectShell
+Keyword Type Description
+set enum Same as for SelectRE, see above.
+type enum Same as for SelectRE, see above.
+action enum Same as for SelectRE, see above.
+content enum Same as for SelectRE, see above.
+(command) bare The command to execute. The selected content will
+ be appended for each row in the set, and when the
+ command returns "success" (i.e. zero), the action
+ will be performed.
+ Example: SelectShell action=toggle "grep -q hello"
+
+NOTE Arguments to the SelectShell command will retain their values
+ across invocations, and will also appear as defaults in the
+ GUI the next time it is used.
+
+
+SelectSuffix
+Keyword Type Description
+action enum Controls what will be done to rows whose names
+ end in the same suffix as either the row you
+ clicked or the focused row. Can be "select",
+ "unselect" or "toggle". Self-explanatory?
+
+
+ViewText
+Keyword Type Description
+encoding string Name of the encoding to expect text to be in.
+mode enum Controls how ViewText will view the contents of
+ a given file. If absent or set to "auto", it will
+ inspect the beginning of the file; if it looks like
+ text in the given encoding, it's viewed as such.
+ If not, or if mode is set to "hex", it will be
+ viewed as hexadecimal data. You can also set the
+ mode to "text" to force text viewing.
+
+
+Quit
+Argument Type Description
+dialog bool If TRUE, the Quit command will always show
+ a dialog, regardless of whether the config
+ has changed or not. If FALSE, the dialog
+ will never be shown. To get the old-style
+ behaviour, with automatic dialog only if the
+ config has changed, omit the argument.
diff --git a/docs/scratch/command_howto.txt b/docs/scratch/command_howto.txt
new file mode 100644
index 0000000..23e2121
--- /dev/null
+++ b/docs/scratch/command_howto.txt
@@ -0,0 +1,163 @@
+ 1999-03-02
+ Emil Brink
+
+ Defining a command
+
+1. INTRODUCTION
+This little text describes how to define a new command in gentoo. Such
+a command is commonly referred to as a "user command". There are two
+kinds of commands in gentoo; those that are built-in ("native"), and
+those that aren't. The latter are what this text is about.
+ In a perfect world, this file wouldn't exist, since this would
+all be covered in the Complete Gentoo Documentation. Unfortunately,
+that have yet to be written. In the meantime, perhaps this text can
+shed some light on the topic.
+ Defining your own commands to do the things you want is an
+important part of utilizing gentoo, so this could be important stuff.
+Read on, and don't hesitate to mail me (at <emil@obsession.se>) if you
+have questions, corrections, or whatever.
+
+
+2. WHERE IS IT DONE?
+To create a user command, open up gentoo's configuration dialog window,
+and click on the tab labeled "Commands". This displays a list of all
+currently defined user commands, plus interface controls that allow you
+to modify, add and delete commands.
+ All operations described below refer to the current command. To
+make a command current, click on its name in the command listing. As the
+command becomes current, the interface reflects this by showing the
+settings for it.
+ It will probably be a lot easier to follow this text if you
+open up the relevant window, so you can check out the interface along
+with reading about it...
+
+
+3. WHAT'S A COMMAND?
+A user command has basically two parts: a name and a definition. The
+name is just some word you choose; typically it should be descriptive
+so you can understand what the command does from its name. Command names
+should begin with a lower-case letter, to distinguish them from the
+built-ins.
+ The definition of a user command consists of a sequence of rows.
+Each row has a type; its either "built-in" or "external". In the former
+case, all the row does is envoke one of gentoo's built-in commands. In
+the latter case, the row causes an external program (such as a shell
+command or another application) to execute.
+
+
+4. DEFINITION EDITING
+In the frame labeled "Definition", the current command's definition is
+shown. The main part of the frame is taken up by a list, showing the
+command's rows. To the left of the list are buttons for adding,
+duplicating, moving and deleting rows. These buttons all act on the
+current row; to make a row current just click it in the list.
+
+
+4.1 ROW EDITING
+Once a row has been selected, you can modify it in various ways. These
+modifications are carried out through the interface below the row list.
+ You can change a row's type, its contents, and the flags from
+this interface.
+
+
+4.2 ROW TYPE
+To change a row's type, select the row and then locate the big popup-
+menu-button (or GtkOptionMenu as its known in the GTK+ widget set) in
+the top left corner of the row editing interface. It will read as either
+"Built-in" or "External", showing you the row's current type. Click on
+the button, and a popup-menu appears with these two types in it. Point
+at the desired type, and click again. The row's type changes to the one
+selected.
+
+
+4.3 ROW DEFINITION STRING
+The most important part of a row is its definition string. This is a
+line of text that you can enter and edit in order to control what the
+row should do when executed.
+ The meaning of the definition string is type-dependant.
+
+
+4.3.1 BUILT-IN DEFINITION
+For a row of type "Built-In", the definition string is really simple:
+it's just the name of a gentoo built-in command to run. For example,
+you could enter "Quit" to envoke the quitting command.
+ The tiny button labeled "..." to the right of the string entry
+field pops up a window allowing you to pick a command name from a list
+of built-ins. The name you select will replace whatever is in the entry
+box.
+
+
+4.3.2 EXTERNAL DEFINITION
+The definition of an external command is a lot more flexible and power-
+ful than that for built-ins. As a side effect, it is also considerably
+more complex.
+ Basically, what you want to do in a external row definition is
+tell gentoo which external command to run, and with which arguments.
+ You can use special selection codes (spelled using braces) in
+the definition string to make gentoo supply information that you want
+to include in the execution.
+ As a simple example, you could use a definition of "echo {f}"
+(without the quotes) to print out the name of the first selected item
+in the pane that is active when the command is run. In this example,
+'echo' is the name of the standard shell command to print text; '{f}'
+is a info selection code that is replaced by the name of the first
+selected file.
+ There are plenty of these data selection codes available. For
+a list (with brief explanations), click on the "..."-button located to
+the right of the entry field. The code you select will be appended at
+the end of the current definition.
+
+4.3.3 EXTERNAL FLAGS
+External commands have a number of flags, that control their behaviour.
+ There are three categories of flags: General, Before and After.
+ The General flags control general aspects of the command exe-
+cution. The currently available flags are:
+Run in Background?
+ Starts up the command in the background, letting it run
+ without tying up gentoo's interface (as it otherwise would).
+Kill Previous Instance?
+ Instructs gentoo to kill the process that the last execution
+ of this command resulted in. Requires background execution.
+Survive Quit?
+ Normally, gentoo will attempt to kill all child processes
+ spawned from it when you quit. If this flag is set, the corre-
+ sponding process will not be killed. Requires background.
+Capture Output?
+ When this is set, gentoo will open up a window into which the
+ command's standard output and error streams will be directed.
+
+The Before and After flag categories contain flags that are applied
+either before or after the command has executed. It works like this:
+first, the Before flags are applied. Then the child process that is
+going to run the command is spawned. When the child terminates, the
+After flags are applied.
+ The flags available in the two categories are the same, with
+the exception of the "Change Directory" group, which is missing for
+obvious reasons in the After category.
+
+
+5. NOTES
+Here are a few notes and general "words of wisdom" regarding user
+commands, their definition & execution:
+
+* The order in which rows are executed is unknown for rows that have
+ the "Run in Background?" flag set.
+* Rows that don't run in the background must complete before the next
+ row starts to execute. This means that you the sequence of rows
+ really is a sequence; commands further down will run after those
+ closer to the top, and thus can depend on their results.
+* External rows are executed by the execvp(3) system call, which
+ means that you don't need to include paths in the command name.
+ It also means that all the stuff normally done by the shell is
+ missing (e.g. $- & ~-expansion, pipes, redirection with < & >).
+ Dollar and tildeexpansion are provided through {}-codes. If you
+ need pipes and/or redirection, run your program through the shell
+ (e.g. use a string of 'sh "my_program <input >output | prog2"',
+ where the single quotes should not be included, but the double
+ ones should).
+* If a {}-code is likely to result in a string containing spaces,
+ you may want to surround it with quotes in the command definition.
+* It is never necessary to define a user command containing just
+ a single row of type "Built-In", since wherever a user command
+ name is accepted, you can always enter the name of a built-in
+ directly. This is how most of the example config's buttons work.
diff --git a/docs/scratch/command_options.txt b/docs/scratch/command_options.txt
new file mode 100644
index 0000000..6db6f33
--- /dev/null
+++ b/docs/scratch/command_options.txt
@@ -0,0 +1,124 @@
+ 2008-07-08
+ Emil Brink
+
+ Command Options
+
+1. INTRODUCTION
+As of version 0.11.4, gentoo includes user interface controls for
+a number of "command options". These options allow you some control
+over how some of the built-in commands perform their actions, thus
+allowing you to further customize gentoo's behaviour.
+
+
+2. COMMAND OPTION DESCRIPTIONS
+The command options are presented in the main configuration window,
+on the page labeled "Command Options".
+ The options are organized on one page per command, with
+a row of tabs allowing you to choose which command to customize.
+The interface is automatically generated, which is why it currently
+might look a little less slick than other parts of the GUI (at least
+to me, it does).
+ The descriptions here are arranged with one section per
+option page, ordered alphabetically (as are the pages in the actual
+interface).
+
+2.1 Copy
+The Copy command has the following options:
+
+Preserve Dates During Copy?
+ When set, this boolean option will cause the Copy command to
+ attempt to also copy the access and modification dates of the
+ original file. This is done using the utime(2) system call.
+
+Leave Failed Destination if Full Size?
+ Normally, the Copy command will remove the destination file if
+ an error occurs during the copying operation. This option,
+ however, will (when set) cause the Copy command to leave the
+ destination file, if it has the same size as the source file.
+ This is sometimes useful in combination with the above
+ option, since the date setting might fail on some file systems.
+
+Buffer Size
+ This lets you set the number of bytes gentoo reads and writes
+ while copying. Setting it to a large value might increase per-
+ formance (since fewer system calls are being done, and more
+ bytes transferred per call), while setting it lower will help
+ conserve memory.
+ The default setting is 256 KB, which seems to give
+ reasonable performance.
+
+2.2 DpFocus
+The DpFocus has just a single option:
+
+Wrap Around at Top and Bottom?
+ When set, this option will cause the focus bar, when moved by
+ "DpFocus prev/next" commands, to wrap around when you try to
+ move it out of the pane. This means that if you're on the top
+ row of a pane, and run "DpFocus prev", you will move to the
+ last row. If, on the other hand, the option was not set, then
+ the commandw would have no effect.
+
+
+2.3 GetSize
+The GetSize command has only a single option:
+
+Unselect Rows When Done?
+ When set, this option causes the GetSize command to unselect
+ each (directory) row, after it has computed the size for it.
+ This is the default behaviour, and is consistent with the
+ way all other commands in gentoo work.
+ When not set, rows will be left selected. This is
+ somtimes useful, e.g. when issuing a GetSize command in order
+ to determine if for example a Copy will succeed. In these
+ cases it is nice not having to re-select the rows after the
+ sizes has been computed.
+
+
+2.4 Information
+The Information command has the following options:
+
+Recurse Directories?
+ When set, this option will cause the Information command to
+ "dive" into selected directories, and recursively compute the
+ size of the contents. When set, an extra row (with the label
+ "Contents") will appear in the Information window for each
+ directory.
+
+Access, Modify and Change Date Formats
+ These three strings allow you to specify the how the command
+ shall format the dates it display. There are three dates per
+ file, hence the three formatting strings.
+ For information about the syntax for these format
+ strings, see the strftime(3) manual page.
+ The default format used is "%Y-%m-%d %H:%M.%S",
+ which cause the date to appear in the ISO standard format of
+ YYYY-MM-DD, followed by the time in 24-hour notation.
+
+
+2.5 MkDir
+The MkDir command has only one option:
+
+CD Into New Directory?
+ This boolean, when set, will cause the MkDir command to enter
+ the freshly created directory. This option is also available
+ in the actual MkDir window, for convenience.
+
+
+2.6 ViewText
+The ViewText command, and its relatives the ViewHex and ViewTextOrHex
+commands, have the following options in common (not all are used by
+all commands):
+
+Buffer Size
+ This lets you set the size of the read buffer used by the
+ ViewText command when mmap() (see above) is NOT being used.
+ As usual, a large buffer might improve performance,
+ while a small conserves memory.
+
+Hex-Check First
+ This option lets you set the number of bytes read (from the
+ start of a file) by the ViewTextOrHex command when it is
+ trying to determine how to view the file.
+ A larger value will improve the accuracy of the
+ decision, but take more time.
+ The default value is 512 bytes.
diff --git a/docs/scratch/commands.txt b/docs/scratch/commands.txt
new file mode 100644
index 0000000..527341a
--- /dev/null
+++ b/docs/scratch/commands.txt
@@ -0,0 +1,232 @@
+ 1998-09-24
+ Emil Brink
+
+ Gentoo Command Architecture II
+
+1. INTRODUCTION
+This document describes a plausible alternative command architecture for
+gentoo, the GTK+ file manager I've been poking around with somewhat
+lately.
+
+
+2. THE OLD ARCHITECTURE
+The current command architecture is a three-tier thing; there are three
+basic components used to perform actions. These are (in order of increasing
+conceptual size):
+ 1. Built-In Commands
+ 2. User Commands
+ 3. Command Sequences
+Let's have a look at each of these three kinds of components in turn:
+
+2.1 BUILT-INS
+A built-in command is a named entity that exists within gentoo, as an
+always-present basic part of it. Built-ins are accessed by name; each
+built-in has a unique name. Examples of built-in command names are Quit,
+DirEnter, SelectRE and FileDefault. All built-in commands have names
+that begin with a capital letter, and have capital initials in any sub-
+sequent words. The names never contain whitespace or underscores.
+
+2.2 USER COMMANDS
+A user command is a lot more complex in appearance than is a built-in.
+As their name sort of implies, user commands are defined and implemented
+by the user, using external programs (such as shell commands and general
+applications). A user command has a name, by which it is referenced. It
+also has a definition, i.e. a string telling which external program is
+to be envoked, and with which arguments. Special codes can be used inside
+the definition in order to have gentoo substitute special data (such as
+names of selected files, directory paths to panes, etc). There are also
+a number of flags for each user command, that control various aspects
+of the command's execution.
+
+2.3 COMMAND SEQUENCES
+A command sequence is a very dumb thing; it's just a list of commands,
+that gentoo executes one by one in turn (or in parallel, but that is
+really just a special case:). The sequence has no name. You connect a
+command sequence to an action (such as a file style action or a button)
+by explicitly defining the command sequence when defining the style,
+button or other thing.
+
+Once a sequence is defined, you cannot use it from somewhere else without
+simply defining a duplicate of the same sequence.
+
+The ONLY thing you can bind to an action is a command sequence; there
+is no way to just put a "bare" command reference in a button.
+
+
+3. PROBLEMS
+There are a few problems with the present command architecture, mainly:
+ 1. Since most actions only need a single command, it's in-
+ convenient to first define it as a user command and THEN
+ define a short sequence containing jus the command.
+ 2. On the few occasions when you really want more than one
+ command in a sequence, you create something complex that
+ can't be reused. That is dumb.
+ 3. It's done, and needs no more twiddling to work. :^)
+
+
+4. NEW ARCHITECTURE
+Here is a proposed (i.e., I'm not sure I'll ever get around to imple-
+menting this, but I sure want to) new architecture.
+
+The core idea here is KISS, at least sort of. To make a complex thing
+simple, it's often a good idea to see that can be removed. Try to do
+that to the current way things works, and you might hit a wall directly,
+since (at least to me) it seems as if everything is necessary. You
+can't remove the built-ins, since they're what make gentoo tick in the
+first place. Removing the user commands looks bad too, since you'll
+want the ability to use external programs. And of course, you need
+command sequences to allow packaging multiple commands into a unit.
+
+If you feel like this, then I'm happy, because that means that my
+original design doesn't seem all that stupid to you, after all. :)
+Unfortunately, it does to me, now... Here's the new deal:
+
+ 1. Keep the built-ins, of course.
+ 2. Remove the user-commands (wait!)
+ 3. Redefine the command sequences.
+
+Details follow.
+
+4.1 THE BUILT-INS
+Really no change here, except that I might make it possible for built-
+in commands to accept general arguments, thus allowing the shortcuts
+to be reimplemented as ordinary commands (e.g. "DirEnter {$HOME}"). Nice!
+
+4.2 THE USER COMMANDS
+I want to get rid of the concept of named user-commands altogether.
+See below.
+
+4.3 COMMAND SEQUENCES
+The big change will be in the command sequences. Currently, a sequence
+can be thought of as a comma-separated list of command names to execute
+(for example: "ActivateOther,DirFromOther,DirEnter,ActivateOther,
+UnselectFirst"). This is very simple, and works pretty well. It is not
+very flexible, though. The proposed solution (?) I have goes like
+this:
+ 1. Make the sequences named (makes them reusable).
+ 2. Free form format, with "inlined" user commands.
+
+The latter point means that it should be possible to define a sequence
+like this: "xv {fp}; UnselectFirst; xv {fp};", to take a silly example.
+
+Note how this simply dumps the idea of named user commands, throwing
+them directly into the sequence.
+
+4.4 PROPOSED CONFIG FORMAT
+Since sooner or later, any new format must be expressed as a serial
+data stream in the config file, I might just as well sketch a little on
+that, too.
+
+What we have is a set of named sequences, each sequence consisting of
+any number (from 1 and up) of rows. Each row has a definition string,
+which might consist of just about anything, a type (I still like to keep
+built-ins clearly separate from anything else), and some amount of
+other, type-specific, data (for external commands, that would be the
+various flags). Here's a sketch of how we might represent this in
+the config (stuff in parentheses are comments):
+
+<Commands> (The main commands node)
+ <Command> (A command (i.e. a sequence))
+ <name>show_image</name>
+ <CDef>
+ <CRow>
+ <type>1</type> (Type 1: external program)
+ <def>"xv {fp}"</def> (Definition; call 'xv')
+ <EFlags> (Flags for external command)
+ <general>4712</general> (Some general flags; background etc)
+ <before>0</before> (The classic before and after
+ <after>0</after> flags)
+ </EFlags>
+ </CRow>
+ <CRow>
+ <type>0</type> (Type 0: built-in)
+ <def>"UnselectFirst"</def> (Just a call of a built-in)
+ </CRow>
+ </CDef> (End of 'show_image' definition)
+ </Command>
+</Commands> (End of all commands)
+
+4.5 PROPOSED INTERNAL FORMAT
+Knowing how something will look in the config is all fine and nice,
+but the config file is only that - a file stored on disk. While gentoo
+is running, I would like a somewhat more straight-forward storage format.
+
+Executing commands is something done very often in gentoo, and although
+I'm sure we could parse the entire config from scratch everytime and
+still not think it's sluggish, I would know that it were and hate it. :)
+
+Here's a proposed way of representing these things internally, using
+a bunch of simple C structures and some of that wonderful glib glue:
+
+typedef enum { CRTP_BUILTIN, CRTP_EXTERNAL } CRType;
+
+typedef struct { /* Extra info for external commands. */
+ guint32 gflags; /* General flags. */
+ guint32 baflags[2]; /* Before and after flags. */
+} CX_Ext;
+
+typedef struct { /* A command "row". */
+ CRType type; /* The type of the row. */
+ GString *def; /* The row definition string. */
+ guint32 flags; /* Flags common to all types. */
+ union { /* Type-specific row info. */
+ CX_Ext external; /* Extra info for external commands. */
+ } extra;
+} CmdRow;
+
+typedef struct {
+ char name[CMD_NAME_MAX]; /* Name of this command, really. */
+ guint32 flags; /* Flags for this command. */
+ GList *row; /* List of CmdRow definition rows. */
+} Command;
+
+The defined commands will then be represented in memory as a bunch of
+Command structures, hashed into a table for quick and easy access.
+
+4.6 FEATURES
+Here are some things that I find particularly neat about this way
+of doing stuff, and that really make me itch to start hacking on
+it:
+
+4.6.1 Extensible
+The above defines two types of command definition rows; built-ins and
+externals. Of course, it would be easy to extend this to support more,
+perhaps another kind of external command (such as a Guile program) or
+even some other kind of internal action. Just define a CRType and hack
+away.
+
+4.6.2 Compatible
+One of the most troublesome/hairy parts of command execution in the
+current version of gentoo is the continuation of a command sequence,
+i.e. stopping it in the middle and then continuing at a later time
+(after the death of a synchronous child). The architecture described
+above should be very compatible with the current way of representing
+an interrupted sequence, which is just a pointer and an index. In fact,
+since the individual rows of the command are in a standard GList, I can
+just use g_list_nth() rather than my own (pretty complex) stuff.
+
+4.6.3 Flags
+The 'flags' field makes it possible to implement the "repeat" feature
+in a much cleaner way (I won't even mention how it's done using today's
+dumb sequences - just let's me say that it's UG-LY!).
+
+4.6.4 Flexibility
+Notice how a row's definition is always just a GString, rather than
+being dependant on the type of the command? This makes it possible to
+add arguments to built-ins in a very natural way; just type them after
+the command name! I'm not 100% convinced that I want this (only ~99.9),
+but I sure like leaving the door open. Built-in commands will still be
+executed by just looking their name up in a hash table, of course.
+
+
+5. PROBLEMS
+The single biggest "problem" with all of the above is that it is more
+or less a full rewrite of large parts of gentoo. But then again, this
+feels a whole lot more like the Right Way of implementing the commands
+than does the old stuff...
+
+
+6. UPDATE!
+After writing the above, which kind'a served like a planning session,
+I tore out the entire old command subsystem and rewrote it as described
+here. It was a 3,000+ line rewrite. Now it just plain rules!
diff --git a/docs/scratch/dirhistory.txt b/docs/scratch/dirhistory.txt
new file mode 100644
index 0000000..0461177
--- /dev/null
+++ b/docs/scratch/dirhistory.txt
@@ -0,0 +1,148 @@
+ 1999-06-08
+ Emil Brink
+
+ Directory History
+
+1. INTRODUCTION
+This little document talks about the "directory history" mechanisms
+in gentoo. These mechanisms are responsible for keeping track of
+which rows were selected in a certain directory the last time you
+visited it in a given pane, the vertical position last used, and
+such.
+ This document was written during development of gentoo
+0.11.8, since that version (hopefully) includes a reworked directory
+history system.
+
+
+2. PROBLEMS WITH PRE-0.11.8's HISTORY HANDLING
+The history code included in releases prior to 0.11.8 has several
+problems. Perhaps the most severe is that it always keeps the list
+of paths you have visited sorted in reverse chronological order,
+leaving the most recent path on top. This is fine for simple inter-
+action, but makes it difficult to step backwards through the
+history (since each step causes it to re-sort).
+ As of version 0.11.7, symbolic links are fairly well supp-
+orted by gentoo, and it becomes necessary to have some way of
+following links "backwards". The old directory history system
+doesn't do this very well, so a new one is needed.
+
+
+3. THE NEW HISTORY
+The new directory history is modeled after the URL history in
+programs such as Netscape Navigator. It will not be exactly like
+a browser's history, however. There are certain differences between
+file system directories and web pages (yes, really, no matter what
+Micros~1 says!).
+ The main idea of the dirhistory system is to keep the data
+that describes a directory around until the next time you enter
+that directory. A secondary goal is to arrange the data in a way
+that preserves the order you visited the directories in, thus making
+it easy to provide back- and forward movement through the history.
+
+3.1 The Current Directory
+There is always a history data entry for the current directory.
+It is not on any of the lists (mentioned below); it's stored in a
+special single-entry "slot" designed for the purpose. This makes
+it easy to always find the current directory's history entry.
+
+3.2 The Backward, Forward and Cache Lists
+In addition to the current directory slot, there are three lists
+that also hold history entries: the backward list; the forward
+list; and the cache.
+ The backward list holds entries that you have already
+visited once during a session. The last entry on the backward
+list is normally the directory that was current previous to the
+one that is currently current (!), and so on. If it sounds comp-
+licated, that's entierly my fault. :)
+ The forward list holds entries for directories that
+you entered after the current directory. The forward list is
+only used by the DirBackward and DirForward commands; it is
+left blank by normal (absolute) navigation.
+ The cache holds entries for directories that have been
+visited, but are no longer part of the sequence available by
+moving backward and forward. See the command descriptions below
+for more details.
+
+3.3 History Commands
+The following commands operate on the history state:
+
+DirEnter
+ Changes the current directory by simply replacing it with
+ a new path.
+ Appends the current dir to the back list first, and
+ then clears the forward list. Detailed steps:
+ 1. Find current dir entry, and update the history state in
+ it.
+ 2. Find entry for target directory. If found on the back
+ list, move all entries _after_ it to the cache list.
+ 3. Enter target dir, apply found entry (if any).
+ 4. Append initial current dir's entry (from step #1) to
+ the back list.
+ 4. Clear forward list.
+ 5. Done!
+
+DirRescan
+ Refreshes the display of a directory, by reading the dir's
+ contents back from the disk. Does not alter the length or
+ contents of any history lists, but makes use of the information
+ in them nevertheless. Detailed steps of operation:
+ 1. Find the current directory's history entry. Should be
+ really simple, since it should be in the "current" slot.
+ 2. Update history information.
+ 3. Reread the directory from disk.
+ 4. Apply previously stored history info.
+ 5. Done!
+DirBack
+ Changes to the previous directory, i.e. the one that is
+ last in the back list. Painfully detailed description:
+ 1. Find current dir's slot.
+ 2. Update history information.
+ 3. Prepend current to forward history list.
+ 4. Change to directory at end of backward list.
+ 5. Done!
+DirForward
+ Goes one step forward in the directory history, to the dir
+ specified by the first item in the forward list. Steps:
+ 1. Find current.
+ 2. Update it.
+ 3. Append current to backward history listt.
+ 4. Change to directory at beginning of forward list.
+ 5. Done!
+
+3.4 Initial Example
+ Illustration, showing a command, the back list, current
+dir, and forward list _after_ the command has executed:
+
+Command Back Current Forward
+(start, initial state) () "" ()
+DirEnter "/" () "/" ()
+DirEnter "/home" ("/") "/home" ()
+DirEnter "/home/emil" ("/" "/home") "/home/emil" ()
+DirBack ("/") "/home" ("/home/emil")
+DirBack () "/" ("/home" "/home/emil")
+DirForward ("/") "/home" ("/home/emil")
+DirForward ("/" "/home") "/home/emil" ()
+
+3.5 No Duplicates
+The new history system (just like the old) will not allow duplicate
+entries in the history. If there is an entry for a path in one of
+the history lists, that entry will always be used whenever that path
+becomes current again. This is unlike e.g. Netscape's behaviour, and
+motivated by two main factors: 1) it's necessary in order to preserve
+selection info, and 2) it's simpler and I think I understand it. :)
+
+3.6 Second Example
+The example continues, from the last state shown above:
+Command Back List Current Dir Forward List
+(initial) ("/" "/home") "/home/emil" ()
+DirEnter "/usr" ("/" "/home" "/home/emil") "/usr" ()
+DirBack ("/" "/home") "/home/emil" ("/usr")
+DirBack ("/") "/home" ("/home/emil" "/usr")
+DirEnter "/usr" ("/" "/home") "/usr" ()
+
+Note that for the last line here, the "/usr" record on the forward
+list would NOT be completely ignored: both lists are searched be-
+fore changing the directory, so that any old selection in "/usr"
+could be found and applied.
+ When the record has been found and used, though, it will
+be deleted together with the rest of the forward list.
diff --git a/docs/scratch/filestyles.txt b/docs/scratch/filestyles.txt
new file mode 100644
index 0000000..0101d65
--- /dev/null
+++ b/docs/scratch/filestyles.txt
@@ -0,0 +1,183 @@
+ 1999-05-31
+ Emil Brink
+
+ gentoo File Styles
+
+1. INTRODUCTION
+This file documents the file style subsystem in gentoo. A good
+understanding of file styles is important in order to maximize
+your comfort in gentoo.
+
+2. NEW vs. OLD STYLE SYSTEM
+If you've never used gentoo prior to version 0.11.7, you can skip
+this section entierly, since it deals with changes to the style
+system that occured with the mentioned release.
+ As of 0.11.7, file style properties are fully dynamic.
+This means that there are no "built-in" properties of any kind,
+neither visual nor action. Prior versions of gentoo featured a
+set of built-in properties (they were Default, View, Edit, Print
+and Play).
+ There was a need to support user-defined actions, but
+I couldn't find a clean way of extending the old code to support
+that. So I tore it all away, designed a style system with fully
+dynamic properties, and implemented that instead. The style system
+in gentoo 0.11.7 is the result.
+ If you want a particular property to be available, just
+add it at a suitable point in the style tree. It will be propagated
+by inheritance to all styles below the one where you added it.
+ If you want to change the value of an inherited property
+at some point in the tree, just override it. The new value will
+propagate downwards.
+ Older versions of gentoo featured a command for each built-
+in property (the FileDefault, FileView, ... commands). Since I don't
+want to dynamically add commands as properties are created, these
+commands have been replaced by the single FileAction command. If
+called with no parameters, this command will run the Default action
+property. If called with an "action=X" argument, it will run the
+property called X.
+
+
+3. WHAT IS A STYLE?
+A style is an abstract object. Its main purpose is to serve as a
+container for a set of related "properties", and to provide an
+inheritance hierarchy for these properties. Styles are tightly
+coupled to the concept of "types"; each type is always connected
+to exactly one style.
+ Styles are arranged in a tree. The tree has a single root
+style (commonly called "Root", although you can rename it if you
+want to) and as many child styles as you need. The tree can have
+any depth; you can add child styles to child styles to build the
+hierarchy up recursively.
+
+4. WHAT IS A PROPERTY?
+Properties are what make styles useful. A property is a named value
+of a certain type.
+ Currently, three different types of properties are supported
+by gentoo: colors, icons and actions. The two former are usually
+refered to as "visual" properties.
+ The point of properties is to contain the information gentoo
+needs to display and handle dirpane rows of various types in a use-
+ful and correct way.
+
+4.1 Property Inheritance
+The properties are inherited downwards in the tree, from the first
+style that define them, down to all its children. This means that
+if the root style defines a property called "A", all child styles
+(i.e., all other styles) will also have a property called "A" with
+the value defined by the root.
+ At any style, you can override the inherited value of a
+property, thus causing the new value to propagate instead of the
+old.
+ Using inheritance saves work, and makes maintaining the
+styles much easier and less error-prone. Basically, it is a good
+thing. :)
+
+4.2 Visual Properties
+Visual properties control how gentoo renders the rows of a pane.
+There are three visual properties in use: background and foreground
+colors, and icon. The two former control the colors used for row
+background and text (foreground), when the row has not been sel-
+ected by the user. As soon as a row is selected, it reverts to
+using GTK+'s standard selection colors. The icon property contains
+the name of the icon graphics to use for the style.
+
+4.3 Action Properties
+Action properties specify commands that can operate on files of
+a given type. You then use the FileAction command to envoke these
+commands by property name.
+ All styles should have a default action property (typically
+called "Default"), inherited from the root. The "Default" action
+is what is executed when you double click on a row in a pane. For
+many styles, it makes sense to make the default action cause the
+files contents to be viewed, by setting the property to "FileAction
+action=View" and defining a suitable View action.
+
+
+5. CONFIGURING STYLES
+To modify the current style tree, open up gentoo's configuration
+window (execute the builtin command Configure). Then click the tab
+labelled "File Styles". It might be helpful to have the window open
+and visible while reading this, since there will be many references
+to various things in the window.
+ The style config page can be divided vertically into four
+areas of interest.
+ At the top is the style tree itself. It shows, using a nice
+tree widget, the current style tree. At the top of the tree is the
+root style, and below it are all its children. The connections bet-
+ween styles are shown with lines.
+
+5.1 Name and Parent
+Below the style tree are two text entry fields, labelled Name and
+Parent, respectively.
+ The Name entry field shows the name of the currently selected
+style, and lets you type directly to rename the style.
+ The Parent text field is not editable. When a style is
+selected, it shows the name of the style's immediate parent. You can
+click the button to the right of the field (with the magnifying glass)
+to pop up a dialog that lets you select a new parent for the style.
+ If the current style has any child styles of its own, the
+entire branch will be moved if you change the parent.
+
+5.2 Properties
+Underneath the name & parent fields is a frame titled "Inherited
+Properties". It contains a notebook with two pages: one for visual
+properties, and one for the actions.
+
+5.2.1 Visual Properties
+The visual property page contains a little preview, showing you how
+the colors and icon look together.
+ It also holds three frames, one for each of the three
+standard visual properties (background color, foreground color, and
+icon).
+ To set a visual property, make sure the "Override Parent's?"
+check button is checked (depressed). Then click the button below the
+check button, the one with the "Edit..." or "Pick..." label. This
+will pop up a dialog where you can make the desired changes.
+ To revert back to the parent's value for a given property,
+simply uncheck the override check button.
+
+5.2.2 Action Properties
+The action property page contains a list of all action properties
+the current style has. Note that not all of these are actually set
+in the style itself: the list shows inherited properties as well.
+ To modify an action property's value (its command), just
+select it in the list and type the new value in the entry box
+labelled "Command". Clicking the magnifying-glass button to the
+right of the entry field pops up a dialog where you can choose
+from the currently defined commands.
+ Changing the command of an action property automatically
+overrides the property, i.e. the new value will be propagated to
+any child styles, and the inherited one will be ignored from this
+style on. Note that even if you change it back to the same value
+as the parent has, it will remain overridden.
+ You can add a new action property by clicking on the
+button labelled "Add Action...". This will pop up a dialog asking
+you for the name of the action to add. I suggest using a single
+word, with an uppercase initial (like "Default", "View", "Edit",
+and so on). Initially, the property will not have a useful value
+assigned to it. Select it in the list, and follow the instructions
+given above to set the value you want.
+ Removing a property you added is simple: just select it,
+and then click the button labeled "Delete Action" (it's to the
+right of the "Add Action..." button). This will immediately remove
+the action from the current style and all its children. If the
+delete-button reads "Revert to Inherited Command" rather than
+"Delete Action", the selected action is an overridden inherited
+one. You cannot remove inherited properties, but you can make them
+assume the inherited value rather than the one set locally in the
+current style, by clicking this button. If the button is ghosted
+(drawn greyed out), the property is a normal inherited one, and
+can be neither removed nor reverted. This is the normal state,
+and probably the one you'll see the most often.
+
+
+5.3 Adding and Deleting Styles
+To add a new style, first select the style you wish to have as
+parent for the new one. Then click the "Add" button in the bottom
+of the page. This will add a new style as a child to the previously
+selected one.
+ To delete a style, select it and click the "Delete" button
+in the bottom-right corner of the page. If the selected style has
+any children, deleting it will also remove the children. This might
+be very inconvenient if done to the wrong style, so there will be
+a confirmation dialog if the style has children.
diff --git a/docs/scratch/filetypes.txt b/docs/scratch/filetypes.txt
new file mode 100644
index 0000000..f37b763
--- /dev/null
+++ b/docs/scratch/filetypes.txt
@@ -0,0 +1,136 @@
+z 1998-08-09
+ Emil Brink
+
+ gentoo FileTypes
+
+INTRODUCTION
+This document describes the gentoo filetyping architecture, i.e. the
+means by which gentoo clasfsifies each file it shows as belonging to
+exactly one previously defined file type. This classification is then
+used to determine how gentoo is to deal with that file; it helps
+specifying display colors and/or pixmaps, action commands, and so on.
+ In this document, the word "file" is used in a very general
+sense. A file is anything that can be found in a disk directory. Since
+gentoo runs on Linux (and perhaps other Unices?), this means that a file
+can be a directory, a plain file, a (soft) link, a (block or character)
+device, a socket, or a FIFO. At least I _think_ that's all...
+
+THE FILETYPE
+A filetype is, technically, a named tuple of identification methods.
+These methods can be applied to a dirpane line to determine if the disk
+entry described by the line belongs to the type or not.
+ A filetype can use anything from one to four available "levels"
+of identification methods in order to determine if a given line has the
+type. These levels are:
+
+1) inode type
+This is the simplest, fastest, most low-level check. The inode
+type tells if the line is a directory, a soft link, plain file,
+device, et cetera. A filetype MUST ALWAYS specify exactly ONE
+inode type.
+
+2) Protection
+Using the protection matching rule, you can require files to have a
+certain combination of protection bits. You can currently only specify
+which bits must be set, not which must NOT be set (i.e. clear). This
+means that you can find all files that are writable, but not all files
+that are NOT writable... I don't know how important this really is,
+but it feels kind'a incomplete right now.
+
+3) Suffix Match
+The suffix match is used to require that the file name ends in a certain
+string. This is very useful to find normal extensions, since a typical
+extension is just a suffix with a dot first. For example, you could use
+the suffix match to require that candidate lines have names ending in
+".gif". This check is highly specialized and therefore fairly quick.
+ Since the suffix checker is meant to be lean, mean and quick,
+it only allows one suffix rather than a list. If you need to check
+against several suffixes (suffici? suffixen?), you'll need to move to
+the next leve, the regular expression matcher.
+
+4) Name Regular Expression Match
+If the names you're trying to find have some similarity more complex
+than just a plain suffix, maybe you can use this level. It lets you
+specify a full regular expression (using the V8 syntax found elsewhere
+in gentoo) against which file names are checked. For example, if you
+where looking for MOD files on an Amiga partition, you might specify
+a name RE of "^mod\..*". Or you could identify tar+gzipped files with
+"(\.tar\.gz$)|(\.tgz$)".
+
+5) 'file' Regular Expression Match
+When none of the previous levels suffice, you can resort to the final
+secret weapon; the 'file' regular expression matcher. This runs the
+UNIX standard utility 'file' on the dirpane line in question, and then
+tries to match the regular expression you supplied against file's
+output.
+ Using this level, you can perform virtually any kind of file
+identification necessary, since you can add things to the "magic" file
+/etc/magic used by file.
+ As an example, you can identify executable files in the ELF
+format (standard on modern Linuxes) by specifying a 'file' matching RE
+of e.g. "ELF 32-bit (L|M)SB executable.*", or just plain "ELF.*".
+Note that the RE you specify is only checked against the part of file's
+output that is after the first colon.
+ Please remember that using 'file' RE matching in your file
+typing SEVERLY degrades gentoo's performance. Beware. I'm waiting for
+a new release of the 'file' package that incorporates a tiny fix which
+will allow gentoo to use it with much greater efficiency...
+
+
+FILETYPING STRUCTURE
+Gentoo maintains a set (e.g. a list) of filetype definitions; there is
+no hierarchy or any other complex structure involved. The definitions
+are applied one by one in search for a match. As soon as any a match is
+found, the search is terminated and the line as considered to have the
+type that matched.
+ If no type matched, the built-in always present type "Unknown"
+is assigned to the line, in order to guarantee that all dirpane lines
+always have exactly one type assigned to them.
+ The ordering of the filetypes internally influences the speed
+of the matching process; this is something I will investigate once the
+filetyping has been more fully implemented and is somewhat stable.
+
+
+STYLES
+A filetype is just a way of specifying how to identify files that have
+things in common. Once the files have been partitioned into groups by
+their file types, it would be nice to take advantage of this grouping
+when working with the files. This is done through the use of styles.
+ A style contains information that gentoo uses when rendering
+the dirpane; colors and pixmaps for example. It also holds data used
+when you manipulate the file (double-clicking it, or trying to view it
+with the built-in View command).
+ Styles, unlike filetypes, form a tree structure. There is a
+single, always-present, "root" style. Other styles then appear as either
+internal or leaf nodes in the tree based in the root style.
+
+
+STYLE PROPERTIES
+The following properties can be specified in a style:
+
+DISPLAY
+ Unselected
+ Background Color
+ Foreground Color
+ Pixmap Icon
+ Selected
+ Background Color
+ Foreground Color
+ Pixmap Icon
+ACTION
+ Double-click
+ View
+ Edit
+ Print
+ Play
+
+
+PROPERTY INHERITANCE
+The reason why the styles are arranged into a tree structure is to
+facilitate inheritance of properties. For each style (except the
+root) you specify which properties are to be changed from the ones
+of the parent style. Those that are not changed are then taken from
+the parent, recursively. The root style always specifies all its
+properties.
+ If you're into C++ and object-oriented programming in general,
+this should be right up your alley.
diff --git a/docs/scratch/focusing.txt b/docs/scratch/focusing.txt
new file mode 100644
index 0000000..37de3ae
--- /dev/null
+++ b/docs/scratch/focusing.txt
@@ -0,0 +1,80 @@
+ 1999-05-13
+ Emil Brink
+
+ Keyboard focusing in gentoo
+
+1. INTRODUCTION
+This little scratch document introduces the support for keyboard-
+controlled focusing introduced with gentoo 0.11.6.
+
+
+2. WHAT?
+The #1 request I've received from users of gentoo during the time
+it has been publicly available (around 8 months or so, I think),
+has been to add support for keyboard navigation. I have always
+responded with that this is difficult under current versions of
+the GTK+ toolkit.
+ It still is, but I hacked around that.
+ Basically, gentoo now supports the notion of "focus",
+which works a bit like a cursor would in a text-editing program.
+At any one time, zero or one row is currently focused. There is
+a command which does the equivalent of a double-click on the
+currently focused row, thus allowing you to e.g. enter directories,
+view text files, and so on. It's pretty neat.
+ The focused row is rendered in what is hopefully a clear
+manner, allowing you to distinguish between it and other, non-
+focused rows. The focusing is also visible regardless of whether
+the focused row is currently selected or not.
+ It is at this point not possible to customize the colors
+used for focusing. I expect this to become possible in a later
+release.
+
+
+3. HOW?
+The focusing is controlled by the addition of a single new built-
+in command, DpFocus. Various internal routines have also been
+extended and modified to be focus-aware.
+ The DpFocus command works with command arguments, and is
+therefore documented in "docs/scratch/command_args.txt".
+ Since the documentation there is perhaps a bit terse,
+I might as well repeat it here using 1,000 words (but no pictures).
+
+3.1 The DpFocus Command Syntax
+The general syntax of the command is:
+
+ DpFocus [center=<bool>] [select=<bool>] <what>
+
+The parts within brackets are optional. When left out, they both
+default to FALSE (see below for what this really means). The word
+<what> controls what should be focused, or what should be done with
+the already focused row.
+ <what> must be one of:
+none Hides the focus. It will not reappear until you execute a
+ DpFocus command with <what> equal to one of {next,prev,
+ last,first}.
+same Keeps the same row focused. Handy for creating a command
+ that just toggles the selection of the currently focused
+ row, without moving the focus (the command would then be
+ "DpFocus select=true same"). This is the default value
+ for the <what> part of the command, but I generally think
+ it should be included anyway, for clarity.
+next These two simply move the focus one row up ("prev") or down
+prev ("next"). If the wanted row is outside of the pane, the
+ focus will wrap around. The pane will scroll to keep up.
+last These two move the focus to the lower ("last") or upper
+first ("first") extreme of the pane.
+
+Finally, if <what> is "activate", gentoo will simulate a double-
+click on the currently focused row.
+
+If "center" is TRUE, the pane will scroll to make the focused
+row appear close to the vertical center. A handy command to bind
+to e.g. Ctrl-L is "DpFocus center=true same".
+
+If "select" is TRUE, the row that was focused BEFORE the rest
+of the DpFocus command changes the selection (assuming it does)
+has its selection status toggled. This means that if you're on
+row 0, and execute "DpFocus select=true next", row 0 will have
+its selection toggled, and then row 1 will be in focus.
+
+(Darn, that's only 571 words)
diff --git a/docs/scratch/mount.txt b/docs/scratch/mount.txt
new file mode 100644
index 0000000..c78987b
--- /dev/null
+++ b/docs/scratch/mount.txt
@@ -0,0 +1,103 @@
+ 1999-01-31
+ Emil Brink
+
+ About auto mounting
+
+1. INTRODUCTION
+In gentoo version 0.9.23, support for auto mounting was added. This
+is (like much other in gentoo) most useful on personal systems,
+and has *ONLY* been tested under Linux. If you're having trouble
+with mounting on other platforms, don't be surprised.
+ This file gives a brief description of the mount support,
+and how to configure it.
+
+
+2. MOUNT MODES
+A "mode" variable determines when gentoo will attempt to mount
+directories. There are three modes available:
+ By default, the mode is "never", which causes auto mounting
+to be disabled. In this mode, gentoo will never mount anything no
+matter what you do.
+ In the next mode, gentoo will only attempt to mount when
+you access a directory either by double-clicking it in a pane, or
+by activating a shortcut pointing at the directory in question.
+ In the last mode, gentoo will attempt to do a mount each
+time you access a directory. This is perhaps the most comfortable
+way of doing it, but also the slowest.
+
+
+3. MOUNT/UNMOUNT COMMANDS
+Since there is no portable way of mounting file systems, and the
+mount(2) system call available on Linux is privileged, gentoo uses
+the normal user-level mount(8) command to do the mounting. For the
+exact same reasons, unmounting is done by calling the umount(8)
+shell command.
+ gentoo assumes that it can mount a file system on a mount-
+point X by issuing the command "mount X", and that it can unmount
+in the same way. If this isn't true on your system, you must write
+glue scripts that have this interface. You don't need to call your
+scripts "mount" and "umount", however, since the actual command
+names (but not the simple "calling convention") is configurable.
+
+
+4. AVAILABLE FILE SYSTEM DATABASE
+gentoo obtains information about which directories are mount points
+by reading in a (set of) system database(s). On Linux systems, this
+database is stored in the "/etc/fstab" file. This file contains
+information about file systems, including which system mounts under
+directory. gentoo buffers this information and uses it to determine
+if a directory being accessed is a mount point.
+ As hinted above, gentoo is not actually limited to reading
+just one of these files. You can specify any number of files, sep-
+arated by colons, in the "fstab" path (on the Paths config tab).
+
+
+5. MOUNTED FILE SYSTEMS DATABASE
+Before issuing a mount command to mount a new file system, gentoo
+needs to check if the file system is already mounted. This is to
+avoid errors from the "mount" command.
+ This check is done through another (set of) system data-
+base(s). On Linux, "/etc/mtab" holds the relevant information. The
+default is to use "/proc/mounts", however, since the latter is
+both faster to access, and more up to date.
+ The time required to scan this database (which is not
+buffered, since you can mount/unmount outside of gentoo) is the
+reason why the middle mounting mode exists: it reduces the number
+of accesses that are considered for mounting, thereby saving time.
+ Again, you are not limited to just one of these databases
+either. You can specify a list of files, separated by colons, in
+the "mtab" path (on the Paths tab in the config window).
+
+
+6. CONFIGURING THE MOUNTING
+There's a tab labeled "Mounting" in the configuration window. This
+tab holds most of the controls needed to configure the mounting.
+The tab is split into two frames: one for setting the mode, and
+the other for setting various flags.
+ You set the mode by clicking on one of the radio buttons
+in the mode frame. If you set the mounting mode to "Never", the
+options frame is disabled to indicate that they are not used.
+ Below the mode frame is another frame, labeled "Mount
+Options". It contains some additional controls that let you fine-
+tune the behavior of the mounting.
+ The text entry fields labeled "Mount Command" and "Unmount
+Command" let you specify the names of the shell commands used to
+mount and unmount file systems. These commands should take, as a
+single argument, the name of the *mount point*, not the file
+system! Also, you must specify the path (e.g. "/bin/mount") too.
+ The check button labeled "Only Mount on Toplevel Dirs?"
+enables a little optimization: if checked, gentoo will not mount
+on a directory that has more than 2 hard links to it. This means
+any directory that contains another directory will never be con-
+sidered as a possible mount point.
+ The "Use Command Error Dialog?" option makes gentoo grab
+any error output by the mount/unmount commands and show it in a
+dialog. If not checked, errors will appear in the shell window.
+ The "Unmount at Exit?" option makes gentoo call the un-
+mount command on all file systems it mounted. This is recommended.
+
+NOTE: in addition to the stuff on the "Mounting" tab, you
+ must also set the "fstab" and "mtab" paths (on the "Paths"
+ tab, shockingly enough) to sensible values. For a Linux
+ system, fstab="/etc/fstab" and mtab="/proc/mounts" works
+ well.
diff --git a/docs/scratch/outline.txt b/docs/scratch/outline.txt
new file mode 100644
index 0000000..35c0c46
--- /dev/null
+++ b/docs/scratch/outline.txt
@@ -0,0 +1,144 @@
+Outline of documentation (some of these things are still to come):
+
+Legal Notice
+ GPL!
+
+Release Notes
+ Version
+ Changes since Last
+
+Quick Guide
+ General Principles
+ Selecting
+ Operating upon Selection
+ Configuring
+ Quitting
+
+Introduction
+ Why Another Filemanager?
+ Design Goals
+ Cool Features
+
+Usage
+ Window Layout
+ Status & Error Info (top line)
+ Selection
+ Error
+ Panes
+ Current
+ Source & Destination
+ Columns
+ Resorting
+ Selection
+ Click
+ Drag
+ With Shift
+ With Control
+ With Meta
+ The SelectRE Window
+ Button Bank
+ Command Buttons
+ Shortcuts
+ Commands
+ Native
+ Directory
+ DirOther
+ DirParent
+ DirRescan
+ DirSwap
+ Activation
+ ActivateLeft
+ ActivateOther
+ ActivateRight
+ File Ops
+ Copy
+ Move
+ Delete
+ Rename
+ ChMod
+ ChOwn
+ Split
+ MkDir
+ Selection
+ SelectAll
+ SelectNone
+ SelectToggle
+ SelectRE
+ Misc
+ Configure
+ Quit
+ User
+ Predefinition
+ Sequences
+ Ideas & Examples
+File Identification
+ The "Type" Concept
+ Definition
+ Name
+ Identification
+ Style Link
+
+File Rendering
+ The "Style" Concept
+ Inheritance
+ Tree Structure
+ Use of Internal Nodes
+
+Miscelleneous
+ Regular Expressions
+ RE->glob Translation
+
+Configuration
+ Introduction
+ Semantics of OK, Save & Cancel (window close)
+ The File
+ XML
+ Styles
+ Naming
+ Inheritance (link?)
+ Advice
+ "Abstract" Styles
+ Properties
+ Visual
+ The Copy-buttons
+ Other
+ Types
+ Naming
+ Identification
+ Type
+ Suffix
+ Name RE
+ File RE
+ Notes on Performance
+ DirPanes
+ Contents
+ Columns
+ Title
+ Justification
+ Width
+ Content-Specific
+ Sorting
+ Default Path
+ User Commands
+ Introduction
+ Definition
+ All {}-selectors, semantics
+ Flags
+ General
+ Before/After
+ Buttons
+ Banks
+ Editing
+ Command Sequences
+
+ Menus
+ (Not Even Implemented)
+
+ Shortcuts
+ Padding
+ Pane
+ Paths
+
+History
+
+Acknowledgements
diff --git a/docs/scratch/renamere.txt b/docs/scratch/renamere.txt
new file mode 100644
index 0000000..b79ad85
--- /dev/null
+++ b/docs/scratch/renamere.txt
@@ -0,0 +1,176 @@
+ 1999-10-31
+ Emil Brink
+
+ About gentoo's RenameRE command
+
+1. INTRODUCTION
+This document contains a few notes, hints and tips on how
+to use the RenameRE command in gentoo. This command was
+introduced in the 0.11.10 release, which became available
+early November, 1999.
+
+
+2. PURPOSE OF RenameRE
+The purpose of the RenameRE command is to support flexible
+renaming. For example, you can use RenameRE to change the
+extension on a bunch of files with a single command, or
+replace some other portion in a set of filenames. It's not
+a command that sees usage every day, but when you need it
+you tend to need it badly. :)
+ Hopefully, the RenameRE command will "save" you
+from having to throw together a script or a fancy shell
+command line. If you really enjoy writing those scripts,
+feel free not to use the command.
+
+
+3. OPERATING MODES
+For maximum ease of use, RenameRE provides not only a
+regular expression-based replacement algorithm, but also
+a simpler replacement algorithm.
+ Before executing the RenameRE command, select
+one or more files. It often makes more sense to use the
+command when you have more than one file selected, but
+of course it will work on a single file as well. If you
+have no files selected when envoking the command, nothing
+happens (just as with most other file operation commands
+in gentoo).
+ When there is a selection, the command pops up a
+simple dialog letting you chose one of the two operating
+modes, and then start the renaming operation by clicking
+the dialog's "OK" button. If you change your mind, just
+hit "Cancel" or the Escape key.
+ You select operating mode by clicking the tabs
+in the top of the dialog; this also changes the dialog's
+contents to show that mode's controlling widgets.
+ When you hit "OK", RenameRE will operate in the
+mode whose controls are visible.
+
+3.1 Replacement
+The first mode is called "simple". It operates like the
+text replacement found in most editors, or like everybody's
+favorite Perl operator, s//.
+ The simple replacement mode takes the following
+parameters:
+"Replace" The string you to search for.
+"With" The string you to replace any found
+ occurances of the "Replace" string
+ with.
+"Ignore Case?" If checked, the search will ignore
+ any differences in case between the
+ "Replace" string and the filenames.
+ Perl people, think of this as the
+ /i option character.
+"Replace All?" This causes the command to continue
+ searching through the input filename
+ even after having found and performed
+ a replacement.
+ In Perl, this looks like a trailing
+ /g option.
+
+For example, if you had a filename of "abcabcabc" and
+specified the parameters as replace="abc", with="ABC",
+and leave the two options at their default values of
+false, the file would be renamed to "ABCabcabc". Check
+the "Replace All?" button, and the result is "ABCABCABC".
+ The primary use for the Simple replacement mode
+is perhaps to change filename extensions. Doing this
+requires some care, however, since you cannot be sure
+that the string you find is indeed the extension, i.e.
+that it is last in the filename. For such control, you
+need to use the Regular Expression mode.
+
+3.2 Regular Expressions
+The second mode is a lot more complicated, but also a
+lot more powerful and flexible.
+ The basic idea is to match a regular expression
+against each of the filenames. The expression can con-
+tain subexpressions (enclosed in round parens). If the
+expression matches against an incoming filename, a second
+string is used to generate the new filename. In this
+second string, you can use $N to refer to the text in
+the incoming filename that matched the N:th subexpression
+in the regular expression. N should be a digit in the
+range 1..9. Any other text in the second string will be
+copied verbatim. To get a single dollar sign in the
+new filename, use $$. Any other character following a
+dollar sign will cause a parse error, and the rename
+will be aborted.
+ The parameters you can provide in the dialog
+are as follows:
+"From" This is where you enter the regular
+ expression. You can use parenthesis
+ to indicate subexpression, and use
+ the matching text in the new filename.
+"To" Here, you specify a string that forms
+ the new filename. You can use $N to
+ refer to the text that matched the N:th
+ subexpression in the From string.
+"Ignore Case?" If checked, the regular expression
+ matcher will disregard differences in
+ case.
+
+Let's use a huge example to make the operation of the
+regular expression RenameRE a bit clearer. Let's assume
+you have a set of HTML documents whose names have the
+general form "gentoo-TOPIC(CATEGORY).htm", like this:
+ "gentoo-commands(internals).htm",
+ "gentoo-selecting(usage).htm",
+ "gentoo-quitting(usage).htm",
+ "gentoo-config(usage).htm",
+ "gentoo-gui(internals).htm",
+ "gentoo-re(misc).htm".
+We want to rename these so that the category (the word
+in parenthesis) is moved to the front, the word gentoo
+is removed, the actual content label is last before the
+dot, and that the extension is "html". To do this, we
+specify the following expression in the "From" box:
+ "^gentoo-([^(]+)\(([^)]+)\)\.htm$"
+ 1 2 3 4 5 6 7 8
+This expression can be broken down:
+1. The caret (^) anchors the expression to the beginning
+ of the incoming string, thus making sure that we begin
+ at the very start. Without this, there could be any
+ prefix before the "gentoo", and we would produce an
+ incorrect result.
+2. The word "gentoo-" matches itself.
+3. The construct ([^(]+) matches one more more characters
+ that are not opening parenthesis. This should collect
+ the letters of the topic part of the incoming names.
+4. The backslash followed by opening paren "\(" matches
+ exactly one opening parenthesis, which is the one
+ between the topic and category parts of the filenames.
+5. ([^)]+) matches the category, up to (but not including)
+ the closing parenthesis.
+6. Then follows a backslash-escaped closing parenthesis.
+7. The sequence "\.htm" matches a dot followed by the three
+ letters "htm".
+8. The dollar sign anchors the expression to the end of
+ the string, so that the ".htm" is really the final part
+ of the filename.
+
+OK. That should take care of the incoming filenames, make
+sure they have the desired format, while at the same time
+storing away the information we want to conserve. Now, we
+specify a "To" string like this:
+ "$2-$1.html"
+That's all there is! The $2 will insert the text that
+matched the second parenthesized subexpression, i.e. the
+one labeled 5 in the above breakdown. This will make the
+category appear first in the output. The dash goes straight
+through into the output name, followed by the topic as
+referenced by the $1 operator. The dot and the "html" suffix
+go straight through as well.
+ Of course, we could have used a subexpression to
+match the "htm" extension as well, and entered "$3l" in the
+"To" string to add the final 'l', but that seemed like over-
+kill to me... :)
+ The point of this example was to show how you can
+do fairly non-trivial permutations of the input filenames.
+A good understanding of regular expressions helps.
+
+4. CLOSING WORDS
+Well, that should introduce the RenameRE command sufficiently
+and allow you to use it. The Simple mode is probably simple
+enough to just use once you know what its parameters mean,
+while the full-blown Regular Expression mode might warrant
+some practice. Anway, enjoy!
diff --git a/docs/scratch/search_howto.txt b/docs/scratch/search_howto.txt
new file mode 100644
index 0000000..419cdf8
--- /dev/null
+++ b/docs/scratch/search_howto.txt
@@ -0,0 +1,110 @@
+ 1999-01-09
+ Emil Brink
+
+ Doing a text search
+
+1. INTRODUCTION
+This file describes how to use the Search-command built-into the
+internal textviewer in gentoo. The textviewer is the one you see
+when you use the ViewText and ViewHex commands, and also when
+doing command output capturing.
+ The Search command is envoked by clicking the button
+labeled "Search..." found close to the bottom right corner of the
+textviewer window. As you click it, a dialog window appears that
+asks for search parameters.
+
+
+2. THE SEARCH DIALOG
+There are three things you can change in the search parameter
+dialog that appears after you click "Search...". These things are:
+ 1. Search text (RE)
+ 2. "Ignore Case?"-flag
+ 3. "Don't Span Newlines?"-flag
+These things are further explained in the following secionts:
+
+2.1 The Search Text
+Of course, when doing a text search you expect to enter the text
+to search for. This is what you do in the entry field in the dialog.
+Note that you're not restricted to entering simple text, you can
+in fact enter a full regular expression (RE), giving you pretty much
+expressive power to be take advantage of.
+ For an introduction to regular expressions as they are
+used in various places in gentoo, see the "docs/misc.html" file.
+ If you're just looking for some old string, and don't
+bother about all these RE things, just pretend they're not there,
+and enter the string directly. Since any simple string is a RE
+that simply matches itself, this works as expected.
+ Note that the expression you type in the field will be
+remembered and reappear the next time you open the dialog, for
+your convenience.
+
+2.2 The "Ignore Case?" Flag
+If you want the search to disregard the difference between upper
+and lower case of characters, check this box before clicking OK.
+ Like the search text itself, the setting of this flag
+will be remembered between dialog envokations.
+
+2.3 The "Dont Span Newlines?" Flag
+This flag is for advanced searches only, and can typically be
+safely ignored (and left in its default OFF state). When active,
+it will disallow the regular expression matcher to match the
+any-character meta characters (mainly ".") against newline. This
+is perhaps not the most useful thing in the world to do, but it
+was supported by the regex routines I use, and sounds cool,
+so there. :^)
+
+
+3. PERFORMING THE SEARCH
+Once you're satisfied with the settings in the dialog, click the
+OK button (or press RETURN) to perform the search. To abandon the
+search, click Cancel (or press ESCAPE).
+ If the search is successful and something is found, gentoo
+will select (highlight) the matching text, and attempt to make the
+line(s) containing it visible.
+
+NOTE: In the current implementation, gentoo will only succeed in
+ making the match line visible if there are NO (or very few)
+ wrapped lines in the text viewer window. This is silly but
+ true.
+
+If the search fails, nothing happens. In particular, there is no
+annoying failure-dialog or some such. The only feedback is the
+lack of feedback.
+
+
+4. SEARCH POSITION
+The first time you envoke the Search command on a particular text,
+the search starts from the first character in the text, as you
+might expect.
+ The next time you envoke it (on the same text), it will
+CONTINUE at the position right after the last in the matched text.
+This allows multiple searches for the same thing to be easily
+performed "back-to-back", thus covering the entire text.
+ If you want to reset the search so that it starts over
+from the beginning, click the "Top" button in the text viewer
+command button row. This will move the viewer to the top, AND
+reset the search so that it again will look at the first character
+in the text. The "Bottom" button has the same effect, by the way.
+
+
+5. MISSING FEATURES
+There are several things that are missing from gentoo's text
+search command.
+ One thing is the ability to search backwards, something
+that is commonly found in functions like this. The reason why
+this isn't present is simple: the POSIX regex(3) functions that
+gentoo uses don't support it. Also, I find I almost never use
+it myself. :)
+ The handling of search position/continuation is probably
+not very intuitive, I will look for a better way to do it.
+ There should be some easy way of just repeating the last
+search, without having to see the dialog again. Keyboard...
+ The "scroll" that attempts to put the matching line in
+view doesn't take wrapped lines into account, and thus misses by
+far if the window contains wrapped lines. This sucks, but it's
+still a lot better than what the GtkText widget itself would do
+(which is scroll (slowly!) to the matching line). Whine, nag.
+ If you're trying to search the display given by the
+built-in ViewHex command, you might expect the Search command to
+realize that the data is in hex and adapt. It doesn't, however.
+ I'm sure there's more...
diff --git a/docs/scratch/symlinks.txt b/docs/scratch/symlinks.txt
new file mode 100644
index 0000000..5e69f45
--- /dev/null
+++ b/docs/scratch/symlinks.txt
@@ -0,0 +1,125 @@
+ 1999-09-12
+ Emil Brink
+
+ Symbolic Links in gentoo
+
+1. INTRODUCTION
+This little document introduces the support for symbolic links that
+was introduced in version 0.11.7 of gentoo. This support replaces
+the old one that was removed as of version 0.11.1. Sorry about the
+delay. :)
+
+
+2. WHAT IS A SYMBOLIC LINK?
+A symbolic link, also known as a soft link or symlink, is a special
+file that contains a pathname of some other file. Whenever the link
+is accessed by the filesystem, it will use the contained pathname
+instead, thus "following the link". Note that the contents of a
+symlink need not be the pathname of an existing file; you can use
+symlinks to store arbitrary data. At least on Linux systems, the
+maximum length of the contents part of a symlink seems to be 1023
+bytes.
+ In the shell, you can create symbolic links by using
+the "ln" (for link) command, with the option "-s" (for symbolic).
+For more information, see the man page for ln(1).
+
+
+3. SYMLINKS IN gentoo
+Symbolic links are treated *transparently* by gentoo whenever
+possible. This means that gentoo will treat the link as its dest-
+ination, rather than as a link. Since referencing other files is
+what symlinks are for, I think it's reasonable to treat them as
+if they were in fact the files they're pointing at. This is
+consistent with the way standard shell commands (cd, ls) treat
+symlinks.
+ This transparency includes gentoo's typing and styling
+system: a symbolic link to e.g. a PNG image will use the type
+and style defined for PNG images, and will respond accordingly when
+double clicked on. It also includes sorting: links to directories
+will sort together with the directories.
+ However, the transparancy is only partial. The information
+shown in a dirpane row for a symbolic link includes mostly data
+about the link itself, not its destination. This means that things
+like size, protection flags, and dates all refer to the link itself.
+The only column that shows information about the link target is
+the Icon column (if present).
+ This partial transparancy means that in a listing, you will
+be able to spot the links from the regular files quite easily:
+ First, if you enable type characters for the Name column
+of the panes, the links will have "@" symbols appended to their
+names.
+ Second, if you enable link destination display (also for
+the Name column), links will display an arrow ("->") plus the name
+of the link target. So, if you enable both of these features, a
+symbolic link called "image" to a PNG file called "picture.png"
+will display as "image@ -> picture.png".
+ Third, the protection flags for a symbolic link will have
+the letter 'l' (for link, of course) in the leftmost position.
+
+
+4. WORKING WITH SYMLINKS
+Of course, gentoo could not be said to really support symlinks if
+they could only be used "passively". So, gentoo includes a set of
+builtin commands to actively work with symbolic links.
+
+4.1 SymLink
+The SymLink command works much like the Copy command. For each
+selected source file, it will create an absolute symbolic link
+in the destination pane, pointing at the source file.
+
+4.2 SymLinkAs
+This command works like the CopyAs command; for each selected
+source file, it will display a dialog asking you for a link name,
+and then create a symbolic link in the destination pane, with the
+given name, and pointing at the source file.
+
+4.3 SymLinkClone
+Continuing the analogy, this command works like Clone. It will ask
+for a link name for every selected source file, and then create an
+absolute link in the *source* pane. Handy when working with shared
+libraries, since those tend to use lots of links in the same
+directory.
+
+4.4 SymLinkEdit
+This command works in two distinctly different modes depending on
+the active pane's selection when the command is run.
+ If there is a selection, the command will pop up a window
+for each symbolic link in the selection, allowing you to directly
+edit the link destination in a text entry field. There is also a
+button popping up a file selection dialog, thus letting you locate
+the desired link target easily. When you click "OK", the current
+link will be modified to point at the new target.
+ If there is no selection, the command will pop up a dialog
+letting you enter both the name and the contents of a link. When
+you click "OK" (or press RETURN), the specified link will be cre-
+ated. In this mode, the command is analogous to the shell command
+ln mentioned above. NOTE: It is possible to completely replace
+ordinary files and directories with symlinks -- the SymLinkEdit
+command will require you to confirm any such operation.
+
+
+5. OTHER COMMANDS
+This section contains some information about how other commands
+in gentoo deal with symlinks. It is far from complete.
+
+5.1 Information
+The Information command has been extended to also show the contents
+of symbolic links. The other information it displays (location, size
+et cetera) is for the link itself, not its destination. This is
+in keeping with the dirpanes, and seems logical to me. A future
+version of gentoo may extend the Information command to maybe show
+both link and target data in the same window...
+
+5.2 Copy and Move
+Both the Copy and the Move commands will _not_ operate transparantly
+on symlinks: they will copy (or move) the link itself, not its
+destination. There is currently no way of changing this behavior.
+ The reason for this is simply that I find it more useful,
+and also a bit more logical: when you copy or move an object, you
+expect to either get one more of that object, or to move the object
+to a new location. If Copy would follow the link, it would produce
+one more of the actual link destination, leaving the number of links
+unchanged. Or something.
+ This behavior is different from that of common shell
+commands (cp, mv). Beware.
+
diff --git a/docs/status.html b/docs/status.html
new file mode 100644
index 0000000..7a45d48
--- /dev/null
+++ b/docs/status.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="dirpanes.html">
+<LINK REL="Previous" HREF="layout.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: The Status Line</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>The Status Line</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+The status line is the horizontal bar that goes from the left border and all
+the way to the right border in the top part of the <STRONG>gentoo</STRONG> window. It
+is used to show various bits of status information. Basically, there are two
+types of information shown: selection summary and command execution status.
+See below for details on what is shown in which mode.
+</P>
+
+<H2>Selection Summary</H2>
+<P>
+During normal use, the status line shows a summary for the current dirpane.
+This summary (which is depicted in the <A HREF="layout.html">layout screenshot</A>),
+lists:
+</P>
+<UL>
+<LI>The number of selected directories,</LI>
+<LI>the total number of directories,</LI>
+<LI>the number of selected files,</LI>
+<LI>the total number of files,</LI>
+<LI>the number of selected bytes,</LI>
+<LI>the total number of bytes,</LI>
+<LI>the number of selected blocks, and finally</LI>
+<LI>the total number of blocks.</LI>
+</UL>
+<P>
+All in all, the status line provides eight pieces of data regarding the
+current directory and any selection you may have done in it. The slash characters
+(/) in the line should be thought of as "out of", so the first pair of
+digits, 0/18 in the screenshot, mean that 0 out of 18 directories have been
+selected. If you bother to count this manually, you'll see that there are actually
+18 directories shown, and no directory seems to be selected either, so this is
+probably correct. Then, by direct analogy, the rest of the stuff must be correct
+too...
+</P>
+<P>
+You might be amused (or annoyed) by the fact that the selected file sizes try
+to adapt the amount of bytes selected. This means that the precision and unit
+shown will change as you select more and more, going from "X bytes" to "X KB",
+over "X MB" and finally up to "X GB". If you are one of those people who just
+can't stand this kind of seemingly chaotic behaviour, you'll be glad to know
+that a future version of <STRONG>gentoo</STRONG> is likely to make the status bar contents
+configurable, too. Till then, chill. ;^)
+</P>
+
+<H2>Command Status</H2>
+<P>
+Whenever you execute a command, such as copy a file, <STRONG>gentoo</STRONG> will report
+the command's exit status in the status line. For the most part, commands should
+succeed, and you will just see the single word "OK" in the status line. This is
+<STRONG>gentoo</STRONG>'s way of signalling that the requested operation was carried out without
+complications.
+</P>
+<P>
+If the command execution should fail for some reason (perhaps you don't have write
+permission in the destination directory), <STRONG>gentoo</STRONG> will complain with a line
+looking something like this:
+</P>
+
+<DIV>
+<IMG SRC="images/status_error.gif" WIDTH=647 HEIGHT=158 ALT="Status line after error" BORDER="0">
+</DIV>
+
+<P>
+The information given in the command status line is:
+</P>
+
+<UL>
+<LI>Operation that failed ("Copy")</LI>
+<LI>Destination file for operation ("/.test.file")</LI>
+<LI>The reason for the failure ("Permission denied")</LI>
+<LI>The operating system error code for this failure (13)</LI>
+</UL>
+
+<P>
+The idea is that the information shown shall help you understand what caused the problem,
+so that you can do something about it.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/styles.html b/docs/styles.html
new file mode 100644
index 0000000..d0dc558
--- /dev/null
+++ b/docs/styles.html
@@ -0,0 +1,219 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="misc.html">
+<LINK REL="Previous" HREF="types.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Styles</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Styles</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+As was mentioned on the <A HREF="types.html">file types</A> page, each file type links to
+something called a <EM>style</EM>. What is a style, you ask? Well, a style is a named
+set of properties, where different properties control different aspects of how files
+associated (through the typing system) with the style are handled.
+</P>
+<P>
+Currently, the only type of property actually implemented is the <EM>visual</EM> ones,
+which controls how files having the style are displayed in the pane lists. You can use a
+style's visual properties to define the colors and icons used when rendering the files.
+This allows for some serious niceness in the general look of <STRONG>gentoo</STRONG>, especially
+when coupled with <A HREF="mailto:johan@tiq.com">Johan Hanson</A>'s wonderful icons.
+Go ahead and play!
+</P>
+
+<H2>The Style Hierarchy</H2>
+<P>
+One thing is important to realize about styles: they form a <EM>hierarchy</EM>, namely
+a singly-rooted N-tree. This means that no style exists by itself; all have a <EM>parent</EM>
+style above them in the tree. The only style which actually doesn't have a parent is,
+as could be expected from its name, the <EM>root</EM> one. The root style is special in
+more ways; it is always available (you cannot delete it!) for example. If this sounds
+horribly abstract and weird, perhaps this example picture can clear things up:
+</P>
+
+<DIV>
+<TABLE WIDTH=90%>
+<TR><TD><IMG SRC="images/style_tree.gif" WIDTH=112 HEIGHT=287 ALT="Style tree picture"></TD>
+<TD>
+<P>
+This small tree, which is actually a cropped screenshot from the configuration window,
+shows the general idea of a tree hierarchy. You can see the Root style on top. Notice
+how all other styles sort of "hang" under the Root style; from any style you can trace
+a way back up to Root.
+</P>
+<P>
+Also note how the tree is sorted alphabetically on each level. This makes it easier
+to locate a given subtree.
+</P>
+<P>
+With a tree like this, generally only Root plus the "leaf" nodes (nodes without any
+children, such as "DEB Archive", "RPM Archive", "Config", "Directory", and so on) are
+actually bound to types. The other nodes, such as "Archive", "Image" and "Source",
+are not. Then you might wonder if they're not just being wasted? No, they're not! See
+below (on inheritance) for why.
+</P>
+</TD>
+</TABLE>
+</DIV>
+
+<H2>Properties and the Use of Inheritance</H2>
+<P>
+So, what is the point of arranging the styles into a tree? Wouldn't it be just as
+convenient to use a less structured model, such as the plain list used by types?
+</P>
+<P>
+Funny you should ask that! The answer is no, and for a very good reason: inheritance.
+Each style contains a number of named values, also called <EM>properties</EM>. Assigning
+a specific value to a property is <EM>optional</EM>. If you don't assign a value to
+a certain property in a style, that property copies the value from its parent! If the
+parent doesn't assign a value either, then <EM>that</EM> style's parent is checked, and
+so on. Eventually you'll reach the Root, and there the search will end, because Root
+always gives a value to <EM>all</EM> its properties. If you go ahead and define a local
+value, that value is said to <EM>override</EM> the one that would otherwise have been
+copied from a parent.
+</P>
+<P>
+This kind of operation, where a value is found by searching down a branch of a family
+tree, is called <EM>inheritance</EM>. It is a very useful way of arranging things, and
+is widely used, for example in object-oriented programming (languages such as Smalltalk,
+C++ and Java all provide support for inheritance).
+</P>
+<P>
+The point of inheritance in <STRONG>gentoo</STRONG> is that it reduces (or even removes completely) the
+need to specify the same property value twice. It also naturally supports grouping; look how
+all styles for various image formats have been grouped under the single parent style "Image",
+for example. If you want all image files to be displayed with a common background color, you
+can just assign that color once to the corresponding property in the "Image" style, and then
+all specific image format styles ("JPEG", "GIF" etc) will inherit it!
+</P>
+
+<H2>Visual Properties</H2>
+<P>
+One big group of properties control how files belonging to a style are displayed in the
+directory panes. These properties are (rather logically) called the <EM>visual properties</EM>.
+They are:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="85%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="15%">Name</TH><TH>Type</TH><TH WIDTH="75%">Explanation</TH></TR>
+<TR BGCOLOR="#C0C0E0"><TD>Unselected Background</TD><TD ALIGN="center">Color</TD>
+<TD>This is the color used as the background on unselected rows. It is normally
+set once, in the Root style. Changing the unselected background color in child styles is
+not recommended, since it can make it harder to distinguish between unselected and selected
+rows. But then again, it's <EM>your</EM> configuration...
+</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD>Unselected Foreground</TD><TD ALIGN="center">Color</TD>
+<TD>This is the foreground (text) color of unselected rows. Generally black.
+</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD>Unselected Icon</TD><TD ALIGN="center">Icon</TD>
+<TD>This specifies the name of the icon to use (for the "Icon" column content) for
+unselected rows of this style. The name is the filename of a small pixmap, sans
+path. For more information about locating icons, see the <A HREF="misc.html#icons">misc page</A>.
+</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD>Selected Background</TD><TD ALIGN="center">Color</TD>
+<TD>This is the background color used for selected rows. Generally the same as the unselected
+<EM>foreground</EM>, to create an easily recognizable "inverse video" look.</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD>Selected Foreground</TD><TD ALIGN="center">Color</TD>
+<TD>As could be expected, this is the color used by the text of selected rows. Like
+the unselected background, it is generally only set once; in Root.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD>Selected Icon</TD><TD ALIGN="center">Icon</TD>
+<TD>Of course, this is the icon used on selected rows. If you forget to specify this,
+the icon will disappear when the row is selected, which might look confusing.</TD></TR>
+</TABLE>
+</DIV>
+
+<H2><A NAME="ap">Action Properties</A></H2>
+<P>
+Action properties allow you to control how <STRONG>gentoo</STRONG> should act upon files having
+a particular style. For example, you could use action properties to inform <STRONG>gentoo</STRONG>
+that is should use some external program to view images, and so on. These are the
+action properties that are available:
+</P>
+
+<DIV>
+<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="8" WIDTH="85%">
+<TR BGCOLOR="#E0E0F0"><TH WIDTH="15%">Name</TH><TH>Explanation</TH></TR>
+<TR BGCOLOR="#C0C0E0"><TD>Doubleclick</TD><TD>This action is executed when a file having
+this particular style is doubleclicked by the user. This action is key to <STRONG>gentoo</STRONG>'s
+normal dirpane navigation: the style bound to directories generally has a doubleclick
+action property of <B>DirEnter</B>.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD>View</TD><TD>This action is used by the built-in <B>FileView</B>
+command: if a file being viewed specifies a view action, it is used in place of the
+built-in (which is just a plain text reader for now).</TD></TR>
+<TR BGCOLOR="#C0C0E0"><TD>Edit</TD><TD>This action is executed by the built-in <B>FileEdit</B>
+command. There is currently no built-in default action.</TD></TR>
+<TR BGCOLOR="#E0E0F0"><TD>Print</TD><TD>This action is inspected and executed by the
+built-in <B>FilePrint</B> command. There is currently no built-in default.</TD></TR>
+</TABLE>
+</DIV>
+
+<H2>Built-In Styles</H2>
+<P>
+There is a single style built into <STRONG>gentoo</STRONG>: it has been mentioned many times
+above, and is generally called "Root". It defines standard values for <EM>all</EM>
+properties, thereby guaranteeing that inheritance from any other style will find a
+value sooner or later. You cannot delete the Root style, but you can (of course)
+change its properties, thus causing non-overridden properties in the entire style
+tree to change accordingly.
+</P>
+
+<H2>Tips on Naming Styles</H2>
+<P>
+Unlike <A HREF="types.html">types</A>, you don't need to pay any special attention
+while naming styles to get a convenient grouping; it is already provided by the tree
+hierarchy. I suggest using short names and not repeating the name of the parent in
+the child's name (in the screenshot above, a little bit of both has been done...).
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/template.html b/docs/template.html
new file mode 100644
index 0000000..bd0bf76
--- /dev/null
+++ b/docs/template.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF=".html">
+<LINK REL="Previous" HREF=".html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation:</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+
+<H1>Usage</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+You use <EM>file styles</EM> to control the way files of different <A HREF="../types.html">types</A> are
+displayed and generally dealt with. For more information about styles and their various properties,
+the tree structure applied to styles, and all other fun details, check out the <A HREF="../styles.html">
+styles</A> chapter!
+</P>
+<P>
+Configuring styles is important in order to get <STRONG>gentoo</STRONG> to look the way you want it to, and
+also to <EM>act</EM> the way you want it to.
+</P>
+
+<TABLE BORDER="0" CELLSPACING="5" CLASS="Note" WIDTH="100%">
+ <TR><TD WIDTH="3%"></TD><TD WIDTH="3%" NOWRAP><H2 CLASS="Note">Note!</H2></TD>
+ <TD WIDTH="94%">
+ <P>Using 'file' carries a pretty heavy performance penalty! Although some
+ considerable attempts have been made in <STRONG>gentoo</STRONG> to lessen the impact, it is still there.
+ For maximum performance, don't use types with 'file' RE rules. If you don't define <STRONG>any</STRONG>
+ type using 'file' RE matching, <STRONG>gentoo</STRONG> will detect this and optimize the entire file typing process
+ somewhat.</P>
+ <P>
+ For the special case of just recognizing any executable file (i.e. not just binary ELF files),
+ simply use the protection flag checks described above. It'll be a lot quicker.
+ </P>
+ </TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<P>
+Acknowledgements and general thanks to:
+</P>
+
+<UL>
+<LI>Linus Torvalds and the entire GNU/Linux community for creating all this wonderful software, and then
+ just giving it away.</LI>
+<LI><A HREF="mailto:johan@tiq.com">Johan Hanson</A> for the original icons. They're great!</LI>
+<LI><A HREF="mailto:jonas@obsession.se">Jonas Minnberg</A>, <A HREF="mailto:ulf@obsession.se">Ulf Pettersson</A> and
+ <A HREF="mailto:eskil@obsession.se">Eskil Steenberg</A> (i.e., most of Obsession Development) for ideas,
+ suggestions, and testing.</LI>
+<LI><A HREF="mailto:erik@tiq.com">Erik Johansson</A> for testing and help with finding and reporting early bugs.</LI>
+<LI>Henry Spencer at the University of Toronto, for his free reimplementation of System V8 regular expressions.</LI>
+<LI>The GTK+ Team for the great toolkit that GTK+ truly is. I wish it were better documented, though...</LI>
+<LI><A HREF="http://verkstan.canit.se">Verkstan F&ouml;r Alla</A>, Stockholm, for letting us in.
+</UL>
+</BODY>
+</HTML>
diff --git a/docs/template_toc.html b/docs/template_toc.html
new file mode 100644
index 0000000..194cd3b
--- /dev/null
+++ b/docs/template_toc.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF=".html">
+<LINK REL="Previous" HREF=".html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation:</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+</TABLE>
+
+<BR>
+
+
+<TABLE BORDER="0" CELLSPACING="6">
+ <TR><TD WIDTH="15%"></TD><TD><H1 CLASS="Index" STYLE="font-size: 28 px;"><STRONG>Table of Contents</STRONG></H1></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top"></TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>1. License Agreement</BIG></TD><TD WIDTH="5%"></TD><TD WIDTH="80%">Before you do <STRONG>anything</STRONG> with this software, read this! Four words: GNU GPL, <STRONG>no</STRONG> warranty.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>3. <A HREF="quick.html">Quick Guide</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">Even if you don't generally read documentation, please try to read this anyway.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>4. <A HREF="intro.html">Introduction</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">Introduction to <STRONG>gentoo</STRONG>.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>5. <A HREF="usage.html">Usage</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">The main text on how to actually use this program.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>6. <A HREF="config/index.html">Configuration</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">If you want to know more about configuring <STRONG>gentoo</STRONG>, and I believe you do, read here.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>7. <A HREF="history.html">History</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">History of changes between various versions.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>8. <A HREF="contribute.html">Contributing</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">If you feel like hacking...</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>9. <A HREF="acks.html">Acknowledgements</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="85%" VALIGN="Top">Thanks.</TD></TR>
+</TABLE>
+
+<BR>
+
+</BODY>
+</HTML>
diff --git a/docs/types.html b/docs/types.html
new file mode 100644
index 0000000..a35fffc
--- /dev/null
+++ b/docs/types.html
@@ -0,0 +1,267 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="styles.html">
+<LINK REL="Previous" HREF="commands.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: File Types</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>File Types</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<H2>Introduction</H2>
+<P>
+Almost all of the files we use every day can be said to have a specific "type", something that
+categorizes the file, be it by its name, its contents, or some other property. This chapter is about
+how you can teach <STRONG>gentoo</STRONG> about the file types you work most with, so it can (for example) tell
+a Perl source code file from a HTML text file.
+</P>
+<P>
+By itself, this typing doesn't achieve much. Sure, you can turn on the "Type" pane content column
+so you can learn about file types in a directory at a glance. You can even sort on that column,
+thus grouping files of equal types together in the listing. While all of this is useful, the actual
+purpose for the file typing mechanism is more subtle: each type is associated with exactly one
+<A HREF="styles.html">style</A>, and styles are real neat things, as we will see later on.
+</P>
+
+<H2>File Types in <STRONG>gentoo</STRONG></H2>
+<P>
+A file type in <STRONG>gentoo</STRONG> has a pretty simple structure. It is basically a set of rules of various
+types which are applied to files in order to determine if they "belong" to the type in question.
+The type also has a name, to make it easier to work with, and a link to something called a <I>style</I>.
+That's really all there is to it.
+</P>
+<H3>Type Rules</H3>
+<P>
+When you define a new type, you must specify the type's rule set. The rules are applied to each
+row to be displayed by <STRONG>gentoo</STRONG>, and as soon as <STRONG>all</STRONG> rules of some type match, the
+file is said to have (be of, belong to) that type. You must try to be as exclusive as possible when you
+design type rules, so that the type doesn't "eat up" all files, thus causing incorrect typing.
+</P>
+<P>
+There are five different kinds of rule you can use. Of these five, one is obligatory and must always
+be used. The other four are optional; you choose freely among them, using none, a few, or all. The
+rules are:
+</P>
+<OL>
+<LI>Intrinsic Type (obligatory)</LI>
+<LI>Protection</LI>
+<LI>File Name Suffix</LI>
+<LI>File Name Regular Expression</LI>
+<LI>'file' Command Regular Expression</LI>
+</OL>
+<P>
+Let's investigate each of these in turn:
+</P>
+
+<H3>Intrinsic Type</H3>
+<P>
+All objects in the file system have an <EM>intrinsic</EM> type. For example, a directory just isn't
+a regular file; it's intrinsic type is directory and that cannot be changed. If you create a type
+and specify e.g. "character device" as the type's intrinsic type requirement, only character device
+files will ever be considered as beloning to your new type.
+</P>
+<P>
+There are seven intrinsic types: file, directory, soft link, block device, character device,
+FIFO and socket. You must specify exactly one.
+</P>
+
+<H3>Protection</H3>
+<P>
+A file's <EM>protection</EM> (or mode) is a file system level intrinsic property. All files
+always have protection information available. The protection information can be seen in <STRONG>gentoo</STRONG>
+by using the various "mode" column content types. You can change a file's protection with the
+built-in <B>ChMod</B> command (named after a standard shell command which does the same thing).
+Checking a file's protection is a fast operation. A protection rule is specified as a set of six
+flags; each flag requires something from the file's protection. The rule matches when all flags
+succeed. These are the flags:
+</P>
+
+<DL>
+<DT>SetUID</DT>
+<DD>Set this to require files to have the SetUID protection bit set.</DD>
+<DT>SetGID</DT>
+<DD>When set, this requires files to have the SetGID bit set.</DD>
+<DT>Sticky</DT>
+<DD>This requires files to be "sticky". Not often used.</DD>
+<DT>Readable, Writeable, Executable</DT>
+<DD>These three flags allow you to require that a file shall be readable, writaable, or
+executable, respectively. They are interesting because they are <EM>not</EM> just direct
+flag comparisons against files. Rather, these three are a little intelligent. They each
+require that <EM>you</EM>, i.e. the user currently running <STRONG>gentoo</STRONG>, have the permission
+in question. When evaluating these rules, <STRONG>gentoo</STRONG> compares your (UID,GID) values
+against those of files, and apply logic to determine which of the three sets of RWX flags
+available in the file applies.
+</DL>
+
+
+<H3>File Name Suffix</H3>
+<P>
+This is a simple file name rule. It allows you to specify a string, and then requires candidate files
+to have names ending in that very string for a match to be considered. If you always use the same suffix
+(sometimes called <I>extension</I>) for your file names, this rule will maybe be all you need. Typically,
+a file type suffix is separated from the actual name of the file by a dot; this rule pretends it doesn't
+know that, so you must always include the dot as the first character in the suffix. The suffix comparison
+is case-insensitive, so <CODE>.jpg</CODE>, <CODE>.JPG</CODE> and <CODE>.JPg</CODE> all mean the same
+thing, and all will match each other.
+</P>
+<P>
+A "problem" with this rule is that it only allows you to specify <STRONG>one</STRONG> suffix.
+Many file types have several popular suffices, one of which is generally a dot followed by three
+letters for compatibility with the broken nightmare known as FAT. For example, HTML hypertext
+files are often given a suffix of ".html" or just ".htm". You cannot specify such alternatives with
+this rule; it has been optimized to check for just one suffix.
+</P>
+
+<H3>File Name Regular Expression</H3>
+<P>
+For those cases when a simple suffix isn't enough, but the type is anyway deductable from just
+the name of a file, you can use the regular expression matching rule. This rule lets you enter
+a full <A HREF="misc.html#re">regular expression</A> against which the names of files are
+checked. A match is required for the rule to succeed.
+</P>
+<P>
+When entering regular expressions for file name matching, remember that the dot (<CODE>.</CODE>)
+is in fact a RE meta-character and need to be escaped (by a backslash; <CODE>\.</CODE>) if you
+really want to match against a dot. Also note that your regular expression is used as a
+"search RE"; if a match is produced between your RE and any part of a file name, that is
+enough. So try to be restrictive when you write regular expressions; for example by using the
+<CODE>^</CODE> and <CODE>$</CODE> metasymbols appropriately.
+</P>
+<P>
+As an example of when RE matching comes in handy, consider attempting to define a file type
+for JPEG image files. Such files are generally given the extension ".jpeg" on real filesystems,
+or just ".jpg" on FAT ugly ones. This rules out using the simple suffix matcher, but lends itself
+perfectly to REs. One naive RE could be "<CODE>.+\.(jpeg|jpg)</CODE>". This works fine, but is long
+and unnecessarily complex to write. A neater way, IMHO, is "<CODE>.+\.jpe?g</CODE>". As always,
+remember to quote that dot!
+</P>
+
+<H3>'file' Command Regular Expression</H3>
+<P>
+For some files, it is not possible to deduce their type from just file names. Consider ordinary
+executables, such as shell commands and applications. If you were to enter a RE to match the
+possible names of those, you would be working for a while... There must be a better way! In fact,
+there is, and it's called the 'file' command.
+</P>
+<P>
+'file' is a standard Un*x command-line tool which is used to (take a guess) identify file
+types! How incredibly handy! As usual among standard Un*x tools, 'file' is incredibly powerful. It
+uses a text file (<CODE>/etc/magic</CODE> on most systems, I believe) containing advanced file identification
+rules. These rules allow looking <STRONG>inside</STRONG> the files for various values, thus making
+identifying e.g. executables easy: just look for the same things the OS do!
+</P>
+<P>When run, 'file' outputs one line of text for each filename it is given to inspect. For example,
+on my system 'file' has the following to say about the <STRONG>gentoo</STRONG> executable itself:
+<PRE>
+~/data/projects/gentoo&gt; file ./gentoo
+./gentoo: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked, stripped
+</PRE>
+<P>
+That's quite a load, but don't worry; you don't have to care about all of it. With the 'file' RE
+rule, you specify a regular expression which is then matched against the output of 'file' when run
+on each of the files in a directory. The file name, colon, and space output by 'file' are removed
+before the RE is applied. So, to find executables, an acceptable expression is just
+"<CODE>.+executable.+</CODE>". A better one might be "<CODE>ELF.+executable.+</CODE>".
+</P>
+
+<TABLE BORDER="0" CELLSPACING="5" CLASS="Note" WIDTH="100%">
+ <TR><TD WIDTH="3%"></TD><TD WIDTH="3%" NOWRAP><H2 CLASS="Note">Note!</H2></TD>
+ <TD WIDTH="94%">
+ <P>Using 'file' carries a pretty heavy performance penalty! Although some
+ considerable attempts have been made in <STRONG>gentoo</STRONG> to lessen the impact, it is still there.
+ For maximum performance, don't use types with 'file' RE rules. If you don't define <STRONG>any</STRONG>
+ type using 'file' RE matching, <STRONG>gentoo</STRONG> will detect this and optimize the entire file typing process
+ somewhat.</P>
+ <P>
+ For the special case of just recognizing any executable file (i.e. not just binary ELF files),
+ simply use the protection flag checks described above. It'll be a lot quicker.
+ </P>
+ </TD>
+ </TR>
+</TABLE>
+
+<H2>Rule Combinations</H2>
+<P>
+As has been hinted above, you can use any number of rules from one (intrinsic only) to five (all of 'em!)
+to identify your types. The rules are applied in the order they were mentioned here, starting with the intrinsic
+and ending with the 'file' RE match if used. The type doesn't match unless all of its rules do.
+</P>
+<P>
+This can sometimes be somewhat useful, for example, imagine a category of files identified by their names
+beginning with either "cfg_" or "cmd_", and all ending in ".c". You can set up a type using first the simple
+suffix matcher to lock onto the ".c" suffix, and then the name RE matcher to check for the correct prefix. Doing
+it this way, rather than just including the suffix into the RE, saves involving the RE routines (which are orders
+of magnitude more complex than the simple suffix check) until we know it's necessary.
+</P>
+
+<H2>Built-In Types</H2>
+<P>
+There is one type that is <I>always</I> available. It is called "Unknown", and uses a magic rule
+system: any file is considered to be of type "Unknown"! Therefore, to prevent it from "eating up"
+all files, it is tested for <STRONG>after</STRONG> all your user-defined rules have failed. Basically,
+the existance of the "Unknown" file with these semantics guarantee that all files always have exactly
+one type, which is a very nice property.
+</P>
+<P>
+Also, the "Unknown" type links to the (equally magic) "Root" style. This causes display of all
+untyped files to use the "Root" style, which is just as things should be. For more information on
+styles, check the <A HREF="styles.html">relevant chapter</A>.
+</P>
+
+<H2>Tips on Naming Types</H2>
+<P>
+Always try to use two (or more) words in your type names, going from the general to the specific.
+For example, a good name for the JPEG type mentioned above might be "Image, JPEG", or something
+similar. Likewise, you could call the executable type "Executable, ELF". Since the types are listed
+alphabetically in the <A HREF="config.html">configuration</A> page, naming them like this helps keep
+related types together and makes things easier to overlook and manage.
+</P>
+
+</BODY>
+</HTML>
diff --git a/docs/usage.html b/docs/usage.html
new file mode 100644
index 0000000..4dd6ee6
--- /dev/null
+++ b/docs/usage.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN">
+<HTML LANG="en">
+
+<HEAD>
+
+<META NAME="Author" CONTENT="Emil Brink, emil@obsession.se, 27-Aug-1998">
+<META NAME="Design and HTML" CONTENT="Ulf Pettersson, ulf@obsession.se, 29-Sep-1998">
+<META NAME="Copyright" CONTENT="May be redistributed and changed according to the GNU General Public License. See gpl.html" LANG="en">
+
+<META NAME="Keywords" CONTENT="gentoo, Obsession, Emil Brink, filemanager, GTK+, Linux, file management, graphical configurability, Ulf Pettersson, Johan Hanson, files, copying, Obsession Development, " LANG="en">
+<META NAME="Description" CONTENT="gentoo Documentation and User Manual. gentoo is a highly configurable graphical filemanager for Linux and other Unix-operating systems." LANG="en">
+<META NAME="Resource-Type" CONTENT="document">
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html, charset=iso-8859-1">
+<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
+
+<LINK REL="Toc" HREF="index.html">
+<LINK REL="Next" HREF="layout.html">
+<LINK REL="Previous" HREF="intro.html">
+<LINK REL="Stylesheet" HREF="gentoo.css" TYPE="text/css">
+
+<TITLE>gentoo Documentation: Usage</TITLE>
+
+</HEAD>
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#33EE33" VLINK="#EF8210" ALINK="#FFFF00">
+
+<TABLE BORDER="0" WIDTH="100%">
+ <TR>
+ <TD HEIGHT="90" VALIGN="Middle"><A HREF="index.html"><IMG SRC="images/gentoo_logo_g.gif" WIDTH="50" HEIGHT="50" ALT="Back to Table of Contents" VSPACE="8" HSPACE="32" BORDER="0"></A><IMG SRC="images/gentoo_logo_text.gif" WIDTH="200" HEIGHT="55" ALT="gentoo - A Click-Ass Filemanager" BORDER="0"></TD>
+ <TD ALIGN="CENTER">
+ </TD>
+ <TD ALIGN="RIGHT" VALIGN="Middle">
+ <A HREF="http://www.obsession.se/"><IMG SRC="images/od__logo_small.gif" WIDTH="64" HEIGHT="61" HSPACE="32" ALT="Go to Obsession Developments Homepage" BORDER="0"></A>
+ </TD>
+ </TR>
+</TABLE>
+
+<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDER=0 STYLE="background: #000000; text-align: center;">
+ <TR>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="gpl.html" TITLE="License - How to distribute this software">LICENSE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="quick.html" TITLE="Quick Guide - A quick guide to the basic concepts of gentoo">GUIDE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="intro.html" TITLE="Introduction - Why another filemanager?, The features and goals of gentoo ">INTRO</A></SMALL></TD>
+ <TD CLASS="Section"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;">&nbsp;&nbsp;<A HREF="usage.html" TITLE="Usage - How to use gentoo">USAGE</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="config/index.html" TITLE="Configuration - How to configure gentoo">CONFIG</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="history.html" TITLE="History - History of changes between versions">HISTORY</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="contribute.html" TITLE="Contribute - Help making gentoo a better filemanager">CONTRIBUTING</A></SMALL></TD>
+ <TD CLASS="Select"><SMALL STYLE="font-weight: bold; font-size: 10px; font-family: Arial, Helvetica, sans-serif;"><A HREF="acks.html" TITLE="Acknowledgements - Who made gentoo?, Thanks">ACKS</A>&nbsp;&nbsp;</SMALL></TD>
+ </TR>
+</TABLE>
+
+<BR>
+
+<H1>Usage</H1>
+
+<IMG SRC="images/tone.gif" WIDTH=175 HEIGHT=18 BORDER="0">
+
+<P>
+Documenting the use of <STRONG>gentoo</STRONG> in a single page wouldn't be very
+practical. Not because it is an exceptionally big program, but because
+it is exceptionally well documented (IMO). When compared to the typical
+free program, <STRONG>gentoo</STRONG> has huge amounts of documentation. That, I
+feel, is a shame. Anyway, let's divide this into subsections, shall we?
+</P>
+
+<TABLE BORDER="0" CELLSPACING="6">
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>1. <A HREF="layout.html">Window Layout</A></BIG></TD><TD WIDTH="5%"></TD><TD WIDTH="80%">A nice commented screen shot telling you what is what in <STRONG>gentoo</STRONG>'s window.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>2. <A HREF="status.html">The Status Line</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Introduces your friend the status line. Always on top.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>3. <A HREF="dirpanes.html">The Directory Panes</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Text about the most important window elements; the dirpanes.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>4. <A HREF="buttons.html">The Button Bank</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Info about the box of buttons in the bottom of the window.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>5. <A HREF="menus.html">The Menus</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Information about the (currently very limited) menu system.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>6. <A HREF="commands.html">Commands</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Explains built-in and user-defined commands in some detail.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>7. <A HREF="types.html">File Typing</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Tells you how you can teach <STRONG>gentoo</STRONG> about the types of your files!</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>8. <A HREF="styles.html">File Styles</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Control how files of different types are displayed in the panes.</TD></TR>
+ <TR><TD WIDTH="15%"></TD><TD NOWRAP><BIG>9. <A HREF="misc.html">Miscellaneous</A></BIG></TD><TD WIDTH="5%">&nbsp;</TD><TD WIDTH="80%" VALIGN="Top">Various other relevant information, for example on regular expressions.</TD></TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/gentoo.spec b/gentoo.spec
new file mode 100644
index 0000000..7882c04
--- /dev/null
+++ b/gentoo.spec
@@ -0,0 +1,52 @@
+%define name gentoo
+%define version 0.20.7
+%define release 1
+%define serial 2
+
+Summary: gentoo is a graphical file management program
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Serial: %{serial}
+Copyright: GPL
+Group: Applications/File
+URL: http://www.obsession.se/gentoo
+Vendor: Emil Brink <emil@obsession.se>
+Source: ftp://ftp.obsession.se/gentoo/%{name}-%{version}.tar.gz
+Requires: gtk+ >= 1.2.5
+BuildRoot: %{_tmppath}/%{name}-%{version}
+
+%description
+gentoo is a modern, powerful, flexible, and utterly configurable
+file manager for UNIX systems, written using the GTK+ toolkit.
+It aims to be 100% graphically configurable; there's no need to
+edit config files by hand and then restart the application.
+gentoo is somewhat inspired in its look & feel by the classic
+Amiga program DirectoryOpus.
+
+%prep
+%setup -q
+
+%build
+%configure
+make
+
+%install
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -rf ${RPM_BUILD_ROOT};
+make DESTDIR=${RPM_BUILD_ROOT} install
+
+%clean
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -rf ${RPM_BUILD_ROOT};
+
+%files
+%defattr(-,root,root)
+%doc docs/* BUGS CONFIG-CHANGES CREDITS README*
+%config(noreplace) %{_sysconfdir}/gentoogtkrc
+%config(noreplace) %{_sysconfdir}/gentoorc
+%{_bindir}/gentoo
+%{_datadir}/gentoo
+
+%changelog
+* Tue Sep 11 2001 Ryan Weaver <ryanw@infohwy.com>
+- Submitted patch to allow spec file generation in source.
+
diff --git a/gentoo.spec.in b/gentoo.spec.in
new file mode 100644
index 0000000..96776bf
--- /dev/null
+++ b/gentoo.spec.in
@@ -0,0 +1,52 @@
+%define name @PACKAGE@
+%define version @VERSION@
+%define release 1
+%define serial 2
+
+Summary: gentoo is a graphical file management program
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Serial: %{serial}
+Copyright: GPL
+Group: Applications/File
+URL: http://www.obsession.se/gentoo
+Vendor: Emil Brink <emil@obsession.se>
+Source: ftp://ftp.obsession.se/gentoo/%{name}-%{version}.tar.gz
+Requires: gtk+ >= 1.2.5
+BuildRoot: %{_tmppath}/%{name}-%{version}
+
+%description
+gentoo is a modern, powerful, flexible, and utterly configurable
+file manager for UNIX systems, written using the GTK+ toolkit.
+It aims to be 100% graphically configurable; there's no need to
+edit config files by hand and then restart the application.
+gentoo is somewhat inspired in its look & feel by the classic
+Amiga program DirectoryOpus.
+
+%prep
+%setup -q
+
+%build
+%configure
+make
+
+%install
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -rf ${RPM_BUILD_ROOT};
+make DESTDIR=${RPM_BUILD_ROOT} install
+
+%clean
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -rf ${RPM_BUILD_ROOT};
+
+%files
+%defattr(-,root,root)
+%doc docs/* BUGS CONFIG-CHANGES CREDITS README*
+%config(noreplace) %{_sysconfdir}/gentoogtkrc
+%config(noreplace) %{_sysconfdir}/gentoorc
+%{_bindir}/gentoo
+%{_datadir}/gentoo
+
+%changelog
+* Tue Sep 11 2001 Ryan Weaver <ryanw@infohwy.com>
+- Submitted patch to allow spec file generation in source.
+
diff --git a/gentoogtkrc.in b/gentoogtkrc.in
new file mode 100644
index 0000000..7a5c555
--- /dev/null
+++ b/gentoogtkrc.in
@@ -0,0 +1,22 @@
+/* GTK+ 3.x styling for gentoo.
+ *
+ * Created in May 2012 by Emil Brink.
+ *
+ * See <http://gnomejournal.org/article/107/styling-gtk-with-css> for information.
+*/
+
+
+/* Here's some intricate styling to make the headers of the current pane stand
+ * out a bit. Note that doing the obvious, i.e. setting background-color,
+ * doesn't work.
+*/
+GtkWindow#gentoo * #pane-current column-header .button {
+ font-weight: bold;
+ color: @selected_bg_color;
+}
+
+
+/* Make the text viewer use a fixed-width font. */
+#txvText, #cstPreview {
+ font: Monospace;
+}
diff --git a/gentoorc.in b/gentoorc.in
new file mode 100644
index 0000000..8b2b652
--- /dev/null
+++ b/gentoorc.in
@@ -0,0 +1,3072 @@
+<?xml version="1.0" standalone="yes"?>
+
+<GentooConfig>
+ <version>"@VERSION@"</version>
+ <DirPanes>
+ <count>2</count>
+ <DirPaneLeft>
+ <columns>9</columns>
+ <DPColumn>
+ <index>0</index>
+ <title>"I"</title>
+ <content>"icon"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>20</width>
+ </DPColumn>
+ <DPColumn>
+ <index>1</index>
+ <title>"Name"</title>
+ <content>"name"</content>
+ <DPExtra>
+ <show_type>TRUE</show_type>
+ <show_linkname>TRUE</show_linkname>
+ </DPExtra>
+ <justification>0</justification>
+ <width>262</width>
+ </DPColumn>
+ <DPColumn>
+ <index>2</index>
+ <title>"Size"</title>
+ <content>"size"</content>
+ <DPExtra>
+ <unit>"bytesnounit"</unit>
+ <ticks>TRUE</ticks>
+ <tick>","</tick>
+ <digits>3</digits>
+ <dir_fs>TRUE</dir_fs>
+ </DPExtra>
+ <justification>1</justification>
+ <width>99</width>
+ </DPColumn>
+ <DPColumn>
+ <index>3</index>
+ <title>"Mode"</title>
+ <content>"modenum"</content>
+ <DPExtra>
+ <numformat>"%o"</numformat>
+ </DPExtra>
+ <justification>1</justification>
+ <width>50</width>
+ </DPColumn>
+ <DPColumn>
+ <index>4</index>
+ <title>"Mode2"</title>
+ <content>"modestr"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>5</index>
+ <title>"Nlink"</title>
+ <content>"nlink"</content>
+ <DPExtra>
+ <numformat>"%d"</numformat>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>6</index>
+ <title>"User"</title>
+ <content>"uname"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>7</index>
+ <title>"Group"</title>
+ <content>"gname"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>8</index>
+ <title>"Modified"</title>
+ <content>"mtime"</content>
+ <DPExtra>
+ <dateformat>"%Y-%m-%d %H:%M.%S"</dateformat>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPSort>
+ <content>"name"</content>
+ <mode>"dirs_first"</mode>
+ <invert>FALSE</invert>
+ <nocase>FALSE</nocase>
+ </DPSort>
+ <defpath>"@history[0]"</defpath>
+ <path_above>FALSE</path_above>
+ <hide_allowed>TRUE</hide_allowed>
+ <scrollbar_always>TRUE</scrollbar_always>
+ <huge_parent>FALSE</huge_parent>
+ <set_font>TRUE</set_font>
+ <font_name>"Monospace 8"</font_name>
+ <rubber_banding>TRUE</rubber_banding>
+ <sbar_pos>"right"</sbar_pos>
+ </DirPaneLeft>
+ <DirPaneRight>
+ <columns>9</columns>
+ <DPColumn>
+ <index>0</index>
+ <title>"I"</title>
+ <content>"icon"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>20</width>
+ </DPColumn>
+ <DPColumn>
+ <index>1</index>
+ <title>"Name"</title>
+ <content>"name"</content>
+ <DPExtra>
+ <show_type>TRUE</show_type>
+ <show_linkname>TRUE</show_linkname>
+ </DPExtra>
+ <justification>0</justification>
+ <width>262</width>
+ </DPColumn>
+ <DPColumn>
+ <index>2</index>
+ <title>"Size"</title>
+ <content>"size"</content>
+ <DPExtra>
+ <unit>"bytesnounit"</unit>
+ <ticks>TRUE</ticks>
+ <tick>","</tick>
+ <digits>3</digits>
+ <dir_fs>TRUE</dir_fs>
+ </DPExtra>
+ <justification>1</justification>
+ <width>99</width>
+ </DPColumn>
+ <DPColumn>
+ <index>3</index>
+ <title>"Mode"</title>
+ <content>"modenum"</content>
+ <DPExtra>
+ <numformat>"%o"</numformat>
+ </DPExtra>
+ <justification>1</justification>
+ <width>57</width>
+ </DPColumn>
+ <DPColumn>
+ <index>4</index>
+ <title>"Mode2"</title>
+ <content>"modestr"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>64</width>
+ </DPColumn>
+ <DPColumn>
+ <index>5</index>
+ <title>"Nlink"</title>
+ <content>"nlink"</content>
+ <DPExtra>
+ <numformat>"%d"</numformat>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>6</index>
+ <title>"User"</title>
+ <content>"uname"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>7</index>
+ <title>"Group"</title>
+ <content>"gname"</content>
+ <DPExtra>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPColumn>
+ <index>8</index>
+ <title>"Modified"</title>
+ <content>"mtime"</content>
+ <DPExtra>
+ <dateformat>"%Y-%m-%d %H:%M.%S"</dateformat>
+ </DPExtra>
+ <justification>2</justification>
+ <width>1</width>
+ </DPColumn>
+ <DPSort>
+ <content>"name"</content>
+ <mode>"dirs_first"</mode>
+ <invert>FALSE</invert>
+ <nocase>FALSE</nocase>
+ </DPSort>
+ <defpath>"@history[0]"</defpath>
+ <path_above>FALSE</path_above>
+ <hide_allowed>TRUE</hide_allowed>
+ <scrollbar_always>TRUE</scrollbar_always>
+ <huge_parent>FALSE</huge_parent>
+ <set_font>TRUE</set_font>
+ <font_name>"Monospace 8"</font_name>
+ <rubber_banding>TRUE</rubber_banding>
+ <sbar_pos>"left"</sbar_pos>
+ </DirPaneRight>
+ <DirPanePaning>
+ <orientation>"horizontal"</orientation>
+ <mode>"ratio"</mode>
+ <value>0.5</value>
+ </DirPanePaning>
+ <DirPaneHistory>
+ <select>TRUE</select>
+ <save>TRUE</save>
+ </DirPaneHistory>
+ </DirPanes>
+ <CmdSeqs>
+ <CmdSeq>
+ <name>"uncompress_tar_gzip"</name>
+ <flags>1</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar xzf {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>8</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_checkbox"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {It:&quot;Testing checkboxes&quot;} {Ix:&quot;One&quot;} {Ix:&quot;Two&quot;} {Ix:&quot;Three&quot;}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"wrap_about"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"About"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"uncompress_gzip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"gunzip {Fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>1</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_pipe"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"bash -c &apos;echo {Fup} | wc&apos;"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"run_file"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"/usr/bin/env bash -c {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"uncompress_tar_bzip2"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar --use-compress-program=bzip2 -xf {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>8</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_uri"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {uq}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"unmount"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"umount {fpu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_deb"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"dpkg-deb -c {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"compress_gzip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"gzip -9 {Fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>1</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"new_shell"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"xterm"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>1</gflags>
+ <bflags>4</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"mouse_right"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"SelectRow action=select"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"MenuPopup"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"open_other"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"DirToOther"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"ActivateOther"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"DirEnter"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"ActivateOther"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"UnselectFirst"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_rfc"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"less {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_tar_bzip2"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar -tvf {fpu} --use-compress-prog=bunzip2"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"uncompress_rar"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"unrar x -inul {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>8</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_tar_gzip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar -tvzf {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_grab"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"{$HOME}/data/src/C/spew --delay=5000000"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"echo_selection"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {FEu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_exec"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"nonexistant {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"tar_extract"</name>
+ <flags>1</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo Extracting {fp} to {Pd}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar xzf {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>16</gflags>
+ <bflags>8</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_gzip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"zcat {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_howto"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"less {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_call"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"wrap_about"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"compress_tar"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar {It:&quot;Create tar archive&quot;}{Ic:&quot;Mode&quot;=&quot;-cf&quot;,&quot;-czf&quot;,&quot;-cyf&quot;} {Pd}/{Is:&quot;Archive Name&quot;} {Ix:&quot;Dereference links?&quot;=&quot;-h&quot;,&quot;&quot;}{Ix:&quot;Compress?&quot;=&quot;-z&quot;,&quot;&quot;} {Fu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>16</gflags>
+ <bflags>4</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"Unnamed"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"bzcat {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_menu"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {Im:&quot;First&quot;=&quot;Hello,:1&quot;,&quot;Good day,:2&quot;,&quot;Good evening,:3&quot;,&quot;Hi,:4&quot;,&quot;Yo:5&quot;} {Im:&quot;Second&quot;=&quot;person&quot;,&quot;dude&quot;,&quot;geek&quot;}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_tar"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"tar -tvf {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_pdf"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>" evince {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_image"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"eog {Fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>4</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_html"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"lynx -dump {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"uncompress_zip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"unzip -qq -o {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>8</bflags>
+ <aflags>2</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"run_missing"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"whatever {Fpu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"edit_text"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"{$EDITOR} {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>1</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_man"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"groff -man -Tascii -P-b -P-u {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"echo_selection_first"</name>
+ <flags>1</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {fu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_dirparent"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"DirParent"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"About"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"edit_image"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"gimp {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"play_mp3"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"xmms {Fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>1</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"mkdir_and_enter_selected"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"MkDir 1"</def>
+ <flags>0</flags>
+ </CmdRow>
+ <CmdRow>
+ <type>"Built-In"</type>
+ <def>"DirEnter dir={fpu}"</def>
+ <flags>0</flags>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"diff"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"diff -pu {fpu} {fdup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>16</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_ps"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"gv {fut}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>1</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"convert_mp3"</name>
+ <flags>1</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"bash -c &apos;mpg123 -q -w $(basename {f} .mp3).wav {fup}&apos;"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>4</bflags>
+ <aflags>1</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"play_sid"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"sidplay {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>1</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"test_input"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {It:&quot;String input defaults to first selected filename:&quot;} {It:&quot;-&quot;} {Is:&quot;Name:&quot;=&quot;prefix-{fQ}-postfix&quot;}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"print_selected"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"echo {Fpu}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_rpm"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"rpm -SOME_SMART_OPTION {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"run_calculator"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"gnome-calculator"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>3</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"run_script"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"/usr/bin/env bash {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>16</gflags>
+ <bflags>20</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"play_mod"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"xmp {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>3</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"play_sample"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"aplay {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_video"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"mplayer -quiet -vo x11 {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>0</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_zip"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"unzip -v {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ <CmdSeq>
+ <name>"view_rar"</name>
+ <flags>0</flags>
+ <CmdRows>
+ <CmdRow>
+ <type>"External"</type>
+ <def>"unrar lt {fup}"</def>
+ <flags>0</flags>
+ <CX_External>
+ <gflags>4</gflags>
+ <bflags>0</bflags>
+ <aflags>0</aflags>
+ </CX_External>
+ </CmdRow>
+ </CmdRows>
+ </CmdSeq>
+ </CmdSeqs>
+ <CommandConfig>
+ <Configure>
+ <auto_save>FALSE</auto_save>
+ </Configure>
+ <Copy>
+ <copy_dates>TRUE</copy_dates>
+ <ignore_attrib_err>TRUE</ignore_attrib_err>
+ <leave_fullsize>TRUE</leave_fullsize>
+ <buf_size>u2097152</buf_size>
+ </Copy>
+ <Delete>
+ <set_mode>u1</set_mode>
+ </Delete>
+ <GetSize>
+ <unselect>FALSE</unselect>
+ </GetSize>
+ <Information>
+ <use_file>TRUE</use_file>
+ <recurse_dirs>TRUE</recurse_dirs>
+ <df_access>"%Y-%m-%d %H:%M.%S"</df_access>
+ <df_modify>"%Y-%m-%d %H:%M.%S"</df_modify>
+ <df_change>"%Y-%m-%d %H:%M.%S"</df_change>
+ <tick>","</tick>
+ </Information>
+ <MkDir>
+ <cd_new>TRUE</cd_new>
+ <focus_new>FALSE</focus_new>
+ </MkDir>
+ <Rename>
+ <inplace>TRUE</inplace>
+ <preselect>u2</preselect>
+ </Rename>
+ <ViewText>
+ <buf_size>u1048576</buf_size>
+ <check_size>u512</check_size>
+ <exit_left>TRUE</exit_left>
+ </ViewText>
+ </CommandConfig>
+ <FileStyles>
+ <Style>
+ <name>"Root"</name>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"Default"</name>
+ <action>"FileAction action=View"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C0000,0000,0000</color>
+ </Property>
+ <Property>
+ <name>"uBG"</name>
+ <color>CE665,E665,E665</color>
+ </Property>
+ <Property>
+ <name>"View"</name>
+ <action>"ViewText mode=Auto"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Document.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Data"</name>
+ <parent>"Root"</parent>
+ <expand>FALSE</expand>
+ </Style>
+ <Style>
+ <name>"Archive"</name>
+ <parent>"Data"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"ClickMClick"</name>
+ <action>"FileAction action=extract"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C8080,0000,6666</color>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Package.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Package"</name>
+ <parent>"Archive"</parent>
+ <expand>FALSE</expand>
+ </Style>
+ <Style>
+ <name>"DEB"</name>
+ <parent>"Package"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_deb"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"deb.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"RPM"</name>
+ <parent>"Package"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_rpm"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"rpm.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Rar"</name>
+ <parent>"Archive"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_rar"</action>
+ </Property>
+ <Property>
+ <name>"extract"</name>
+ <action>"uncompress_rar"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Tar"</name>
+ <parent>"Archive"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_tar"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Tar BZip2"</name>
+ <parent>"Archive"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_tar_bzip2"</action>
+ </Property>
+ <Property>
+ <name>"extract"</name>
+ <action>"uncompress_tar_bzip2"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Tar GZip"</name>
+ <parent>"Archive"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_tar_gzip"</action>
+ </Property>
+ <Property>
+ <name>"extract"</name>
+ <action>"uncompress_tar_gzip"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"ZIP"</name>
+ <parent>"Archive"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_zip"</action>
+ </Property>
+ <Property>
+ <name>"extract"</name>
+ <action>"uncompress_zip"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Compressed"</name>
+ <parent>"Data"</parent>
+ <expand>FALSE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Package.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"BZip2"</name>
+ <parent>"Compressed"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_bzip2"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"GZip"</name>
+ <parent>"Compressed"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_gzip"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Image"</name>
+ <parent>"Data"</parent>
+ <expand>FALSE</expand>
+ <Properties>
+ <Property>
+ <name>"Default"</name>
+ <action>"FileAction action=View"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C8080,0000,3333</color>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Image.xpm"</icon>
+ </Property>
+ <Property>
+ <name>"Edit"</name>
+ <action>"edit_image"</action>
+ </Property>
+ <Property>
+ <name>"View"</name>
+ <action>"view_image"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"BMP"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Windows.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"GIF"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"gif.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"IFF-ILBM"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"iff.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"JPEG"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"jpeg.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"PNG"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"png.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"TARGA"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"targa.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"TIFF"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"tiff.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"XPM"</name>
+ <parent>"Image"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"xpm.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Sound"</name>
+ <parent>"Data"</parent>
+ <expand>FALSE</expand>
+ <Properties>
+ <Property>
+ <name>"Default"</name>
+ <action>"FileAction action=Play"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C4848,4848,6868</color>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Music"</name>
+ <parent>"Sound"</parent>
+ <expand>FALSE</expand>
+ </Style>
+ <Style>
+ <name>"MP3"</name>
+ <parent>"Music"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"mp3.xpm"</icon>
+ </Property>
+ <Property>
+ <name>"Play"</name>
+ <action>"play_mp3"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Module"</name>
+ <parent>"Music"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"mod.xpm"</icon>
+ </Property>
+ <Property>
+ <name>"Play"</name>
+ <action>"play_mod"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"SID"</name>
+ <parent>"Music"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"sid.xpm"</icon>
+ </Property>
+ <Property>
+ <name>"Play"</name>
+ <action>"play_sid"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Sample"</name>
+ <parent>"Sound"</parent>
+ <expand>FALSE</expand>
+ <Properties>
+ <Property>
+ <name>"Play"</name>
+ <action>"play_sample"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"WAV"</name>
+ <parent>"Sample"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"wav.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"au"</name>
+ <parent>"Sample"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"au.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Text"</name>
+ <parent>"Data"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"txt.xpm"</icon>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C0000,6666,3333</color>
+ </Property>
+ <Property>
+ <name>"Edit"</name>
+ <action>"edit_text"</action>
+ </Property>
+ <Property>
+ <name>"View"</name>
+ <action>"ViewText encoding=ISO-8859-1"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"COPYING"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"License.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Config"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"conf.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"HOWTO"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_howto"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Readme.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"HTML"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_html"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"html.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"MS Word"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"MSWordDoc.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Makefile"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Makefile.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Man Page"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_man"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"man.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"PDF"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_pdf"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"pdf.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Package Info"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Readme.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Plain"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ </Style>
+ <Style>
+ <name>"PostScript"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_ps"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"ps.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"RFC"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"View"</name>
+ <action>"view_rfc"</action>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Source Code"</name>
+ <parent>"Text"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uFG"</name>
+ <color>C0000,3333,0000</color>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Source.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Assembly Source"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ </Style>
+ <Style>
+ <name>"C Header"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"h.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"C Source"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"c.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Java Source"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"java.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"M4"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Source.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Perl"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"pl.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Python"</name>
+ <parent>"Source Code"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"py.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Video"</name>
+ <parent>"Data"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uFG"</name>
+ <color>CA665,0000,428F</color>
+ </Property>
+ <Property>
+ <name>"View"</name>
+ <action>"view_video"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Animation.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"3GP"</name>
+ <parent>"Video"</parent>
+ <expand>TRUE</expand>
+ </Style>
+ <Style>
+ <name>"AVI"</name>
+ <parent>"Video"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"avi.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"MPEG"</name>
+ <parent>"Video"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"mpeg.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Directory"</name>
+ <parent>"Root"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"Default"</name>
+ <action>"DirEnter"</action>
+ </Property>
+ <Property>
+ <name>"View"</name>
+ <action>""</action>
+ </Property>
+ <Property>
+ <name>"OpenOther"</name>
+ <action>"open_other"</action>
+ </Property>
+ <Property>
+ <name>"ClickMClick"</name>
+ <action>"FileAction action=OpenOther"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>CFFFF,3333,3333</color>
+ </Property>
+ <Property>
+ <name>"unmount"</name>
+ <action>"unmount"</action>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Directory.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Executable"</name>
+ <parent>"Root"</parent>
+ <expand>FALSE</expand>
+ <Properties>
+ <Property>
+ <name>"Default"</name>
+ <action>"run_file"</action>
+ </Property>
+ <Property>
+ <name>"uFG"</name>
+ <color>C8080,8080,0000</color>
+ </Property>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Executable.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Java Class"</name>
+ <parent>"Executable"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"class.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Object"</name>
+ <parent>"Executable"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"o.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Shared Object"</name>
+ <parent>"Executable"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"so.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Windows"</name>
+ <parent>"Executable"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"exe.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Special"</name>
+ <parent>"Root"</parent>
+ <expand>FALSE</expand>
+ </Style>
+ <Style>
+ <name>"FIFO"</name>
+ <parent>"Special"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"FIFO.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ <Style>
+ <name>"Socket"</name>
+ <parent>"Special"</parent>
+ <expand>TRUE</expand>
+ <Properties>
+ <Property>
+ <name>"uIcon"</name>
+ <icon>"Port.xpm"</icon>
+ </Property>
+ </Properties>
+ </Style>
+ </FileStyles>
+ <FileTypes>
+ <FileType>
+ <name>"Directory"</name>
+ <mode>16384</mode>
+ <style>"Directory"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Tar"</name>
+ <mode>32768</mode>
+ <suffix>".tar"</suffix>
+ <style>"Tar"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Rar"</name>
+ <mode>32768</mode>
+ <suffix>".rar"</suffix>
+ <style>"Rar"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Tar BZip2"</name>
+ <mode>32768</mode>
+ <name_re>"^.+\\.(tbz|tar\\.bz2)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Tar BZip2"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Tar Gzip"</name>
+ <mode>32768</mode>
+ <name_re>".+\\.(tar\\.gz|tgz)"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Tar GZip"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, ZIP"</name>
+ <mode>32768</mode>
+ <suffix>".zip"</suffix>
+ <style>"ZIP"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Package, Debian"</name>
+ <mode>32768</mode>
+ <suffix>".deb"</suffix>
+ <style>"DEB"</style>
+ </FileType>
+ <FileType>
+ <name>"Archive, Package, RPM"</name>
+ <mode>32768</mode>
+ <suffix>".rpm"</suffix>
+ <style>"RPM"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, BMP"</name>
+ <mode>32768</mode>
+ <suffix>".bmp"</suffix>
+ <style>"BMP"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, GIF"</name>
+ <mode>32768</mode>
+ <suffix>".gif"</suffix>
+ <style>"GIF"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, JPEG"</name>
+ <mode>32768</mode>
+ <name_re>"^.+\\.jpe?g$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>TRUE</name_nocase>
+ <style>"JPEG"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, IFF-ILBM"</name>
+ <mode>32768</mode>
+ <name_re>"\\.(lbm|iff)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"IFF-ILBM"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, TARGA"</name>
+ <mode>32768</mode>
+ <suffix>".tga"</suffix>
+ <style>"TARGA"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, TIFF"</name>
+ <mode>32768</mode>
+ <name_re>"\\.tiff?$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"TIFF"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, PNG"</name>
+ <mode>32768</mode>
+ <suffix>".png"</suffix>
+ <style>"PNG"</style>
+ </FileType>
+ <FileType>
+ <name>"Image, XPM"</name>
+ <mode>32768</mode>
+ <suffix>".xpm"</suffix>
+ <style>"XPM"</style>
+ </FileType>
+ <FileType>
+ <name>"Sound, Music, Module"</name>
+ <mode>32768</mode>
+ <name_re>"(^mod\\..+)|(.+\\.mod$)"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Module"</style>
+ </FileType>
+ <FileType>
+ <name>"Sound, Music, MP3"</name>
+ <mode>32768</mode>
+ <suffix>".mp3"</suffix>
+ <style>"MP3"</style>
+ </FileType>
+ <FileType>
+ <name>"Sound, Music, SID"</name>
+ <mode>32768</mode>
+ <suffix>".sid"</suffix>
+ <style>"SID"</style>
+ </FileType>
+ <FileType>
+ <name>"Sound, Sample, WAV"</name>
+ <mode>32768</mode>
+ <file_re>"WAVE audio"</file_re>
+ <file_glob>FALSE</file_glob>
+ <file_nocase>FALSE</file_nocase>
+ <style>"WAV"</style>
+ </FileType>
+ <FileType>
+ <name>"Sound, Sample, au"</name>
+ <mode>32768</mode>
+ <suffix>".au"</suffix>
+ <style>"au"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, Assembly, ASM-One"</name>
+ <mode>32768</mode>
+ <name_re>"\\.(s|S)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Root"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, Assembly"</name>
+ <mode>32768</mode>
+ <name_re>"\\.(s|asm)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Assembly Source"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, C Header"</name>
+ <mode>32768</mode>
+ <suffix>".h"</suffix>
+ <style>"C Header"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, C Source"</name>
+ <mode>32768</mode>
+ <suffix>".c"</suffix>
+ <style>"C Source"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, C++ Source"</name>
+ <mode>32768</mode>
+ <name_re>"\\.(cpp|cc)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"C Source"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, Java"</name>
+ <mode>32768</mode>
+ <suffix>".java"</suffix>
+ <style>"Java Source"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, M4"</name>
+ <mode>32768</mode>
+ <suffix>".m4"</suffix>
+ <style>"M4"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, Perl"</name>
+ <mode>32768</mode>
+ <suffix>".pl"</suffix>
+ <style>"Perl"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, PHP"</name>
+ <mode>32768</mode>
+ <suffix>".php"</suffix>
+ <style>"Source Code"</style>
+ </FileType>
+ <FileType>
+ <name>"Source Code, Python"</name>
+ <mode>32768</mode>
+ <suffix>".py"</suffix>
+ <style>"Python"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, COPYING"</name>
+ <mode>32768</mode>
+ <name_re>"^(COPYING|COPYRIGHT|LICENSE)$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"COPYING"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, Config"</name>
+ <mode>32768</mode>
+ <name_re>"^\\..+rc$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Config"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, HOWTO"</name>
+ <mode>32768</mode>
+ <name_re>"-HOWTO(\\.gz)?$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"HOWTO"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, MS Word"</name>
+ <mode>32768</mode>
+ <suffix>".doc"</suffix>
+ <style>"MS Word"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, HTML"</name>
+ <mode>32768</mode>
+ <name_re>".+\\.html?$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"HTML"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, Makefile"</name>
+ <mode>32768</mode>
+ <name_re>"^Makefile"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Makefile"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, Man Page"</name>
+ <mode>32768</mode>
+ <name_re>"^[^.]+[^0-9]\\.[0-9][A-Za-z]?(\\.gz)?$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Man Page"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, Package Information"</name>
+ <mode>32768</mode>
+ <name_re>"^(BUGS|ChangeLog|INSTALL|README|TODO)"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Package Info"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, PDF"</name>
+ <mode>32768</mode>
+ <suffix>".pdf"</suffix>
+ <style>"PDF"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, Plain"</name>
+ <mode>32768</mode>
+ <suffix>".txt"</suffix>
+ <file_re>"ASCII text"</file_re>
+ <file_glob>FALSE</file_glob>
+ <file_nocase>FALSE</file_nocase>
+ <style>"Plain"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, PostScript"</name>
+ <mode>32768</mode>
+ <suffix>".ps"</suffix>
+ <style>"PostScript"</style>
+ </FileType>
+ <FileType>
+ <name>"Text, RFC"</name>
+ <mode>32768</mode>
+ <name_re>"^rfc[0-9]+(\\.gz)?$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"RFC"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, 3GP"</name>
+ <mode>32768</mode>
+ <suffix>".3gp"</suffix>
+ <style>"3GP"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, AVI"</name>
+ <mode>32768</mode>
+ <suffix>".avi"</suffix>
+ <style>"AVI"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, MPEG"</name>
+ <mode>32768</mode>
+ <name_re>"\\.mpe?g$"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"MPEG"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, MOV"</name>
+ <mode>32768</mode>
+ <suffix>".mov"</suffix>
+ <style>"3GP"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, WMV"</name>
+ <mode>32768</mode>
+ <suffix>".wmv"</suffix>
+ <style>"3GP"</style>
+ </FileType>
+ <FileType>
+ <name>"Video, RealMedia"</name>
+ <mode>32768</mode>
+ <suffix>".rm"</suffix>
+ <style>"3GP"</style>
+ </FileType>
+ <FileType>
+ <name>"Executable, Shared Object"</name>
+ <mode>32768</mode>
+ <name_re>"^lib.+\\.so(\\.[0-9.]+)?"</name_re>
+ <name_glob>FALSE</name_glob>
+ <name_nocase>FALSE</name_nocase>
+ <style>"Shared Object"</style>
+ </FileType>
+ <FileType>
+ <name>"Executable"</name>
+ <mode>32768</mode>
+ <perm>32</perm>
+ <style>"Executable"</style>
+ </FileType>
+ <FileType>
+ <name>"Executable, Java Class"</name>
+ <mode>32768</mode>
+ <suffix>".class"</suffix>
+ <style>"Java Class"</style>
+ </FileType>
+ <FileType>
+ <name>"Executable, Object"</name>
+ <mode>32768</mode>
+ <suffix>".o"</suffix>
+ <style>"Object"</style>
+ </FileType>
+ <FileType>
+ <name>"Executable, Windows"</name>
+ <mode>32768</mode>
+ <suffix>".exe"</suffix>
+ <style>"Windows"</style>
+ </FileType>
+ <FileType>
+ <name>"Data, Compressed, GZip"</name>
+ <mode>32768</mode>
+ <suffix>".gz"</suffix>
+ <style>"GZip"</style>
+ </FileType>
+ <FileType>
+ <name>"Data, Compressed, BZip2"</name>
+ <mode>32768</mode>
+ <suffix>".bz2"</suffix>
+ <style>"BZip2"</style>
+ </FileType>
+ <FileType>
+ <name>"Special, Link"</name>
+ <mode>40960</mode>
+ <style>"FIFO"</style>
+ </FileType>
+ <FileType>
+ <name>"Special, Socket"</name>
+ <mode>49152</mode>
+ <style>"Socket"</style>
+ </FileType>
+ <FileType>
+ <name>"Special, FIFO"</name>
+ <mode>4096</mode>
+ <style>"FIFO"</style>
+ </FileType>
+ <FileType>
+ <name>"Unknown"</name>
+ <mode>0</mode>
+ <style>"Root"</style>
+ </FileType>
+ </FileTypes>
+ <ButtonSheets>
+ <ButtonSheet>
+ <label>"Shortcuts"</label>
+ <ButtonSheetRows>
+ <ButtonRow>
+ <width>1</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Home"</label>
+ <cmdseq>"DirEnter &apos;dir=$HOME&apos;"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"~root"</label>
+ <cmdseq>"DirEnter &apos;dir=~root&apos;"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ <ButtonRow>
+ <width>1</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Local"</label>
+ <cmdseq>"DirEnter &apos;dir=/usr/local/&apos;"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ <ButtonRow>
+ <width>1</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"/"</label>
+ <cmdseq>"DirEnter &apos;dir=/&apos;"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ <ButtonRow>
+ <width>1</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"CD-ROM"</label>
+ <cmdseq>"DirEnter &apos;dir=/cdrom/&apos;"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"CD-RW"</label>
+ <cmdseq>"DirEnter &apos;dir=/cdrw/&apos;"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ </ButtonSheetRows>
+ </ButtonSheet>
+ <ButtonSheet>
+ <label>"Default"</label>
+ <ButtonSheetRows>
+ <ButtonRow>
+ <width>8</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"All"</label>
+ <cmdseq>"SelectAll"</cmdseq>
+ <key>"&lt;Control&gt;a"</key>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"None"</label>
+ <cmdseq>"SelectNone"</cmdseq>
+ <key>"&lt;Shift&gt;&lt;Control&gt;a"</key>
+ </BFace>
+ </BFaces>
+ <tooltip>"Ctrl+A / Shift+Ctrl+A"</tooltip>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u1</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Copy"</label>
+ <cmdseq>"Copy"</cmdseq>
+ <key>"F3"</key>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"Copy As"</label>
+ <cmdseq>"CopyAs"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u2</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Make Link"</label>
+ <cmdseq>"SymLink"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"Link As"</label>
+ <cmdseq>"SymLinkAs"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u3</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Move"</label>
+ <cmdseq>"Move"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"Move As"</label>
+ <cmdseq>"MoveAs"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u4</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Delete"</label>
+ <cmdseq>"Delete"</cmdseq>
+ <key>"Delete"</key>
+ <fg>CE2FB,14C2,14C2</fg>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u5</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Make Dir"</label>
+ <cmdseq>"MkDir"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u6</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"ChMod"</label>
+ <cmdseq>"ChMod"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"ChOwn"</label>
+ <cmdseq>"ChOwn"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u7</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"_Configure..."</label>
+ <cmdseq>"Configure"</cmdseq>
+ <key>"c"</key>
+ <fg>C21F3,88D9,D580</fg>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ <ButtonRow>
+ <width>8</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Toggle"</label>
+ <cmdseq>"SelectToggle"</cmdseq>
+ <key>"&lt;Alt&gt;a"</key>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <cmdseq>""</cmdseq>
+ </BFace>
+ </BFaces>
+ <tooltip>"Alt+A"</tooltip>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u1</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Clone"</label>
+ <cmdseq>"Clone"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u2</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Link Clone"</label>
+ <cmdseq>"SymLinkClone"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"Link Edit"</label>
+ <cmdseq>"SymLinkEdit"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u3</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Rename"</label>
+ <cmdseq>"Rename"</cmdseq>
+ <key>"F2"</key>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"RenameRE"</label>
+ <cmdseq>"RenameRE"</cmdseq>
+ <key>"&lt;Shift&gt;F2"</key>
+ </BFace>
+ </BFaces>
+ <tooltip>"F2"</tooltip>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u4</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"_Information"</label>
+ <cmdseq>"Information"</cmdseq>
+ <key>"i"</key>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u5</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Get Size"</label>
+ <cmdseq>"GetSize"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"ClearSize"</label>
+ <cmdseq>"ClearSize"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u6</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"XTerm"</label>
+ <cmdseq>"new_shell"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ <ButtonRow>
+ <width>8</width>
+ <ButtonRowButtons>
+ <Button>
+ <pos>u0</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"SelectRE"</label>
+ <cmdseq>"SelectRE"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"SelectShell"</label>
+ <cmdseq>"SelectShell"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u1</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"tar..."</label>
+ <cmdseq>"compress_tar"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"untar"</label>
+ <cmdseq>"uncompress_tar_gzip"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u2</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"gzip"</label>
+ <cmdseq>"compress_gzip"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"gunzip"</label>
+ <cmdseq>"uncompress_gzip"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u3</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"RenameSeq"</label>
+ <cmdseq>"RenameSeq"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u4</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"Split"</label>
+ <cmdseq>"Split"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <label>"Join"</label>
+ <cmdseq>"Join"</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u5</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"SelectRE"</label>
+ <cmdseq>"SelectRE {It:&quot;Home-grown RE Selection&quot;} set={Im:&quot;Set&quot;=&quot;All rows&quot;,&quot;Selected&quot;,&quot;Unselected&quot;} type={Im:&quot;Type&quot;=&quot;All types&quot;,&quot;Directories only&quot;,&quot;Non-directories only&quot;} action={Im:&quot;Action&quot;=&quot;Select&quot;,&quot;Unselect&quot;,&quot;Toggle&quot;} full={Ix:&quot;Require full match?&quot;*} {Is:&quot;RE&quot;}"</cmdseq>
+ </BFace>
+ <BFace>
+ <face>u1</face>
+ <cmdseq>""</cmdseq>
+ </BFace>
+ </BFaces>
+ <tooltip>"This uses command arguments to &quot;fake&quot; the SelectRE command"</tooltip>
+ <flags>u2</flags>
+ </Button>
+ <Button>
+ <pos>u6</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <cmdseq>""</cmdseq>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ <Button>
+ <pos>u7</pos>
+ <BFaces>
+ <BFace>
+ <face>u0</face>
+ <label>"_Quit"</label>
+ <cmdseq>"Quit"</cmdseq>
+ <key>"q"</key>
+ </BFace>
+ </BFaces>
+ <flags>u0</flags>
+ </Button>
+ </ButtonRowButtons>
+ </ButtonRow>
+ </ButtonSheetRows>
+ </ButtonSheet>
+ </ButtonSheets>
+ <ButtonLayout>
+ <ShortcutSheet>
+ <right>FALSE</right>
+ <separation>2</separation>
+ </ShortcutSheet>
+ </ButtonLayout>
+ <Paths>
+ <PathList>
+ <Path>
+ <index>0</index>
+ <path>"icons:/usr/local/share/icons/gentoo/16x16:/usr/share/icons:gentoo/16x16:/usr/share/icons/gnome/16x16/mimetypes"</path>
+ </Path>
+ <Path>
+ <index>1</index>
+ <path>"~/.config/gentoo"</path>
+ </Path>
+ <Path>
+ <index>2</index>
+ <path>"/etc/fstab"</path>
+ </Path>
+ <Path>
+ <index>3</index>
+ <path>"/proc/mounts"</path>
+ </Path>
+ </PathList>
+ <HideInfo>
+ <mode>1</mode>
+ <re>"^\\."</re>
+ <re_nocase>FALSE</re_nocase>
+ </HideInfo>
+ </Paths>
+ <Windows>
+ <Window>
+ <id>u0</id>
+ <x>619</x>
+ <y>123</y>
+ <w>800</w>
+ <h>1050</h>
+ <pos_use>FALSE</pos_use>
+ <pos_update>FALSE</pos_update>
+ <size_use>TRUE</size_use>
+ <size_update>TRUE</size_update>
+ </Window>
+ <Window>
+ <id>u1</id>
+ <x>0</x>
+ <y>58</y>
+ <w>800</w>
+ <h>600</h>
+ <pos_use>TRUE</pos_use>
+ <pos_update>TRUE</pos_update>
+ <size_use>TRUE</size_use>
+ <size_update>TRUE</size_update>
+ </Window>
+ <Window>
+ <id>u2</id>
+ <x>32</x>
+ <y>32</y>
+ <w>800</w>
+ <h>600</h>
+ <pos_use>FALSE</pos_use>
+ <pos_update>FALSE</pos_update>
+ <size_use>TRUE</size_use>
+ <size_update>TRUE</size_update>
+ </Window>
+ <Window>
+ <id>u3</id>
+ <x>32</x>
+ <y>32</y>
+ <w>320</w>
+ <h>480</h>
+ <pos_use>FALSE</pos_use>
+ <pos_update>FALSE</pos_update>
+ <size_use>TRUE</size_use>
+ <size_update>TRUE</size_update>
+ </Window>
+ <Borders>
+ <width>4</width>
+ <height>-24</height>
+ </Borders>
+ </Windows>
+ <Dialogs>
+ <pos>"mouse"</pos>
+ </Dialogs>
+ <Controls>
+ <Keys>
+ <Key>
+ <keyname>"&lt;Alt&gt;&lt;Mod2&gt;1"</keyname>
+ <cmdseq>"ActivateLeft"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Alt&gt;&lt;Mod2&gt;2"</keyname>
+ <cmdseq>"ActivateRight"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Control&gt;&lt;Mod2&gt;F8"</keyname>
+ <cmdseq>"Rerun"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Control&gt;Tab"</keyname>
+ <cmdseq>"DirFromOther"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Control&gt;r"</keyname>
+ <cmdseq>"DpReorient"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Control&gt;s"</keyname>
+ <cmdseq>"DpFocusISrch text="</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Control&gt;space"</keyname>
+ <cmdseq>"MenuPopup"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Mod2&gt;q"</keyname>
+ <cmdseq>"Quit"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Mod2&gt;space"</keyname>
+ <cmdseq>"ActivateOther"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Primary&gt;&lt;Mod2&gt;g"</keyname>
+ <cmdseq>"DpGotoRow {It:&quot;Jump To Row Matching&quot;} re=^{Is:&quot;Regular Expression&quot;} focus={Ix:&quot;Focus Destination?&quot;}"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Primary&gt;&lt;Mod2&gt;l"</keyname>
+ <cmdseq>"DpFocusPath select=true"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Shift&gt;&lt;Mod2&gt;r"</keyname>
+ <cmdseq>"DpMaximize"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"&lt;Shift&gt;Return"</keyname>
+ <cmdseq>"DpFocusPath select=true"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"BackSpace"</keyname>
+ <cmdseq>"DirParent"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"Delete"</keyname>
+ <cmdseq>"Delete"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"F1"</keyname>
+ <cmdseq>"About"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"F5"</keyname>
+ <cmdseq>"DirRescan"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"F8"</keyname>
+ <cmdseq>"Run"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"Left"</keyname>
+ <cmdseq>"DirParent"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"Tab"</keyname>
+ <cmdseq>"ActivateOther"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"c"</keyname>
+ <cmdseq>"Configure"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"h"</keyname>
+ <cmdseq>"DpHide"</cmdseq>
+ </Key>
+ <Key>
+ <keyname>"r"</keyname>
+ <cmdseq>"DpRecenter value=50"</cmdseq>
+ </Key>
+ </Keys>
+ <MouseButtons>
+ <MouseButton>
+ <button>u1</button>
+ <state>u5</state>
+ <cmdseq>"SelectSuffix action=toggle"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u1</button>
+ <state>u8</state>
+ <cmdseq>"SelectType action=toggle"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u2</button>
+ <state>u0</state>
+ <cmdseq>"DirParent"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u2</button>
+ <state>u1</state>
+ <cmdseq>"SelectRow"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u3</button>
+ <state>u0</state>
+ <cmdseq>"MenuPopup"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u3</button>
+ <state>u1</state>
+ <cmdseq>"mouse_right"</cmdseq>
+ </MouseButton>
+ <MouseButton>
+ <button>u3</button>
+ <state>u4</state>
+ <cmdseq>"MenuPopup menu=&lt;ActionMenu&gt;"</cmdseq>
+ </MouseButton>
+ </MouseButtons>
+ <ClickMClick>
+ <cmdseq>"FileAction action=ClickMClick"</cmdseq>
+ <delay>0.40000000596046448</delay>
+ </ClickMClick>
+ <Generals>
+ <General>
+ <context>"evt-path-rmb"</context>
+ <cmdseq>"About"</cmdseq>
+ </General>
+ </Generals>
+ <ignore_numlock>TRUE</ignore_numlock>
+ </Controls>
+ <Errors>
+ <display>0</display>
+ <beep>FALSE</beep>
+ </Errors>
+ <Nagging>
+
+ </Nagging>
+</GentooConfig>
diff --git a/icons/AbiWord.xpm b/icons/AbiWord.xpm
new file mode 100644
index 0000000..3b6ea95
--- /dev/null
+++ b/icons/AbiWord.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char * AbiWord_xpm[] = {
+"16 15 23 1",
+". c #000000",
+"# c #0000FF",
+"a c #202020",
+"b c #3030FF",
+"c c #404040",
+"d c #606060",
+"e c #6161FF",
+"f c #7070FF",
+"g c #808080",
+"h c #8080FF",
+"i c #9696FF",
+"j c #A0A0A0",
+"k c #A2A2FF",
+"l c #A8A8FF",
+"m c #C0C0C0",
+"n c #C5C5FF",
+"o c #D1D1FF",
+"p c #D8D8FF",
+"q c #DEDEDE",
+"r c #E1E1FF",
+"s c #EFEFFF",
+"t c None",
+"u c #FFFFFF",
+"tdddddddddddddct",
+"tduuuuuuuuuuuu.t",
+"tduuuuuuuuuuuu.t",
+"tduuuuueeuuuuu.t",
+"tduuuuf##fuuuu.t",
+"tduuuo#uu#suuu.t",
+"tduuuefuufhuuu.t",
+"tduur#uuuu#uuu.t",
+"tduuhfuunukluu.t",
+"tduu#nkepuuiuu.t",
+"tduub#kuuuudddat",
+"tduuuuuuuuudumct",
+"tduuuuuuuujgmcjt",
+"tduuuuuuqmdmcgtt",
+"tc........acjttt"};
diff --git a/icons/Amiga.xpm b/icons/Amiga.xpm
new file mode 100644
index 0000000..28c6bdd
--- /dev/null
+++ b/icons/Amiga.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char * Amiga_xpm[] = {
+"16 15 29 1",
+". c None",
+"m c #2D2DFF",
+"f c #DF9E7D",
+"g c #FF7D00",
+"r c #14967D",
+"z c #69AA9E",
+"A c #61DF61",
+"w c #00FF00",
+"u c #8EBE00",
+"d c #828282",
+"j c #BEBE00",
+"s c #BEDF61",
+"e c #A2A2A2",
+"o c #DFDF61",
+"t c #BEFF00",
+"n c #5555BE",
+"y c #41BE41",
+"i c #FFFF00",
+"h c #BE5D00",
+"p c #2020BE",
+"b c #DF6161",
+"c c #BE0000",
+"k c #BEBE41",
+"q c #FFFF7D",
+"v c #10715D",
+"l c #7575DF",
+"# c #FF0000",
+"x c #00BE00",
+"a c #DB514D",
+"...........#a#a.",
+"..........b#c#d.",
+"..........#c#ae.",
+".........b#c#d..",
+".........#c#ae..",
+"........fghgd...",
+"........ijike...",
+".lmnme.oijid....",
+"..mpmneqjike....",
+"..lmprstutd.....",
+"...rvrwxwye.....",
+"...zrvwxwd......",
+"....rwxwye......",
+"....Awywd.......",
+".....edde......."};
diff --git a/icons/Animation.xpm b/icons/Animation.xpm
new file mode 100644
index 0000000..cb052eb
--- /dev/null
+++ b/icons/Animation.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * Animation2_xpm[] = {
+"16 15 19 1",
+". c #000000",
+"# c None",
+"a c #3E3E3E",
+"b c #404040",
+"c c #6B635A",
+"d c #756251",
+"e c #786655",
+"f c #7D6B5B",
+"g c #806E5E",
+"h c #808080",
+"i c #847362",
+"j c #8A7B6A",
+"k c #8F8070",
+"l c #928373",
+"m c #968878",
+"n c #9A8C7C",
+"o c #9D9080",
+"p c #A19585",
+"q c #A59A8A",
+"##.#b........b#.",
+"##...dddeffii...",
+"##.#bddeffiijb#.",
+"##...deffiijj...",
+"##.#beffiijjkb#.",
+"##...fgiijjkl...",
+"##.#bgiijjklmb#.",
+"##..............",
+"##.#bijjllmnob#.",
+"##...jjllmnop...",
+"##.#bjllmnoppbh.",
+"##...llmnopp...b",
+"##.#blmnopqqc.b#",
+"##...nnopqqc..h#",
+"##.#b.......a###"};
diff --git a/icons/Apple.xpm b/icons/Apple.xpm
new file mode 100644
index 0000000..f1ce95d
--- /dev/null
+++ b/icons/Apple.xpm
@@ -0,0 +1,88 @@
+/* XPM */
+static char * Apple_xpm[] = {
+"16 15 70 1",
+" c None",
+"! c #65EF59",
+"# c #00AE00",
+"$ c #008600",
+"% c #A2A2A2",
+"& c #828282",
+"/ c #01BB00",
+"( c #008A00",
+") c #CEFF9A",
+"= c #18C614",
+"+ c #009200",
+"* c #107910",
+"- c #FFCE31",
+"[ c #FFEFC2",
+"] c #FFFFFF",
+"{ c #FFFF00",
+"} c #FFEF08",
+"< c #FFD224",
+"> c #FFC22D",
+", c #FFA631",
+". c #CA8E2D",
+"| c #9A6531",
+"@ c #616161",
+"~ c #FFFBF3",
+"' c #FFFFB6",
+"? c #EF9A2D",
+"0 c #B67939",
+"1 c #CE6900",
+"2 c #FFF3C2",
+"3 c #FF6500",
+"4 c #EF6500",
+"5 c #D76500",
+"6 c #CE6D0C",
+"7 c #CE6500",
+"8 c #FFCA96",
+"9 c #CE5908",
+"A c #A65524",
+"B c #BC0000",
+"C c #FF9ACA",
+"D c #DE0000",
+"E c #CE0000",
+"F c #AA0000",
+"G c #860000",
+"H c #650000",
+"I c #C679AE",
+"J c #CA319A",
+"K c #F3089A",
+"L c #F7019A",
+"M c #FB009A",
+"N c #E71096",
+"O c #CA2896",
+"P c #B22D92",
+"Q c #8C3182",
+"R c #653165",
+"S c #DB1C9A",
+"T c #F30896",
+"U c #DB1C96",
+"V c #C22896",
+"W c #A22D8E",
+"X c #9A319A",
+"Y c #9292BA",
+"Z c #0000AA",
+"a c #1C3DB6",
+"b c #203DAE",
+"c c #18248E",
+"d c #1C419A",
+"e c #2449B2",
+"f c #1C3DAE",
+"g c #00008A",
+"h c #414141",
+" !# ",
+" !#$% ",
+" #$&% ",
+" #/( %&#/( ",
+" ()!=//#+$*& ",
+" -[]{{}<>,.|@% ",
+" -~'{{}<>?0@&% ",
+" 123333456|&% ",
+" 783333349A|% ",
+" BCDDDDDEBFGH% ",
+" IJKLLMLNOPQR& ",
+" JSKKLTUVWQX@ ",
+" YZabccdefg@& ",
+" Yggh@&gg@&% ",
+" %&&% %&%% "};
diff --git a/icons/BSD.xpm b/icons/BSD.xpm
new file mode 100644
index 0000000..92963ec
--- /dev/null
+++ b/icons/BSD.xpm
@@ -0,0 +1,48 @@
+/* XPM */
+static char * BSD_xpm[] = {
+"16 15 30 1",
+" c None",
+"! c #A62420",
+"# c #612028",
+"$ c #792820",
+"% c #927175",
+"& c #592D31",
+"/ c #C28686",
+"( c #DFE7EF",
+") c #281820",
+"= c #82454D",
+"+ c #614141",
+"* c #616161",
+"- c #E3C2C2",
+"[ c #6D2024",
+"] c #A61410",
+"{ c #8E2418",
+"} c #000000",
+"< c #A26561",
+"> c #412431",
+", c #8A4949",
+". c #AE9A9A",
+"| c #49181C",
+"@ c #521C24",
+"~ c #6D2018",
+"' c #751C1C",
+"? c #351820",
+"0 c #796979",
+"1 c #392431",
+"2 c #9E9E9E",
+"3 c #181410",
+" ! # ",
+" ! !$$% %# ",
+" !$$!$&#!% ",
+" !//(!$#) ",
+" ) =#+*-![#% ",
+" ) )]{#}<!#> ",
+"! )),{{{{$)% ",
+" !)) .###)) ",
+" )]]||]@ ",
+" ]{)]~) ",
+" ))]')) ",
+" )))@) ",
+" ]@?)%]]]%",
+" ((01@})@]% )",
+" 1((2003 ))"};
diff --git a/icons/Bad.xpm b/icons/Bad.xpm
new file mode 100644
index 0000000..8f011b4
--- /dev/null
+++ b/icons/Bad.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char * Bad_xpm[] = {
+"16 15 2 1",
+". c None",
+"# c #000000",
+".##############.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".##############."};
diff --git a/icons/Battery.xpm b/icons/Battery.xpm
new file mode 100644
index 0000000..65c1c00
--- /dev/null
+++ b/icons/Battery.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * Battery2_xpm[] = {
+"16 15 48 1",
+". c #000000",
+"# c None",
+"a c #0F0F0F",
+"b c #171717",
+"c c #1D1D1D",
+"d c #202020",
+"e c #2C2C2C",
+"f c #303030",
+"g c #3C3C3C",
+"h c #404040",
+"i c #592714",
+"j c #606060",
+"k c #723118",
+"l c #803A1F",
+"m c #808080",
+"n c #8A8A8A",
+"o c #999999",
+"p c #A0A0A0",
+"q c #A34B28",
+"r c #A65231",
+"s c #A9A9A9",
+"t c #AD5533",
+"u c #AE694E",
+"v c #B68775",
+"w c #B7B7B7",
+"x c #C4633B",
+"y c #C2C2C2",
+"z c #C5907C",
+"A c #C66A45",
+"B c #C96037",
+"C c #C96941",
+"D c #D17953",
+"E c #D38465",
+"F c #D97046",
+"G c #DDDDDD",
+"H c #DE784D",
+"I c #DE855D",
+"J c #E18962",
+"K c #E88A5F",
+"L c #E88A60",
+"M c #EB936A",
+"N c #EFA483",
+"O c #EFA77D",
+"P c #F1B28E",
+"Q c #F3BD9F",
+"R c #F5C8AF",
+"S c #F7D3BF",
+"T c #FFFFFF",
+"#####yTGps######",
+"#####pwyom######",
+"###zENRNJDuv####",
+"###BFMSMHCrk####",
+"###BFLQLHxqk####",
+"###BFLPKHxqk####",
+"###BFLOKHxqk####",
+"###BFLOKHxqk####",
+"###tAIOKHxli####",
+"###dfhjhfda.####",
+"###dfhjhfda.####",
+"###dfhjhfda.####",
+"###dfhjhfda.####",
+"###ddfhfeca.####",
+"###ngedcbegn####"};
diff --git a/icons/CDROM.xpm b/icons/CDROM.xpm
new file mode 100644
index 0000000..053f3fc
--- /dev/null
+++ b/icons/CDROM.xpm
@@ -0,0 +1,125 @@
+/* XPM */
+static char * cd_rom2_xpm[] = {
+"16 15 107 2",
+".. c None",
+".# c #434831",
+".a c #434A16",
+".b c #45423D",
+".c c #444B2F",
+".d c #464B19",
+".e c #494D1C",
+".f c #4A4D23",
+".g c #495031",
+".h c #4A4F35",
+".i c #4B501E",
+".j c #4B5020",
+".k c #4B502B",
+".l c #4C463E",
+".m c #513834",
+".n c #514B43",
+".o c #525522",
+".p c #51622C",
+".q c #523637",
+".r c #554B38",
+".s c #565A25",
+".t c #565E29",
+".u c #57512E",
+".v c #595138",
+".w c #5C622C",
+".x c #5A4C34",
+".y c #5B5C26",
+".z c #5A6241",
+".A c #5A6E3B",
+".B c #5C5E29",
+".C c #5E6533",
+".D c #625647",
+".E c #636836",
+".F c #645D35",
+".G c #646238",
+".H c #666666",
+".I c #67682F",
+".J c #686868",
+".K c #696229",
+".L c #6A6B31",
+".M c #6B6B3C",
+".N c #747474",
+".O c #727237",
+".P c #747338",
+".Q c #756A4D",
+".R c #756B30",
+".S c #786D54",
+".T c #7B7546",
+".U c #7C7B3F",
+".V c #7F7458",
+".W c #82793B",
+".X c #847E70",
+".Y c #876E51",
+".Z c #898646",
+".0 c #8A8C47",
+".1 c #8E9149",
+".2 c #8F8F8F",
+".3 c #90866B",
+".4 c #908D4D",
+".5 c #928465",
+".6 c #938C81",
+".7 c #999999",
+".8 c #9C9C5B",
+".9 c #9B9B87",
+"#. c #9C8664",
+"## c #9C988C",
+"#a c #9FA055",
+"#b c #A08D7B",
+"#c c #A0A0A0",
+"#d c #A1A868",
+"#e c #A1CC9D",
+"#f c #A3975E",
+"#g c #A3B066",
+"#h c #A49C59",
+"#i c #A4C4A2",
+"#j c #A5A39E",
+"#k c #A5AB66",
+"#l c #A5AC59",
+"#m c #A6BE79",
+"#n c #A6C19F",
+"#o c #A78E64",
+"#p c #A7C0B9",
+"#q c #ABABAB",
+"#r c #AAB562",
+"#s c #B0AD61",
+"#t c #B3A276",
+"#u c #B3AA72",
+"#v c #B9B9B9",
+"#w c #BAA369",
+"#x c #BCB6A5",
+"#y c #BFB9AF",
+"#z c #C2C2C2",
+"#A c #C2C7A8",
+"#B c #C6B6A8",
+"#C c #C9C3B9",
+"#D c #CC8F7C",
+"#E c #CC9577",
+"#F c #CDCDCD",
+"#G c #D18C7C",
+"#H c #D2D2D2",
+"#I c #DDDDDD",
+"#J c #DE9E8E",
+"#K c #E4E4E4",
+"#L c #E799A0",
+"#M c #EAEAEA",
+"#N c #F0F0F0",
+"#O c #FEFEFE",
+"........#H#M#M#K#I#F#z..........",
+"......#N#y.V.G.a.G.S###v........",
+"....#O.3.e.a.a.a.d.e.s.5#q......",
+"..#N.3.w.j.d.a.a.d.i.L.1#u#c....",
+"#H#C.C.w.t.i.m.q.m.w.0#l#r.9#q..",
+"#M#b.M.E.C.h#v#F#H.z#g#m#e#p.2..",
+"#M#..T.T.p#v#O#I#O#H.A#i#n#A.N..",
+"#K.8.8#f.f#F#I#z#I#O.f#d#d#k.H..",
+"#I#J#D#G.u#H#O#I#O#H.f.Z.4#o.H..",
+"#F#L#E#w#h.C#H#O#H.k.y.R.W.Y.N..",
+"#z#B#s#a.Z.P.g.#.c.j.j.o.K.D.7..",
+"..#x#t.0.U.L.B.o.j.j.j.j.x.l....",
+"....#j.5.O.I.y.o.j.j.j.r.b......",
+".......6.X.Q.G.o.F.v.n.b........",
+"........#q.2.N.H.J.N.7.........."};
diff --git a/icons/COPYING b/icons/COPYING
new file mode 100644
index 0000000..ee0775e
--- /dev/null
+++ b/icons/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/icons/Card.xpm b/icons/Card.xpm
new file mode 100644
index 0000000..9bcb8fa
--- /dev/null
+++ b/icons/Card.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char * Card_xpm[] = {
+"16 15 21 1",
+" c None",
+"! c #004100",
+"# c #618261",
+"$ c #008200",
+"% c #006100",
+"& c #000000",
+"/ c #73A673",
+"( c #399239",
+") c #A6B6A6",
+"= c #419641",
+"+ c #414141",
+"* c #319231",
+"- c #4D9A4D",
+"[ c #FFFFFF",
+"] c #002000",
+"{ c #C2C2C2",
+"} c #65A265",
+"< c #D7D7D7",
+"> c #828282",
+", c #616161",
+". c #C6CA79",
+" ",
+" !# ",
+" !$%!# ",
+" !$&//%!# ",
+" !$&&&()=%!# ",
+" !$&&&&+*)-$[!# ",
+" ]$&&+${&}[<>! ",
+" !{+${&&[<&<, ",
+" !.,${&&[<&<, ",
+" !.,.,$$[<<<, ",
+" !.,.{[<&<, ",
+" !.][<&<, ",
+" ! [<<, ",
+" [<>, ",
+" > "};
diff --git a/icons/Database.xpm b/icons/Database.xpm
new file mode 100644
index 0000000..b401a9d
--- /dev/null
+++ b/icons/Database.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * Database_xpm[] = {
+"16 15 20 1",
+" c None",
+"! c #8EBCDF",
+"# c #75BEEF",
+"$ c #5DBEFF",
+"% c #289AF7",
+"& c #0C3D82",
+"/ c #39AAFB",
+"( c #55BAFF",
+") c #49A6EF",
+"= c #358AD2",
+"+ c #0C4596",
+"* c #4DB6FF",
+"- c #188AEF",
+"[ c #0C71D7",
+"] c #0C61BE",
+"{ c #0C51AA",
+"} c #51AAFB",
+"< c #59B6FF",
+"> c #3979BE",
+", c #658AB6",
+" !#$$$$$#! ",
+" $$$$$$$$$$$ ",
+" $$$$$$$$$$$$$ ",
+" %$$$$$$$$$$$& ",
+" %/($$$$$$)=+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" %/*$*/%-[]{+& ",
+" }<$*/%-[]{+ ",
+" !#*/%-[>, "};
diff --git a/icons/Directory.xpm b/icons/Directory.xpm
new file mode 100644
index 0000000..3f073c0
--- /dev/null
+++ b/icons/Directory.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * Directory_xpm[] = {
+"16 15 12 1",
+" c None",
+"! c #B68E4D",
+"# c #9E7D4D",
+"$ c #654D18",
+"% c #968A71",
+"& c #92866D",
+"/ c #CA9E5D",
+"( c #9A7124",
+") c #D7AE79",
+"= c #B28E59",
+"+ c #695120",
+"* c #FFCE9A",
+" ",
+" !##$% & ",
+" $/(!)#$&=+& ",
+" $**/(!))))#$ ",
+" $****/(!)))$ ",
+" $******/(!)($ ",
+" $********/(($ ",
+" $*********$($ ",
+" $*********$($ ",
+" $*********$($ ",
+" &$=*******$($ ",
+" &$=*****$($ ",
+" &$=***$($ ",
+" &$=*$($ ",
+" &$$$ "};
diff --git a/icons/Directory2.xpm b/icons/Directory2.xpm
new file mode 100644
index 0000000..6c52121
--- /dev/null
+++ b/icons/Directory2.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char * Directory2_xpm[] = {
+"16 15 32 1",
+" c None",
+"! c #7D7D65",
+"# c #9E9E92",
+"$ c #654D18",
+"% c #92866D",
+"& c #9A7124",
+"/ c #AE9A71",
+"( c #BEBEA6",
+") c #7D6941",
+"= c #D7AE79",
+"+ c #B28E59",
+"* c #695120",
+"- c #CA9E5D",
+"[ c #FFFFCA",
+"] c #FFFFE7",
+"{ c #AA966D",
+"} c #FFCE9A",
+"< c #CAB686",
+"> c #BA9661",
+", c #AAA296",
+". c #8A6D39",
+"| c #9E7D49",
+"@ c #79795D",
+"~ c #826531",
+"' c #DFDFC6",
+"? c #797559",
+"0 c #756D49",
+"1 c #9E9E86",
+"2 c #71653D",
+"3 c #6D5D31",
+"4 c #716941",
+"5 c #8E7951",
+" !# $% % ",
+"&/ !(!)=+$%+*% ",
+"$-&/[](!{=+==+* ",
+")=}-&<[](!{===* ",
+"%+}}}-&<[](!{=>*",
+",.}}}}}-&<[](!|)",
+" $}}}}}}}-&<]@~%",
+" )=}}}}}}}}&'?* ",
+" %+}}}}}}}}&(0) ",
+" ,.}}}}}}}}&12% ",
+" $+}}}}}}}&!3 ",
+" %$+}}}}}&4) ",
+" %$+}}}&3% ",
+" %$+}&* ",
+" %$$5 "};
diff --git a/icons/Document.xpm b/icons/Document.xpm
new file mode 100644
index 0000000..344b75a
--- /dev/null
+++ b/icons/Document.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * Document_xpm[] = {
+"16 15 10 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #202020",
+"/ c #C2C2C2",
+"( c #A2A2A2",
+") c #828282",
+"= c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$!!!& ",
+" !$$$$$$$$$!$/# ",
+" !$$$$$$$$()/#( ",
+" !$$$$$$=/!/#) ",
+" #%%%%%%%%&#( "};
diff --git a/icons/EggTimer.xpm b/icons/EggTimer.xpm
new file mode 100644
index 0000000..27f38b3
--- /dev/null
+++ b/icons/EggTimer.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * EggTimer2_xpm[] = {
+"16 15 25 1",
+". c #010101",
+"# c None",
+"a c #1E1E1E",
+"b c #252525",
+"c c #373737",
+"d c #4F4F4F",
+"e c #5D5D5D",
+"f c #626262",
+"g c #818181",
+"h c #8C8C8C",
+"i c #919191",
+"j c #9A9A9A",
+"k c #A0A0A0",
+"l c #ABABAB",
+"m c #BABABA",
+"n c #C1C1C1",
+"o c #CACACA",
+"p c #D4D4D4",
+"q c #DBDBDB",
+"r c #E2E2E2",
+"s c #ECECEC",
+"t c #F5F5F5",
+"u c #F37B7B",
+"v c #FAFAFA",
+"w c #FF1F1F",
+"######kkk#######",
+"#####kqspk######",
+"####kttsssk#####",
+"###kqvvvtsng####",
+"###kvvvvtssk####",
+"##hovvvvtssmg###",
+"##krvvtwtsqnd###",
+"##kvvvtutsqnc###",
+"##knkiigeeebb###",
+"##kvkvivereka###",
+"##kpkvkrinei.###",
+"##hiqqpnmlifa###",
+"###gkkllkjk.####",
+"####.fikif.#####",
+"#####a...a######"};
diff --git a/icons/ExcelCalcXLS.xpm b/icons/ExcelCalcXLS.xpm
new file mode 100644
index 0000000..1bd5e28
--- /dev/null
+++ b/icons/ExcelCalcXLS.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char * ExcelCalcXLS_xpm[] = {
+"16 15 36 2",
+".. c #000000",
+".# c None",
+".a c #002020",
+".b c #004040",
+".c c #006060",
+".d c #107F80",
+".e c #222222",
+".f c #209FA0",
+".g c #2B2B2B",
+".h c #2E5E5E",
+".i c #343434",
+".j c #404040",
+".k c #40BEC0",
+".l c #575757",
+".m c #585858",
+".n c #616161",
+".o c #6A6A6A",
+".p c #777777",
+".q c #78C6C8",
+".r c #818181",
+".s c #8A8A8A",
+".t c #919191",
+".u c #989898",
+".v c #A0A0A0",
+".w c #ACACAC",
+".x c #B0CFD0",
+".y c #B4B4B4",
+".z c #BBBBBB",
+".A c #C0C0C0",
+".B c #CACACA",
+".C c #D6D6D6",
+".D c #DEDEDE",
+".E c #E4E4E4",
+".F c #EAEAEA",
+".G c #F5F5F5",
+".H c #FEFEFE",
+".H.H.H.C.H.H.H.C.H.H.H.C.H.H.H.o",
+".H.A.A.o.H.A.A.o.H.A.A.o.H.A.A..",
+".v.o.o.i.o.i.i.i.o.i.i.i.o.i.i..",
+".H.H.H.o.H.H.H.A.H.H.H.A.H.H.H..",
+".H.A.h.b.a.E.F.b.b.a.E.z.H.H.H..",
+".v.o.b.x.x...b.f.d...u.y.z.A.A..",
+".H.H.F.b.k.q...c...v.z.w.H.H.H..",
+".H.A.y.g.b.k.q...b.b.a.v.G.H.H..",
+".v.o.o.b.f.b.k.q...c...t.t.A.A..",
+".H.H.b.d.c.c.b.k.q...u.t.F.H.H..",
+".H.A.a.........b.k.q...t.m.n.n.e",
+".v.o.n.g.s.r.r.r.b...e.t.l.H.A.j",
+".H.H.G.n.E.D.D.v.B.z.z.r.p.A.j.v",
+".H.A.z.i.H.G.G.z.F.B.w.m.z.j.r.#",
+".i.....................e.j.v.#.#"};
diff --git a/icons/Executable.xpm b/icons/Executable.xpm
new file mode 100644
index 0000000..75a3d70
--- /dev/null
+++ b/icons/Executable.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * Executable_xpm[] = {
+"16 15 9 1",
+" c None",
+"! c #BED7D7",
+"# c #3D8486",
+"$ c #3D6D6D",
+"% c #7DAEAE",
+"& c #002D31",
+"/ c #005959",
+"( c #2D7175",
+") c #004145",
+" ",
+" ",
+" ",
+" !# ",
+" !$ %& !# ",
+" #/$%&%/& ",
+" #/()/& ",
+" !%%(//(%%# ",
+" #&&)//)&&& ",
+" %/()/) ",
+" !/&%&#/) ",
+" #& %& #& ",
+" #& ",
+" ",
+" "};
diff --git a/icons/FIFO.xpm b/icons/FIFO.xpm
new file mode 100644
index 0000000..d7d3662
--- /dev/null
+++ b/icons/FIFO.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * FIFO2_xpm[] = {
+"16 15 17 1",
+". c None",
+"# c #1F120B",
+"a c #55301C",
+"b c #5F2405",
+"c c #672C0D",
+"d c #703E23",
+"e c #723718",
+"f c #7D4528",
+"g c #8C5132",
+"h c #975C3D",
+"i c #AC7152",
+"j c #B97E5F",
+"k c #BC8163",
+"l c #CD9275",
+"m c #D4997A",
+"n c #E3A889",
+"o c #FFCDB3",
+"................",
+"................",
+"................",
+"................",
+"..nmh......nmh..",
+"llonijlllllonijl",
+"nnnlhknnnnnnlhkn",
+"iilhegiiiiilhegi",
+"ffheadfffffheadf",
+"##cb#######cb###",
+"..a##......a##..",
+"................",
+"................",
+"................",
+"................"};
diff --git a/icons/Floppy.xpm b/icons/Floppy.xpm
new file mode 100644
index 0000000..0b232f6
--- /dev/null
+++ b/icons/Floppy.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * Floppy_xpm[] = {
+"16 15 20 1",
+" c None",
+"! c #8A969A",
+"# c #516D75",
+"$ c #75797D",
+"% c #759EAA",
+"& c #EBF3F3",
+"/ c #283539",
+"( c #FFFFFF",
+") c #BACED2",
+"= c #96B2BA",
+"+ c #65868E",
+"* c #B6CACE",
+"- c #F3F3F3",
+"[ c #EFEFEF",
+"] c #DFDFDF",
+"{ c #AABEC2",
+"} c #55696D",
+"< c #B6B6B6",
+"> c #5D5D5D",
+", c #354549",
+" !##$ ",
+" !#%&%/ ",
+" !#%&&()%$ ",
+" !#%&&((((%/ ",
+"#%&&(((((()%$ ",
+"%)(((((((((%/ ",
+"#=((((((()%+%$ ",
+"!%)(((()%%##%/ ",
+" #=(()%%*-%++%$ ",
+" !%)%%*-[]{%#%/ ",
+" #=%-[}]]]%#/$ ",
+" !%%{[{]<>/$ ",
+" #=%-]>/$ ",
+" !#,>/$ ",
+" #/$ "};
diff --git a/icons/Font.xpm b/icons/Font.xpm
new file mode 100644
index 0000000..b908c6b
--- /dev/null
+++ b/icons/Font.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * Font_xpm[] = {
+"16 15 48 1",
+"R c #5B5B5B",
+". c None",
+"y c #AB6A2B",
+"3 c #926D45",
+"F c #6D6D6D",
+"e c #C68649",
+"l c #352D18",
+"j c #2D2814",
+"w c #BA9269",
+"m c #BC7531",
+"p c #865924",
+"q c #945B24",
+"i c #734920",
+"S c #92714D",
+"V c #828282",
+"Y c #A68661",
+"5 c #A46528",
+"z c #312D14",
+"K c #A2A2A2",
+"A c #614D39",
+"D c #6D695D",
+"o c #54351C",
+"v c #8E5920",
+"8 c #CA7D35",
+"h c #9E6128",
+"9 c #9C7B5B",
+"7 c #616161",
+"P c #B6712D",
+"Z c #835120",
+"a c #8A5520",
+"I c #443418",
+"T c #8E6541",
+"E c #CA8235",
+"n c #C47A31",
+"U c #9C6124",
+"X c #B28A65",
+"N c #795120",
+"1 c #B26D2D",
+"b c #8E8E8E",
+"g c #55411C",
+"G c #5A411C",
+"H c #393118",
+"C c #65513D",
+"r c #4D3920",
+"O c #BE7931",
+"u c #CA863D",
+"W c #695945",
+"B c #555555",
+"................",
+".......uu.......",
+".......8Eg......",
+"......nennD.....",
+"......mjmOl.....",
+".....wPzPmp.....",
+".....yGW.11DKKK.",
+".....yH..yyGVVVK",
+"....5ZW..X557FVK",
+"....UUUUUhhhI7FK",
+"...YqrIIIIqqN77K",
+"...vGW.R777qq77.",
+"..9Zib7F...aaiR.",
+".9ZZZTB...3ZZZS.",
+"..CoooZ....AoooF"};
diff --git a/icons/GNUstep.xpm b/icons/GNUstep.xpm
new file mode 100644
index 0000000..7d977f9
--- /dev/null
+++ b/icons/GNUstep.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char * app2_xpm[] = {
+"16 15 28 1",
+"N c None",
+". c #000000",
+"# c #080808",
+"a c #101010",
+"b c #202020",
+"c c #2C2C2C",
+"d c #313131",
+"e c #404040",
+"f c #494949",
+"g c #505050",
+"h c #5C5C5C",
+"i c #606060",
+"j c #6D6D6D",
+"k c #707070",
+"l c #7B7B7B",
+"m c #808080",
+"n c #8B8B8B",
+"o c #919191",
+"p c #9B9B9B",
+"q c #A1A1A1",
+"r c #ABABAB",
+"s c #BEBEBE",
+"t c #D1D1D1",
+"u c #DDDDDD",
+"v c #E4E4E4",
+"w c #EDEDED",
+"x c #F7F7F7",
+"y c #FFFFFF",
+"NNNNNmigeimNNNNN",
+"NNNpkigeda..beeN",
+"NNpkigedb.yyy..N",
+"Npkigedba.yxwv.N",
+"Nkigedba#.ywvtgN",
+"migedba#..yvtskN",
+"igeda.....ytsrnN",
+"gedb.yyyyyvsrplN",
+"edba.yxwvtsrqnjN",
+"iba#.ywvtsrqolfN",
+"ma#..yvtsrqolhcN",
+"N....ytsrqolid.N",
+"iewyyvsrqolie..N",
+"eb.utsrpnlhd...N",
+"b..gjonljfc....N"};
diff --git a/icons/Ghost.xpm b/icons/Ghost.xpm
new file mode 100644
index 0000000..3c562f9
--- /dev/null
+++ b/icons/Ghost.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * Ghost2_xpm[] = {
+"16 15 9 1",
+". c #000000",
+"# c None",
+"a c #202020",
+"b c #404040",
+"c c #606060",
+"d c #C0C0C0",
+"e c #DFDFDF",
+"f c #F3F3F3",
+"g c #FEFEFE",
+"#####cbbc#######",
+"####begge.######",
+"###ceggggdb#####",
+"###bgggggd.#####",
+"##bbg.gg.d..b###",
+"#cgegbggbebgdb##",
+"#bggggggggggd.##",
+"##.ggggggggd.###",
+"###bggggggdb####",
+"###cgggggfd.####",
+"###bgegggeeb####",
+"##befeggfege.###",
+"#cggdbgedbgedb##",
+"##a..a#b..#b.###",
+"################"};
diff --git a/icons/GnomeCalc.xpm b/icons/GnomeCalc.xpm
new file mode 100644
index 0000000..7b9bc78
--- /dev/null
+++ b/icons/GnomeCalc.xpm
@@ -0,0 +1,109 @@
+/* XPM */
+static char * GnomeCalc_xpm[] = {
+"16 15 91 2",
+".. c #000000",
+".# c None",
+".a c #0E0805",
+".b c #0F0505",
+".c c #120A08",
+".d c #12100A",
+".e c #140C07",
+".f c #1B1916",
+".g c #1D1D1D",
+".h c #222222",
+".i c #23211C",
+".j c #241F19",
+".k c #282D23",
+".l c #2B2624",
+".m c #2D241E",
+".n c #2E2E2E",
+".o c #343434",
+".p c #352E26",
+".q c #35312E",
+".r c #362828",
+".s c #371B15",
+".t c #3B3B3B",
+".u c #3B3530",
+".v c #3F392D",
+".w c #414141",
+".x c #442E2E",
+".y c #453F2F",
+".z c #4B4B4B",
+".A c #4A4641",
+".B c #4D3A34",
+".C c #514C42",
+".D c #525252",
+".E c #5B5B5B",
+".F c #5B574E",
+".G c #5C4C3D",
+".H c #605246",
+".I c #605D52",
+".J c #616161",
+".K c #635B5B",
+".L c #6A6A6A",
+".M c #6F605A",
+".N c #716B5E",
+".O c #74665F",
+".P c #747474",
+".Q c #756D6D",
+".R c #787267",
+".S c #7B5B56",
+".T c #7E7B7B",
+".U c #7E7471",
+".V c #848484",
+".W c #8C8C8C",
+".X c #918580",
+".Y c #918C8B",
+".Z c #928378",
+".0 c #938A7F",
+".1 c #958677",
+".2 c #97928A",
+".3 c #9A8D8C",
+".4 c #9B9B9B",
+".5 c #9C807C",
+".6 c #9D8D84",
+".7 c #9E9184",
+".8 c #9E9494",
+".9 c #A1928B",
+"#. c #A1A1A1",
+"## c #A18D88",
+"#a c #AB9F94",
+"#b c #ACA19C",
+"#c c #ACACAC",
+"#d c #B0A194",
+"#e c #B3B3B3",
+"#f c #B2A89D",
+"#g c #B4ADA5",
+"#h c #B5A7A1",
+"#i c #BCBCBC",
+"#j c #B9AEA9",
+"#k c #BDB3AB",
+"#l c #C0C0C0",
+"#m c #CBCBCB",
+"#n c #CEC9C1",
+"#o c #D4D4D4",
+"#p c #D7CDCB",
+"#q c #D9D3D0",
+"#r c #DCDCDC",
+"#s c #DFDCD5",
+"#t c #E3E3E3",
+"#u c #E2DBD4",
+"#v c #E7DDDC",
+"#w c #EFEFEF",
+"#x c #F2F2F2",
+"#y c #FEFEFE",
+"#y#y#y#o#y#y#y#o#y#y#y#o#y#y#y.L",
+"#y#i#e.E#m.W.V.z#r#e#i.L#y#l#l..",
+"#..J.E.h.9.l#v.H.z.n.o.o.L.o.o..",
+"#y#t#c.2#b.M#j.u.K#m#w#i#y#y#y..",
+"#y.4.8.U.u.d.B.d.K#i#t#i#y#y#y..",
+"#..z#g.I.l.Y#q#a.N.T#.#i#i#l#l..",
+"#y#e.X.m.3#s#f.0.p.Q#o#e#y#y#y..",
+"#y.V#k.y#u#h.6.O.e.T#i#.#x#y#y..",
+"#..D.k.c#n.9.C.c.r.E.L.V.W#l#l..",
+"#y#t#e.n#k.7.f.q.D#q##.x#l#y#y..",
+"#y#e.4.g.5.7.v.A.t#d.C.c.w.J.J.h",
+"#..L.E.h.S.Z.1#a#p#k.i.c.z#y#l.w",
+"#y#y#w.D.W.G.R.6.7.F.b.J.L#l.w#.",
+"#y#l#i.o#l.W.s.j.i.a.P.z#e.w.V.#",
+".o.....................g.t#..#.#"};
diff --git a/icons/GnomeWord.xpm b/icons/GnomeWord.xpm
new file mode 100644
index 0000000..94692e3
--- /dev/null
+++ b/icons/GnomeWord.xpm
@@ -0,0 +1,93 @@
+/* XPM */
+static char * GnomeWord_xpm[] = {
+"16 15 75 2",
+".. c #000000",
+".# c #0D0704",
+".a c #100B08",
+".b c #13120C",
+".c c #130B06",
+".d c #1A1815",
+".e c #1A1A1A",
+".f c #202020",
+".g c #231E18",
+".h c #25201B",
+".i c #342D25",
+".j c #39332D",
+".k c #3E382C",
+".l c #404040",
+".m c #422822",
+".n c #503D37",
+".o c #514944",
+".p c #544D3E",
+".q c #5A564D",
+".r c #5F5C51",
+".s c #606060",
+".t c #615143",
+".u c #61665D",
+".v c #625549",
+".w c #635A59",
+".x c #665252",
+".y c #6F605A",
+".z c #706B69",
+".A c #73655E",
+".B c #777166",
+".C c #797573",
+".D c #808080",
+".E c #8A8681",
+".F c #8D8D8D",
+".G c #928376",
+".H c #92897E",
+".I c #938A8A",
+".J c #938D81",
+".K c #949090",
+".L c #9C8D83",
+".M c #9B9797",
+".N c #9E827D",
+".O c #9E9183",
+".P c #A08C87",
+".Q c #A2928C",
+".R c #A0A0A0",
+".S c #A49D9A",
+".T c #A79E91",
+".U c #AAA6A6",
+".V c #ADADAD",
+".W c #ABA09B",
+".X c #AFA093",
+".Y c #B2A59B",
+".Z c #B4A6A0",
+".0 c #B5AAA8",
+".1 c #B8ADA8",
+".2 c #BCB2AA",
+".3 c #C2C2C2",
+".4 c #CACACA",
+".5 c #CCC7C6",
+".6 c #CEC9C1",
+".7 c #D3D3D3",
+".8 c #D4C7C1",
+".9 c #D5CDCC",
+"#. c #DADADA",
+"## c #DAD2CE",
+"#a c #DEDBD4",
+"#b c #E3E3E3",
+"#c c #E2E0DB",
+"#d c #E3DCD5",
+"#e c #E6DCDB",
+"#f c #EBEBEB",
+"#g c #F2F2F2",
+"#h c #FCFCFC",
+"#i c None",
+"#i.s.s.s.s.s.s.s.s.s.s.s.s.s.l#i",
+"#i.s#h#h#f#..7.3.4#f#h#h#h#h..#i",
+"#i.s#h#f.3.8.M#e.v.3#f#h#h#h..#i",
+"#i.s#g.3.6.W.y.1.j.I#b#h#h#h..#i",
+"#i.s#b.9.0.j.b.n.b.K.7#g#h#h..#i",
+"#i.s.7##.r.z.5#c.Y.J.3#f#h#h..#i",
+"#i.s.4.1.j.0#a.Y.H.i.S#b#h#h..#i",
+"#i.s.3.2.p#d.Z.L.A.c.U#.#f#h..#i",
+"#i.s.7.u.h.6.Q.o.a.w.F.V.4#f..#i",
+"#i.s#f.4.F.2.O.d.C.S##.P.x#...#i",
+"#i.s#h#b.V.N.O.k.E.Q.X.s.s.s.f#i",
+"#i.s#h#g.4.Q.G.G.T.9.2.s#h.3.l#i",
+"#i.s#h#h#b.V.t.B.L.L.q.D.3.l.R#i",
+"#i.s#h#h#g#..U.m.g.h.#.3.l.D#i#i",
+"#i.l.................e.l.R..#i#i"};
diff --git a/icons/Harddrive.xpm b/icons/Harddrive.xpm
new file mode 100644
index 0000000..9c5468b
--- /dev/null
+++ b/icons/Harddrive.xpm
@@ -0,0 +1,86 @@
+/* XPM */
+static char * Harddrive2_xpm[] = {
+"16 15 68 2",
+" c None",
+".. c #000000",
+".# c #3F2C3F",
+".a c #5F515F",
+".b c #7D646C",
+".c c #808080",
+".d c #A77B7B",
+".e c #A88576",
+".f c #A99690",
+".g c #AD6D5F",
+".h c #AD9574",
+".i c #AE7B5C",
+".j c #AE9E8B",
+".k c #B07D5E",
+".l c #B488A4",
+".m c #C7C7C7",
+".n c #CEBEC3",
+".o c #D0CCCA",
+".p c #D189B3",
+".q c #D298C9",
+".r c #D59FC7",
+".s c #D5A1C7",
+".t c #D99E96",
+".u c #D9AAC6",
+".v c #DCB1C6",
+".w c #DDB99B",
+".x c #DEC9B4",
+".y c #DFB8C6",
+".z c #DFDFDF",
+".A c #E0BAC6",
+".B c #E19178",
+".C c #E2BFC8",
+".D c #E2D2D5",
+".E c #E4C6CB",
+".F c #E5B673",
+".G c #E5C889",
+".H c #E77917",
+".I c #EA8D54",
+".J c #EBAB97",
+".K c #ECA495",
+".L c #ECAF99",
+".M c #ECB195",
+".N c #EDA68E",
+".O c #EDB798",
+".P c #EDBC99",
+".Q c #EDC39D",
+".R c #EECCA3",
+".S c #EDCEAC",
+".T c #EED3AF",
+".U c #EEE0E0",
+".V c #EFD8B3",
+".W c #F0A17F",
+".X c #F0DBB5",
+".Y c #F2D38D",
+".Z c #F3AC74",
+".0 c #F4A072",
+".1 c #F3A551",
+".2 c #F3DB95",
+".3 c #F4BB6A",
+".4 c #F4BC78",
+".5 c #F5CC81",
+".6 c #F4DC8F",
+".7 c #F4E0A2",
+".8 c #F4E29F",
+".9 c #F4E7B3",
+"#. c #F8EEDB",
+"## c #F9DCC2",
+"#a c #FEFEFD",
+" ",
+" ",
+".a.#.#.#.#.#.#.#.#.#.#.#.#.#.a..",
+".U.D.y.........f.x.S.w.e...#.#..",
+".D.E.v.......X.V.T.R.Q.O.M...#..",
+".D.E.v.....h#.#a.R.Q.P.M.L.d.#..",
+".D.E.v...c#a.z.k###a##.M.J.t....",
+".D.E.v#a.z.m.k.Y#a.o#a.I.N.K....",
+".D.C.A.q.m.k.6.Y###a.H.I.W.B....",
+".D.v.v.u.p.j.8.2.Y.3.1.Z.0.g....",
+".n.v.u.s.b...9.7.Y.5.4.Z.0.#.#..",
+".#.l.r.q.b.....j.G.5.F.i...#.#..",
+".a.#.b.b.b.#.#.#.........#.#.a..",
+"................................",
+" "};
diff --git a/icons/Image.xpm b/icons/Image.xpm
new file mode 100644
index 0000000..cdd7f5d
--- /dev/null
+++ b/icons/Image.xpm
@@ -0,0 +1,67 @@
+/* XPM */
+static char * Image2_xpm[] = {
+"16 15 49 2",
+".. c #000010",
+".# c None",
+".a c #0F0600",
+".b c #130800",
+".c c #1C0B00",
+".d c #222232",
+".e c #334455",
+".f c #381700",
+".g c #3F3F4F",
+".h c #441100",
+".i c #555565",
+".j c #582400",
+".k c #652900",
+".l c #7799AA",
+".m c #7B3607",
+".n c #8C4718",
+".o c #99AACC",
+".p c #9B5627",
+".q c #A15E2F",
+".r c #A7A7B7",
+".s c #AB6738",
+".t c #AD6A3E",
+".u c #B37043",
+".v c #B9774B",
+".w c #BC784A",
+".x c #BE7D50",
+".y c #CCCCEE",
+".z c #CDBAAD",
+".A c #D08B5C",
+".B c #D5966B",
+".C c #D9CBC1",
+".D c #DA9566",
+".E c #DC9A6E",
+".F c #E2A479",
+".G c #E6C2AA",
+".H c #EBAC81",
+".I c #EAC3A8",
+".J c #EBA677",
+".K c #EBC2A6",
+".L c #ECA778",
+".M c #EDB086",
+".N c #F2B184",
+".O c #F0F0FF",
+".P c #F3B58C",
+".Q c #F2C2A2",
+".R c #F5F0F0",
+".S c #FEC39A",
+".T c #FFE0D5",
+".U c #FFE2CE",
+".S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S",
+".S.F.B.w.u.u.t.q.s.w.v.x.F.P.S.S",
+".S.S.S.S.S.S.S.S.P.M.B.B.v.q.w.H",
+".S.P.J.J.L.L.J.J.J.J.P.P.S.S.S.S",
+".A.p.k.f.f.f.k.m.n.s.A.J.H.P.S.S",
+".J.s.b.a.b.b.c.c.f.j.m.s.A.E.P.S",
+".K.S.w.b.j.z.C.y.O.l.d.h.j.p.J.N",
+".#.Q.S.m.m.C.R.i.......g.n.j.n.J",
+".#.K.S.A.n.D.R.g.d...d.g.R.s.j.A",
+".#.#.Q.S.J.D.T.o.d.e.e.r.R.J.w.J",
+".#.#.G.S.S.J.N.U.U.R.R.R.J.J.P.S",
+".#.#.#.I.S.S.S.J.A.w.s.w.J.P.S.S",
+".#.#.#.#.K.S.S.S.S.S.S.S.S.S.S.#",
+".#.#.#.#.#.#.Q.S.S.S.S.S.S.#.#.#",
+".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#"};
diff --git a/icons/Internet.xpm b/icons/Internet.xpm
new file mode 100644
index 0000000..790f935
--- /dev/null
+++ b/icons/Internet.xpm
@@ -0,0 +1,135 @@
+/* XPM */
+static char * Internet2_xpm[] = {
+"16 15 117 2",
+".. c None",
+".# c #203B5C",
+".a c #203B53",
+".b c #203C62",
+".c c #21426C",
+".d c #223A4D",
+".e c #244060",
+".f c #23445F",
+".g c #274F76",
+".h c #285077",
+".i c #2C3F4D",
+".j c #335D8C",
+".k c #345F91",
+".l c #36608E",
+".m c #37669A",
+".n c #376983",
+".o c #3C728E",
+".p c #41556A",
+".q c #416EA3",
+".r c #4173AB",
+".s c #424D4C",
+".t c #426B9C",
+".u c #4480A0",
+".v c #467DB5",
+".w c #487AAB",
+".x c #4C82B6",
+".y c #4F616A",
+".z c #51647A",
+".A c #5184AE",
+".B c #546576",
+".C c #576162",
+".D c #5B5E4D",
+".E c #5F7189",
+".F c #617780",
+".G c #617B95",
+".H c #6589B2",
+".I c #668EA3",
+".J c #6896B6",
+".K c #6C7974",
+".L c #6D96C1",
+".M c #6E705B",
+".N c #6F95BC",
+".O c #6F98BF",
+".P c #749CB2",
+".Q c #7C795A",
+".R c #7C96A2",
+".S c #7D8893",
+".T c #7D8D70",
+".U c #7D989D",
+".V c #808080",
+".W c #808A8A",
+".X c #84908D",
+".Y c #85949B",
+".Z c #869069",
+".0 c #8695A1",
+".1 c #889CA6",
+".2 c #88A1BD",
+".3 c #8BA7C7",
+".4 c #8F8B70",
+".5 c #8F9E8E",
+".6 c #96A17F",
+".7 c #96A7B0",
+".8 c #9BACAD",
+".9 c #9BB0B6",
+"#. c #9E9161",
+"## c #A29B73",
+"#a c #A0A2A1",
+"#b c #A2BC9B",
+"#c c #A4B8C1",
+"#d c #A5AF9A",
+"#e c #A7A483",
+"#f c #A7C098",
+"#g c #A8B1A8",
+"#h c #ABABAB",
+"#i c #AEAC80",
+"#j c #AFB791",
+"#k c #B2A685",
+"#l c #B2B192",
+"#m c #B2B69F",
+"#n c #B2BFCA",
+"#o c #B3AE86",
+"#p c #B5A579",
+"#q c #B7B48C",
+"#r c #B7B7B7",
+"#s c #B8BB9B",
+"#t c #BAAF80",
+"#u c #BCB090",
+"#v c #BCB27C",
+"#w c #BCBCBC",
+"#x c #C2B48A",
+"#y c #C2C2C2",
+"#z c #C2C9AC",
+"#A c #C5B485",
+"#B c #C5BC91",
+"#C c #C8CA9B",
+"#D c #CAD3C6",
+"#E c #CEDCD8",
+"#F c #D0B887",
+"#G c #D3C8A2",
+"#H c #D4D2A4",
+"#I c #DCC995",
+"#J c #DDDDDD",
+"#K c #DFC594",
+"#L c #DFCE9B",
+"#M c #E2E2E2",
+"#N c #E1CF9B",
+"#O c #E7E8BA",
+"#P c #EBEBEB",
+"#Q c #EEE5A7",
+"#R c #F1E8A9",
+"#S c #F4F4F4",
+"#T c #F5F4D3",
+"#U c #F6F7DD",
+"#V c #FCFCFC",
+"#W c #FEFCDB",
+"#X c #FDFBD3",
+"#Y c #FFFCE1",
+"........#c.R.R.Y.T.8............",
+".......L.7.U.5.6.T.Z.X..........",
+".....O#D#Y#T.9#a#u#B#v.4........",
+"...N#E#Y#W#W#X#U#H#R#t#..W......",
+".3.x#z#O#T#W#X#X#s#Q#o.Q.M.Y....",
+".H.x.J.P#b#f#C#N#x#l.K.i.D.B....",
+".H.v.x.A#d#j#q#x#F#e.f.d.s.B....",
+".H.r.w.w#g#K#A#p#V#V#S#S#P#M#M#J",
+".H.m.q.t#G#L#i###V.n.n.n.n.n.o#h",
+".2.j.k.l#m#I##.y#V.n.1#h.1.I.u#h",
+"...G.g.h.F#k.C.e#V.n.1.1.1.I.u#h",
+".....p.e.c.c.b.##S.o.I.I.I.I.u#a",
+".......E.e.#.b.a#J#y#w#r#h#h#h#a",
+".........0.z.z.B.S#n#a.V.V#a....",
+"..................#J#J#J#J#J.V.."};
diff --git a/icons/KDECalc.xpm b/icons/KDECalc.xpm
new file mode 100644
index 0000000..e500a67
--- /dev/null
+++ b/icons/KDECalc.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char * KDECalc_xpm[] = {
+"16 15 28 1",
+". c #000000",
+"# c None",
+"a c #0A0A0A",
+"b c #1C1C1C",
+"c c #222222",
+"d c #2B2B2B",
+"e c #333333",
+"f c #414141",
+"g c #4B4B4B",
+"h c #535353",
+"i c #5B5B5B",
+"j c #606060",
+"k c #6B6B6B",
+"l c #757575",
+"m c #7D7D7D",
+"n c #828282",
+"o c #8A8A8A",
+"p c #919191",
+"q c #9C9C9C",
+"r c #A1A1A1",
+"s c #AAAAAA",
+"t c #B2B2B2",
+"u c #BABABA",
+"v c #C0C0C0",
+"w c #D5D5D5",
+"x c #DEDEDE",
+"y c #EBEBEB",
+"z c #FFFFFF",
+"zywruuuqvwywzzzk",
+"zrmekhhdlmrkzvv.",
+"rheszaazzbdekee.",
+"ztjzzaszhkuvzzz.",
+"znfzzhzsdluvzzz.",
+"rgczzzzadipvvvv.",
+"ztizzhzsdluvzzz.",
+"zogzzaszhkuvzzz.",
+"rhezsbbzzipvvvv.",
+"zwrekkkglrwvzzz.",
+"ztrduuuovwyvjjjc",
+"rkkevvvvvvvvjzvf",
+"zzzkzzzvzzzrnvfr",
+"zvvezzzvzxvjvfn#",
+"e..........cfr##"};
diff --git a/icons/KDEWord.xpm b/icons/KDEWord.xpm
new file mode 100644
index 0000000..60caca2
--- /dev/null
+++ b/icons/KDEWord.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char * KDEWord_xpm[] = {
+"16 15 26 1",
+". c #000000",
+"# c #141414",
+"a c #1D1D1D",
+"b c #202020",
+"c c #3D3D3D",
+"d c #404040",
+"e c #484848",
+"f c #565656",
+"g c #5A5A5A",
+"h c #606060",
+"i c #737373",
+"j c #797979",
+"k c #848484",
+"l c #8C8C8C",
+"m c #999999",
+"n c #A0A0A0",
+"o c #AAAAAA",
+"p c #C1C1C1",
+"q c #C9C9C9",
+"r c #D5D5D5",
+"s c #DADADA",
+"t c #E5E5E5",
+"u c #E8E8E8",
+"v c #F6F6F6",
+"w c None",
+"x c #FFFFFF",
+"whhhhhhhhhhhhhdw",
+"whvurrssrruvxx.w",
+"whtplkmmklpuxx.w",
+"whrloxdcxxlrxx.w",
+"whqjxx#oxflrxx.w",
+"whqixxfxoensxx.w",
+"whpixxxxahotxx.w",
+"whqixxfxoensxx.w",
+"whqjxx#oxflrxx.w",
+"whrlxodcxxlrxx.w",
+"whtplkmmklpghhbw",
+"whvurrssrrugxpdw",
+"whxxxxxxxxnkpdnw",
+"whxxxxxxsphpdkww",
+"wd........bdnwww"};
diff --git a/icons/Kernel.xpm b/icons/Kernel.xpm
new file mode 100644
index 0000000..0bd235c
--- /dev/null
+++ b/icons/Kernel.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * Kernel2_xpm[] = {
+"16 15 52 2",
+".. c None",
+".# c #4C3218",
+".a c #50361C",
+".b c #563C22",
+".c c #583E24",
+".d c #5B4127",
+".e c #5F452B",
+".f c #60462C",
+".g c #62482E",
+".h c #644B32",
+".i c #684E34",
+".j c #6B5137",
+".k c #6D5339",
+".l c #6D5945",
+".m c #70563C",
+".n c #72583E",
+".o c #755B41",
+".p c #756351",
+".q c #785E44",
+".r c #7A6046",
+".s c #7C6249",
+".t c #80664C",
+".u c #81684E",
+".v c #816E58",
+".w c #856B52",
+".x c #86735F",
+".y c #886E54",
+".z c #897969",
+".A c #8A7765",
+".B c #8B7865",
+".C c #8D7359",
+".D c #918071",
+".E c #92785E",
+".F c #957B61",
+".G c #987E64",
+".H c #9A8066",
+".I c #9D8369",
+".J c #A0866C",
+".K c #A88E74",
+".L c #AB9177",
+".M c #AE947A",
+".N c #B2987E",
+".O c #B69C82",
+".P c #B99F85",
+".Q c #BBA187",
+".R c #BEA48A",
+".S c #C1A78D",
+".T c #CBB197",
+".U c #CDB399",
+".V c #D1B79D",
+".W c #D8BEA4",
+".X c #E9CFB5",
+"................................",
+".................D.K.F..........",
+".............C.t.n.r.s.w.z......",
+"...........u.j.o.I.R.L.C.w.D....",
+".........t.k.s.J.U.X.V.H.r.h....",
+".......D.k.o.F.S.W.W.P.w.g.l....",
+".......o.k.w.M.U.V.Q.F.o.c.p....",
+".....D.k.r.H.P.T.O.G.s.f.e.D....",
+".....o.o.C.J.N.M.E.m.f.b.c......",
+"...D.n.s.G.J.I.C.n.d.a.h........",
+"...x.m.w.F.F.t.k.f.#.h..........",
+"...o.m.w.y.s.i.c.#.k............",
+"...o.o.q.n.h.b.j.D..............",
+"...s.u.h.c.o.A..................",
+"...v.n.B........................"};
diff --git a/icons/Keymap.xpm b/icons/Keymap.xpm
new file mode 100644
index 0000000..ad616c4
--- /dev/null
+++ b/icons/Keymap.xpm
@@ -0,0 +1,85 @@
+/* XPM */
+static char * Keymap2_xpm[] = {
+"16 15 67 2",
+".. c None",
+".# c #22211C",
+".a c #272521",
+".b c #292623",
+".c c #2C2A27",
+".d c #363430",
+".e c #383633",
+".f c #3E3C38",
+".g c #413F3B",
+".h c #42403C",
+".i c #464441",
+".j c #4C4A46",
+".k c #4E4B48",
+".l c #504E4A",
+".m c #575551",
+".n c #585654",
+".o c #5D5B58",
+".p c #605E5B",
+".q c #62605C",
+".r c #666460",
+".s c #686662",
+".t c #6B6965",
+".u c #6D6B69",
+".v c #706E6A",
+".w c #74726E",
+".x c #767470",
+".y c #787673",
+".z c #7A7874",
+".A c #7E7C78",
+".B c #807E7A",
+".C c #84827E",
+".D c #868481",
+".E c #888682",
+".F c #8B8985",
+".G c #908E8A",
+".H c #93918D",
+".I c #969490",
+".J c #989692",
+".K c #9B9995",
+".L c #9F9D99",
+".M c #A19F9B",
+".N c #A4A29E",
+".O c #A6A4A0",
+".P c #A8A6A2",
+".Q c #ABA9A5",
+".R c #AEACA8",
+".S c #B0AEAA",
+".T c #B3B1AD",
+".U c #B7B5B1",
+".V c #B8B6B2",
+".W c #BCBAB6",
+".X c #BEBCB8",
+".Y c #C1BFBB",
+".Z c #C4C2BE",
+".0 c #C6C4C0",
+".1 c #C9C7C3",
+".2 c #CAC8C4",
+".3 c #CCCAC8",
+".4 c #D0CECA",
+".5 c #D2D0CC",
+".6 c #D6D4D1",
+".7 c #D9D7D3",
+".8 c #DCDAD6",
+".9 c #DFDDD9",
+"#. c #E0DEDA",
+"## c #E2E0DC",
+"#a c #E6E4E0",
+"................................",
+"................................",
+".......6.E.C.z.z.C.B.C.E.P......",
+".....3#..s.t.y.A.C.C.F.L.X.K....",
+"....#a.9.r.x.B.C.F.G.K.T.U.u....",
+".D.u.5#..B.D.G.H.I.K.P.V.T.k.b.u",
+".u.M.8#..C.H.K.K.L.P.T.Y.2.j.g.i",
+".n.Q.8##.D.K.N.N.Q.T.W.0.1.f.m.e",
+".k.Q.7.8.O.N.V.W.X.Y.0.6.0.e.f.c",
+".k.R.4.S.Z.0.2.4.4.4.4.3.H.d.f.#",
+".i.W.Y.N.D.w.v.v.v.v.v.w.x.i.g.#",
+".i.T.V.J.t.r.q.q.q.q.q.t.w.l.h.#",
+".o.u.J.D.t.w.t.r.r.q.q.w.z.o.h.#",
+".D.a.y.B.r.A.A.A.z.q.q.A.A.p.#.q",
+"...n.k.h.h.h.h.h.h.h.h.h.h.l.n.."};
diff --git a/icons/Lego.xpm b/icons/Lego.xpm
new file mode 100644
index 0000000..b9f3a84
--- /dev/null
+++ b/icons/Lego.xpm
@@ -0,0 +1,85 @@
+/* XPM */
+static char * prg2_xpm[] = {
+"16 15 67 2",
+".. c None",
+".# c #200000",
+".a c #3D3B28",
+".b c #474D49",
+".c c #484F53",
+".d c #512611",
+".e c #565833",
+".f c #61615C",
+".g c #674412",
+".h c #694B33",
+".i c #6A3C0C",
+".j c #6B4016",
+".k c #6B6B6D",
+".l c #6C5116",
+".m c #6D4C16",
+".n c #6D4F18",
+".o c #706E53",
+".p c #724D16",
+".q c #747470",
+".r c #79775F",
+".s c #7C4F1B",
+".t c #85441E",
+".u c #8B5519",
+".v c #8F5421",
+".w c #941203",
+".x c #959E97",
+".y c #995E37",
+".z c #A06060",
+".A c #A35C21",
+".B c #A48E72",
+".C c #A74815",
+".D c #AC1B00",
+".E c #AD8E70",
+".F c #AE1600",
+".G c #B02104",
+".H c #B04816",
+".I c #B31607",
+".J c #B40D00",
+".K c #B71F04",
+".L c #B74618",
+".M c #B79575",
+".N c #B7A28C",
+".O c #B7B8B4",
+".P c #B8BCAB",
+".Q c #BA2D09",
+".R c #B9481C",
+".S c #B99C6E",
+".T c #BF360D",
+".U c #BF4210",
+".V c #C14412",
+".W c #C60000",
+".X c #C64B15",
+".Y c #C90000",
+".Z c #C9CCC3",
+".0 c #D1D1CE",
+".1 c #D4D4D3",
+".2 c #D6D6C7",
+".3 c #D6DFD0",
+".4 c #DDC2AC",
+".5 c #DDC7BA",
+".6 c #E5E8E2",
+".7 c #EAE9DB",
+".8 c #F3ECF5",
+".9 c #F5EEE1",
+"#. c #F7F2E5",
+"## c #F7F7F5",
+"#a c #FDFDFE",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.z",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.W.K.T.D.Q.U.D.T.G.F.X.V.w.#",
+"...Y.Q.y.S.g.E.5.c.4.h.d.4.M.t.#",
+"...I.i.7.o.r.Z.c#a.b.x.0.f.2.l.#",
+"...H.N.Z.a.7.O.O.k##.0.P.e.9.j.#",
+"...p#.#a.1#a.8.O.1.6.q.6.3.B.L.#",
+"...C.n.m.v.l.p.u.l.p.A.l.s.R.J.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.#",
+"...z.#.#.#.#.#.#.#.#.#.#.#.#.#.#"};
diff --git a/icons/License.xpm b/icons/License.xpm
new file mode 100644
index 0000000..677428a
--- /dev/null
+++ b/icons/License.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char * License_xpm[] = {
+"16 15 22 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #929292",
+"/ c #313131",
+"( c #3D3D3D",
+") c #C3C3C3",
+"= c #AAAAAA",
+"+ c #595959",
+"* c #080808",
+"- c #494949",
+"[ c #282828",
+"] c #141414",
+"{ c #828282",
+"} c #7D7D7D",
+"< c #202020",
+"> c #E3E3E3",
+", c #696969",
+". c #A2A2A2",
+"| c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$&/()$$$$% ",
+" !$$$)%$/%$$$$% ",
+" !$$$=%=)+$$$$% ",
+" !$$$$*%-$$$$$% ",
+" !$$$+-[%]$$$$% ",
+" !$$$%{$)%}$$$% ",
+" !$$$=%%+<$$$$% ",
+" !$$$$>%%=$$$$% ",
+" !$$$=-$]*$!!!< ",
+" !$$$,%$(($!$)# ",
+" !$$$$,++$.{)#. ",
+" !$$$$$$|)!)#{ ",
+" #%%%%%%%%<#. "};
diff --git a/icons/Linux.xpm b/icons/Linux.xpm
new file mode 100644
index 0000000..6ee1ba9
--- /dev/null
+++ b/icons/Linux.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char * Linux_xpm[] = {
+"16 15 36 1",
+" c None",
+"! c #616161",
+"# c #000000",
+"$ c #313131",
+"% c #828282",
+"& c #C5C5C5",
+"/ c #795D08",
+"( c #EFD23D",
+") c #DB9A0C",
+"= c #A4730A",
+"+ c #CEB210",
+"* c #D2A610",
+"- c #555555",
+"[ c #B2B2B2",
+"] c #FBFBFB",
+"{ c #E6E6E6",
+"} c #6D6D6D",
+"< c #F3F3F3",
+"> c #494949",
+", c #0C0C0C",
+". c #F3C214",
+"| c #E6AD09",
+"@ c #715504",
+"~ c #E7A610",
+"' c #EBB210",
+"? c #EFBC10",
+"0 c #EFEFEF",
+"1 c #DFDFDF",
+"2 c #DBA208",
+"3 c #F5BE0A",
+"4 c #FBC208",
+"5 c #D79A0C",
+"6 c #DDAE2D",
+"7 c #EBB208",
+"8 c #D29208",
+"9 c #E3A608",
+" !##! ",
+" !####! ",
+" $%$&$# ",
+" $#$#&# ",
+" /(()=# ",
+" !#+*=-#! ",
+" #[]{{[## ",
+" !#&{{{&%# ",
+" #}]<]]]&>! ",
+" !#&]{]]]],# ",
+" ##]]{]]]]$# ",
+" ..|#]{]]]|@| ",
+" ~'??|#0]]1|234 ",
+" 25||6&]]1&|372 ",
+" 6228#####889 "};
diff --git a/icons/MSWordDoc.xpm b/icons/MSWordDoc.xpm
new file mode 100644
index 0000000..0b81133
--- /dev/null
+++ b/icons/MSWordDoc.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * MSWord_doc_xpm[] = {
+"16 15 12 1",
+". c #000000",
+"# c #0000FF",
+"a c #202020",
+"b c #404040",
+"c c #606060",
+"d c #7F7FFF",
+"e c #808080",
+"f c #A0A0A0",
+"g c #C0C0C0",
+"h c #DEDEDE",
+"i c None",
+"j c #FFFFFF",
+"icccccccccccccbi",
+"icjjjjjjjjjjjj.i",
+"icj##########j.i",
+"icj#jjjjjjjj#j.i",
+"icj###dd#dd##j.i",
+"icj#d#j##j#d#j.i",
+"icj#d#d##d#j#j.i",
+"icj#d#####dj#j.i",
+"icj#d##d##jj#j.i",
+"icj#d#dj#djj#j.i",
+"icj#jjjjjjjcccai",
+"icj########cjgbi",
+"icjjjjjjjjfegbfi",
+"icjjjjjjhgcgbeii",
+"ib........abfiii"};
diff --git a/icons/Makefile b/icons/Makefile
new file mode 100644
index 0000000..cd38de7
--- /dev/null
+++ b/icons/Makefile
@@ -0,0 +1,622 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# icons/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+# -----------------------------------------------------------------------------
+# gentoo icons makefile
+# -----------------------------------------------------------------------------
+
+
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/gentoo
+pkgincludedir = $(includedir)/gentoo
+pkglibdir = $(libdir)/gentoo
+pkglibexecdir = $(libexecdir)/gentoo
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+subdir = icons
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_$(V))
+am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pixmapdir)"
+DATA = $(pixmap_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in COPYING README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/emil/data/workspace/gentoo/missing aclocal-1.15
+AMTAR = $${TAR-tar}
+AM_DEFAULT_VERBOSITY = 1
+AUTOCONF = ${SHELL} /home/emil/data/workspace/gentoo/missing autoconf
+AUTOHEADER = ${SHELL} /home/emil/data/workspace/gentoo/missing autoheader
+AUTOMAKE = ${SHELL} /home/emil/data/workspace/gentoo/missing automake-1.15
+AWK = mawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPP = gcc -E
+CPPFLAGS =
+CYGPATH_W = echo
+DATE = 2016-06-14
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EGREP = /bin/grep -E
+EXEEXT =
+GENTOO_CFLAGS = -Wall -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Werror-implicit-function-declaration -g -pg
+GETTEXT_MACRO_VERSION = 0.19
+GMSGFMT = /usr/bin/msgfmt
+GMSGFMT_015 = /usr/bin/msgfmt
+GREP = /bin/grep
+GTK_CFLAGS = -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/mirclient -I/usr/include/mircommon -I/usr/include/mircookie -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
+GTK_LIBS = -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+INTLLIBS =
+INTL_MACOSX_LIBS =
+LDFLAGS =
+LIBICONV = -liconv
+LIBINTL =
+LIBOBJS =
+LIBS = -lm
+LTLIBICONV = -liconv
+LTLIBINTL =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/emil/data/workspace/gentoo/missing makeinfo
+MKDIR_P = /bin/mkdir -p
+MODULES_CFLAGS = -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
+MODULES_LIBS = -lgio-2.0 -lgobject-2.0 -lgthread-2.0 -pthread -lglib-2.0
+MSGFMT = /usr/bin/msgfmt
+MSGFMT_015 = /usr/bin/msgfmt
+MSGMERGE = /usr/bin/msgmerge
+OBJEXT = o
+PACKAGE = gentoo
+PACKAGE_BUGREPORT = emil@obsession.se
+PACKAGE_NAME = gentoo
+PACKAGE_STRING = gentoo 0.20.7
+PACKAGE_TARNAME = gentoo
+PACKAGE_URL = http://obsession.se/gentoo/
+PACKAGE_VERSION = 0.20.7
+PATH_SEPARATOR = :
+PKG_CONFIG = /usr/bin/pkg-config
+PKG_CONFIG_LIBDIR =
+PKG_CONFIG_PATH =
+POSUB = po
+RANLIB = ranlib
+SED = /bin/sed
+SET_MAKE =
+SHELL = /bin/bash
+STRIP =
+USE_NLS = yes
+VERSION = 0.20.7
+XGETTEXT = /usr/bin/xgettext
+XGETTEXT_015 = /usr/bin/xgettext
+XGETTEXT_EXTRA_OPTIONS =
+abs_builddir = /home/emil/data/workspace/gentoo/icons
+abs_srcdir = /home/emil/data/workspace/gentoo/icons
+abs_top_builddir = /home/emil/data/workspace/gentoo
+abs_top_srcdir = /home/emil/data/workspace/gentoo
+ac_ct_CC = gcc
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = $${TAR-tar} chof - "$$tardir"
+am__untar = $${TAR-tar} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias =
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/emil/data/workspace/gentoo/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+mandir = ${datarootdir}/man
+mkdir_p = $(MKDIR_P)
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+runstatedir = ${localstatedir}/run
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target_alias =
+top_build_prefix = ../
+top_builddir = ..
+top_srcdir = ..
+pixmapdir = $(datadir)/gentoo/icons
+pixmap_DATA = AbiWord.xpm \
+ Amiga.xpm \
+ Animation.xpm \
+ Apple.xpm \
+ BSD.xpm \
+ Bad.xpm \
+ Battery.xpm \
+ CDROM.xpm \
+ Card.xpm \
+ Database.xpm \
+ Directory.xpm \
+ Directory2.xpm \
+ Document.xpm \
+ EggTimer.xpm \
+ ExcelCalcXLS.xpm \
+ Executable.xpm \
+ FIFO.xpm \
+ Floppy.xpm \
+ Font.xpm \
+ GNUstep.xpm \
+ Ghost.xpm \
+ GnomeCalc.xpm \
+ GnomeWord.xpm \
+ Harddrive.xpm \
+ Image.xpm \
+ Internet.xpm \
+ KDECalc.xpm \
+ KDEWord.xpm \
+ Kernel.xpm \
+ Keymap.xpm \
+ Lego.xpm \
+ License.xpm \
+ Linux.xpm \
+ MSWordDoc.xpm \
+ Makefile.xpm \
+ Maya.xpm \
+ Mixer.xpm \
+ Mouse.xpm \
+ Mouse2.xpm \
+ NetAmiga.xpm \
+ NetApple.xpm \
+ NetHD.xpm \
+ NetSGI.xpm \
+ NetSun.xpm \
+ NetWindows.xpm \
+ Package.xpm \
+ Package2.xpm \
+ Port.xpm \
+ Port2.xpm \
+ PowerButton.xpm \
+ Printer.xpm \
+ Readme.xpm \
+ SCSI.xpm \
+ SoundCard.xpm \
+ Source.xpm \
+ Speaker.xpm \
+ Speaker2.xpm \
+ Spreadsheet.xpm \
+ Tape.xpm \
+ VRML.xpm \
+ Windows.xpm \
+ aiff.xpm \
+ au.xpm \
+ avi.xpm \
+ bmp.xpm \
+ bmp2.xpm \
+ c.xpm \
+ class.xpm \
+ conf.xpm \
+ core.xpm \
+ cpp.xpm \
+ deb.xpm \
+ eps.xpm \
+ exe.xpm \
+ gentoo.png \
+ gif.xpm \
+ gif2.xpm \
+ h.xpm \
+ html.xpm \
+ html2.xpm \
+ iff.xpm \
+ iff2.xpm \
+ java.xpm \
+ jpeg.xpm \
+ jpeg2.xpm \
+ log.xpm \
+ m.xpm \
+ man.xpm \
+ midi.xpm \
+ mod.xpm \
+ mov.xpm \
+ mov2.xpm \
+ mp3.xpm \
+ mpeg.xpm \
+ o.xpm \
+ pcx.xpm \
+ pcx2.xpm \
+ pdb.xpm \
+ pdf.xpm \
+ pl.xpm \
+ png.xpm \
+ png2.xpm \
+ prc.xpm \
+ ps.xpm \
+ r.xpm \
+ ra.xpm \
+ rom.xpm \
+ rpm.xpm \
+ sh.xpm \
+ sid.xpm \
+ so.xpm \
+ targa.xpm \
+ targa2.xpm \
+ tex.xpm \
+ tiff.xpm \
+ tiff2.xpm \
+ txt.xpm \
+ wav.xpm \
+ xbm.xpm \
+ xbm2.xpm \
+ xcf.xpm \
+ xpm.xpm \
+ xpm2.xpm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu icons/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu icons/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-pixmapDATA: $(pixmap_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \
+ done
+
+uninstall-pixmapDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pixmapdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pixmapDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pixmapDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+ ctags-am distclean distclean-generic distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pixmapDATA install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am \
+ uninstall-pixmapDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/icons/Makefile.am b/icons/Makefile.am
new file mode 100644
index 0000000..f617b54
--- /dev/null
+++ b/icons/Makefile.am
@@ -0,0 +1,128 @@
+# -----------------------------------------------------------------------------
+# gentoo icons makefile
+# -----------------------------------------------------------------------------
+
+pixmapdir=$(datadir)/gentoo/icons
+pixmap_DATA=AbiWord.xpm \
+ Amiga.xpm \
+ Animation.xpm \
+ Apple.xpm \
+ BSD.xpm \
+ Bad.xpm \
+ Battery.xpm \
+ CDROM.xpm \
+ Card.xpm \
+ Database.xpm \
+ Directory.xpm \
+ Directory2.xpm \
+ Document.xpm \
+ EggTimer.xpm \
+ ExcelCalcXLS.xpm \
+ Executable.xpm \
+ FIFO.xpm \
+ Floppy.xpm \
+ Font.xpm \
+ GNUstep.xpm \
+ Ghost.xpm \
+ GnomeCalc.xpm \
+ GnomeWord.xpm \
+ Harddrive.xpm \
+ Image.xpm \
+ Internet.xpm \
+ KDECalc.xpm \
+ KDEWord.xpm \
+ Kernel.xpm \
+ Keymap.xpm \
+ Lego.xpm \
+ License.xpm \
+ Linux.xpm \
+ MSWordDoc.xpm \
+ Makefile.xpm \
+ Maya.xpm \
+ Mixer.xpm \
+ Mouse.xpm \
+ Mouse2.xpm \
+ NetAmiga.xpm \
+ NetApple.xpm \
+ NetHD.xpm \
+ NetSGI.xpm \
+ NetSun.xpm \
+ NetWindows.xpm \
+ Package.xpm \
+ Package2.xpm \
+ Port.xpm \
+ Port2.xpm \
+ PowerButton.xpm \
+ Printer.xpm \
+ Readme.xpm \
+ SCSI.xpm \
+ SoundCard.xpm \
+ Source.xpm \
+ Speaker.xpm \
+ Speaker2.xpm \
+ Spreadsheet.xpm \
+ Tape.xpm \
+ VRML.xpm \
+ Windows.xpm \
+ aiff.xpm \
+ au.xpm \
+ avi.xpm \
+ bmp.xpm \
+ bmp2.xpm \
+ c.xpm \
+ class.xpm \
+ conf.xpm \
+ core.xpm \
+ cpp.xpm \
+ deb.xpm \
+ eps.xpm \
+ exe.xpm \
+ gentoo.png \
+ gif.xpm \
+ gif2.xpm \
+ h.xpm \
+ html.xpm \
+ html2.xpm \
+ iff.xpm \
+ iff2.xpm \
+ java.xpm \
+ jpeg.xpm \
+ jpeg2.xpm \
+ log.xpm \
+ m.xpm \
+ man.xpm \
+ midi.xpm \
+ mod.xpm \
+ mov.xpm \
+ mov2.xpm \
+ mp3.xpm \
+ mpeg.xpm \
+ o.xpm \
+ pcx.xpm \
+ pcx2.xpm \
+ pdb.xpm \
+ pdf.xpm \
+ pl.xpm \
+ png.xpm \
+ png2.xpm \
+ prc.xpm \
+ ps.xpm \
+ r.xpm \
+ ra.xpm \
+ rom.xpm \
+ rpm.xpm \
+ sh.xpm \
+ sid.xpm \
+ so.xpm \
+ targa.xpm \
+ targa2.xpm \
+ tex.xpm \
+ tiff.xpm \
+ tiff2.xpm \
+ txt.xpm \
+ wav.xpm \
+ xbm.xpm \
+ xbm2.xpm \
+ xcf.xpm \
+ xpm.xpm \
+ xpm2.xpm
diff --git a/icons/Makefile.in b/icons/Makefile.in
new file mode 100644
index 0000000..0dcfdad
--- /dev/null
+++ b/icons/Makefile.in
@@ -0,0 +1,622 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -----------------------------------------------------------------------------
+# gentoo icons makefile
+# -----------------------------------------------------------------------------
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = icons
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pixmapdir)"
+DATA = $(pixmap_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in COPYING README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATE = @DATE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENTOO_CFLAGS = @GENTOO_CFLAGS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MODULES_CFLAGS = @MODULES_CFLAGS@
+MODULES_LIBS = @MODULES_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+pixmapdir = $(datadir)/gentoo/icons
+pixmap_DATA = AbiWord.xpm \
+ Amiga.xpm \
+ Animation.xpm \
+ Apple.xpm \
+ BSD.xpm \
+ Bad.xpm \
+ Battery.xpm \
+ CDROM.xpm \
+ Card.xpm \
+ Database.xpm \
+ Directory.xpm \
+ Directory2.xpm \
+ Document.xpm \
+ EggTimer.xpm \
+ ExcelCalcXLS.xpm \
+ Executable.xpm \
+ FIFO.xpm \
+ Floppy.xpm \
+ Font.xpm \
+ GNUstep.xpm \
+ Ghost.xpm \
+ GnomeCalc.xpm \
+ GnomeWord.xpm \
+ Harddrive.xpm \
+ Image.xpm \
+ Internet.xpm \
+ KDECalc.xpm \
+ KDEWord.xpm \
+ Kernel.xpm \
+ Keymap.xpm \
+ Lego.xpm \
+ License.xpm \
+ Linux.xpm \
+ MSWordDoc.xpm \
+ Makefile.xpm \
+ Maya.xpm \
+ Mixer.xpm \
+ Mouse.xpm \
+ Mouse2.xpm \
+ NetAmiga.xpm \
+ NetApple.xpm \
+ NetHD.xpm \
+ NetSGI.xpm \
+ NetSun.xpm \
+ NetWindows.xpm \
+ Package.xpm \
+ Package2.xpm \
+ Port.xpm \
+ Port2.xpm \
+ PowerButton.xpm \
+ Printer.xpm \
+ Readme.xpm \
+ SCSI.xpm \
+ SoundCard.xpm \
+ Source.xpm \
+ Speaker.xpm \
+ Speaker2.xpm \
+ Spreadsheet.xpm \
+ Tape.xpm \
+ VRML.xpm \
+ Windows.xpm \
+ aiff.xpm \
+ au.xpm \
+ avi.xpm \
+ bmp.xpm \
+ bmp2.xpm \
+ c.xpm \
+ class.xpm \
+ conf.xpm \
+ core.xpm \
+ cpp.xpm \
+ deb.xpm \
+ eps.xpm \
+ exe.xpm \
+ gentoo.png \
+ gif.xpm \
+ gif2.xpm \
+ h.xpm \
+ html.xpm \
+ html2.xpm \
+ iff.xpm \
+ iff2.xpm \
+ java.xpm \
+ jpeg.xpm \
+ jpeg2.xpm \
+ log.xpm \
+ m.xpm \
+ man.xpm \
+ midi.xpm \
+ mod.xpm \
+ mov.xpm \
+ mov2.xpm \
+ mp3.xpm \
+ mpeg.xpm \
+ o.xpm \
+ pcx.xpm \
+ pcx2.xpm \
+ pdb.xpm \
+ pdf.xpm \
+ pl.xpm \
+ png.xpm \
+ png2.xpm \
+ prc.xpm \
+ ps.xpm \
+ r.xpm \
+ ra.xpm \
+ rom.xpm \
+ rpm.xpm \
+ sh.xpm \
+ sid.xpm \
+ so.xpm \
+ targa.xpm \
+ targa2.xpm \
+ tex.xpm \
+ tiff.xpm \
+ tiff2.xpm \
+ txt.xpm \
+ wav.xpm \
+ xbm.xpm \
+ xbm2.xpm \
+ xcf.xpm \
+ xpm.xpm \
+ xpm2.xpm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu icons/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu icons/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-pixmapDATA: $(pixmap_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \
+ done
+
+uninstall-pixmapDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(pixmapdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pixmapDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pixmapDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+ ctags-am distclean distclean-generic distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pixmapDATA install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am \
+ uninstall-pixmapDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/icons/Makefile.xpm b/icons/Makefile.xpm
new file mode 100644
index 0000000..5b8d06f
--- /dev/null
+++ b/icons/Makefile.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * Makefile_xpm[] = {
+"16 15 16 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #DBEFF3",
+"% c #000000",
+"& c #FFFFFF",
+"/ c #F7BA7D",
+"( c #BA7D51",
+") c #EF7100",
+"= c #7D4124",
+"+ c #202020",
+"* c #C2C2C2",
+"- c #A2A2A2",
+"[ c #828282",
+"] c #CEE7EB",
+"{ c #B2C6CA",
+"!!!!!!!!!!!!!!!#",
+"!$$$$$$$$$$$$$$%",
+"!$#$$$$$$$$$$#$%",
+"!&&&&&&/(&&&&&&%",
+"!&#&&&/))(&&&#&%",
+"!$$$$/))))($$$$%",
+"!$#$/)=)=))($#$%",
+"!&&&()%%%%)=&&&%",
+"!&#&&())))=&&#&%",
+"!$$$$$())=$$$$$%",
+"!$#$$$$(=$$$!!!+",
+"!&&&&&&&&&&&!&*#",
+"!&#&&&&&&&&-[*#-",
+"!$$$$$$$$]{!*#[ ",
+"#%%%%%%%%%%+#- "};
diff --git a/icons/Maya.xpm b/icons/Maya.xpm
new file mode 100644
index 0000000..e4e97e0
--- /dev/null
+++ b/icons/Maya.xpm
@@ -0,0 +1,76 @@
+/* XPM */
+static char * Maya_xpm[] = {
+"16 15 58 2",
+".. c #000000",
+".# c #1B0303",
+".a c #1B0327",
+".b c #2F0303",
+".c c #350505",
+".d c #450303",
+".e c #4E0606",
+".f c #510909",
+".g c #574646",
+".h c #5A0505",
+".i c #6C0C0C",
+".j c #6F0707",
+".k c #740D0D",
+".l c #7C4646",
+".m c #824A4A",
+".n c #830B0B",
+".o c #8A1010",
+".p c #9A0E0E",
+".q c #9C5D5D",
+".r c #9E1111",
+".s c #A31313",
+".t c #A60808",
+".u c #AB1111",
+".v c #AB0F0F",
+".w c #AE5F5F",
+".x c #B01414",
+".y c #B10D0D",
+".z c #B41B1B",
+".A c #B16262",
+".B c #B30505",
+".C c #BE0000",
+".D c #C46363",
+".E c #C7C1C1",
+".F c #C8C2CB",
+".G c #CC4444",
+".H c #CAC4C4",
+".I c #CB6565",
+".J c #CE6969",
+".K c #CEAEAE",
+".L c #CF3F3F",
+".M c #D04343",
+".N c #D35C5C",
+".O c #D55656",
+".P c #D58282",
+".Q c #D7AFAF",
+".R c #DD8181",
+".S c #DDDDDD",
+".T c #DF7F7F",
+".U c #E08080",
+".V c #E2C4C4",
+".W c #E5B3B3",
+".X c #E6ADAD",
+".Y c #EDCACA",
+".Z c #EFBFBF",
+".0 c #EFC0C0",
+".1 c #F0C2C2",
+".2 c #F3F2F2",
+".3 c #FEFEFE",
+".C.C.........................C.C",
+".1.G.C.d.#.g.E.#.#.#.#.#.d.C.C.C",
+".3.Z.G.C.m.2.3.c.c.c.c.h.C.C.C.C",
+".3.C.2.U.2.j.3.l.3.m.j.M.3.L.C.C",
+".3.C.M.S.M.C.3.i.i.3.M.3.C.C.C.C",
+".3.C.C.X.C.Z.3.V.o.R.3.R.B.C.C.C",
+".3.C.C.u.C.C.C.R.0.O.3.O.v.3.C.C",
+".3.y.y.z.P.3.1.M.S.C.3.z.J.3.I.x",
+".3.u.u.z.Y.N.0.C.3.C.3.z.W.W.W.u",
+".3.p.p.s.S.D.N.U.3.C.3.s.3.r.3.r",
+".3.n.n.o.A.S.3.T.1.t.3.w.3.V.Q.w",
+".3.i.i.i.i.i.3.C.C.k.3.i.i.i.q.K",
+".3.e.e.f.f.f.3.3.3.3.3.3.3.3.3.3",
+".3.c.c.c.c.c.c.e.e.c.3.c.c.c.c.c",
+".F.a.a.#.#.#.#.b.b.#.H.#.#.a.a.a"};
diff --git a/icons/Mixer.xpm b/icons/Mixer.xpm
new file mode 100644
index 0000000..fc76c52
--- /dev/null
+++ b/icons/Mixer.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * Mixer_xpm[] = {
+"16 15 10 1",
+" c None",
+"c c #6D6D6D",
+"i c #222222",
+". c #828282",
+"d c #3A3A3A",
+"a c #414141",
+"f c #A2A2A2",
+"b c #000000",
+"h c #C2C2C2",
+"j c #292929",
+"..............d ",
+".aaaaaaaaaaaaab ",
+".aabaaabaaabaab ",
+".aabaacccdabaab ",
+".aabaa...jabaab ",
+".aabaafffjabaab ",
+".aabaahhhicccdb ",
+".aabaadbij...jb ",
+".acccdabaafffjb ",
+".a...jabaahhhib ",
+".afffjabaadbijb ",
+".ahhhiabaaabaab ",
+".adbijabaaabaab ",
+".aaaaaaaaaaaaab ",
+"dbbbbbbbbbbbbbb "};
diff --git a/icons/Mouse.xpm b/icons/Mouse.xpm
new file mode 100644
index 0000000..298899f
--- /dev/null
+++ b/icons/Mouse.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char * Mouse_xpm[] = {
+"16 15 2 1",
+" c None",
+"! c #000000",
+" !! ",
+" !! !! ! ",
+" !!!!!!! ! ",
+" !!!!!!!! ! ",
+"!!!!! !! ! ",
+"!!!!!! ! ",
+" !!!!! ! ",
+" !!!!!! ! ",
+" !!!!!!!! !! ",
+" !!!!!!!!!! !! ",
+" ! !!!!!!!!!!! ",
+" ! !!!!!!!! ",
+" !!!!!!! ",
+" !! !!!! ",
+" !!! "};
diff --git a/icons/Mouse2.xpm b/icons/Mouse2.xpm
new file mode 100644
index 0000000..2fe03e5
--- /dev/null
+++ b/icons/Mouse2.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char * Mouse3_xpm[] = {
+"16 15 26 2",
+".. c None",
+".# c #3B3B3B",
+".a c #525252",
+".b c #558955",
+".c c #5D5D5D",
+".d c #6B6B6B",
+".e c #747474",
+".f c #7C7C7C",
+".g c #828282",
+".h c #8B8B8B",
+".i c #949494",
+".j c #9B9B9B",
+".k c #A2A2A2",
+".l c #AAAAAA",
+".m c #B2B2B2",
+".n c #BBBBBB",
+".o c #C2C2C2",
+".p c #CBCBCB",
+".q c #C9B3A7",
+".r c #D3D3D3",
+".s c #D6E7D6",
+".t c #DBDBDB",
+".u c #E2E2E2",
+".v c #EBEBEB",
+".w c #F2F2F2",
+".x c #FAFAFA",
+"................................",
+"...........h.i..................",
+".......e.g.j.u.i.e..............",
+".....k.v.w.p.e.k.v.t.j..........",
+"...k.n.j.j.h.o.q.t.u.t.l........",
+".i.u.w.x.n.n.s.b.k.u.t.r.m......",
+".e.k.r.o.i.x.w.v.t.u.t.r.p.k....",
+".g.n.j.g.t.w.v.v.u.t.r.p.o.o.i..",
+"...h.n.n.h.n.v.u.u.t.r.p.o.o.n.f",
+".....h.k.o.j.k.t.t.r.p.o.o.n.m.g",
+".......l.g.n.m.h.p.r.p.o.o.n.m.g",
+"...........g.j.m.i.m.o.o.n.m.k.e",
+"...............f.j.l.j.h.i.g.a.#",
+"...................h.f.d.d.c.e..",
+"................................"};
diff --git a/icons/NetAmiga.xpm b/icons/NetAmiga.xpm
new file mode 100644
index 0000000..f43d04e
--- /dev/null
+++ b/icons/NetAmiga.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char * NetAmiga_xpm[] = {
+"16 15 22 1",
+" c None",
+"! c #CECECE",
+"# c #E7E7E7",
+"$ c #C28282",
+"% c #FFFFFF",
+"& c #FFAAAA",
+"/ c #FF5555",
+"( c #BE0000",
+") c #B6AAAA",
+"= c #FF0000",
+"+ c #EF0000",
+"* c #9E6161",
+"- c #7D0000",
+"[ c #414141",
+"] c #DFDFDF",
+"{ c #616161",
+"} c #C6C6C6",
+"< c #D7D7D7",
+"> c #9A9A9A",
+", c #AAAAAA",
+". c #929292",
+"| c #797979",
+" ",
+" ",
+" !#$ ",
+" !#%&/() ",
+" %&/===+* ",
+" #/=====- ",
+" !&=====() ",
+" %=====+* ",
+" #/===+(- ",
+" !&+(-*) ",
+" $*)[ ",
+" ]{ ",
+" ]{ ",
+"}!<]]]]>>{]]]<!}",
+",.|{{{>{{{{{{|.,"};
diff --git a/icons/NetApple.xpm b/icons/NetApple.xpm
new file mode 100644
index 0000000..476b574
--- /dev/null
+++ b/icons/NetApple.xpm
@@ -0,0 +1,93 @@
+/* XPM */
+static char * NetApple_xpm[] = {
+"16 15 75 1",
+" c None",
+"! c #65EF59",
+"# c #008A00",
+"$ c #828282",
+"% c #A2A2A2",
+"& c #41D231",
+"/ c #04BE00",
+"( c #10B204",
+") c #00AE00",
+"= c #E7E779",
+"+ c #E7FBA6",
+"* c #FFFFB6",
+"- c #FFFB2D",
+"[ c #FFF710",
+"] c #FBEB0C",
+"{ c #F7CA20",
+"} c #EBB228",
+"< c #C68E2D",
+"> c #A26D31",
+", c #FFE731",
+". c #FFFBF3",
+"| c #FFEB96",
+"@ c #AA7524",
+"~ c #693D1C",
+"' c #FD6300",
+"? c #FFCA96",
+"0 c #F76100",
+"1 c #E76100",
+"2 c #D25904",
+"3 c #C2590C",
+"4 c #AE5D18",
+"5 c #613110",
+"6 c #A64914",
+"7 c #DE0000",
+"8 c #F35561",
+"9 c #CE0000",
+"A c #BE0000",
+"B c #AA0000",
+"C c #820C10",
+"D c #792D39",
+"E c #F31882",
+"F c #F73186",
+"G c #F30C6D",
+"H c #EB0861",
+"I c #DF0C5D",
+"J c #CE145D",
+"K c #B61859",
+"L c #9E1C55",
+"M c #8A2461",
+"N c #653165",
+"O c #C686AE",
+"P c #B62892",
+"Q c #C61492",
+"R c #B60C86",
+"S c #B6207D",
+"T c #9E2071",
+"U c #8A2886",
+"V c #792482",
+"W c #75416D",
+"X c #616161",
+"Y c #9A82B2",
+"Z c #203DAE",
+"a c #00008A",
+"b c #594565",
+"c c #202020",
+"d c #B2B2B6",
+"e c #414141",
+"f c #DFDFDF",
+"g c #C6C6C6",
+"h c #CECECE",
+"i c #D7D7D7",
+"j c #9A9A9A",
+"k c #AAAAAA",
+"l c #929292",
+"m c #797979",
+" !#$ ",
+" !#$% ",
+" &/(#$/)#% ",
+" =+*-[]{}<>% ",
+" ,.|-[]{}@~$ ",
+" '?'012345$% ",
+" '?'012365% ",
+" 787779ABCD% ",
+" EFGHIJKLMN$ ",
+" OPQRSTUVWX$ ",
+" YZabcZaX$% ",
+" %$de$$%% ",
+" fX ",
+"ghiffffjjXfffihg",
+"klmXXXjXXXXXXmlk"};
diff --git a/icons/NetHD.xpm b/icons/NetHD.xpm
new file mode 100644
index 0000000..4969f2e
--- /dev/null
+++ b/icons/NetHD.xpm
@@ -0,0 +1,94 @@
+/* XPM */
+static char * NetHD_xpm[] = {
+"16 15 76 1",
+" c None",
+"! c #EFE3E3",
+"# c #DFBAC6",
+"$ c #000000",
+"% c #AA9692",
+"& c #DFCAB2",
+"/ c #EFCEAE",
+"( c #DFBA9A",
+") c #AA8675",
+"= c #3D2D3D",
+"+ c #E3D2D7",
+"* c #DFB2C6",
+"- c #F3DDB6",
+"[ c #EFD7B2",
+"] c #EFCAA6",
+"{ c #EFC29E",
+"} c #EFBC9A",
+"< c #EFB296",
+"> c #AE9675",
+", c #FBEFDB",
+". c #FFFFFF",
+"| c #F3D2A2",
+"@ c #F3CA9E",
+"~ c #EFB49A",
+"' c #A67979",
+"? c #828282",
+"0 c #DFDFDF",
+"1 c #B27D5D",
+"2 c #FBDFC2",
+"3 c #EFAE9A",
+"4 c #DB9E96",
+"5 c #C6C6C6",
+"6 c #D2CECA",
+"7 c #EB8E55",
+"8 c #EFA68E",
+"9 c #EFA696",
+"A c #E3BAC6",
+"B c #D29ACA",
+"C c #FBE392",
+"D c #F7DD94",
+"E c #E77914",
+"F c #F3A282",
+"G c #E39279",
+"H c #DBAAC6",
+"I c #D28AB2",
+"J c #AEA28A",
+"K c #FBE7A4",
+"L c #F7D78E",
+"M c #F7BA69",
+"N c #F3A651",
+"O c #F7AE79",
+"P c #F7A273",
+"Q c #AE6D5D",
+"R c #CEBEC2",
+"S c #D7A2C6",
+"T c #7D656D",
+"U c #FBEFB6",
+"V c #FBDB92",
+"W c #FBCE82",
+"X c #F7BE79",
+"Y c #F7AE71",
+"Z c #D79EC6",
+"a c #AE9E8E",
+"b c #E7CA8A",
+"c c #FBD282",
+"d c #E7BA75",
+"e c #AE795D",
+"f c #5D515D",
+"g c #414141",
+"h c #616161",
+"i c #CECECE",
+"j c #D7D7D7",
+"k c #9A9A9A",
+"l c #AAAAAA",
+"m c #929292",
+"n c #797979",
+" ",
+" !#$$$$%&/()$== ",
+" +*$$$--[]{}<$= ",
+" +*$$>,.|@}~~'= ",
+" +*$?.012.2<34$ ",
+" +*.051 .6.789$ ",
+" +AB51CD2.E7FG$ ",
+" +*HIJKDLMNOPQ$ ",
+" RHST$UKVWXYP== ",
+" =ZBT$$abcde$== ",
+" fTTT===$$$$==f ",
+" 0g ",
+" 0h ",
+"5ij0000kkh000ji5",
+"lmnhhhkhhhhhhnml"};
diff --git a/icons/NetSGI.xpm b/icons/NetSGI.xpm
new file mode 100644
index 0000000..1b57165
--- /dev/null
+++ b/icons/NetSGI.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * NetSGI_xpm[] = {
+"15 15 12 1",
+" c None",
+"! c #929292",
+"# c #000000",
+"$ c #313131",
+"% c #616161",
+"& c #AAAAAA",
+"/ c #797979",
+"( c #DFDFDF",
+") c #C6C6C6",
+"= c #CECECE",
+"+ c #D7D7D7",
+"* c #9A9A9A",
+" !## ##! ",
+" #$ # # $# ",
+" #! # # !# ",
+" $#% %#$ ",
+" ##% %#% %## ",
+" # %# #% # ",
+" # #!# # # # ",
+" ## ## ## ## ",
+" # #&# # ",
+" #% #!# %# ",
+" %##/##% ",
+" (% ",
+" (% ",
+")=+(((**%(((+=)",
+"&!/%%*%%%%%%/!&"};
diff --git a/icons/NetSun.xpm b/icons/NetSun.xpm
new file mode 100644
index 0000000..3ce2fb5
--- /dev/null
+++ b/icons/NetSun.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * NetSun_xpm[] = {
+"16 15 17 1",
+" c None",
+"! c #828282",
+"# c #FFFFFF",
+"$ c #41007D",
+"% c #713D9E",
+"& c #CEBEDF",
+"/ c #A27DBE",
+"( c #414141",
+") c #DFDFDF",
+"= c #616161",
+"+ c #C6C6C6",
+"* c #CECECE",
+"- c #D7D7D7",
+"[ c #9A9A9A",
+"] c #AAAAAA",
+"{ c #929292",
+"} c #797979",
+" !! ",
+" !##! ",
+" !#$$#! ",
+" !#%$&$#! ",
+" !#$&%$&%#! ",
+" !#$&$//%$$#! ",
+" !#$$%//$&$#( ",
+" !#%&$%&$#( ",
+" !#$&$%#( ",
+" !#$$#( ",
+" !##( ",
+" )( ",
+" )= ",
+"+*-))))[[=)))-*+",
+"]{}===[======}{]"};
diff --git a/icons/NetWindows.xpm b/icons/NetWindows.xpm
new file mode 100644
index 0000000..0648e87
--- /dev/null
+++ b/icons/NetWindows.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char * NetWindows_xpm[] = {
+"16 15 42 1",
+" c None",
+"! c #828282",
+"# c #414141",
+"$ c #AAAAAA",
+"% c #C6A29A",
+"& c #D2614D",
+"/ c #000000",
+"( c #202020",
+") c #141414",
+"= c #CA8275",
+"+ c #D74128",
+"* c #3D2D28",
+"- c #411C14",
+"[ c #2D6520",
+"] c #8E2D1C",
+"{ c #69B255",
+"} c #59AA45",
+"< c #9EAEBE",
+"> c #20351C",
+", c #598ABE",
+". c #7D9EBE",
+"| c #3979BE",
+"@ c #283139",
+"~ c #182839",
+"' c #284D75",
+"? c #2D5520",
+"0 c #3D7131",
+"1 c #3975B6",
+"2 c #49411C",
+"3 c #A68E31",
+"4 c #7D6920",
+"5 c #51657D",
+"6 c #FFD745",
+"7 c #9A9A9A",
+"8 c #555555",
+"9 c #DFDFDF",
+"A c #616161",
+"B c #C6C6C6",
+"C c #CECECE",
+"D c #D7D7D7",
+"E c #929292",
+"F c #797979",
+" !! ",
+" !#!$ ",
+" %%&!#/#()#!$ ",
+" !!$=%+*-++-[/ ",
+" !#!+=/]++/{}/ ",
+" < !/#/(-]>}}/ ",
+"!! ,.|@~|'//?0# ",
+" !#<|./'1'234>! ",
+" !/|5/~'~366/ ",
+" !/#///363# ",
+" 78!8/2! ",
+" 9A !/ ",
+" 9A ",
+"BCD999977A999DCB",
+"$EFAAA7AAAAAAFE$"};
diff --git a/icons/Package.xpm b/icons/Package.xpm
new file mode 100644
index 0000000..368aa3b
--- /dev/null
+++ b/icons/Package.xpm
@@ -0,0 +1,83 @@
+/* XPM */
+static char * Archive_xpm[] = {
+"16 15 65 1",
+" c None",
+"! c #BAA68A",
+"# c #AA845D",
+"$ c #C2BAB6",
+"% c #9A8A79",
+"& c #AA7D55",
+"/ c #B68E63",
+"( c #B28A55",
+") c #A67549",
+"= c #9E7145",
+"+ c #745231",
+"* c #AA824D",
+"- c #825C39",
+"[ c #45351C",
+"] c #7D593D",
+"{ c #7D6549",
+"} c #513D23",
+"< c #A28261",
+"> c #BE9269",
+", c #A27951",
+". c #8A693D",
+"| c #8A653D",
+"@ c #755939",
+"~ c #6B5333",
+"' c #614528",
+"? c #A57141",
+"0 c #866139",
+"1 c #624B2B",
+"2 c #594324",
+"3 c #3D311C",
+"4 c #101010",
+"5 c #614524",
+"6 c #B2794D",
+"7 c #AE7545",
+"8 c #9E6941",
+"9 c #201010",
+"A c #140C04",
+"B c #926541",
+"C c #795333",
+"D c #412020",
+"E c #221911",
+"F c #1C100C",
+"G c #6D512D",
+"H c #694D31",
+"I c #795D35",
+"J c #513520",
+"K c #4D351C",
+"L c #3B281A",
+"M c #2D1C10",
+"N c #1C1804",
+"O c #8A6135",
+"P c #55392D",
+"Q c #493B20",
+"R c #312014",
+"S c #20180C",
+"T c #92653D",
+"U c #594531",
+"V c #39241C",
+"W c #2D2018",
+"X c #281C18",
+"Y c #595524",
+"Z c #554124",
+"a c #616161",
+"b c #9E6949",
+"c c #655531",
+" ",
+" !#! ",
+" $%&/()=+% ",
+"!((#++*-[+]{% ",
+"}</>,+[+.|-@~~% ",
+"}~('[+?[+0+1234 ",
+"}5['(678+['39A4 ",
+"}1[1+B-C[D4EEF4 ",
+"}G[HI?JKLL4MEN4 ",
+"}+[CO?PQ[L4RES4 ",
+" }[-T?U}Q[4VWX4 ",
+" [-8?YZ}Q434a ",
+" }b?c2Z}4a ",
+" }?c14a ",
+" }4a "};
diff --git a/icons/Package2.xpm b/icons/Package2.xpm
new file mode 100644
index 0000000..0749d52
--- /dev/null
+++ b/icons/Package2.xpm
@@ -0,0 +1,90 @@
+/* XPM */
+static char * Archive2_xpm[] = {
+"16 15 72 2",
+"OD c None",
+".z c #9E7959",
+".K c #7B634D",
+".Y c #080404",
+"#t c #694D31",
+".o c #AEA29A",
+".1 c #9A6D45",
+".X c #4B3122",
+".R c #180C0C",
+".# c #BCB2AC",
+".u c #5D4535",
+".r c #826549",
+".c c #A68671",
+".W c #866B51",
+".t c #694D3A",
+".A c #8E6D51",
+".a c #B69A82",
+".n c #92755B",
+".U c #5D4931",
+"#F c #957A61",
+"#m c #A68A6D",
+"#f c #9A7D64",
+".H c #312018",
+"#l c #AE9275",
+".C c #B4AEAA",
+".F c #51392D",
+".e c #412820",
+".G c #413120",
+".0 c #927D6D",
+".x c #100C08",
+".S c #8E7159",
+".O c #9E836A",
+".k c #A4856A",
+".j c #2D1C18",
+"#w c #311C18",
+".7 c #AA8E72",
+"#x c #49352D",
+".q c #513D24",
+".J c #967555",
+".P c #A68261",
+".E c #000000",
+".b c #352D20",
+".w c #616161",
+"#d c #A27D5B",
+".5 c #080808",
+".y c #8E796D",
+".9 c #453528",
+"#E c #101010",
+"#G c #8A6D59",
+".M c #201010",
+".Z c #967561",
+".l c #A68B72",
+".L c #8A7155",
+"#z c #AD9379",
+".T c #6D5949",
+".D c #94795D",
+".Q c #AA8669",
+"#r c #BEA68E",
+".i c #513D31",
+".p c #755C45",
+"#j c #795D45",
+"#b c #392D1C",
+"#q c #715131",
+"#B c #B6A69A",
+"#y c #9E8E7D",
+"#k c #14100C",
+".m c #1C100C",
+".4 c #181814",
+".f c #866141",
+"#n c #28201C",
+".g c #B29279",
+"#u c #514128",
+"ODOD.#.a.7.c#fODODODOD.CODODODOD",
+"#r.7.k#f.Z.S.W.yODOD.k.n.oODODOD",
+".l#F.r.p.t.u.i#x.0.P.P.z.A#yODOD",
+".C#G.t.F.e.H.m.j.K.7#d#d.z.A.WOD",
+"OD.t.X#w.M.R.x#E.U.k#z.P#d.z.A.W",
+"OD.X.m.R.Y.Y.5#E.G.1#d.g.Q.P.J.p",
+"OD.O#j.E.E.E.5#E#b#q.1#d.7.7.pOD",
+".##z#F#j.E.E.5#E#b.q.f#f.7.pODOD",
+"#B#z.O.L#j.E.5#E#b.p.D#l#l#m.pOD",
+"OD#B.l#f.W#j#k.4.T.O#z#l#m.O.n.p",
+"OD#t#z.l#F.W#j.k#z#z#m#f#F.D#qOD",
+"ODOD#t#z.O.W.9#n#z.O.D.K#q#nODOD",
+"ODODOD#t#z.9#u.b#n#F#q#n.wODODOD",
+"ODODODOD#t#t#q.9.b#n.wODODODODOD",
+"ODODODODOD#q#q.9.wODODODODODODOD"};
diff --git a/icons/Port.xpm b/icons/Port.xpm
new file mode 100644
index 0000000..aba3a68
--- /dev/null
+++ b/icons/Port.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * Port_xpm[] = {
+"16 15 11 1",
+" c None",
+"! c #828282",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #DFDFDF",
+"& c #C2C2C2",
+"/ c #969696",
+"( c #CECECE",
+") c #9A9A9A",
+"= c #000000",
+"+ c #AAAAAA",
+" ! ",
+" !#$%# ",
+" !$%#$$# ",
+" !$&&&#$$# ",
+" !%%&!%&#$$# ",
+" !$&!%!%&#$%# ",
+" !%%&!%/(&#$)# ",
+" !$&&/%&&&## ",
+" !%$&&/(&&)= ",
+" !%&$&&+&)#= ",
+" !%&!$&&)#= ",
+" !$ ###))#= ",
+" !$&= === ",
+"!$&= ",
+"%&# "};
diff --git a/icons/Port2.xpm b/icons/Port2.xpm
new file mode 100644
index 0000000..b24b411
--- /dev/null
+++ b/icons/Port2.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * Port2_xpm[] = {
+"16 15 14 1",
+" c None",
+"! c #D7D7D7",
+"# c #FFFFFF",
+"$ c #DFDFDF",
+"% c #848484",
+"& c #4D4D4D",
+"/ c #EFEFEF",
+"( c #C2C2C2",
+") c #CACACA",
+"= c #969696",
+"+ c #A2A2A2",
+"* c #AAAAAA",
+"- c #717171",
+"[ c #656565",
+" ",
+" ",
+" ! ",
+" #$$% $",
+" #$$& $##",
+" $##/$&($##)=",
+" $#$$$/# =+%==*",
+" #/$$$$$&%*+-* ",
+" $/#/$$[%===- ",
+" $%(/#%=====- ",
+" $&%%(=====-% ",
+" $&%&(===-% ",
+" %%&(=-% ",
+" %*% ",
+" "};
diff --git a/icons/PowerButton.xpm b/icons/PowerButton.xpm
new file mode 100644
index 0000000..ad0c04f
--- /dev/null
+++ b/icons/PowerButton.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char * PowerButton2_xpm[] = {
+"16 15 21 2",
+".. c None",
+".# c #424242",
+".a c #4D4D4D",
+".b c #545454",
+".c c #5A5A5A",
+".d c #626262",
+".e c #6C6C6C",
+".f c #727272",
+".g c #7C7C7C",
+".h c #808080",
+".i c #8A8A8A",
+".j c #919191",
+".k c #9D9D9D",
+".l c #A0A0A0",
+".m c #AAAAAA",
+".n c #B6B6B6",
+".o c #B9B9B9",
+".p c #C3C3C3",
+".q c #C9C9C9",
+".r c #D1D1D1",
+".s c #E0E0E0",
+"...........c.#.#.#.c............",
+".......b.c.k.p.q.n.i.b.b........",
+".....#.j.s.n.l.l.l.m.n.g.#......",
+"...b.l.s.l.k.l.k.k.l.l.m.g.a....",
+"...c.s.l.l.i.b.#.b.h.l.l.k.b....",
+".c.k.n.l.h.b.j.h.j.b.h.l.k.f.c..",
+".#.q.l.l.b.j.l.#.l.j.b.l.k.h.#..",
+".#.r.l.l.#.l.l.#.k.l.#.l.l.g.#..",
+".#.o.l.l.b.j.l.#.l.j.b.l.k.g.#..",
+".c.i.m.l.h.b.j.h.j.b.h.l.j.d.c..",
+"...b.n.l.l.i.b.#.b.h.l.l.f.a....",
+"...b.h.l.l.k.k.k.k.k.l.e.c.a....",
+".....#.f.j.k.k.l.k.i.e.c.#......",
+".......a.b.e.g.g.f.d.a.a........",
+"...........b.#.#.#.b............"};
diff --git a/icons/Printer.xpm b/icons/Printer.xpm
new file mode 100644
index 0000000..35c0805
--- /dev/null
+++ b/icons/Printer.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char * Printer_xpm[] = {
+"16 15 32 1",
+" c None",
+"! c #9A9A9A",
+"# c #ACAAAC",
+"$ c #A2A2A5",
+"% c #EEEEEE",
+"& c #E7E7E4",
+"/ c #CACAC6",
+"( c #F3F3F3",
+") c #EBEBE7",
+"= c #E3E3DF",
+"+ c #DFDFDE",
+"* c #FFFFFF",
+"- c #B3B3B3",
+"[ c #717173",
+"] c #9A9A96",
+"{ c #92928E",
+"} c #D7D7D2",
+"< c #5A5A5B",
+"> c #C6C6C6",
+", c #535353",
+". c #BEBABE",
+"| c #CECECE",
+"@ c #AAAAA6",
+"~ c #696969",
+"' c #424242",
+"? c #BABAB6",
+"0 c #797979",
+"1 c #4D4D4D",
+"2 c #827D82",
+"3 c #939393",
+"4 c #626262",
+"5 c #696965",
+" ",
+" !!!# ",
+" $%&%/!!! ",
+" ##%()&=+! ",
+" !**()&=-# ",
+" !*(%%&=![! ",
+" !]{-+%}/[<[[ ",
+" })%%%+>-{{<[<, ",
+"$.|+%)%%%%%@~,' ",
+"$-??#.|+%@0~,1' ",
+"<[23$$$!45<1'4 ",
+"444<,~23<,''3 ",
+"#30[[[~~''4 ",
+" #304'3 ",
+" "};
diff --git a/icons/README b/icons/README
new file mode 100644
index 0000000..0d1b9fe
--- /dev/null
+++ b/icons/README
@@ -0,0 +1,50 @@
+Gentooicons Oct 17 1999
+========================
+
+General
+-------
+All icons were hand-crafted by Johan Hanson <johan@tiq.com>, originally
+for the file manager Gentoo by Emil Brink.
+
+The latest version of these icons can be found at
+"http://www.obsession.se/johan/gentooicons.html".
+Gentoo can be found at "http://www.obsession.se/gentoo/".
+
+I would be happy to recieve any comments and/or icons that you may have
+based on my work. A version in size 32x32 is *not* under way, but I have
+made a few images that you can get if you mail me.
+
+If you think you can do better than me, don't hesitate to send your
+artwork to me and maybe it will be included in the next release.
+I'm actually not an artist, just a programmer that believes he has a
+sense for style. =)
+
+Try my GTK theme "Xenophilia". It is plain, grey, and very nice.
+It is implemented as a theme engine, thus it is faster than pixmap
+themes. You can find it at http://www.obsession.se/johan/gtk.html
+
+Further distribution
+--------------------
+If you want to redistribute icons from this package, please consider
+distributing the whole package. (including this README)
+Also, I would be happy to recieve an email about your redistribution.
+Those things are not required, but they strenghten my ego. =)
+
+Acknowledgements
+----------------
+A lot of the motives have been taken from:
+GNOME icons by Tigert (Tuomas Kuosmanen), MarcoIcons by Marco van
+Hylckama Vlieg, MagicWB by Martin Huttenloher, BeOS by Be Inc., Atari
+control panel by Atari corp.(RIP), ACDSee icons by ACD Systems, Ltd.,
+Copilot icon by Alan Chavis, GNUstep 3D icon by Andrea Mistrali.
+Some of these have in turn borrowed images from other collections.
+
+License
+-------
+Copyright (C) 1998 Johan Hanson.
+
+The images are free software. You may redistribute and/or modify
+them under the terms of the GNU General Public License, version
+2 or later. See the file [../]COPYING for details.
+
+Logos and trademarks belong to their respective organisations.
diff --git a/icons/Readme.xpm b/icons/Readme.xpm
new file mode 100644
index 0000000..8799e47
--- /dev/null
+++ b/icons/Readme.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * Readme_xpm[] = {
+"16 15 14 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #757DB2",
+"/ c #495196",
+"( c #D2D2E7",
+") c #A6AACA",
+"= c #202020",
+"+ c #C2C2C2",
+"* c #A2A2A2",
+"- c #828282",
+"[ c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$&//&$$$$% ",
+" !$$(//$(//($$% ",
+" !$$////////$$% ",
+" !$&//)$(///&$% ",
+" !$////$(////$% ",
+" !$////$(////$% ",
+" !$&///$(///&$% ",
+" !$$//)$$)//$$% ",
+" !$$(//////!!!= ",
+" !$$$$&//&$!$+# ",
+" !$$$$$$$$*-+#* ",
+" !$$$$$$[+!+#- ",
+" #%%%%%%%%=#* "};
diff --git a/icons/SCSI.xpm b/icons/SCSI.xpm
new file mode 100644
index 0000000..6e410a8
--- /dev/null
+++ b/icons/SCSI.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *SCSI[] = {
+/* width height num_colors chars_per_pixel */
+" 16 15 12 1",
+/* colors */
+". c None",
+"# c #404040",
+"a c #606060",
+"b c #808080",
+"c c #a0a0a0",
+"d c #aaaaaa",
+"e c #b0b0b0",
+"f c #b8b8b8",
+"g c #cfcfcf",
+"h c #dddddd",
+"i c #f0f0f0",
+"j c #ffffff",
+/* pixels */
+"................",
+"......cc........",
+".....cjic.......",
+"....cjggic......",
+"...cjg#bgic.....",
+"..cjg#bhbgic....",
+".cjg#bcccbgiccc.",
+"cjg#bcjjiiiiiigf",
+"cigbhchcbbigaaab",
+".cigb..cjig#bbbd",
+"..cigbcjig#bc...",
+"...cigbig#bc....",
+"....cigg#bc.....",
+".....ci#bc......",
+"......cec......."
+};
diff --git a/icons/SoundCard.xpm b/icons/SoundCard.xpm
new file mode 100644
index 0000000..4400175
--- /dev/null
+++ b/icons/SoundCard.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char * SoundCard2_xpm[] = {
+"16 15 37 1",
+". c #000000",
+"# c None",
+"a c #002000",
+"b c #004100",
+"c c #006100",
+"d c #008200",
+"e c #319231",
+"f c #3F3F3F",
+"g c #404040",
+"h c #419641",
+"i c #4D9A4D",
+"j c #616161",
+"k c #618261",
+"l c #65A265",
+"m c #7F7F7F",
+"n c #828282",
+"o c #919191",
+"p c #9C9C9C",
+"q c #A2A2A2",
+"r c #A6B6A6",
+"s c #B2B2B2",
+"t c #BCBCBC",
+"u c #C1C1C1",
+"v c #C6CA79",
+"w c #C8C8C8",
+"x c #CDDACD",
+"y c #D6D6D6",
+"z c #D1E9D1",
+"A c #D5D89C",
+"B c #DCDCDC",
+"C c #E3E3E3",
+"D c #E4ECE4",
+"E c #EBF5EB",
+"F c #EDEDED",
+"G c #F5F5F5",
+"H c #F6F6E8",
+"I c #FCFDFC",
+"###wBFIGC#######",
+"##BGpjf.G#######",
+"##G.gnt.Dk######",
+"##G.tmf.Gcbk####",
+"##I.gno.Erhcbk##",
+"##D.IGI.FeridIbk",
+"##I.IGI.Eu.lIynb",
+"yII.Iw..I..Iy.yj",
+"Gy..Iq.ny.Iy.yj#",
+"Gs.nBHFzdIyyyj##",
+"yGGxAjvuIy.yj###",
+"####bvaIy.yj####",
+"#####buIyyj#####",
+"######Iynj######",
+"#######n########"};
diff --git a/icons/Source.xpm b/icons/Source.xpm
new file mode 100644
index 0000000..ef0df9d
--- /dev/null
+++ b/icons/Source.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * Source_xpm[] = {
+"16 15 12 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #DBEFF3",
+"% c #000000",
+"& c #FFFFFF",
+"/ c #202020",
+"( c #C2C2C2",
+") c #A2A2A2",
+"= c #828282",
+"+ c #CEE7EB",
+"* c #B2C6CA",
+"!!!!!!!!!!!!!!!#",
+"!$$$$$$$$$$$$$$%",
+"!$#$$$$$$$$$$#$%",
+"!&&&&&&&&&&&&&&%",
+"!&#&&&&&&&&&&#&%",
+"!$$$$$$$$$$$$$$%",
+"!$#$$$$$$$$$$#$%",
+"!&&&&&&&&&&&&&&%",
+"!&#&&&&&&&&&&#&%",
+"!$$$$$$$$$$$$$$%",
+"!$#$$$$$$$$$!!!/",
+"!&&&&&&&&&&&!&(#",
+"!&#&&&&&&&&)=(#)",
+"!$$$$$$$$+*!(#= ",
+"#%%%%%%%%%%/#) "};
diff --git a/icons/Speaker.xpm b/icons/Speaker.xpm
new file mode 100644
index 0000000..3fa0fe3
--- /dev/null
+++ b/icons/Speaker.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * Speaker_xpm[] = {
+"16 15 52 1",
+" c None",
+"! c #595959",
+"# c #867D71",
+"$ c #716955",
+"% c #CECECE",
+"& c #ACACAC",
+"/ c #9A968E",
+"( c #717171",
+") c #C4C4C4",
+"= c #BCBCBC",
+"+ c #B2B2B2",
+"* c #AEAAA2",
+"- c #8A8A86",
+"[ c #796949",
+"] c #000000",
+"{ c #7D7D7D",
+"} c #A6A6A6",
+"< c #D4D4D4",
+"> c #939393",
+", c #756D69",
+". c #AAA296",
+"| c #554D49",
+"@ c #B6AEAA",
+"~ c #6D6961",
+"' c #D7CEC6",
+"? c #715D3D",
+"0 c #736965",
+"1 c #C2BEBA",
+"2 c #848484",
+"3 c #6D6D6D",
+"4 c #EBE3DF",
+"5 c #F7EBE3",
+"6 c #FFFFFB",
+"7 c #DFDFDF",
+"8 c #B6AAA6",
+"9 c #B2A69E",
+"A c #C2B2A6",
+"B c #DBD7CE",
+"C c #B6B2AE",
+"D c #797171",
+"E c #8A827D",
+"F c #7D7975",
+"G c #4D4D4D",
+"H c #655D5D",
+"I c #A29A96",
+"J c #71716D",
+"K c #9A9A9A",
+"L c #181818",
+"M c #615D55",
+"N c #555149",
+"O c #554939",
+"P c #2D2820",
+" ",
+" !! ",
+" #$! %& ",
+" #/#( )=+ ",
+"*--[ ]/{ %} <>= ",
+",..|]]@> <&&<}} ",
+"~''?]01> )2))> ",
+"344(56=> 72 72 ",
+"089?ABC{ )2))> ",
+"DEFG]HIJ %&&<}} ",
+"KGGL ]FM %} <>= ",
+" G NO )=+ ",
+" GPP %& ",
+" ]] ",
+" "};
diff --git a/icons/Speaker2.xpm b/icons/Speaker2.xpm
new file mode 100644
index 0000000..86dbeab
--- /dev/null
+++ b/icons/Speaker2.xpm
@@ -0,0 +1,72 @@
+/* XPM */
+static char * Speaker2_xpm[] = {
+"16 15 54 1",
+" c None",
+"! c #595959",
+"# c #867D71",
+"$ c #716955",
+"% c #CBCBCB",
+"& c #D7D7D7",
+"/ c #DFDFDF",
+"( c #6D6D6D",
+") c #000000",
+"= c #9A968E",
+"+ c #717171",
+"* c #A2A2A2",
+"- c #828282",
+"[ c #616161",
+"] c #313131",
+"{ c #AEAAA2",
+"} c #8A8A86",
+"< c #796949",
+"> c #7D7D7D",
+", c #756D69",
+". c #AAA296",
+"| c #554D49",
+"@ c #B6AEAA",
+"~ c #939393",
+"' c #6D6961",
+"? c #D7CEC6",
+"0 c #715D3D",
+"1 c #736965",
+"2 c #C2BEBA",
+"3 c #EBE3DF",
+"4 c #F7EBE3",
+"5 c #FFFFFB",
+"6 c #BEBEBE",
+"7 c #B6AAA6",
+"8 c #B2A69E",
+"9 c #C2B2A6",
+"A c #DBD7CE",
+"B c #B6B2AE",
+"C c #414141",
+"D c #797171",
+"E c #8A827D",
+"F c #7D7975",
+"G c #4D4D4D",
+"H c #655D5D",
+"I c #A29A96",
+"J c #71716D",
+"K c #9A9A9A",
+"L c #181818",
+"M c #615D55",
+"N c #C2C2C2",
+"O c #555149",
+"P c #554939",
+"Q c #202020",
+"R c #2D2820",
+" ",
+" !! ",
+" #$!%&////()",
+" #=#+*-[[])])",
+"{}}< )=>%&/)(/%)",
+",..|))@~*-[)[[-)",
+"'??0)12~%&/)//%)",
+"(33+456~*-[)[[-)",
+"17809AB>%&/)/C))",
+"DEFG)HIJ*-[)[))C",
+"KGGL )FMNC))//%N",
+" G OP*))Q[[-*",
+" GRR%&////&%",
+" )) ",
+" "};
diff --git a/icons/Spreadsheet.xpm b/icons/Spreadsheet.xpm
new file mode 100644
index 0000000..dd84839
--- /dev/null
+++ b/icons/Spreadsheet.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * Spreadsheet_xpm[] = {
+"16 15 13 1",
+". c #000000",
+"# c None",
+"a c #202020",
+"b c #353535",
+"c c #404040",
+"d c #606060",
+"e c #6B6B6B",
+"f c #808080",
+"g c #A0A0A0",
+"h c #C0C0C0",
+"i c #D6D6D6",
+"j c #DEDEDE",
+"k c #FFFFFF",
+"kkkikkkikkkikkke",
+"khhekhhekhhekhh.",
+"geebebbbebbbebb.",
+"kkkekkkhkkkhkkk.",
+"khhbkkkhkkkhkkk.",
+"geebhhhhhhhhhhh.",
+"kkkekkkhkkkhkkk.",
+"khhbkkkhkkkhkkk.",
+"geebhhhhhhhhhhh.",
+"kkkekkkhkkkhkkk.",
+"khhbkkkhkkkhddda",
+"geebhhhhhhhhdkhc",
+"kkkekkkhkkkgfhcg",
+"khhbkkkhkjhdhcf#",
+"b..........acg##"};
diff --git a/icons/Tape.xpm b/icons/Tape.xpm
new file mode 100644
index 0000000..3315ef9
--- /dev/null
+++ b/icons/Tape.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * Tape_xpm[] = {
+"16 15 13 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #B2B2C2",
+"% c #515161",
+"& c #000000",
+"/ c #202020",
+"( c #313131",
+") c #49494D",
+"= c #A2A2AE",
+"+ c #79798A",
+"* c #656579",
+"- c #51515D",
+" ",
+" ",
+"!!!!!!!!!!!!!!!#",
+"!$%$####%%#####&",
+"#&&&&&&&&&&&&&&&",
+"!#!!!!!!!!!!!!#&",
+"!/#//////////#/&",
+"!/(&)=)&/+=)*)/&",
+"!//&=&=&&=&=*-/&",
+"!/(&)=)&/+=+*)/&",
+"!/#!!!!!!!!!!#/&",
+"!/############/&",
+"#&&&&&&&&&&&&&&&",
+" ",
+" "};
diff --git a/icons/VRML.xpm b/icons/VRML.xpm
new file mode 100644
index 0000000..a4818ef
--- /dev/null
+++ b/icons/VRML.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char * VRML2_xpm[] = {
+"16 15 29 1",
+". c #000000",
+"# c None",
+"a c #002915",
+"b c #003118",
+"c c #003040",
+"d c #003D1B",
+"e c #00421E",
+"f c #004820",
+"g c #005470",
+"h c #007135",
+"i c #0078A0",
+"j c #008840",
+"k c #0091BC",
+"l c #00AAD8",
+"m c #1E9154",
+"n c #202020",
+"o c #2D965B",
+"p c #300008",
+"q c #303030",
+"r c #4D9E73",
+"s c #4EA075",
+"t c #500010",
+"u c #50A075",
+"v c #6D6D6D",
+"w c #74AA8C",
+"x c #7DAC92",
+"y c #80AD94",
+"z c #919191",
+"A c #A00020",
+"################",
+"######zn.nz#####",
+"#####vqdfhqz####",
+"#####nafhjhn####",
+"#####.befhgll###",
+"##AAA.abefcikll#",
+"##pAAA.abacgiik#",
+"##ppAAA..nzciirj",
+"#jppttt####cg#jj",
+"sjppttt######ujw",
+"jj#pttt#####rjw#",
+"jjsy######wjmw##",
+"sjj#uy##yjjo####",
+"#j###ujjmx######",
+"################"};
diff --git a/icons/Windows.xpm b/icons/Windows.xpm
new file mode 100644
index 0000000..d44e360
--- /dev/null
+++ b/icons/Windows.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char * Windows_xpm[] = {
+"16 15 34 1",
+" c None",
+"! c #828282",
+"# c #414141",
+"$ c #AAAAAA",
+"% c #C6A29A",
+"& c #D2614D",
+"/ c #000000",
+"( c #202020",
+") c #141414",
+"= c #CA8275",
+"+ c #D74128",
+"* c #3D2D28",
+"- c #411C14",
+"[ c #2D6520",
+"] c #8E2D1C",
+"{ c #69B255",
+"} c #59AA45",
+"< c #9EAEBE",
+"> c #20351C",
+", c #598ABE",
+". c #7D9EBE",
+"| c #3979BE",
+"@ c #283139",
+"~ c #182839",
+"' c #284D75",
+"? c #2D5520",
+"0 c #3D7131",
+"1 c #3975B6",
+"2 c #49411C",
+"3 c #A68E31",
+"4 c #7D6920",
+"5 c #51657D",
+"6 c #FFD745",
+"7 c #555555",
+" ",
+" ",
+" !! ",
+" !#!$ ",
+" %%&!#/#()#!$ ",
+" !!$=%+*-++-[/ ",
+" !#!+=/]++/{}/ ",
+" < !/#/(-]>}}/ ",
+"!! ,.|@~|'//?0# ",
+" !#<|./'1'234>! ",
+" !/|5/~'~366/ ",
+" !/#///363# ",
+" $!7/2! ",
+" !/ ",
+" "};
diff --git a/icons/aiff.xpm b/icons/aiff.xpm
new file mode 100644
index 0000000..6c8edb9
--- /dev/null
+++ b/icons/aiff.xpm
@@ -0,0 +1,48 @@
+/* XPM */
+static char * aiff_xpm[] = {
+"16 15 30 1",
+" c None",
+"! c #D4D5D4",
+"# c #DEDEDE",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #CECECE",
+"/ c #EFF7BE",
+"( c #E7E7E7",
+") c #CACE9A",
+"= c #354500",
+"+ c #9AAE5D",
+"* c #96A655",
+"- c #DBE3AA",
+"[ c #8AA629",
+"] c #E7F3E7",
+"{ c #617D01",
+"} c #8EAA2D",
+"< c #5D7900",
+"> c #5D632D",
+", c #557100",
+". c #829E24",
+"| c #516900",
+"@ c #8EAA31",
+"~ c #597100",
+"' c #929A61",
+"? c #A2A671",
+"0 c #B6BE86",
+"1 c #394108",
+"2 c #F7F7F7",
+"3 c #C6C6C6",
+" ! ",
+" #$# ",
+" #$%$! ",
+" !$$%$# & ",
+" !$%/%$$(!#$# ",
+" !$$%)=)%$$$%$!",
+"($$%/=+=*%-%-=$(",
+"$[]{}<[<[>[,[{]$",
+"==%.|@~}~'|}>}[=",
+"$${/%-=?=0%-1-[$",
+"!#($%$%)=-$/%$$!",
+" &!$$%/%$2$%$! ",
+" !($$%$##$! ",
+" 3!$%$! & ",
+" !$! "};
diff --git a/icons/au.xpm b/icons/au.xpm
new file mode 100644
index 0000000..6a8e797
--- /dev/null
+++ b/icons/au.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char * au_xpm[] = {
+"16 15 27 1",
+" c None",
+"! c #D4D5D4",
+"# c #DEDEDE",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #CECECE",
+"/ c #FFE3F3",
+"( c #E7E7E7",
+") c #FFA6D7",
+"= c #711845",
+"+ c #DB7DAE",
+"* c #D275A6",
+"- c #FFC6E3",
+"[ c #C66D9A",
+"] c #A24575",
+"{ c #CE71A2",
+"} c #9E4171",
+"< c #963B69",
+"> c #CA6D9E",
+", c #A24975",
+". c #C26596",
+"| c #923565",
+"@ c #9A3D6D",
+"~ c #CA719E",
+"' c #EF96C2",
+"? c #F7F7F7",
+"0 c #C6C6C6",
+" ! ",
+" #$# ",
+" #$%$! ",
+" !$$%$# & ",
+" !$%/%$$(!#$# ",
+" !$$%)=)%$$$%$!",
+"($$%/=+=*%-%-=$(",
+"$[/]{}[}[<><>,/$",
+"==%.|{@{<~|{<{[=",
+"$$]/%-=+='%-=-[$",
+"!#($%$%)=-$/%$$!",
+" &!$$%/%$?$%$! ",
+" !($$%$##$! ",
+" 0!$%$! & ",
+" !$! "};
diff --git a/icons/avi.xpm b/icons/avi.xpm
new file mode 100644
index 0000000..2e843b9
--- /dev/null
+++ b/icons/avi.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char * avi2_xpm[] = {
+"16 15 37 1",
+". c #000000",
+"# c None",
+"a c #404040",
+"b c #800000",
+"c c #808080",
+"d c #980C00",
+"e c #9D3A2D",
+"f c #9C563E",
+"g c #A02000",
+"h c #A03D30",
+"i c #A35C44",
+"j c #A34032",
+"k c #AB634A",
+"l c #AE6F5C",
+"m c #B01800",
+"n c #B0684F",
+"o c #B5391D",
+"p c #B66C53",
+"q c #B93D21",
+"r c #BA7057",
+"s c #BD735A",
+"t c #C02000",
+"u c #C06250",
+"v c #C0755C",
+"w c #C4795F",
+"x c #C57B61",
+"y c #C87C64",
+"z c #CC8066",
+"A c #CE8369",
+"B c #D1856B",
+"C c #D68A6F",
+"D c #D7735F",
+"E c #D78B70",
+"F c #DF8F7F",
+"G c #EFC7BF",
+"H c #F7E3DF",
+"I c #FFFFFF",
+"##.#a........a#.",
+"##...ffiiikkn...",
+"##.#afiiikknpa#.",
+"#uteetototqpp...",
+"uFIFgItIbIgpsa#.",
+"tIbIbGFGdIbss...",
+"tIIIbDHDmIbsva#.",
+"tIbIbtIbtIb.....",
+"ugegeegehgjxya#.",
+"##...prsvwxyz...",
+"##.#arsvxxyABac.",
+"##...svxyzBB...a",
+"##.#avxyzBBEl.a#",
+"##...xyzABCc..c#",
+"##.#a.......a###"};
diff --git a/icons/bmp.xpm b/icons/bmp.xpm
new file mode 100644
index 0000000..a205463
--- /dev/null
+++ b/icons/bmp.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * bmp_xpm[] = {
+"16 15 11 1",
+". c #000000",
+"# c None",
+"a c #201810",
+"b c #403020",
+"c c #555555",
+"d c #806040",
+"e c #999999",
+"f c #AAAAAA",
+"g c #BFAF9F",
+"h c #DFDFDF",
+"i c #FFFFFF",
+"################",
+"##ihhhhhhhhhhf##",
+"##heeeeeeeeeec##",
+"bbbbbbbbbbbbbbba",
+"bdddddddddddddd.",
+"biigdidddidiigd.",
+"bididiidiididid.",
+"biigdigigidiigd.",
+"bidididgdididdd.",
+"biigdidddididdd.",
+"bdddddddddddddd.",
+"a...............",
+"##heeeeeeeeeec##",
+"##fccccccccccc##",
+"################"};
diff --git a/icons/bmp2.xpm b/icons/bmp2.xpm
new file mode 100644
index 0000000..f0c8e01
--- /dev/null
+++ b/icons/bmp2.xpm
@@ -0,0 +1,73 @@
+/* XPM */
+static char * _bmp2_xpm[] = {
+"16 15 55 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #2D2216",
+"f c #302418",
+"g c #334455",
+"h c #381700",
+"i c #3F3F4F",
+"j c #413120",
+"k c #441100",
+"l c #4F3C27",
+"m c #503C28",
+"n c #555565",
+"o c #582400",
+"p c #604830",
+"q c #652900",
+"r c #7799AA",
+"s c #7B3607",
+"t c #806040",
+"u c #856950",
+"v c #875834",
+"w c #876649",
+"x c #8A694C",
+"y c #8C4718",
+"z c #99AACC",
+"A c #9B5627",
+"B c #A7A7B7",
+"C c #AC6738",
+"D c #B08868",
+"E c #BD7849",
+"F c #BFAF9F",
+"G c #CCCCEE",
+"H c #CDBAAD",
+"I c #CDC1B9",
+"J c #D08B5C",
+"K c #D9CBC1",
+"L c #DA9566",
+"M c #DC9A6E",
+"N c #E4C2AA",
+"O c #EBA677",
+"P c #ECA778",
+"Q c #ECC3A7",
+"R c #EEAD81",
+"S c #F2B184",
+"T c #F0F0FF",
+"U c #F3C3A1",
+"V c #F3B68C",
+"W c #F5F0F0",
+"X c #FEC39A",
+"Y c #FFE0D5",
+"Z c #FFE2CE",
+"0 c #FFFFFF",
+"QVOOPPOOOOVVXN##",
+"JAqhhhqsyCJORVXN",
+"OCbabbcchosCJMVX",
+"QXEboHKGTrdkoAOS",
+"#UXssKWn...iyoyO",
+"#QXJyLWid.diWCoJ",
+"#IUXOLYzdggBWOEO",
+"##NXXOSZZWWWOOVX",
+"eppuDpXOJpvppwXX",
+"p00Ft0pXp0m00Fx#",
+"p0t0j00p00j0t0j#",
+"p00Ft0F0F0j00Fj#",
+"p0t0j0jFp0j0jj##",
+"p00Ft0ljp0j0je##",
+"emjjeme#ememf###"};
diff --git a/icons/c.xpm b/icons/c.xpm
new file mode 100644
index 0000000..2c73788
--- /dev/null
+++ b/icons/c.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * c2_xpm[] = {
+"16 15 25 1",
+". c #000000",
+"# c #0000C6",
+"a c #1C1FCC",
+"b c #202020",
+"c c #2121CD",
+"d c #2F34D0",
+"e c #3336D1",
+"f c #3838D2",
+"g c #404040",
+"h c #606060",
+"i c #6671DA",
+"j c #7878E0",
+"k c #7D8AE0",
+"l c #808080",
+"m c #9CADE6",
+"n c #A0A0A0",
+"o c #B0C7CA",
+"p c #B8B8EF",
+"q c #C0C0C0",
+"r c #CEE5E8",
+"s c #D4EBF2",
+"t c #D8EFF2",
+"u c #F6F6FD",
+"v c None",
+"w c #FFFFFF",
+"hhhhhhhhhhhhhhhg",
+"htttttttttttttt.",
+"htgttttttttttgt.",
+"hwwwwjc#cjwwwww.",
+"hwgwp#####pwwgw.",
+"httte#iti#dtttt.",
+"htgt##sttttttgt.",
+"hwww##uwwwwwwww.",
+"hwgwf#jwj#ewwgw.",
+"htttm#####mtttt.",
+"htgttka#aitthhhb",
+"hwwwwwwwwwwwhwqg",
+"hwgwwwwwwwwnlqgn",
+"httttttttrohqglv",
+"g..........bgnvv"};
diff --git a/icons/class.xpm b/icons/class.xpm
new file mode 100644
index 0000000..e9c238e
--- /dev/null
+++ b/icons/class.xpm
@@ -0,0 +1,96 @@
+/* XPM */
+static char * class2_xpm[] = {
+"16 15 78 2",
+".. c None",
+".# c #4637B4",
+".a c #4B3DB5",
+".b c #4B409E",
+".c c #4E41B8",
+".d c #4F4693",
+".e c #50459F",
+".f c #5244BA",
+".g c #52489A",
+".h c #5649BB",
+".i c #564CA4",
+".j c #564D97",
+".k c #5A5392",
+".l c #5D549B",
+".m c #5B548D",
+".n c #625B93",
+".o c #605A8F",
+".p c #6156B8",
+".q c #6159A1",
+".r c #645AAC",
+".s c #6B64A4",
+".t c #6B6693",
+".u c #6E63C2",
+".v c #6E6994",
+".w c #716C94",
+".x c #774A90",
+".y c #7772A1",
+".z c #793474",
+".A c #7970BE",
+".B c #7B73B7",
+".C c #7D4B95",
+".D c #7D7998",
+".E c #81547A",
+".F c #847ACE",
+".G c #8B75C3",
+".H c #8F2C73",
+".I c #9164AE",
+".J c #983156",
+".K c #9A5CA1",
+".L c #9F2F3B",
+".M c #9F4E59",
+".N c #A03743",
+".O c #A13A46",
+".P c #A04A54",
+".Q c #A36E74",
+".R c #A37177",
+".S c #A4404B",
+".T c #AA1A2A",
+".U c #A87C81",
+".V c #A92433",
+".W c #A98589",
+".X c #AC2761",
+".Y c #AC2C3A",
+".Z c #AD1728",
+".0 c #AD303E",
+".1 c #AE5A63",
+".2 c #B02333",
+".3 c #B43D4A",
+".4 c #B71326",
+".5 c #B71E2F",
+".6 c #BB4451",
+".7 c #B92738",
+".8 c #B93644",
+".9 c #BA1A2C",
+"#. c #BC2D3D",
+"## c #BC2032",
+"#a c #BC2241",
+"#b c #BC414F",
+"#c c #C20D22",
+"#d c #C23661",
+"#e c #C93143",
+"#f c #CB3A4B",
+"#g c #CB5866",
+"#h c #D41D32",
+"#i c #DD6A77",
+"#j c #DE2E42",
+"#k c #E0152C",
+"#l c #E53F52",
+".............P#l#l#l............",
+".......Y.T.N.3.......6..........",
+".....S.9...7.1.W....#i..........",
+".....5.T...Y.0#....4#i.R........",
+".....V.Z.L#f#c#k#g.8.T..........",
+".....V..#.#h#h.6#e.Q.V..........",
+".......2.O#j#b##.P...O..........",
+".........M..#d#a#..U............",
+".......g.a.G.K.X.E.J.l.a.a.d....",
+".......a.a.C.I.z.H.x.a.k.g.a....",
+".........p.a.a.a.a.y...s.a.n....",
+".........a.i.g.A.F.B...r.t......",
+"...........a.a.a.c..............",
+"...q.e.s.v.o.j.l.n.t.w.n.l.D....",
+".....m.b.f.#.a.a.a.h.u.k.t......"};
diff --git a/icons/conf.xpm b/icons/conf.xpm
new file mode 100644
index 0000000..344e288
--- /dev/null
+++ b/icons/conf.xpm
@@ -0,0 +1,84 @@
+/* XPM */
+static char * conf_xpm[] = {
+"16 15 66 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #EBEBD7",
+"/ c #1A1A0C",
+"( c #3B3B21",
+") c #33331C",
+"= c #9E9E9A",
+"+ c #EFEBB2",
+"* c #656339",
+"- c #DFDC8C",
+"[ c #656141",
+"] c #121208",
+"{ c #5D594D",
+"} c #A2A29E",
+"< c #A6A269",
+"> c #F7F3BA",
+", c #EFEBA6",
+". c #EBE396",
+"| c #8A8651",
+"@ c #9A9A94",
+"~ c #DBD78E",
+"' c #F3EFB2",
+"? c #EBE79E",
+"0 c #DBD27D",
+"1 c #CECA71",
+"2 c #CAC671",
+"3 c #615D35",
+"4 c #969692",
+"5 c #D7CE7D",
+"6 c #828245",
+"7 c #414124",
+"8 c #BCB661",
+"9 c #B6AE55",
+"A c #5B5A33",
+"B c #717169",
+"C c #D7D7AE",
+"D c #D7D27D",
+"E c #71713D",
+"F c #2D2D18",
+"G c #9A964D",
+"H c #96964D",
+"I c #222210",
+"J c #C6C269",
+"K c #AAA251",
+"L c #8E8E4D",
+"M c #797949",
+"N c #6D6D41",
+"O c #51512D",
+"P c #828275",
+"Q c #A6A251",
+"R c #A29E59",
+"S c #7D7D45",
+"T c #4B4B2A",
+"U c #737345",
+"V c #69693D",
+"W c #514D2D",
+"X c #202020",
+"Y c #D2D2CA",
+"Z c #414131",
+"a c #C2C2C2",
+"b c #A2A2A2",
+"c c #828282",
+"d c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$&/(()=$$$% ",
+" !$$&+*-[]{}$$% ",
+" !$$<>,.|)/]@$% ",
+" !$~'?-0123]4$% ",
+" !$&5-6789A]B$% ",
+" !$CD1EFGHAI($% ",
+" !$CJ8K/LMNOP$% ",
+" !$&CQGRS*TI@$% ",
+" !$$&UUVAW)!!!X ",
+" !$$$Y=T7Z$!$a# ",
+" !$$$$$$$$bca#b ",
+" !$$$$$$da!a#c ",
+" #%%%%%%%%X#b "};
diff --git a/icons/core.xpm b/icons/core.xpm
new file mode 100644
index 0000000..23cb240
--- /dev/null
+++ b/icons/core.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * core_xpm[] = {
+"16 15 8 1",
+". c None",
+"d c #828282",
+"b c #414141",
+"c c #000000",
+"e c #616161",
+"f c #202020",
+"a c #FFFF00",
+"# c #FF6D00",
+"...........#....",
+".......#........",
+".........#.#.#..",
+"..........#a#...",
+"........bcaaa#.#",
+".......cd.#a#...",
+"...ecccb.#.###..",
+"..ccfbfcc.......",
+".ecbebfcce.#...#",
+".cfebfcccc......",
+".cfbfcccfc......",
+".cffcccffc......",
+".eccccfbce......",
+"..cccfbcc.......",
+"...eccce........"};
diff --git a/icons/cpp.xpm b/icons/cpp.xpm
new file mode 100644
index 0000000..958281b
--- /dev/null
+++ b/icons/cpp.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *cpp[] = {
+/* width height num_colors chars_per_pixel */
+" 16 15 23 1",
+/* colors */
+". c #000000",
+"# c None",
+"a c #006051",
+"b c #116b5d",
+"c c #202020",
+"d c #24786b",
+"e c #2a7a6d",
+"f c #404040",
+"g c #478e85",
+"h c #56988f",
+"i c #606060",
+"j c #6aa69f",
+"k c #808080",
+"l c #83b7b3",
+"m c #8cbcb8",
+"n c #9ac0ba",
+"o c #a0a0a0",
+"p c #a5c6c0",
+"q c #b0c7ca",
+"r c #c0c0c0",
+"s c #cee5e8",
+"t c #d8eff2",
+"u c #ffffff",
+/* pixels */
+"iiiiiiiiiiiiiiif",
+"itttttttttttttt.",
+"itfttttttttttft.",
+"iuuuuneaenuuuuu.",
+"iufupaaaaapuufu.",
+"itttdahtlagtttt.",
+"itftaattettetft.",
+"iuuuaaueaeeaeuu.",
+"iufuaauueuueufu.",
+"itttdajtlagtttt.",
+"itftmaaaaamtiiic",
+"iuuuunbaenuuiurf",
+"iufuuuuuuuuokrfo",
+"ittttttttsqirfk#",
+"f..........cfo##"
+};
diff --git a/icons/deb.xpm b/icons/deb.xpm
new file mode 100644
index 0000000..3761904
--- /dev/null
+++ b/icons/deb.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * deb_xpm[] = {
+"16 15 52 1",
+" c None",
+"! c #D4D4D4",
+"# c #E4E4E4",
+"$ c #F5F5F5",
+"% c #FEFEFE",
+"& c #EBBABA",
+"/ c #EBAAAE",
+"( c #EF9296",
+") c #D71C24",
+"= c #B28E92",
+"+ c #CDCDCD",
+"* c #FBDBDB",
+"- c #8A595D",
+"[ c #7D7D7D",
+"] c #A6A6A6",
+"{ c #CA757D",
+"} c #D7656D",
+"< c #C65559",
+"> c #828282",
+", c #554D9A",
+". c #929292",
+"| c #BA8E96",
+"@ c #DEDEDE",
+"~ c #FBD7DB",
+"' c #C6C6C6",
+"? c #B5B5B5",
+"0 c #AA5559",
+"1 c #BCBCBC",
+"2 c #ECECEC",
+"3 c #CE595D",
+"4 c #DB454D",
+"5 c #9E9E9E",
+"6 c #A67171",
+"7 c #AAAAAA",
+"8 c #E38286",
+"9 c #FFF7F7",
+"A c #EFAEB2",
+"B c #DF9A9E",
+"C c #C63139",
+"D c #D78E92",
+"E c #EB7579",
+"F c #F7CACA",
+"G c #C64951",
+"H c #CE797D",
+"I c #C68E92",
+"J c #E3DFE3",
+"K c #E7B2B2",
+"L c #D71C28",
+"M c #CE121C",
+"N c #B6454D",
+"O c #717171",
+"P c #A63949",
+" !#$%&/#%%$#! ",
+" !#%%())=+%%%#! ",
+"+#$%*)-[]{}#%$#+",
+"!$%%(<>,.|)]%%$!",
+"@$%~)>'%%%?#%%$@",
+"#%%(01%%%%%%%%%#",
+"2%%)[!%3+%%%%%%2",
+"2%%45$%67%%%%%%2",
+"2%%81%%##%9)2%%2",
+"#%%A+%%%%%BC?%%#",
+"@$%%2%%%%D)-?%$@",
+"!2%%%%E)))-?2%2!",
+"+@$F//)GHI+2%$@+",
+" +JKLMNOPMM2%J+ ",
+" +@??+!+??##+ "};
diff --git a/icons/eps.xpm b/icons/eps.xpm
new file mode 100644
index 0000000..5d9248f
--- /dev/null
+++ b/icons/eps.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * eps_xpm[] = {
+"16 15 25 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #412000",
+"/ c #9E4100",
+"( c #F38AB2",
+") c #EB5D96",
+"= c #E32871",
+"+ c #EF84AE",
+"* c #E74182",
+"- c #F7B2CE",
+"[ c #FBD7E7",
+"] c #DFDFDF",
+"{ c #EB5592",
+"} c #C2C2C2",
+"< c #EF7100",
+"> c #CECECE",
+", c #FFEBF3",
+". c #202020",
+"| c #F7AACA",
+"@ c #EB518E",
+"~ c #A2A2A2",
+"' c #828282",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$&$$% ",
+" !$$$$$$$$/$$$% ",
+" !$$$$$$$/$()=% ",
+" !$$$$$$/+*-[]% ",
+" !$$$$//{-$$}$% ",
+" !$$$$/=$$$}$$% ",
+" !$$$<{$$$}]>}% ",
+" !$$<+-$}}>>]$% ",
+" !$<,*$$}}$!!!. ",
+" !/$(|$}>$$!$}# ",
+" !$$@[}]>$~'}#~ ",
+" !$$=}$>]}!}#' ",
+" #%%%%%%%%.#~ "};
diff --git a/icons/exe.xpm b/icons/exe.xpm
new file mode 100644
index 0000000..b34197f
--- /dev/null
+++ b/icons/exe.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char * exe2_xpm[] = {
+"16 15 34 1",
+". c #000000",
+"# c #000080",
+"a c #0E0E0E",
+"b c #182E13",
+"c c #19334F",
+"d c #1F3F62",
+"e c #202020",
+"f c #2E5E92",
+"g c #305B25",
+"h c #404040",
+"i c #458336",
+"j c #606060",
+"k c #6E6E6E",
+"l c #732316",
+"m c #776521",
+"n c #777777",
+"o c #808080",
+"p c #812719",
+"q c #888888",
+"r c #919191",
+"s c #999999",
+"t c #9E301F",
+"u c #A0A0A0",
+"v c #AAAAAA",
+"w c #B3B3B3",
+"x c #BBBBBB",
+"y c #C0C0C0",
+"z c #D5D5D5",
+"A c #DDDDDD",
+"B c #E6E6E6",
+"C c #EEEEEE",
+"D c #F7D143",
+"E c #F7F7F7",
+"F c #FFFFFF",
+"oooooooooooooooo",
+"oyyyyyyyyyyyyyy.",
+"oy############o.",
+"oy######y#y#y#o.",
+"oyyyyyyyyyyyyyo.",
+"oyFEzzFFFFFFFFo.",
+"oyFCAyqquyAEFFo.",
+"oyFBAwrklpejyFo.",
+"oyEAxvketligjFo.",
+"oyCzzsrcdagbyFo.",
+"oyFCwnedfmDeEFo.",
+"oyFFFAyohemjFFo.",
+"oyFFFFFFFAoyFFo.",
+"oyooooooooooooo.",
+"o..............."};
diff --git a/icons/gentoo.png b/icons/gentoo.png
new file mode 100644
index 0000000..d2729d6
--- /dev/null
+++ b/icons/gentoo.png
Binary files differ
diff --git a/icons/gif.xpm b/icons/gif.xpm
new file mode 100644
index 0000000..d85f0d7
--- /dev/null
+++ b/icons/gif.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * gif_xpm[] = {
+"16 15 12 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #004900",
+"( c #002400",
+") c #009600",
+"= c #000000",
+"+ c #7DCA7D",
+"* c #BEE7BE",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)+!!*)!!!)!!!!=",
+"/)!)))))!))!)))=",
+"/)!)!!))!))!!!)=",
+"/)!))!))!))!)))=",
+"/)+!!+)!!!)!)))=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/gif2.xpm b/icons/gif2.xpm
new file mode 100644
index 0000000..27b93e7
--- /dev/null
+++ b/icons/gif2.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char * gif3_xpm[] = {
+"16 15 53 1",
+". c #000010",
+"# c None",
+"a c #004000",
+"b c #005000",
+"c c #006000",
+"d c #0F0600",
+"e c #130800",
+"f c #1C0B00",
+"g c #222232",
+"h c #306C30",
+"i c #334455",
+"j c #381700",
+"k c #3F3F4F",
+"l c #441100",
+"m c #555565",
+"n c #582400",
+"o c #5F7C25",
+"p c #608860",
+"q c #609060",
+"r c #652900",
+"s c #76933C",
+"t c #7799AA",
+"u c #7B3607",
+"v c #7EA14F",
+"w c #7FAF7F",
+"x c #7FCA7F",
+"y c #80A14E",
+"z c #8C4718",
+"A c #99AACC",
+"B c #9B5627",
+"C c #A7A7B7",
+"D c #AC6738",
+"E c #BD7849",
+"F c #BFD7BF",
+"G c #CCCCEE",
+"H c #CDBAAD",
+"I c #D08B5C",
+"J c #D9CBC1",
+"K c #DA9566",
+"L c #DC9A6E",
+"M c #EBA677",
+"N c #ECA778",
+"O c #ECC3A7",
+"P c #EEAD81",
+"Q c #F2B184",
+"R c #F0F0FF",
+"S c #F3C3A1",
+"T c #F3B68C",
+"U c #F5F0F0",
+"V c #FEC39A",
+"W c #FFE0D5",
+"X c #FFE2CE",
+"Y c #FFFFFF",
+"OTMMNNMMMMTTV###",
+"IBrjjjruzDIMPTV#",
+"MDedeeffjnuDILTV",
+"OVEenHJGRtglnBMQ",
+"#SVuuJUm...kznzM",
+"#OVIzKUkg.gkUDnI",
+"##SVMKWAgiiCUMEM",
+"###VVMQXXUUUMMTV",
+"#qccvycscccoMTVV",
+"qwYYFcYbYYYbVVV#",
+"cYaaacYaYaapV###",
+"cYaYYbYaYYxh####",
+"cYaaYaYaYab#####",
+"qwYYwbYaYa######",
+"#qbahqbhbh######"};
diff --git a/icons/h.xpm b/icons/h.xpm
new file mode 100644
index 0000000..50d3454
--- /dev/null
+++ b/icons/h.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *h[] = {
+/* width height num_colors chars_per_pixel */
+" 16 15 16 1",
+/* colors */
+". c #000000",
+"# c #202020",
+"a c #404040",
+"b c #606060",
+"c c #808080",
+"d c #a0a0a0",
+"e c #b0c7ca",
+"f c #c0c0c0",
+"g c #c600c6",
+"h c #cee5e8",
+"i c #d030d0",
+"j c #d8eff2",
+"k c #da66da",
+"l c #efb8ef",
+"m c None",
+"n c #ffffff",
+/* pixels */
+"bbbbbbbbbbbbbbba",
+"bjjjjjjjjjjjjjj.",
+"bjajjjjjjjjjjaj.",
+"bnnnnggnnnnnnnn.",
+"bnannggnnnnnnan.",
+"bjjjjggkgijjjjj.",
+"bjajjgggggijjaj.",
+"bnnnngglnggnnnn.",
+"bnannggnnggnnan.",
+"bjjjjggjjggjjjj.",
+"bjajjggjjggjbbb#",
+"bnnnnnnnnnnnbnfa",
+"bnannnnnnnndcfad",
+"bjjjjjjjjhebfacm",
+"a..........#admm"
+};
diff --git a/icons/html.xpm b/icons/html.xpm
new file mode 100644
index 0000000..742d860
--- /dev/null
+++ b/icons/html.xpm
@@ -0,0 +1,56 @@
+/* XPM */
+static char * html_xpm[] = {
+"16 15 38 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FEFFFF",
+"% c #000000",
+"& c #002C2D",
+"/ c #002D31",
+"( c #003434",
+") c #003539",
+"= c #00393B",
+"+ c #9AB2B2",
+"* c #004242",
+"- c #205959",
+"[ c #D7E3E3",
+"] c #A6BEBE",
+"{ c #004549",
+"} c #004A4A",
+"< c #DFE7E7",
+"> c #F7FBFB",
+", c #005252",
+". c #8EC6CA",
+"| c #8EB2B2",
+"@ c #00595A",
+"~ c #BED7D7",
+"' c #E3EFEF",
+"? c #005D61",
+"0 c #006161",
+"1 c #006D6D",
+"2 c #007575",
+"3 c #008282",
+"4 c #BEE3E3",
+"5 c #696969",
+"6 c #EFEFEF",
+"7 c #202020",
+"8 c #C2C2C2",
+"9 c #A2A2A2",
+"A c #DFDFDF",
+"B c #828282",
+" !!!!!!!!!!!!# ",
+" !$$$$$$$$$$$% ",
+" !$&&&&&&&&&$% ",
+" !$((((((((($% ",
+" !$*+$**-[]*$% ",
+" !${}<>},.},$% ",
+" !$,,.|>,.,,$% ",
+" !$@@.@~'.?0$% ",
+" !$12.334$11$% ",
+" !$(565%%%(2$% ",
+" !$%%%%%%%!!!7 ",
+" !$%%%%%%%!$8# ",
+" !$$$$$$$9!8#9 ",
+" !$$$$$A8!8#B ",
+" #%%%%%%%7#9 "};
diff --git a/icons/html2.xpm b/icons/html2.xpm
new file mode 100644
index 0000000..86f96dd
--- /dev/null
+++ b/icons/html2.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * html2_xpm[] = {
+"16 15 16 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #FFFF00",
+"/ c #EFEF6D",
+"( c #FF0000",
+") c #E7E7A6",
+"= c #FF7D00",
+"+ c #FF3D00",
+"* c #202020",
+"- c #C2C2C2",
+"[ c #A2A2A2",
+"] c #DFDFDF",
+"{ c #828282",
+" !!!!!!!!!!!!# ",
+" !$$$$$$$$$$$% ",
+" !$$$$$&$$$$$% ",
+" !$$$$/(/$$$$% ",
+" !$$$)=(=)$$$% ",
+" !)))/+(+/)))% ",
+" !)((((((((()% ",
+" !$)+(((((+)$% ",
+" !$$)=(((=)$$% ",
+" !$$)=(+(=)$$% ",
+" !$$/++&++!!!* ",
+" !$$/(/$/(!$-# ",
+" !$$&)$$$[!-#[ ",
+" !$$$$$]-!-#{ ",
+" #%%%%%%%*#[ "};
diff --git a/icons/iff.xpm b/icons/iff.xpm
new file mode 100644
index 0000000..ab6d143
--- /dev/null
+++ b/icons/iff.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * iff_xpm[] = {
+"16 15 10 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #7D1000",
+"( c #3D0800",
+") c #FF2400",
+"= c #000000",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)!))!!!!)!!!!)=",
+"/)!))!))))!))))=",
+"/)!))!!!))!!!))=",
+"/)!))!))))!))))=",
+"/)!))!))))!))))=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/iff2.xpm b/icons/iff2.xpm
new file mode 100644
index 0000000..1fee185
--- /dev/null
+++ b/icons/iff2.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char * iff3_xpm[] = {
+"16 15 48 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #334455",
+"f c #381700",
+"g c #3F3F4F",
+"h c #441100",
+"i c #555565",
+"j c #582400",
+"k c #652900",
+"l c #7799AA",
+"m c #7B3607",
+"n c #800000",
+"o c #8C4718",
+"p c #99AACC",
+"q c #9B5627",
+"r c #A02000",
+"s c #A7A7B7",
+"t c #A84830",
+"u c #AC6738",
+"v c #B7421B",
+"w c #BD7849",
+"x c #C02000",
+"y c #C16C5B",
+"z c #CCCCEE",
+"A c #CDBAAD",
+"B c #CE4524",
+"C c #D08B5C",
+"D c #D9CBC1",
+"E c #DA9566",
+"F c #DC9A6E",
+"G c #DF8F7F",
+"H c #EBA677",
+"I c #ECA778",
+"J c #ECC3A7",
+"K c #EEAD81",
+"L c #F2B184",
+"M c #F0F0FF",
+"N c #F3C3A1",
+"O c #F3B68C",
+"P c #F5F0F0",
+"Q c #FEC39A",
+"R c #FFE0D5",
+"S c #FFE2CE",
+"T c #FFFFFF",
+"JOHHIIHHHHOOQ###",
+"CqkfffkmouCHKOQ#",
+"HubabbccfjmuCFOQ",
+"JQwbjADzMldhjqHL",
+"#NQmmDPi...gojoH",
+"#JQCoEPgd.dgPujC",
+"##NQHERpdeesPHwH",
+"###QQHLSSPPPHHOQ",
+"yxyxxxBxxxvwHOQQ",
+"xTrTTTrTTTrQQQQ#",
+"xTnTnnrTnnrQQ###",
+"xTnTTGxTTGt#####",
+"xTnTnrxTnx######",
+"xTnTn#xTn#######",
+"yrtrt#yrt#######"};
diff --git a/icons/java.xpm b/icons/java.xpm
new file mode 100644
index 0000000..ec76406
--- /dev/null
+++ b/icons/java.xpm
@@ -0,0 +1,100 @@
+/* XPM */
+static char * java2_xpm[] = {
+"16 15 82 2",
+" c None",
+".. c #000000",
+".# c #202020",
+".a c #404040",
+".b c #433D76",
+".c c #4638B5",
+".d c #4B3DB6",
+".e c #5B4FBD",
+".f c #606060",
+".g c #756BC8",
+".h c #756CB7",
+".i c #786DC9",
+".j c #7D7ACC",
+".k c #808080",
+".l c #857BCE",
+".m c #8974BE",
+".n c #8F86D2",
+".o c #928AD3",
+".p c #943781",
+".q c #988ED1",
+".r c #9A6EB3",
+".s c #9B93D7",
+".t c #9F3678",
+".u c #A0A0A0",
+".v c #A4A3DB",
+".w c #A464A3",
+".x c #A65391",
+".y c #A69FDB",
+".z c #AEA8DE",
+".A c #B0C7CA",
+".B c #B2ACE0",
+".C c #B2B0C3",
+".D c #B6B0E2",
+".E c #BABEE4",
+".F c #C0C0C0",
+".G c #C1CBE8",
+".H c #C7D8EB",
+".I c #CCDBEC",
+".J c #CEE5E8",
+".K c #CFCBEC",
+".L c #D0CCEC",
+".M c #D1E4EF",
+".N c #D8EEF1",
+".O c #D9E1E4",
+".P c #D9E6EA",
+".Q c #DA8995",
+".R c #DB919D",
+".S c #DB97A2",
+".T c #DBA2AC",
+".U c #DCABB5",
+".V c #DC8592",
+".W c #DC9FAA",
+".X c #DCC9D0",
+".Y c #DE5768",
+".Z c #DE7987",
+".0 c #DF5264",
+".1 c #DF8C98",
+".2 c #E0152C",
+".3 c #E04053",
+".4 c #E05768",
+".5 c #E06B7A",
+".6 c #E1818E",
+".7 c #E36675",
+".8 c #E4B9CC",
+".9 c #E55F6F",
+"#. c #E6E4F5",
+"## c #E9606F",
+"#a c #E98596",
+"#b c #EB6473",
+"#c c #EB6877",
+"#d c #ECEBF8",
+"#e c #ED7381",
+"#f c #ED7886",
+"#g c #EF8994",
+"#h c #F1949E",
+"#i c #F197A1",
+"#j c #F1F0FA",
+"#k c #F3A3AC",
+"#l c #F8CCD1",
+"#m c #FEFEFE",
+"#n c #FCE6E8",
+"#o c #FCE8EB",
+".f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.a",
+".f.N.N.N.N.N.U.U.V.R.6.N.N.N.N..",
+".f.N.a.N.P.0.Q.2.X.N.T.N.N.a.N..",
+".f#m#m#m#k#c#i#g#g#n#f#l#m#m#m..",
+".f#m.a#m#h#c###b.2#e.2#o#m.a#m..",
+".f.N.N.N.W.U.4.2.7.5.Z.N.N.N.N..",
+".f.N.a.N.N.1.Y.9.3.S.O.T.N.a.N..",
+".f#m#m#m#m.K.D.w.t#a.8.d.n#d#m..",
+".f#m.a#m#m.d.d.r.x.p.d.v.d.b#m..",
+".f.N.N.N.N.I.d.q.d.m.G.d.j.H.N..",
+".f.N.a.N.N.M.g.d.d.d.E.v.f.f.f.#",
+".f#m#m#m.s.z.L.o.l.y#j#..f#m.F.a",
+".f#m.a#j.B.i.d.c.d.d.e.h.f.C.a.u",
+".f.N.N.N.N.N.N.N.N.J.A.f.F.a.k ",
+".a.....................#.a.u "};
diff --git a/icons/jpeg.xpm b/icons/jpeg.xpm
new file mode 100644
index 0000000..58f77fa
--- /dev/null
+++ b/icons/jpeg.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * jpeg_xpm[] = {
+"16 15 13 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #3D3D00",
+"( c #202000",
+") c #7D7D00",
+"= c #000000",
+"+ c #BEBE7D",
+"* c #DFDFBE",
+"- c #9E9E3D",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)!)!!+)!!)+!!)=",
+"/)!)!)!)!))!)))=",
+"/)!)!!+)!*)!-!)=",
+"/)!)!)))!))!)!)=",
+"/!*)!)))!!)+!+)=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/jpeg2.xpm b/icons/jpeg2.xpm
new file mode 100644
index 0000000..b1241f6
--- /dev/null
+++ b/icons/jpeg2.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char * jpg3_xpm[] = {
+"16 15 53 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #334455",
+"f c #381700",
+"g c #3F3F4F",
+"h c #404000",
+"i c #441100",
+"j c #505000",
+"k c #555565",
+"l c #582400",
+"m c #606000",
+"n c #652900",
+"o c #6C6C30",
+"p c #7799AA",
+"q c #7B3607",
+"r c #7E6218",
+"s c #87873F",
+"t c #8C4718",
+"u c #8C8C59",
+"v c #929265",
+"w c #99AACC",
+"x c #9B5627",
+"y c #A7A7B7",
+"z c #A8843F",
+"A c #A89358",
+"B c #AC6738",
+"C c #AFAF7F",
+"D c #B29351",
+"E c #BD7849",
+"F c #CCCCEE",
+"G c #CDBAAD",
+"H c #D08B5C",
+"I c #D7D7BF",
+"J c #D9CBC1",
+"K c #DA9566",
+"L c #DC9A6E",
+"M c #EBA677",
+"N c #ECA778",
+"O c #ECC3A7",
+"P c #EEAD81",
+"Q c #F2B184",
+"R c #F0F0FF",
+"S c #F3C3A1",
+"T c #F3B68C",
+"U c #F5F0F0",
+"V c #FEC39A",
+"W c #FFE0D5",
+"X c #FFE2CE",
+"Y c #FFFFFF",
+"OTMMNNMMMMTTV###",
+"HxnfffnqtBHMPTV#",
+"MBbabbccflqBHLTV",
+"OVEblGJFRpdilxMQ",
+"#SVqqJUk...gtltM",
+"#OVHtKUgd.dgUBlH",
+"##SVMKWwdeeyUMEM",
+"###VVMQXXUUUMMTV",
+"#vmAmmDzmmrmmmDV",
+"#mYjYYCmYYjCYYj#",
+"#mYhYmYhYhmYhhu#",
+"#mYhYYCjYIjYsYh#",
+"vmYhYhjmYhmYhYh#",
+"mYIhYh#mYYhCYCj#",
+"vjovjo#vjhomhjv#"};
diff --git a/icons/log.xpm b/icons/log.xpm
new file mode 100644
index 0000000..7271f51
--- /dev/null
+++ b/icons/log.xpm
@@ -0,0 +1,88 @@
+/* XPM */
+static char * log_xpm[] = {
+"16 15 70 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #61615D",
+"/ c #BE9E71",
+"( c #B28452",
+") c #D2B69A",
+"= c #E3D2C2",
+"+ c #F7EFEB",
+"* c #847155",
+"- c #AE824D",
+"[ c #A47B49",
+"] c #B58E5D",
+"{ c #C2A279",
+"} c #D2BE9E",
+"< c #E7DBC6",
+"> c #5D411C",
+", c #694924",
+". c #7B5A33",
+"| c #8E693D",
+"@ c #BA9463",
+"~ c #BA9A6D",
+"' c #BE9669",
+"? c #AE8E65",
+"0 c #968675",
+"1 c #715D41",
+"2 c #75593D",
+"3 c #AA7D49",
+"4 c #A67945",
+"5 c #A27549",
+"6 c #9C794B",
+"7 c #967149",
+"8 c #755935",
+"9 c #3D2810",
+"A c #1C1408",
+"B c #867D75",
+"C c #6D6559",
+"D c #554D41",
+"E c #7D6141",
+"F c #9E7549",
+"G c #8E6539",
+"H c #825D35",
+"I c #715535",
+"J c #694D31",
+"K c #553D24",
+"L c #140C04",
+"M c #DFDFDF",
+"N c #969494",
+"O c #757571",
+"P c #A68659",
+"Q c #7D5D39",
+"R c #65513D",
+"S c #4D3520",
+"T c #392818",
+"U c #312014",
+"V c #F7F7F5",
+"W c #8E6D49",
+"X c #797979",
+"Y c #A2A2A2",
+"Z c #BABABA",
+"a c #FBFBF7",
+"b c #DBD7C6",
+"c c #CECECE",
+"d c #E7E7E7",
+"e c #202020",
+"f c #EFEBE7",
+"g c #C2C2C2",
+"h c #828282",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" &/()=+$$$$$$$% ",
+" *-[]]-]{}<$$$% ",
+" >,.|[((]@~'?0% ",
+" 1..2|34566789A ",
+" !BCDEFGH.IJK9L ",
+" !MNOPQJRSSTUD% ",
+" !$V@WRXYZYNXX% ",
+" !$ab*XcdV$!!!e ",
+" !$$$f$$$V$!$g# ",
+" !$$$$$$$$Yhg#Y ",
+" !$$$$$$Mg!g#h ",
+" #%%%%%%%%e#Y "};
diff --git a/icons/m.xpm b/icons/m.xpm
new file mode 100644
index 0000000..7e88109
--- /dev/null
+++ b/icons/m.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * m2_xpm[] = {
+"16 15 16 1",
+" c None",
+". c #000000",
+"# c #0000C6",
+"a c #202020",
+"b c #3035D0",
+"c c #404040",
+"d c #606060",
+"e c #6671DA",
+"f c #808080",
+"g c #A0A0A0",
+"h c #B0C7CA",
+"i c #B8B8EF",
+"j c #C0C0C0",
+"k c #CEE5E8",
+"l c #D8EFF2",
+"m c #FFFFFF",
+"dddddddddddddddc",
+"dllllllllllllll.",
+"dlcllllllllllcl.",
+"dmmmmmmmmmmmmmm.",
+"dmcmmmmmmmmmmcm.",
+"dlll#eb#eb#elll.",
+"dlcl########lcl.",
+"dmmm##i##i##mmm.",
+"dmcm##m##m##mcm.",
+"dlll##l##l##lll.",
+"dlcl##l##l##ddda",
+"dmmmmmmmmmmmdmjc",
+"dmcmmmmmmmmgfjcg",
+"dllllllllkhdjcf ",
+"c..........acg "};
diff --git a/icons/man.xpm b/icons/man.xpm
new file mode 100644
index 0000000..42c7004
--- /dev/null
+++ b/icons/man.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * man2_xpm[] = {
+"16 15 50 2",
+".. c None",
+".# c #141612",
+".a c #2C2F28",
+".b c #34382F",
+".c c #3C4036",
+".d c #404439",
+".e c #45493E",
+".f c #484C40",
+".g c #50534B",
+".h c #505547",
+".i c #585D4F",
+".j c #5B6152",
+".k c #5C5F57",
+".l c #5D605A",
+".m c #60625C",
+".n c #646A5A",
+".o c #686F5E",
+".p c #69705E",
+".q c #6A6D67",
+".r c #6C7263",
+".s c #70726D",
+".t c #707865",
+".u c #73786C",
+".v c #787A74",
+".w c #78806C",
+".x c #798071",
+".y c #7C7E78",
+".z c #7E807C",
+".A c #7E8871",
+".B c #808080",
+".C c #82847E",
+".D c #849076",
+".E c #898B85",
+".F c #8C8C8A",
+".G c #8F938A",
+".H c #909090",
+".I c #90928E",
+".J c #90A080",
+".K c #989B94",
+".L c #999998",
+".M c #9DA099",
+".N c #A0A0A0",
+".O c #A0A19E",
+".P c #A8A8A6",
+".Q c #B0B1B0",
+".R c #B8B8B8",
+".S c #C1C2C1",
+".T c #CCCCCC",
+".U c #D0D0D0",
+".V c #D8D8D8",
+"...........M.K.G.E.C.x.u.r.n.M..",
+".........M.w.D.A.w.w.w.w.w.p.l..",
+".........n.J.D.a.o.b.w.w.w.c.B..",
+".......M.x.D.A.j.w.#.w.w.j.l.H.n",
+".......n.J.D.w.w.d.e.w.w.c.B.N.c",
+".....M.x.D.A.w.j.n.w.w.j.l.H.n.C",
+".....r.J.D.w.t.r.w.w.w.c.B.N.c..",
+"...M.x.D.A.w.f.j.w.w.j.l.H.n.C..",
+"...u.J.D.w.w.w.w.w.w.c.B.N.c....",
+".M.x.D.A.w.w.w.w.w.j.l.H.n.C....",
+".m.c.d.f.h.i.j.n.r.c.B.N.c......",
+".c.N.L.F.z.s.q.l.g.l.H.n.C......",
+".c.N.V.U.T.S.S.R.Q.H.N.c........",
+".C.k.q.y.E.I.O.Q.S.N.n.C........",
+".......P.O.I.E.v.s.m.g.........."};
diff --git a/icons/midi.xpm b/icons/midi.xpm
new file mode 100644
index 0000000..8fd45fb
--- /dev/null
+++ b/icons/midi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * midi_xpm[] = {
+"16 15 15 1",
+"j c #BEBEBE",
+"r c #616161",
+"a c #C3C3C3",
+"# c #CCCCCC",
+"m c #7D7D7D",
+"d c #DEDEDE",
+"q c #929292",
+"h c #393939",
+"n c #A2A2A2",
+"l c #595959",
+"i c #000000",
+"g c #D6D6D6",
+"o c #8E8E8E",
+". c #353535",
+"b c #B6B6B6",
+"###############a",
+"#gggggggggggggg#",
+"#gddborhigddddg#",
+"##ji.lmniaaaaa##",
+"#gdijqrhidddidg#",
+"aaai.lmniaaaiiaa",
+"#gdiddddidddiqr#",
+"aaaiaaaaiaaaiaaa",
+"#gdiddddidddidg#",
+"aaaiaariiaaaiaaa",
+"#riiddiirdddidg#",
+"#iiraaaaaariia##",
+"#dddddddddiirdd#",
+"#gggggggggggggg#",
+"a##############a"};
diff --git a/icons/mod.xpm b/icons/mod.xpm
new file mode 100644
index 0000000..6aba7c0
--- /dev/null
+++ b/icons/mod.xpm
@@ -0,0 +1,74 @@
+/* XPM */
+static char * mod_xpm[] = {
+"16 15 56 1",
+" c None",
+"! c #CBCBCB",
+"# c #E7E7E7",
+"$ c #D4D4D4",
+"% c #AEAEAE",
+"& c #8A8A8A",
+"/ c #6A6A6A",
+"( c #4B4B4B",
+") c #000000",
+"= c #ECECEC",
+"+ c #3B3B3B",
+"* c #9C9C9C",
+"- c #B2B2B2",
+"[ c #424242",
+"] c #DDDDDD",
+"{ c #FEFEFE",
+"} c #AAB6AA",
+"< c #BACABA",
+"> c #353535",
+", c #F5F5F5",
+". c #CED2CE",
+"| c #6D966D",
+"@ c #A2BAA2",
+"~ c #9CAE9C",
+"' c #CCDDCC",
+"? c #181818",
+"0 c #006100",
+"1 c #B6BEB6",
+"2 c #A5B5A5",
+"3 c #86A686",
+"4 c #96B296",
+"5 c #8AAE8A",
+"6 c #5D8A5D",
+"7 c #82AA82",
+"8 c #4B824B",
+"9 c #75A675",
+"A c #3B843B",
+"B c #E7F3E7",
+"C c #8EA28E",
+"D c #759E75",
+"E c #619661",
+"F c #75AA75",
+"G c #6DA66D",
+"H c #797979",
+"I c #636963",
+"J c #418241",
+"K c #AAC2AA",
+"L c #242424",
+"M c #0C690C",
+"N c #CEE3CE",
+"O c #656565",
+"P c #E3EBE3",
+"Q c #0C0C0C",
+"R c #C4C4C4",
+"S c #5D5D5D",
+"T c #D7DFD7",
+" ! ",
+" !#$ ",
+" %&/()=! ",
+" )+/*!)=$ ! ",
+" )-*+[)==]$]{] ",
+" )[/(})<>,,{){$",
+" !)&.|@)~>'?'0{#",
+"!1)~234)56789AB{",
+"22)}C2D)E587AFG0",
+"!!)!HI))JKL'MNG{",
+"O))$H))IJ',PQ{{$",
+"))OR$]ST[==,Q{$ ",
+" R$]#[=$${$ ",
+" R!#[=$ ! ",
+" !=$ "};
diff --git a/icons/mov.xpm b/icons/mov.xpm
new file mode 100644
index 0000000..1bd3dd4
--- /dev/null
+++ b/icons/mov.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char * mov3_xpm[] = {
+"16 15 42 1",
+". c #000000",
+"# c None",
+"a c #404040",
+"b c #5C2E00",
+"c c #808080",
+"d c #867349",
+"e c #8B784D",
+"f c #8F7A50",
+"g c #927E53",
+"h c #958055",
+"i c #998459",
+"j c #9D885C",
+"k c #9F651F",
+"l c #A18B5F",
+"m c #A46C2A",
+"n c #A3641C",
+"o c #A37E48",
+"p c #A48D62",
+"q c #A7834D",
+"r c #A79165",
+"s c #A89165",
+"t c #AA5500",
+"u c #AA671E",
+"v c #AA712F",
+"w c #AB5906",
+"x c #AC9569",
+"y c #AC7E43",
+"z c #AD7532",
+"A c #AF986D",
+"B c #B29B6E",
+"C c #B48657",
+"D c #B48658",
+"E c #B69E71",
+"F c #BBA275",
+"G c #BEA679",
+"H c #C2A87D",
+"I c #C6AD80",
+"J c #C9945F",
+"K c #D4AA7F",
+"L c #E9D4BF",
+"M c #F4E9DF",
+"N c #FFFFFF",
+"##.#a........a#.",
+"##...ddefghij...",
+"##.#adefghijla#.",
+"Dtbbtktntmtmp...",
+"tNJJMKNKNtNwsa#.",
+"tNNNMNtMLKLux...",
+"tNJJMNtMJMJyBa#.",
+"tNttMKNKtNt.....",
+"DtbCtotqvtzEFa#.",
+"##...prxxBEFF...",
+"##.#asxxBEFFHac.",
+"##...xABEFGH...a",
+"##.#aABEFGHII.a#",
+"##...BEFGHIc..c#",
+"##.#a.......a###"};
diff --git a/icons/mov2.xpm b/icons/mov2.xpm
new file mode 100644
index 0000000..f153ede
--- /dev/null
+++ b/icons/mov2.xpm
@@ -0,0 +1,62 @@
+/* XPM */
+static char * mov3_xpm[] = {
+"16 15 44 2",
+".# c None",
+".. c #000000",
+".a c #110E09",
+".b c #14110C",
+".c c #181818",
+".d c #1D3B5B",
+".e c #3367A0",
+".f c #35592B",
+".g c #3975B6",
+".h c #404040",
+".i c #443B26",
+".j c #4C412C",
+".k c #554A34",
+".l c #5D9D4B",
+".m c #608080",
+".n c #616161",
+".o c #69B255",
+".p c #6C2114",
+".q c #725F1F",
+".r c #7B6A44",
+".s c #808080",
+".t c #816F49",
+".u c #8E9979",
+".v c #8F7A50",
+".w c #927E53",
+".x c #958055",
+".y c #998459",
+".z c #9D885C",
+".A c #A18B5F",
+".B c #A48D62",
+".C c #A89165",
+".D c #AA8060",
+".E c #AC9569",
+".F c #AF986D",
+".G c #B29A6E",
+".H c #B69E71",
+".I c #BBA275",
+".J c #BD3A24",
+".K c #BEA679",
+".L c #C2A87D",
+".M c #C0C0C0",
+".N c #C6AD80",
+".O c #C8A736",
+".P c #D74128",
+".#.#...#.h.................h.#..",
+".#.#.......a.i.r.v.w.x.y.z......",
+".#.c.p.J.D.O.q.M.t.x.y.z.A.h.#..",
+".n.p.P.P.D.q...q.j.y.z.A.B......",
+".c.J.P.P.q...q.O.b.z.B.B.C.h.#..",
+"...D.D.f.M.q.u.u...B.B.C.E......",
+".c.l.o.o.d.g.g.e.b.B.C.E.G.h.#..",
+".n.f.o.o.m.g.g.d................",
+".#.c.f.l.m.e.d.b.k.E.G.H.I.h.#..",
+".#.#.......b.k.k...G.H.I.I......",
+".#.#...#.h.C.E.E.G.H.I.I.L.h.s..",
+".#.#.......E.F.G.H.I.K.L.......h",
+".#.#...#.h.F.G.H.I.K.L.N.N...h.#",
+".#.#.......G.H.I.K.L.N.s.....s.#",
+".#.#...#.h...............h.#.#.#"};
diff --git a/icons/mp3.xpm b/icons/mp3.xpm
new file mode 100644
index 0000000..67e1f94
--- /dev/null
+++ b/icons/mp3.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * mp3_xpm[] = {
+"16 15 15 1",
+" c None",
+"! c #929292",
+"# c #6D4100",
+"$ c #616161",
+"% c #B27100",
+"& c #FFA220",
+"/ c #000000",
+"( c #FFB241",
+") c #FFA200",
+"= c #925900",
+"+ c #6D6D6D",
+"* c #494949",
+"- c #DB8A00",
+"[ c #242424",
+"] c #FFC261",
+" !#$ ",
+" $%&/ ",
+" !#(&#! ",
+" $%()=+ ",
+" !#)()%* ",
+" $%)()-[ ",
+" !#)]]())%$ ",
+" #)))())))# ",
+" $#%]))))#! ",
+" [()))%$ ",
+" *()))#! ",
+" +())%$ ",
+" !())#! ",
+" /)%$ ",
+" $#! "};
diff --git a/icons/mpeg.xpm b/icons/mpeg.xpm
new file mode 100644
index 0000000..4a41a5c
--- /dev/null
+++ b/icons/mpeg.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char * mpeg2_xpm[] = {
+"16 15 39 1",
+". c #000000",
+"# c #000075",
+"a c #000080",
+"b c None",
+"c c #12124D",
+"d c #1F1F8F",
+"e c #333370",
+"f c #3C3478",
+"g c #3F3F9F",
+"h c #404040",
+"i c #42397D",
+"j c #454580",
+"k c #473E81",
+"l c #483E81",
+"m c #4C4184",
+"n c #52488A",
+"o c #6767A2",
+"p c #6B5C6C",
+"q c #6F6070",
+"r c #756474",
+"s c #7C6B7A",
+"t c #7F788D",
+"u c #7F7FBF",
+"v c #808080",
+"w c #81707F",
+"x c #867483",
+"y c #887684",
+"z c #8D7B8A",
+"A c #927E8D",
+"B c #94808F",
+"C c #978391",
+"D c #998594",
+"E c #9E8997",
+"F c #9F9FCF",
+"G c #A28D9B",
+"H c #A8919F",
+"I c #A994A1",
+"J c #BFBFDF",
+"K c #FFFFFF",
+"bb.bh........hb.",
+"bb...ppqrrssw...",
+"bb.bhpqrrsswxhb.",
+"oaccafaaiaalac..",
+"aKFFKaKKgKKFKJe.",
+"aKKKKaKuFKFKada.",
+"aKFFKaKKgKgKaKa.",
+"aKaaKaKaaKKFKKa.",
+"oacjakammaanaa#.",
+"bb...yzzACDEG...",
+"bb.bhzzADDEGGhv.",
+"bb...ABDDGGI...h",
+"bb.bhBDDGGIIt.hb",
+"bb...DDGGHIv..vb",
+"bb.bh.......hbbb"};
diff --git a/icons/o.xpm b/icons/o.xpm
new file mode 100644
index 0000000..57da8a5
--- /dev/null
+++ b/icons/o.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * o2_xpm[] = {
+"16 15 19 1",
+". c None",
+"# c #294144",
+"a c #2F5F65",
+"b c #3D6166",
+"c c #477177",
+"d c #48787E",
+"e c #508086",
+"f c #528288",
+"g c #5B8B91",
+"h c #6C9CA2",
+"i c #74A4AA",
+"j c #85B5BB",
+"k c #89B9BF",
+"l c #8CBCC2",
+"m c #91C1C7",
+"n c #96C6CC",
+"o c #A4D4DA",
+"p c #B9E9EF",
+"q c #C7F7FD",
+"........pfb.....",
+"........bfc.....",
+"....npppkf#pppn.",
+"....pjjlighjjf#.",
+"....pjfffffffb#.",
+".qpbnifffffbcb#.",
+".pfffffffffc....",
+".nc#fhfffffgjmf.",
+"....ojfffffffb#.",
+"....phbbbebbbb#.",
+"....n###df#####.",
+"........nfb.....",
+"........pfc.....",
+"........nba.....",
+"................"};
diff --git a/icons/pcx.xpm b/icons/pcx.xpm
new file mode 100644
index 0000000..a66372a
--- /dev/null
+++ b/icons/pcx.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * pcx_xpm[] = {
+"16 15 12 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #414141",
+"( c #202020",
+") c #828282",
+"= c #000000",
+"+ c #BEBEBE",
+"* c #7D7D7D",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)!!+)+!!)!))!)=",
+"/)!*!)!)))%!!%)=",
+"/)!!+)!))))##))=",
+"/)!)))!)))%!!%)=",
+"/)!)))+!!)!))!)=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/pcx2.xpm b/icons/pcx2.xpm
new file mode 100644
index 0000000..695b0bb
--- /dev/null
+++ b/icons/pcx2.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * pcx3_xpm[] = {
+"16 15 50 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #334455",
+"f c #381700",
+"g c #3F3F4F",
+"h c #404040",
+"i c #441100",
+"j c #505050",
+"k c #555565",
+"l c #582400",
+"m c #606060",
+"n c #652900",
+"o c #7799AA",
+"p c #7B3607",
+"q c #82634D",
+"r c #8C4718",
+"s c #8C8C8C",
+"t c #93735E",
+"u c #99AACC",
+"v c #9B5627",
+"w c #9F806A",
+"x c #A78D7B",
+"y c #A7A7B7",
+"z c #AC6738",
+"A c #AFAFAF",
+"B c #BD7849",
+"C c #CCCCEE",
+"D c #CDBAAD",
+"E c #D08B5C",
+"F c #D7D7D7",
+"G c #D9CBC1",
+"H c #DA9566",
+"I c #DC9A6E",
+"J c #EBA677",
+"K c #ECA778",
+"L c #ECC3A7",
+"M c #EEAD81",
+"N c #F2B184",
+"O c #F0F0FF",
+"P c #F3C3A1",
+"Q c #F3B68C",
+"R c #F5F0F0",
+"S c #FEC39A",
+"T c #FFE0D5",
+"U c #FFE2CE",
+"V c #FFFFFF",
+"LQJJKKJJJJQQS###",
+"EvnfffnprzEJMQS#",
+"JzbabbccflpzEIQS",
+"LSBblDGCOodilvJN",
+"#PSppGRk...grlrJ",
+"#LSErHRgd.dgRzlE",
+"##PSJHTudeeyRJBJ",
+"###SSJNUURRRJJQS",
+"smmsxmmmtmqmwQSS",
+"mVVAmAVAmVmVjSS#",
+"mVhVhVhVhFFFm###",
+"mVVAjVhhmmVh####",
+"mVhjmVhVhFFFs###",
+"mVh#mAVAjVhVj###",
+"sjm#smhjsjmjm###"};
diff --git a/icons/pdb.xpm b/icons/pdb.xpm
new file mode 100644
index 0000000..7014f36
--- /dev/null
+++ b/icons/pdb.xpm
@@ -0,0 +1,56 @@
+/* XPM */
+static char * pdb_xpm[] = {
+"16 15 38 1",
+" c None",
+"! c #000041",
+"# c #101096",
+"$ c #2424AA",
+"% c #D7DB59",
+"& c #7D7D41",
+"/ c #D2B241",
+"( c #000082",
+") c #3D3D61",
+"= c #BABE31",
+"+ c #828282",
+"* c #5D5D31",
+"- c #454524",
+"[ c #000000",
+"] c #A2A2A2",
+"{ c #3D3D3D",
+"} c #202020",
+"< c #008200",
+"> c #181818",
+", c #2DAA2D",
+". c #148E3D",
+"| c #51A6DF",
+"@ c #5DBEFF",
+"~ c #75BEEF",
+"' c #8EBEDF",
+"? c #616161",
+"0 c #51B6FF",
+"1 c #49AAF3",
+"2 c #357DBE",
+"3 c #289AF7",
+"4 c #4DB6FF",
+"5 c #0C71D7",
+"6 c #0C3D82",
+"7 c #00618A",
+"8 c #144D79",
+"9 c #458EBE",
+"A c #3986CE",
+"B c #657DA2",
+" !#$%%&%/$#((! ",
+" !#$)=)$$#(!+ ",
+" &*&*&*&*-[] ",
+" [[{{}[[[[[[] ",
+" [[{{}[[[[<[+ ",
+" ><,,,,,<[] ",
+" ><,,,,,<[] ",
+" ><,,,,,<[] ",
+" ><,,,,,.|@@~'",
+" >?+++++0@@@12",
+" >?+++++3@4356",
+" 7>>>>>>3@4356",
+" >+>+>+>3@4356",
+" [>>>>>>3@4356",
+" [[[[[[8943AB"};
diff --git a/icons/pdf.xpm b/icons/pdf.xpm
new file mode 100644
index 0000000..90a2067
--- /dev/null
+++ b/icons/pdf.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * pdf_xpm[] = {
+"16 15 14 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #FF7D7D",
+"/ c #FF0000",
+"( c #FFBEBE",
+") c #FF3D3D",
+"= c #202020",
+"+ c #C2C2C2",
+"* c #A2A2A2",
+"- c #828282",
+"[ c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$&/($$$$$$% ",
+" !$$$/$)$$$$$$% ",
+" !$$$&()$$$$$$% ",
+" !$$$$//$$$$$$% ",
+" !$$$$&(/$$$$$% ",
+" !$$$$/$$///&$% ",
+" !$$$(&(//($)$% ",
+" !$$$//&$$&/($% ",
+" !$$)(&$$$$!!!= ",
+" !$/$)$$$$$!$+# ",
+" !$//$$$$$*-+#* ",
+" !$$$$$$[+!+#- ",
+" #%%%%%%%%=#* "};
diff --git a/icons/pl.xpm b/icons/pl.xpm
new file mode 100644
index 0000000..a1fb510
--- /dev/null
+++ b/icons/pl.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char * pl_xpm[] = {
+"16 15 29 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #DBEFF3",
+"% c #000000",
+"& c #FFFFFF",
+"/ c #CCCCCC",
+"( c #C3C3C3",
+") c #B6B6B6",
+"= c #9B9B9B",
+"+ c #D2D2D2",
+"* c #BCBCBC",
+"- c #E5E5E5",
+"[ c #AEAEAE",
+"] c #8A8A8A",
+"{ c #DFDFDF",
+"} c #6D6D6D",
+"< c #555555",
+"> c #3B3B3B",
+", c #595959",
+". c #A2A2A2",
+"| c #4D4D4D",
+"@ c #757575",
+"~ c #BED2D7",
+"' c #92A6AA",
+"? c #CEE7EB",
+"0 c #202020",
+"1 c #828282",
+"2 c #B2C6CA",
+"!!!!!!!!!!!!!!!#",
+"!$$$$$$$$$$$$$$%",
+"!$#$$$$$$$$$$#$%",
+"!&&&&&/()=+&&&&%",
+"!&#&&*&&-[]{&#&%",
+"!$$$/&&&-[}]$$$%",
+"!$#$(&&&+=!<$#$%",
+"!&&&*--+=}>,&&&%",
+"!&#&.[[=}|>@&#&%",
+"!$$$~]}!>>]'$$$%",
+"!$#$$?]<,@'$!!!0",
+"!&&&&&&&&&&&!&(#",
+"!&#&&&&&&&&.1(#.",
+"!$$$$$$$$?2!(#1 ",
+"#%%%%%%%%%%0#. "};
diff --git a/icons/png.xpm b/icons/png.xpm
new file mode 100644
index 0000000..c351565
--- /dev/null
+++ b/icons/png.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * png_xpm[] = {
+"16 15 12 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #3D1435",
+"( c #1C0818",
+") c #7D2D69",
+"= c #000000",
+"+ c #BE96B2",
+"* c #DFCADB",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)!!+)!))!)+!!*=",
+"/)!)!)!!)!)!)))=",
+"/)!!+)!)!!)!)!!=",
+"/)!)))!))!)!))!=",
+"/)!)))!))!)+!!+=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/png2.xpm b/icons/png2.xpm
new file mode 100644
index 0000000..ad8282a
--- /dev/null
+++ b/icons/png2.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * png3_xpm[] = {
+"16 15 52 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #334455",
+"f c #381700",
+"g c #3F3F4F",
+"h c #400040",
+"i c #441100",
+"j c #500050",
+"k c #555565",
+"l c #582400",
+"m c #602060",
+"n c #652900",
+"o c #7799AA",
+"p c #7B3607",
+"q c #86434C",
+"r c #8C4718",
+"s c #8E4C54",
+"t c #907090",
+"u c #99AACC",
+"v c #9B5627",
+"w c #9C6780",
+"x c #A5636B",
+"y c #A7A7B7",
+"z c #A96B76",
+"A c #AC6738",
+"B c #AE717D",
+"C c #AF8FAF",
+"D c #BD7849",
+"E c #CCCCEE",
+"F c #CDBAAD",
+"G c #D08B5C",
+"H c #D7C7D7",
+"I c #D9CBC1",
+"J c #DA9566",
+"K c #DC9A6E",
+"L c #EBA677",
+"M c #ECA778",
+"N c #ECC3A7",
+"O c #EEAD81",
+"P c #F2B184",
+"Q c #F0F0FF",
+"R c #F3C3A1",
+"S c #F3B68C",
+"T c #F5F0F0",
+"U c #FEC39A",
+"V c #FFE0D5",
+"W c #FFE2CE",
+"X c #FFFFFF",
+"NSLLMMLLLLSSU###",
+"GvnfffnprAGLOSU#",
+"LAbabbccflpAGKSU",
+"NUDblFIEQodilvLP",
+"#RUppITk...grlrL",
+"#NUGrJTgd.dgTAlG",
+"##RULJVudeeyTLDL",
+"###UULPWWTTTLLSU",
+"tmmwBmBxmsqmmzUU",
+"mXXCmXjmXjCXXHj#",
+"mXmXjXHjXhXhhhj#",
+"mXXCjXCCXhXhXXj#",
+"mXhjmXhHXhXhhXh#",
+"mXh#mXhmXhCXXCj#",
+"tjj#tjjtjjtjhj##"};
diff --git a/icons/prc.xpm b/icons/prc.xpm
new file mode 100644
index 0000000..b7d6ab5
--- /dev/null
+++ b/icons/prc.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char * prc_xpm[] = {
+"16 15 37 1",
+" c None",
+"! c #000041",
+"# c #101096",
+"$ c #2424AA",
+"% c #D7DB59",
+"& c #7D7D41",
+"/ c #D2B241",
+"( c #000082",
+") c #3D3D61",
+"= c #BABE31",
+"+ c #828282",
+"* c #5D5D31",
+"- c #454524",
+"[ c #000000",
+"] c #A2A2A2",
+"{ c #3D3D3D",
+"} c #202020",
+"< c #008200",
+"> c #181818",
+", c #2DAA2D",
+". c #BEBE41",
+"| c #96D714",
+"@ c #1C1C00",
+"~ c #DFDF20",
+"' c #DFDF61",
+"? c #616161",
+"0 c #CAEB08",
+"1 c #3D3D00",
+"2 c #FFFF00",
+"3 c #FFFF7D",
+"4 c #00618A",
+"5 c #8A8A0C",
+"6 c #C6C604",
+"7 c #FFFFFF",
+"8 c #BEBE82",
+"9 c #BEBE00",
+"A c #7D7D00",
+" !#$%%&%/$#((! ",
+" !#$)=)$$#(!+ ",
+" &*&*&*&*-[] ",
+" [[{{}[[[[[[] ",
+" [[{{}[[[[<[+ ",
+" ><,,,,,<[] ",
+" ><,,,,,<[] ",
+" ><,,,,,<[. ",
+" ><,,,,|<@~. '",
+" >?+++++012.2 ",
+" >?+++++?232. ",
+" 4>>>>5623732~",
+" >+>+>+>?232.8",
+" [>>>>>>912.2 ",
+" [[[[[A[8~8 '"};
diff --git a/icons/ps.xpm b/icons/ps.xpm
new file mode 100644
index 0000000..25f3201
--- /dev/null
+++ b/icons/ps.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * ps_xpm[] = {
+"16 15 11 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #C2C2C2",
+"/ c #F4F4F4",
+"( c #828282",
+") c #202020",
+"= c #A2A2A2",
+"+ c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$#&%$$$$% ",
+" !$&%%%&%/!%&$% ",
+" !$%%%&%/&%%%$% ",
+" !$%%&%//!%%%$% ",
+" !$%%(&%&%%%%$% ",
+" !$%%%#&!%%%%$% ",
+" !$%%%%!%%%%%$% ",
+" !$&%#(%%%%!!!) ",
+" !$$$$$$$$$!$&# ",
+" !$$$$$$$$=(&#= ",
+" !$$$$$$+&!&#( ",
+" #%%%%%%%%)#= "};
diff --git a/icons/py.xpm b/icons/py.xpm
new file mode 100644
index 0000000..4cfba7c
--- /dev/null
+++ b/icons/py.xpm
@@ -0,0 +1,98 @@
+/* XPM */
+static char * py_xpm[] = {
+"16 15 80 1",
+" c None",
+". c #616161",
+"+ c #414141",
+"@ c #DBEFF3",
+"# c #000000",
+"$ c #DAEEF0",
+"% c #D9ECEC",
+"& c #DDF0F4",
+"* c #FFFFFF",
+"= c #9DAE72",
+"- c #8DA64C",
+"; c #A0BC5A",
+"> c #B7CB89",
+", c #C1D49E",
+"' c #BFCEAC",
+") c #8BA844",
+"! c #A2BF52",
+"~ c #9CB849",
+"{ c #8FA347",
+"] c #776C28",
+"^ c #888D42",
+"/ c #A3BB5D",
+"( c #9BB453",
+"_ c #8D9D64",
+": c #BABFAC",
+"< c #778E40",
+"[ c #83A827",
+"} c #ACC55F",
+"| c #ACC45D",
+"1 c #91AC3D",
+"2 c #69752E",
+"3 c #8A9B46",
+"4 c #A9C25E",
+"5 c #B2C967",
+"6 c #8EA746",
+"7 c #94A96E",
+"8 c #7B9D26",
+"9 c #80A626",
+"0 c #799C24",
+"a c #7B9B29",
+"b c #93B238",
+"c c #A7C351",
+"d c #A4BC59",
+"e c #8CA14B",
+"f c #86A137",
+"g c #89A348",
+"h c #A3B59C",
+"i c #97A283",
+"j c #729322",
+"k c #769725",
+"l c #709226",
+"m c #6F8C2D",
+"n c #81974A",
+"o c #7F9253",
+"p c #9BAD73",
+"q c #A6B87C",
+"r c #B0BE91",
+"s c #F8F9F9",
+"t c #78825B",
+"u c #739623",
+"v c #6D882D",
+"w c #8E9F60",
+"x c #5F6845",
+"y c #82A926",
+"z c #7E9F2D",
+"A c #77825B",
+"B c #565E40",
+"C c #7EA425",
+"D c #7D8E51",
+"E c #202020",
+"F c #FDFEFE",
+"G c #5C6D36",
+"H c #57643C",
+"I c #C2C2C2",
+"J c #FCFDFE",
+"K c #A2A2A2",
+"L c #828282",
+"M c #CEE7EB",
+"N c #B2C6CA",
+"O c #7F7F7F",
+"...............+",
+".@@@@@@@@@@@@@@#",
+".@+@@@$$$%$&@+@#",
+".*****=-;>,'***#",
+".*+**)!~{]^/(_:#",
+".@@@<[}|1234567#",
+".@+@890abcdefgh#",
+".**ijklmnopqr*s#",
+".*+tuvw*****s+s#",
+".@@xyzA@@@@@@@@#",
+".@+BCzD@@@@@...E",
+".**FGHFF****.*I+",
+".*+****JF**KLI+K",
+".@@@@@@@@MN.I+LO",
+"+##########E+KO "};
diff --git a/icons/r.xpm b/icons/r.xpm
new file mode 100644
index 0000000..b00aa9a
--- /dev/null
+++ b/icons/r.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char * r2_xpm[] = {
+"16 15 19 1",
+". c #000000",
+"# c #007261",
+"a c #202020",
+"b c #3F9588",
+"c c #404040",
+"d c #4FA096",
+"e c #5DA59A",
+"f c #606060",
+"g c #7FB8B0",
+"h c #808080",
+"i c #97C9C6",
+"j c #A0A0A0",
+"k c #B0C7CA",
+"l c #B2D4CF",
+"m c #C0C0C0",
+"n c #CEE5E8",
+"o c #D8EFF2",
+"p c None",
+"q c #FFFFFF",
+"fffffffffffffffc",
+"foooooooooooooo.",
+"focooooooooooco.",
+"fqqqq####bqqqqq.",
+"fqcqq##gb#bqqcq.",
+"foooo##oo##oooo.",
+"focoo##gb#booco.",
+"fqqqq#####qqqqq.",
+"fqcqq##qe#lqqcq.",
+"foooo##oi#doooo.",
+"focoo##oo##offfa",
+"fqqqqqqqqqqqfqmc",
+"fqcqqqqqqqqjhmcj",
+"foooooooonkfmchp",
+"c..........acjpp"};
diff --git a/icons/ra.xpm b/icons/ra.xpm
new file mode 100644
index 0000000..f2f0517
--- /dev/null
+++ b/icons/ra.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * ra_xpm[] = {
+"16 15 25 1",
+" c None",
+"! c #B2B2B2",
+"# c #A2A2A2",
+"$ c #828282",
+"% c #C2C2C2",
+"& c #CDCECD",
+"/ c #F3F3F3",
+"( c #FFFFFF",
+") c #DFDFDF",
+"= c #7D7D3D",
+"+ c #3D3D1C",
+"* c #BABEBA",
+"- c #65A265",
+"[ c #92B292",
+"] c #515151",
+"{ c #FFFF00",
+"} c #359235",
+"< c #000000",
+"> c #087D08",
+", c #088208",
+". c #BEBE1C",
+"| c #929292",
+"@ c #656565",
+"~ c #414141",
+"' c #8E8E8E",
+" ",
+" !#$$$$$$#% ",
+" #$&/((((/&## ",
+" $&()&%==%%&)%$ ",
+"#&)&%%=(+*%-[&#]",
+"$/&%==({+[-[}%#<",
+"$(%%=({{+%>%,%#<",
+"$/&%+<=.+[-[}%|<",
+"#&)%%%<++*%-[#]@",
+" $&%%%%<+%%*|]< ",
+" $~$'###%%$<@ ",
+" @~<<#%$< ",
+" <#$< ",
+" <$< ",
+" << "};
diff --git a/icons/rom.xpm b/icons/rom.xpm
new file mode 100644
index 0000000..c1af848
--- /dev/null
+++ b/icons/rom.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * rom_xpm[] = {
+"16 15 10 1",
+" c None",
+"! c #828282",
+"# c #414141",
+"$ c #000000",
+"% c #616161",
+"& c #F3F3F3",
+"/ c #DFDFDF",
+"( c #A2A2A2",
+") c #CECECE",
+"= c #AEAEAE",
+" ",
+" ! ",
+" ###! ",
+" ######! ",
+" #########! ",
+" ##########$ ",
+" ##########$! ",
+" ###$!%####$&! ",
+" !%$##!###$!/( ",
+" !!!#%!##$&!)( ",
+" =!!!%#$!/() ",
+" / (!!$&!)( ",
+" ($/() ",
+" )( ",
+" ) "};
diff --git a/icons/rpm.xpm b/icons/rpm.xpm
new file mode 100644
index 0000000..5e4ca47
--- /dev/null
+++ b/icons/rpm.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * rpm2_xpm[] = {
+"16 15 14 1",
+" c None",
+". c #000000",
+"# c #2C0606",
+"a c #404040",
+"b c #555555",
+"c c #580C0C",
+"d c #808080",
+"e c #841212",
+"f c #AAAAAA",
+"g c #B01818",
+"h c #D5D5D5",
+"i c #EEEEEE",
+"j c #F0F0F0",
+"k c #FEFEFE",
+" da...ad ",
+" ......... ",
+" ..cgeegc... ",
+" ...eeggg#c... ",
+"d...g#cegge...d ",
+"a.eecgggggg#..a ",
+"..gg#.cgggegc.. ",
+"..cgggeeggggg.. ",
+"....eggggggge.. ",
+"a..kd.#cegge..a ",
+"d..bkkbbbbb...d ",
+" akkbkkkkkb... ",
+" kkkkkbff... ",
+" jkkkkk.fj ",
+" hikkkih "};
diff --git a/icons/sh.xpm b/icons/sh.xpm
new file mode 100644
index 0000000..a2277d8
--- /dev/null
+++ b/icons/sh.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char * sh_xpm[] = {
+"16 15 18 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #BED7D7",
+"/ c #3D8486",
+"( c #3D6D6D",
+") c #7DAEAE",
+"= c #002D31",
+"+ c #005959",
+"* c #2D7175",
+"- c #004145",
+"[ c #202020",
+"] c #C2C2C2",
+"{ c #A2A2A2",
+"} c #828282",
+"< c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$&/$$$$$% ",
+" !$$&($)=$&/$$% ",
+" !$$/+()=)+=$$% ",
+" !$$$/+*-+=$$$% ",
+" !$&))*++*))/$% ",
+" !$/==-++-===$% ",
+" !$$$)+*-+-$$$% ",
+" !$$&+=)=/+-$$% ",
+" !$$/=$)=$)!!![ ",
+" !$$$$$/=$$!$]# ",
+" !$$$$$$$${}]#{ ",
+" !$$$$$$<]!]#} ",
+" #%%%%%%%%[#{ "};
diff --git a/icons/sid.xpm b/icons/sid.xpm
new file mode 100644
index 0000000..75c8fa2
--- /dev/null
+++ b/icons/sid.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * sid2_xpm[] = {
+"16 15 20 1",
+". c #000000",
+"# c #0000C6",
+"a c #1C1FCC",
+"b c #2121CD",
+"c c #404040",
+"d c #5252D7",
+"e c #5353D8",
+"f c #7B7BE2",
+"g c None",
+"h c #808080",
+"i c #8585E2",
+"j c #8B8BE4",
+"k c #9898E8",
+"l c #DFDFDF",
+"m c #E3E3E3",
+"n c #EBEBEB",
+"o c #F3F3F3",
+"p c #FCFCFC",
+"q c #FF1F1F",
+"r c #FF8C8C",
+"gggggggggggggggg",
+"gggggggggggngggg",
+"gmoppolggggnmggg",
+"npjb#ipggggn.ogg",
+"pj####pppomn..og",
+"pe#kpjf###nn.hcm",
+"p##pgpf##pgo.pnn",
+"p##pgprqqpgo.ogg",
+"pd#kpkrqqqno.ogg",
+"pj####pppoop.ngg",
+"npia#ipggnc..ngg",
+"gmoppomggm..cmgg",
+"ggggggggggmnmggg",
+"gggggggggggggggg",
+"gggggggggggggggg"};
diff --git a/icons/so.xpm b/icons/so.xpm
new file mode 100644
index 0000000..11e10f6
--- /dev/null
+++ b/icons/so.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char * so_xpm[] = {
+"16 15 31 1",
+" c None",
+"! c #C3C3C3",
+"# c #181818",
+"$ c #4D4D4D",
+"% c #AEAEAE",
+"& c #626262",
+"/ c #0C0C0C",
+"( c #333333",
+") c #EEEEEE",
+"= c #757575",
+"+ c #F3F3F3",
+"* c #D2D2D2",
+"- c #131313",
+"[ c #5A5A5A",
+"] c #8B8B8B",
+"{ c #CCCCCC",
+"} c #E4E4E4",
+"< c #2B2B2B",
+"> c #424242",
+", c #DCDCDC",
+". c #A2A2A2",
+"| c #6D6D6D",
+"@ c #9C9C9C",
+"~ c #222222",
+"' c #BBBBBB",
+"? c #7A7A7A",
+"0 c #959595",
+"1 c #3D3D3D",
+"2 c #B3B3B3",
+"3 c #868686",
+"4 c #525252",
+" ",
+" !#$%&/#( ",
+" ))=%+*(-#$[ ",
+" ]{}}}*}<(#/-> ",
+"!)}+},!!.|@-/~ ",
+",),*{!*''%@@#[ ",
+"?'**!(>!..0</1= ",
+" *!!?>~]20|#(/( ",
+"{{!2@$<[.?][[(# ",
+"{{22@0-3]=|[4(# ",
+" ]]@0.!.&&&#(## ",
+" ]]3|?=[[(///4 ",
+" ??||[[4$>(/ ",
+" =#<44>>$>/ ",
+" >><//@ "};
diff --git a/icons/targa.xpm b/icons/targa.xpm
new file mode 100644
index 0000000..7004b62
--- /dev/null
+++ b/icons/targa.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * targa_xpm[] = {
+"16 15 13 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #003D3D",
+"( c #001C1C",
+") c #007D7D",
+"= c #000000",
+"+ c #7DBEBE",
+"* c #BEDFDF",
+"- c #3D9E9E",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/)!!!)+!!*)-!-)=",
+"/))!))!))))*+*)=",
+"/))!))!)!!)!)!)=",
+"/))!))!))!)!!!)=",
+"/))!))+!!+)!)!)=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/targa2.xpm b/icons/targa2.xpm
new file mode 100644
index 0000000..7f80d82
--- /dev/null
+++ b/icons/targa2.xpm
@@ -0,0 +1,73 @@
+/* XPM */
+static char * targa3_xpm[] = {
+"16 15 55 1",
+". c #000010",
+"# c None",
+"a c #004040",
+"b c #005050",
+"c c #006060",
+"d c #0F0600",
+"e c #130800",
+"f c #1C0B00",
+"g c #222232",
+"h c #306060",
+"i c #334455",
+"j c #381700",
+"k c #3F3F4F",
+"l c #3F8787",
+"m c #441100",
+"n c #555565",
+"o c #56654D",
+"p c #582400",
+"q c #5C8F8F",
+"r c #5F9090",
+"s c #609090",
+"t c #652900",
+"u c #65765F",
+"v c #76846D",
+"w c #7799AA",
+"x c #7B3607",
+"y c #7E927E",
+"z c #7FAFAF",
+"A c #7FBFBF",
+"B c #8C4718",
+"C c #99AACC",
+"D c #9B5627",
+"E c #A7A7B7",
+"F c #AC6738",
+"G c #BD7849",
+"H c #BFD7D7",
+"I c #CCCCEE",
+"J c #CDBAAD",
+"K c #D08B5C",
+"L c #D9CBC1",
+"M c #DA9566",
+"N c #DC9A6E",
+"O c #EBA677",
+"P c #ECA778",
+"Q c #ECC3A7",
+"R c #EEAD81",
+"S c #F2B184",
+"T c #F0F0FF",
+"U c #F3C3A1",
+"V c #F3B68C",
+"W c #F5F0F0",
+"X c #FEC39A",
+"Y c #FFE0D5",
+"Z c #FFE2CE",
+"0 c #FFFFFF",
+"QVOOPPOOOOVVX###",
+"KDtjjjtxBFKORVX#",
+"OFedeeffjpxFKNVX",
+"QXGepJLITwgmpDOS",
+"#UXxxLWn...kBpBO",
+"#QXKBMWkg.gkWFpK",
+"##UXOMYCgiiEWOGO",
+"###XXOSZZWWWOOVX",
+"scccyyccuGocvVXX",
+"c000bz00Hbl0lyX#",
+"sc0ac0aabcHAHh##",
+"#c0ac0a00b0a0b##",
+"#c0ac0ab0a000a##",
+"#c0arz00zb0a0a##",
+"#sbh#sbahqbhbh##"};
diff --git a/icons/tex.xpm b/icons/tex.xpm
new file mode 100644
index 0000000..f4a33f7
--- /dev/null
+++ b/icons/tex.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * tex2_xpm[] = {
+"16 15 11 1",
+" c None",
+". c #000000",
+"# c #202020",
+"a c #414141",
+"b c #606060",
+"c c #808080",
+"d c #A0A0A0",
+"e c #C0C0C0",
+"f c #DDDDDD",
+"g c #F7F7F7",
+"h c #FFFFFF",
+" bbbbbbbbbbbbba ",
+" bhhhhhhhhhhhh. ",
+" bhhhhhhhhhhhh. ",
+" bhhhhhhhhhhhh. ",
+" bdbbbdhhdbhbd. ",
+" beh.hehgg.fch. ",
+" bhh.ebbchf.fh. ",
+" bhh.h.hfhcf.f. ",
+" bhebf.chdbhbd. ",
+" bhhhh.hfhhhhh. ",
+" bhhhebbchhbbb# ",
+" bhhhhhhhhhbhea ",
+" bhhhhhhhhdcead ",
+" bhhhhhhfebeac ",
+" a........#ad "};
diff --git a/icons/tiff.xpm b/icons/tiff.xpm
new file mode 100644
index 0000000..2b95721
--- /dev/null
+++ b/icons/tiff.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * tiff_xpm[] = {
+"16 15 10 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #00007D",
+"( c #00003D",
+") c #0000FF",
+"= c #000000",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"///////////////(",
+"/))))))))))))))=",
+"/!!!)!)!!!)!!!)=",
+"/)!))!)!)))!)))=",
+"/)!))!)!!))!!))=",
+"/)!))!)!)))!)))=",
+"/)!))!)!)))!)))=",
+"/))))))))))))))=",
+"(===============",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/tiff2.xpm b/icons/tiff2.xpm
new file mode 100644
index 0000000..be3624a
--- /dev/null
+++ b/icons/tiff2.xpm
@@ -0,0 +1,68 @@
+/* XPM */
+static char * tif3_xpm[] = {
+"16 15 50 1",
+". c #000010",
+"# c #000040",
+"a c #000060",
+"b c #000080",
+"c c None",
+"d c #0F0600",
+"e c #130800",
+"f c #1C0B00",
+"g c #222232",
+"h c #303078",
+"i c #334455",
+"j c #381700",
+"k c #3F3F4F",
+"l c #441100",
+"m c #4E4E9A",
+"n c #555565",
+"o c #57345C",
+"p c #582400",
+"q c #6161A0",
+"r c #652900",
+"s c #7799AA",
+"t c #7B3607",
+"u c #7E628E",
+"v c #80628D",
+"w c #8C4718",
+"x c #8F8FBF",
+"y c #99AACC",
+"z c #9B5627",
+"A c #A7A7B7",
+"B c #AC6738",
+"C c #BD7849",
+"D c #CCCCEE",
+"E c #CDBAAD",
+"F c #D08B5C",
+"G c #D9CBC1",
+"H c #DA9566",
+"I c #DC9A6E",
+"J c #EBA677",
+"K c #ECA778",
+"L c #ECC3A7",
+"M c #EEAD81",
+"N c #F2B184",
+"O c #F0F0FF",
+"P c #F3C3A1",
+"Q c #F3B68C",
+"R c #F5F0F0",
+"S c #FEC39A",
+"T c #FFE0D5",
+"U c #FFE2CE",
+"V c #FFFFFF",
+"LQJJKKJJJJQQSccc",
+"FzrjjjrtwBFJMQSc",
+"JBedeeffjptBFIQS",
+"LSCepEGDOsglpzJN",
+"cPSttGRn...kwpwJ",
+"cLSFwHRkg.gkRBpF",
+"ccPSJHTygiiARJCJ",
+"cccSSJNUURRRJJQS",
+"mbbbubvbbbobbbvS",
+"bVVVaVaVVVaVVVac",
+"qbV#aV#V##aV##hc",
+"cbV#bV#VVxbVVxqc",
+"cbV#bV#V#hbV#hcc",
+"cbV#bV#V#cbV#ccc",
+"cqahqahahcqahccc"};
diff --git a/icons/txt.xpm b/icons/txt.xpm
new file mode 100644
index 0000000..468c54d
--- /dev/null
+++ b/icons/txt.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * txt_xpm[] = {
+"16 15 11 1",
+" c None",
+"! c #616161",
+"# c #414141",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #828282",
+"/ c #AAAAAA",
+"( c #C2C2C2",
+") c #202020",
+"= c #A2A2A2",
+"+ c #DFDFDF",
+" !!!!!!!!!!!!!# ",
+" !$$$$$$$$$$$$% ",
+" !$$$$$$$$$$$$% ",
+" !$&/&(&//(/($% ",
+" !$$$$$$$$$$$$% ",
+" !$&/&/&//&/($% ",
+" !$$$$$$$$$$$$% ",
+" !$/&/(&/&//($% ",
+" !$$$$$$$$$$$$% ",
+" !$/&&///&/($$% ",
+" !$$$$$$$$$!!!) ",
+" !$&(/&/&($!$(# ",
+" !$$$$$$$$=!(#= ",
+" !$$$$$$+(!(#& ",
+" #%%%%%%%%)#= "};
diff --git a/icons/wav.xpm b/icons/wav.xpm
new file mode 100644
index 0000000..e0aa8fa
--- /dev/null
+++ b/icons/wav.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * wav_xpm[] = {
+"16 15 25 1",
+" c None",
+"! c #D4D5D4",
+"# c #DEDEDE",
+"$ c #FFFFFF",
+"% c #000000",
+"& c #CECECE",
+"/ c #EBEBFF",
+"( c #E7E7E7",
+") c #C2BEFF",
+"= c #2D28A6",
+"+ c #E7F3E7",
+"* c #9692FF",
+"- c #8E8AFF",
+"[ c #D7D2FF",
+"] c #837DFC",
+"{ c #5B53D4",
+"} c #8A82FF",
+"< c #514BCA",
+"> c #5D59D7",
+", c #7D75F7",
+". c #4D45C6",
+"| c #8682FF",
+"@ c #AEAAFF",
+"~ c #F7F7F7",
+"' c #C6C6C6",
+" ! ",
+" #$# ",
+" #$%$! ",
+" !$$%$# & ",
+" !$%/%$$(!#$# ",
+" !$$%)=)%$$$%$!",
+"($$%+=*=-%[%[=$(",
+"$]+{}{]{]<]<]>/$",
+"==%,.}<}<|.}<}]=",
+"$${/%[=*=@%[=[]$",
+"!#($%$%)=[$/%$$!",
+" &!$$%+%$~$%$! ",
+" !($$%$##$! ",
+" '!$%$! & ",
+" !$! "};
diff --git a/icons/xbm.xpm b/icons/xbm.xpm
new file mode 100644
index 0000000..6df730e
--- /dev/null
+++ b/icons/xbm.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * xbm_xpm[] = {
+"16 15 9 1",
+" c None",
+"! c #FFFFFF",
+"# c #DFDFDF",
+"$ c #AAAAAA",
+"% c #9A9A9A",
+"& c #555555",
+"/ c #000000",
+"( c #BEBEBE",
+") c #3D3D3D",
+" ",
+" !##########$ ",
+" #%%%%%%%%%%& ",
+"////////////////",
+"////////////////",
+"/!//!/!!(/!///!/",
+"/)!!)/!/!/!!/!!/",
+"//((//!!(/!)!)!/",
+"/)!!)/!/!/!/)/!/",
+"/!//!/!!(/!///!/",
+"////////////////",
+"////////////////",
+" #%%%%%%%%%%& ",
+" $&&&&&&&&&&& ",
+" "};
diff --git a/icons/xbm2.xpm b/icons/xbm2.xpm
new file mode 100644
index 0000000..03f5a83
--- /dev/null
+++ b/icons/xbm2.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * xbm3_xpm[] = {
+"16 15 52 1",
+". c None",
+"# c #000010",
+"a c #0F0600",
+"b c #101010",
+"c c #130800",
+"d c #1C0B00",
+"e c #202020",
+"f c #222232",
+"g c #334455",
+"h c #381700",
+"i c #3F3F4F",
+"j c #441100",
+"k c #4B4B4B",
+"l c #555565",
+"m c #582400",
+"n c #5D3F2A",
+"o c #652900",
+"p c #666666",
+"q c #6A6663",
+"r c #6D4F3A",
+"s c #7799AA",
+"t c #795A46",
+"u c #7B3607",
+"v c #806755",
+"w c #808080",
+"x c #8C4718",
+"y c #99AACC",
+"z c #9B5627",
+"A c #A7A7B7",
+"B c #AC6738",
+"C c #BD7849",
+"D c #BFBFBF",
+"E c #C0C0C0",
+"F c #CCCCEE",
+"G c #CDBAAD",
+"H c #D08B5C",
+"I c #D9CBC1",
+"J c #DA9566",
+"K c #DC9A6E",
+"L c #EBA677",
+"M c #ECA778",
+"N c #ECC3A7",
+"O c #EEAD81",
+"P c #F2B184",
+"Q c #F0F0FF",
+"R c #F3C3A1",
+"S c #F3B68C",
+"T c #F5F0F0",
+"U c #FEC39A",
+"V c #FFE0D5",
+"W c #FFE2CE",
+"X c #FFFFFF",
+"NSLLMMLLLLSSU...",
+"HzohhhouxBHLOSU.",
+"LBcaccddhmuBHKSU",
+"NUCcmGIFQsfjmzLP",
+".RUuuITl###ixmxL",
+".NUHxJTif#fiTBmH",
+"..RULJVyfggATLCL",
+"...UULPWWTTTLLSU",
+"peqeveetrenCtevU",
+"eXeXbXXDeXbveXb.",
+"pEEEbXbXbXXbXXb.",
+".eXbeXXDeXwXwXb.",
+"pEEEeXbXbXbweXb.",
+"eXbXbXXDeXbkeXb.",
+"pbkbkbbkpbk.pbk."};
diff --git a/icons/xcf.xpm b/icons/xcf.xpm
new file mode 100644
index 0000000..2eb2181
--- /dev/null
+++ b/icons/xcf.xpm
@@ -0,0 +1,101 @@
+/* XPM */
+static char * xcf_xpm[] = {
+"16 15 83 2",
+"#h c #5D5D5D",
+"OD c None",
+".g c #6D6955",
+"#J c #55534B",
+"#i c #75715D",
+".5 c #433B2A",
+"#A c #5A5A52",
+".3 c #C6C6C6",
+"#F c #494333",
+".x c #867965",
+".Y c #737472",
+".w c #9A8E79",
+"#w c #555243",
+".F c #595545",
+"#I c #181812",
+".o c #625D49",
+"#X c #454541",
+".j c #797973",
+".C c #696553",
+"#x c #312D23",
+".7 c #6C6A5C",
+"#n c #716B5B",
+".s c #2A2822",
+"#R c #737365",
+".b c #828282",
+"#O c #4B493A",
+"#K c #51493D",
+"#G c #867D6B",
+".R c #E3E3E3",
+"#k c #E7EBEB",
+".2 c #3D3928",
+".Q c #8E9292",
+".N c #929292",
+"#B c #B2B2A6",
+".d c #7D827D",
+".6 c #201C18",
+".W c #A4A4A4",
+".O c #282420",
+"#D c #515151",
+".r c #9E968E",
+"#. c #45453D",
+"#q c #B4B4B4",
+"#U c #49453D",
+".G c #929282",
+".B c #616161",
+"#M c #413528",
+".X c #696969",
+".m c #827561",
+"#l c #A2A292",
+".E c #CACACA",
+"#c c #8A8A75",
+"#S c #D4D4D4",
+".J c #797979",
+"#V c #C2BEB6",
+".n c #202020",
+"#e c #3B3B33",
+".z c #5D5949",
+".9 c #73736B",
+"#W c #656151",
+"#p c #201C14",
+".V c #28241C",
+"#d c #4D514D",
+"#j c #ACAAA6",
+".v c #A2968A",
+".S c #DFDFDF",
+".M c #D2CED2",
+".u c #554D41",
+".T c #8C8E8E",
+".H c #353535",
+".y c #393535",
+".p c #6B6B63",
+".1 c #595549",
+"#t c #3D3D3D",
+"#o c #AEA28E",
+".L c #9E9E9E",
+"#Y c #8E8A82",
+"#Z c #20201C",
+".t c #312D28",
+".A c #9A9279",
+"#y c #4D4D4D",
+"#Q c #96928A",
+".4 c #AAAEAE",
+"#L c #65614D",
+"ODODOD#oODODODODODODODODODOD.L#R",
+"ODODOD#o#Q.QODODODODODODOD.4.9.g",
+"ODODOD#j.A.j.TODODODODOD#q#R.C.o",
+"ODODODOD#o#G.p.YODODODOD#n.C.z#A",
+"ODODODOD#l.w.x#c.G.9.7.C#L.o.F.7",
+"OD.Y.TOD#q.S#V.E#k#B#n#w#K#O#O.p",
+".X.N#D.Y#S.H#S.R.H.3.7#O.5.5#x.j",
+".B.N#D.Y.L.v#j.T.M#j.o#F.5#x#I.N",
+"#t#t#h.C#i.m#G.r#Y.7#w.5#M.6#Z.W",
+".J#d.9#w.o.C.C#W.o#e#A.2#x#I.yOD",
+"OD.d.1#F#O#w.u#F#I#J#O#x.V.O#yOD",
+"ODOD.b.t#p.s.6#I#A#.#x.V.s.B.WOD",
+"ODODOD.W.b#U#J#X.t.t.n#e#y.bODOD",
+"ODODODODODOD.L.J#D#h#h.b.WODODOD",
+"ODODODODODODODODODODODODODODODOD"};
diff --git a/icons/xpm.xpm b/icons/xpm.xpm
new file mode 100644
index 0000000..51a894f
--- /dev/null
+++ b/icons/xpm.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * xpm_xpm[] = {
+"16 15 13 1",
+". c None",
+"k c #FBDBBE",
+"f c #391C00",
+"j c #EB963D",
+"e c #713900",
+"c c #9A9A9A",
+"b c #AAAAAA",
+"h c #000000",
+"g c #E77100",
+"i c #F3BA7D",
+"a c #DFDFDF",
+"# c #FFFFFF",
+"d c #555555",
+"................",
+"..#aaaaaaaaaab..",
+"..accccccccccd..",
+"eeeeeeeeeeeeeeef",
+"eggggggggggggggh",
+"e#gg#g##ig#ggg#h",
+"ej##jg#g#g##g##h",
+"egkkgg##ig#j#j#h",
+"ej##jg#ggg#gjg#h",
+"e#gg#g#ggg#ggg#h",
+"eggggggggggggggh",
+"fhhhhhhhhhhhhhhh",
+"..accccccccccd..",
+"..bddddddddddd..",
+"................"};
diff --git a/icons/xpm2.xpm b/icons/xpm2.xpm
new file mode 100644
index 0000000..a9b5bd6
--- /dev/null
+++ b/icons/xpm2.xpm
@@ -0,0 +1,72 @@
+/* XPM */
+static char * xpm3_xpm[] = {
+"16 15 54 1",
+". c #000010",
+"# c None",
+"a c #0F0600",
+"b c #130800",
+"c c #1C0B00",
+"d c #222232",
+"e c #334455",
+"f c #381700",
+"g c #3F3F4F",
+"h c #441100",
+"i c #542A00",
+"j c #555565",
+"k c #582400",
+"l c #652900",
+"m c #7799AA",
+"n c #7B3607",
+"o c #7E5F3F",
+"p c #803F00",
+"q c #8C4718",
+"r c #99AACC",
+"s c #9B5627",
+"t c #A7A7B7",
+"u c #AA5500",
+"v c #AB5F21",
+"w c #AC6738",
+"x c #B38251",
+"y c #B7824F",
+"z c #BA6C27",
+"A c #BD7849",
+"B c #C57732",
+"C c #CC8341",
+"D c #CCCCEE",
+"E c #CDBAAD",
+"F c #D08446",
+"G c #D08B5C",
+"H c #D4AA7F",
+"I c #D9CBC1",
+"J c #DA9566",
+"K c #DB955A",
+"L c #DC9A6E",
+"M c #E9D4BF",
+"N c #EBA677",
+"O c #ECA778",
+"P c #ECC3A7",
+"Q c #EEAD81",
+"R c #F2B184",
+"S c #F0F0FF",
+"T c #F3C3A1",
+"U c #F3B68C",
+"V c #F5F0F0",
+"W c #FEC39A",
+"X c #FFE0D5",
+"Y c #FFE2CE",
+"Z c #FFFFFF",
+"PUNNOONNNNUUW###",
+"GslffflnqwGNQUW#",
+"NwbabbccfknwGLUW",
+"PWAbkEIDSmdhksNR",
+"#TWnnIVj...gqkqN",
+"#PWGqJVgd.dgVwkG",
+"##TWNJXrdeetVNAN",
+"###WWNRYYVVVNNUW",
+"xuyuCuuBzuvAFuCW",
+"uZuZpZZHuZpKpZp#",
+"xMMMpZiZiZZpZZi#",
+"#uZiuZZHpZHZHZi#",
+"xMMMuZipuZiMpZi#",
+"uZiZpZi#uZipuZi#",
+"xpopopo#xpo#xpo#"};
diff --git a/install-sh b/install-sh
new file mode 100644
index 0000000..e9de238
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..1f5412d
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = intlmacosx.m4 nls.m4 po.m4 glibc2.m4 intl.m4 intldir.m4 intmax.m4 lock.m4 longdouble.m4 longlong.m4 printf-posix.m4 size_max.m4 visibility.m4 wchar_t.m4 wint_t.m4 xsize.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..506653f
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,439 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATE = @DATE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENTOO_CFLAGS = @GENTOO_CFLAGS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MODULES_CFLAGS = @MODULES_CFLAGS@
+MODULES_LIBS = @MODULES_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = intlmacosx.m4 nls.m4 po.m4 glibc2.m4 intl.m4 intldir.m4 intmax.m4 lock.m4 longdouble.m4 longlong.m4 printf-posix.m4 size_max.m4 visibility.m4 wchar_t.m4 wint_t.m4 xsize.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu m4/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+ ctags-am distclean distclean-generic distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 0000000..223955b
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,21 @@
+# codeset.m4 serial 2 (gettext-0.16)
+dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET); return !cs;],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644
index 0000000..da31efe
--- /dev/null
+++ b/m4/gettext.m4
@@ -0,0 +1,405 @@
+# gettext.m4 serial 67 (gettext-0.19.6)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored. If NEEDSYMBOL is specified and is
+dnl 'need-formatstring-macros', then GNU gettext implementations that don't
+dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value '$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+ [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
+ ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+ define([gt_included_intl],
+ ifelse([$1], [external],
+ ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+ [yes]))
+ define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+ gt_NEEDS_INIT
+ AM_GNU_GETTEXT_NEED([$2])
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+ dnl documented, we avoid it.
+ ifelse(gt_included_intl, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+ gt_INTL_MACOSX
+
+ dnl Set USE_NLS.
+ AC_REQUIRE([AM_NLS])
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl Add a version number to the cache macros.
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH([included-gettext],
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
+
+ AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+ ]])],
+ [eval "$gt_func_gnugettext_libc=yes"],
+ [eval "$gt_func_gnugettext_libc=no"])])
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ [$gt_func_gnugettext_libintl],
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ]])],
+ [eval "$gt_func_gnugettext_libintl=yes"],
+ [eval "$gt_func_gnugettext_libintl=no"])
+ dnl Now see whether libintl exists and depends on libiconv.
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ]])],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ CATOBJEXT=
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Some extra flags are needed during linking.
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE([ENABLE_NLS], [1],
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ AC_MSG_RESULT([$gt_source])
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE([HAVE_GETTEXT], [1],
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE([HAVE_DCGETTEXT], [1],
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST([BUILD_INCLUDED_LIBINTL])
+ AC_SUBST([USE_INCLUDED_LIBINTL])
+ AC_SUBST([CATOBJEXT])
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST([DATADIRNAME])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST([INSTOBJEXT])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST([GENCAT])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLOBJS=
+ if test "$USE_INCLUDED_LIBINTL" = yes; then
+ INTLOBJS="\$(GETTOBJS)"
+ fi
+ AC_SUBST([INTLOBJS])
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST([INTLLIBS])
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+ m4_divert_text([DEFAULTS], [gt_needs=])
+ m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+
+
+dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], [])
diff --git a/m4/glibc2.m4 b/m4/glibc2.m4
new file mode 100644
index 0000000..e8f5bfe
--- /dev/null
+++ b/m4/glibc2.m4
@@ -0,0 +1,30 @@
+# glibc2.m4 serial 1
+dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.0 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gt_GLIBC2],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2 or newer,
+ ac_cv_gnu_library_2,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2=yes,
+ ac_cv_gnu_library_2=no)
+ ]
+ )
+ AC_SUBST(GLIBC2)
+ GLIBC2="$ac_cv_gnu_library_2"
+ ]
+)
diff --git a/m4/glibc21.m4 b/m4/glibc21.m4
new file mode 100644
index 0000000..d95fd98
--- /dev/null
+++ b/m4/glibc21.m4
@@ -0,0 +1,30 @@
+# glibc21.m4 serial 3
+dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644
index 0000000..4e37363
--- /dev/null
+++ b/m4/iconv.m4
@@ -0,0 +1,271 @@
+# iconv.m4 serial 19 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_func_iconv=yes])
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_lib_iconv=yes]
+ [am_cv_func_iconv=yes])
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+ dnl Solaris 10.
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+ ]],
+ [[int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+ /* Try HP-UX names. */
+ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+ result |= 16;
+ return result;
+]])],
+ [am_cv_func_iconv_works=yes], ,
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE([HAVE_ICONV], [1],
+ [Define if you have the iconv() function and it works.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl warnings.
+m4_define([gl_iconv_AC_DEFUN],
+ m4_version_prereq([2.64],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [m4_ifdef([gl_00GNULIB],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [[AC_DEFUN(
+ [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL([am_cv_proto_iconv], [
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+ ]],
+ [[]])],
+ [am_cv_proto_iconv_arg1=""],
+ [am_cv_proto_iconv_arg1="const"])
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([
+ $am_cv_proto_iconv])
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+ [Define as const if the declaration of iconv() needs const.])
+ dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+ m4_ifdef([gl_ICONV_H_DEFAULTS],
+ [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test -n "$am_cv_proto_iconv_arg1"; then
+ ICONV_CONST="const"
+ fi
+ ])
+ fi
+])
diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4
new file mode 100644
index 0000000..8c8a670
--- /dev/null
+++ b/m4/intdiv0.m4
@@ -0,0 +1,84 @@
+# intdiv0.m4 serial 2 (gettext-0.17)
+dnl Copyright (C) 2002, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+ AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+ gt_cv_int_divbyzero_sigfpe,
+ [
+ gt_cv_int_divbyzero_sigfpe=
+changequote(,)dnl
+ case "$host_os" in
+ macos* | darwin[6-9]* | darwin[1-9][0-9]*)
+ # On MacOS X 10.2 or newer, just assume the same as when cross-
+ # compiling. If we were to perform the real test, 1 Crash Report
+ # dialog window would pop up.
+ case "$host_cpu" in
+ i[34567]86 | x86_64)
+ gt_cv_int_divbyzero_sigfpe="guessing yes" ;;
+ esac
+ ;;
+ esac
+changequote([,])dnl
+ if test -z "$gt_cv_int_divbyzero_sigfpe"; then
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+sigfpe_handler (int sig)
+{
+ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
+ exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+ signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+ signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL. */
+#if defined (__sparc__) && defined (__linux__)
+ signal (SIGILL, sigfpe_handler);
+#endif
+
+ z = x / y;
+ nan = y / y;
+ exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+ [
+ # Guess based on the CPU.
+changequote(,)dnl
+ case "$host_cpu" in
+ alpha* | i[34567]86 | x86_64 | m68k | s390*)
+ gt_cv_int_divbyzero_sigfpe="guessing yes";;
+ *)
+ gt_cv_int_divbyzero_sigfpe="guessing no";;
+ esac
+changequote([,])dnl
+ ])
+ fi
+ ])
+ case "$gt_cv_int_divbyzero_sigfpe" in
+ *yes) value=1;;
+ *) value=0;;
+ esac
+ AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+ [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/m4/intl.m4 b/m4/intl.m4
new file mode 100644
index 0000000..077cbc7
--- /dev/null
+++ b/m4/intl.m4
@@ -0,0 +1,284 @@
+# intl.m4 serial 8 (gettext-0.17)
+dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006.
+
+AC_PREREQ(2.52)
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([gt_GLIBC2])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([gl_VISIBILITY])dnl
+ AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
+ AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+ AC_REQUIRE([gt_TYPE_WINT_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gt_TYPE_INTMAX_T])
+ AC_REQUIRE([gt_PRINTF_POSIX])
+ AC_REQUIRE([gl_GLIBC21])dnl
+ AC_REQUIRE([gl_XSIZE])dnl
+ AC_REQUIRE([gt_INTL_MACOSX])dnl
+
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+ AC_CHECK_FUNCS([asprintf fwprintf putenv setenv setlocale snprintf wcslen])
+
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+ gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+ AC_SUBST([HAVE_POSIX_PRINTF])
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+ AC_SUBST([HAVE_ASPRINTF])
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+ AC_SUBST([HAVE_SNPRINTF])
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+ AC_SUBST([HAVE_WPRINTF])
+
+ AM_LANGINFO_CODESET
+ gt_LC_MESSAGES
+
+ dnl Compilation on mingw and Cygwin needs special Makefile rules, because
+ dnl 1. when we install a shared library, we must arrange to export
+ dnl auxiliary pointer variables for every exported variable,
+ dnl 2. when we install a shared library and a static library simultaneously,
+ dnl the include file specifies __declspec(dllimport) and therefore we
+ dnl must arrange to define the auxiliary pointer variables for the
+ dnl exported variables _also_ in the static library.
+ if test "$enable_shared" = yes; then
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32dll=yes ;;
+ *) is_woe32dll=no ;;
+ esac
+ else
+ is_woe32dll=no
+ fi
+ WOE32DLL=$is_woe32dll
+ AC_SUBST([WOE32DLL])
+
+ dnl On mingw and Cygwin, we can activate special Makefile rules which add
+ dnl version information to the shared libraries and executables.
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32=yes ;;
+ *) is_woe32=no ;;
+ esac
+ WOE32=$is_woe32
+ AC_SUBST([WOE32])
+ if test $WOE32 = yes; then
+ dnl Check for a program that compiles Windows resource files.
+ AC_CHECK_TOOL([WINDRES], [windres])
+ fi
+
+ dnl Determine whether when creating a library, "-lc" should be passed to
+ dnl libtool or not. On many platforms, it is required for the libtool option
+ dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
+ dnl in the *.la files - makes it impossible to create multithreaded programs,
+ dnl because libtool also reorders the -lc to come before the -pthread, and
+ dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
+ case "$host_os" in
+ hpux*) LTLIBC="" ;;
+ *) LTLIBC="-lc" ;;
+ esac
+ AC_SUBST([LTLIBC])
+
+ dnl Rename some macros and functions used for locking.
+ AH_BOTTOM([
+#define __libc_lock_t gl_lock_t
+#define __libc_lock_define gl_lock_define
+#define __libc_lock_define_initialized gl_lock_define_initialized
+#define __libc_lock_init gl_lock_init
+#define __libc_lock_lock gl_lock_lock
+#define __libc_lock_unlock gl_lock_unlock
+#define __libc_lock_recursive_t gl_recursive_lock_t
+#define __libc_lock_define_recursive gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive gl_recursive_lock_init
+#define __libc_lock_lock_recursive gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive gl_recursive_lock_unlock
+#define glthread_in_use libintl_thread_in_use
+#define glthread_lock_init libintl_lock_init
+#define glthread_lock_lock libintl_lock_lock
+#define glthread_lock_unlock libintl_lock_unlock
+#define glthread_lock_destroy libintl_lock_destroy
+#define glthread_rwlock_init libintl_rwlock_init
+#define glthread_rwlock_rdlock libintl_rwlock_rdlock
+#define glthread_rwlock_wrlock libintl_rwlock_wrlock
+#define glthread_rwlock_unlock libintl_rwlock_unlock
+#define glthread_rwlock_destroy libintl_rwlock_destroy
+#define glthread_recursive_lock_init libintl_recursive_lock_init
+#define glthread_recursive_lock_lock libintl_recursive_lock_lock
+#define glthread_recursive_lock_unlock libintl_recursive_lock_unlock
+#define glthread_recursive_lock_destroy libintl_recursive_lock_destroy
+#define glthread_once libintl_once
+#define glthread_once_call libintl_once_call
+#define glthread_once_singlethreaded libintl_once_singlethreaded
+])
+])
+
+
+dnl Checks for the core files of the intl subdirectory:
+dnl dcigettext.c
+dnl eval-plural.h
+dnl explodename.c
+dnl finddomain.c
+dnl gettextP.h
+dnl gmo.h
+dnl hash-string.h hash-string.c
+dnl l10nflist.c
+dnl libgnuintl.h.in (except the *printf stuff)
+dnl loadinfo.h
+dnl loadmsgcat.c
+dnl localealias.c
+dnl log.c
+dnl plural-exp.h plural-exp.c
+dnl plural.y
+dnl Used by libglocale.
+AC_DEFUN([gt_INTL_SUBDIR_CORE],
+[
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([gt_INTDIV0])dnl
+ AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+ AC_REQUIRE([gt_INTTYPES_PRI])dnl
+ AC_REQUIRE([gl_LOCK])dnl
+
+ AC_TRY_LINK(
+ [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }],
+ [],
+ [AC_DEFINE([HAVE_BUILTIN_EXPECT], 1,
+ [Define to 1 if the compiler understands __builtin_expect.])])
+
+ AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
+ stpcpy strcasecmp strdup strtoul tsearch argz_count argz_stringify \
+ argz_next __fsetlocking])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+
+ AM_ICONV
+
+ dnl glibc >= 2.4 has a NL_LOCALE_NAME macro when _GNU_SOURCE is defined,
+ dnl and a _NL_LOCALE_NAME macro always.
+ AC_CACHE_CHECK([for NL_LOCALE_NAME macro], gt_cv_nl_locale_name,
+ [AC_TRY_LINK([#include <langinfo.h>
+#include <locale.h>],
+ [char* cs = nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES));
+ return !cs;
+ ],
+ gt_cv_nl_locale_name=yes,
+ gt_cv_nl_locale_name=no)
+ ])
+ if test $gt_cv_nl_locale_name = yes; then
+ AC_DEFINE(HAVE_NL_LOCALE_NAME, 1,
+ [Define if you have <langinfo.h> and it defines the NL_LOCALE_NAME macro if _GNU_SOURCE is defined.])
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+ [AC_TRY_COMPILE([$2], [
+#ifndef $1
+ char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+ if test $ac_cv_have_decl_$1 = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
diff --git a/m4/intldir.m4 b/m4/intldir.m4
new file mode 100644
index 0000000..7a28843
--- /dev/null
+++ b/m4/intldir.m4
@@ -0,0 +1,19 @@
+# intldir.m4 serial 1 (gettext-0.16)
+dnl Copyright (C) 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+AC_PREREQ(2.52)
+
+dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
+AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])
diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4
new file mode 100644
index 0000000..d3f0d90
--- /dev/null
+++ b/m4/intlmacosx.m4
@@ -0,0 +1,51 @@
+# intlmacosx.m4 serial 1 (gettext-0.17)
+dnl Copyright (C) 2004-2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Checks for special options needed on MacOS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+ dnl Check for API introduced in MacOS X 10.2.
+ AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+ gt_cv_func_CFPreferencesCopyAppValue,
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
+ [CFPreferencesCopyAppValue(NULL, NULL)],
+ [gt_cv_func_CFPreferencesCopyAppValue=yes],
+ [gt_cv_func_CFPreferencesCopyAppValue=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+ AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
+ [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ dnl Check for API introduced in MacOS X 10.3.
+ AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
+ [gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
+ [gt_cv_func_CFLocaleCopyCurrent=yes],
+ [gt_cv_func_CFLocaleCopyCurrent=no])
+ LIBS="$gt_save_LIBS"])
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
+ [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/m4/intmax.m4 b/m4/intmax.m4
new file mode 100644
index 0000000..ce7a8a4
--- /dev/null
+++ b/m4/intmax.m4
@@ -0,0 +1,33 @@
+# intmax.m4 serial 3 (gettext-0.16)
+dnl Copyright (C) 2002-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;
+ return !x;],
+ gt_cv_c_intmax_t=yes,
+ gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4
new file mode 100644
index 0000000..7c7f894
--- /dev/null
+++ b/m4/inttypes-pri.m4
@@ -0,0 +1,36 @@
+# inttypes-pri.m4 serial 4 (gettext-0.16)
+dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ(2.52)
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values. This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+ AC_CHECK_HEADERS([inttypes.h])
+ if test $ac_cv_header_inttypes_h = yes; then
+ AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+ gt_cv_inttypes_pri_broken,
+ [
+ AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+ ])
+ fi
+ if test "$gt_cv_inttypes_pri_broken" = yes; then
+ AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+ [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+ PRI_MACROS_BROKEN=1
+ else
+ PRI_MACROS_BROKEN=0
+ fi
+ AC_SUBST([PRI_MACROS_BROKEN])
+])
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
new file mode 100644
index 0000000..ab370ff
--- /dev/null
+++ b/m4/inttypes.m4
@@ -0,0 +1,27 @@
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+ [
+ AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+ ])
+ if test $gt_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+ [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+ fi
+])
diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4
new file mode 100644
index 0000000..edc8ecb
--- /dev/null
+++ b/m4/inttypes_h.m4
@@ -0,0 +1,26 @@
+# inttypes_h.m4 serial 7
+dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <inttypes.h>],
+ [uintmax_t i = (uintmax_t) -1; return !i;],
+ gl_cv_header_inttypes_h=yes,
+ gl_cv_header_inttypes_h=no)])
+ if test $gl_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4
new file mode 100644
index 0000000..1319dd1
--- /dev/null
+++ b/m4/isc-posix.m4
@@ -0,0 +1,26 @@
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer. Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4
new file mode 100644
index 0000000..19aa77e
--- /dev/null
+++ b/m4/lcmessage.m4
@@ -0,0 +1,30 @@
+# lcmessage.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([gt_LC_MESSAGES],
+[
+ AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)])
+ if test $gt_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..91ca911
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,119 @@
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2003, 2009-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes
+ ;;
+*)
+ acl_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld [default=no]])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT([$LD])
+else
+ AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..d8d5d1f
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,777 @@
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+ dnl because these -l options might require -L options that are present in
+ dnl LIBS. -l options benefit only from the -L options listed before it.
+ dnl Otherwise, add it to the front of LIBS, because it may be a static
+ dnl library that depends on another static library that is present in LIBS.
+ dnl Static libraries benefit only from the static libraries listed after
+ dnl it.
+ case " $LIB[]NAME" in
+ *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+ *) LIBS="$LIB[]NAME $LIBS" ;;
+ esac
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[$3]], [[$4]])],
+ [ac_cv_lib[]Name=yes],
+ [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ LIB[]NAME[]_PREFIX=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ popdef([NAME])
+ popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl acl_libext,
+dnl acl_shlibext,
+dnl acl_libname_spec,
+dnl acl_library_names_spec,
+dnl acl_hardcode_libdir_flag_spec,
+dnl acl_hardcode_libdir_separator,
+dnl acl_hardcode_direct,
+dnl acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE([rpath],
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_frompackage_]NAME, [$2])
+ popdef([NAME])
+ pushdef([PACK],[$2])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_libsinpackage_]PACKUP,
+ m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+ popdef([PACKUP])
+ popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+ dnl Autoconf >= 2.61 supports dots in --with options.
+ pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH(P_A_C_K[-prefix],
+[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
+ --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ LIB[]NAME[]_PREFIX=
+ dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+ dnl computed. So it has to be reset here.
+ HAVE_LIB[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ dir="$additional_libdir"
+ dnl The same code as in the loop below:
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext"; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$acl_hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+ popdef([P_A_C_K])
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+ AC_REQUIRE([AC_LIB_RPATH])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ $1=
+ if test "$enable_rpath" != no; then
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode directories into the resulting
+ dnl binary.
+ rpathdirs=
+ next=
+ for opt in $2; do
+ if test -n "$next"; then
+ dir="$next"
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next=
+ else
+ case $opt in
+ -L) next=yes ;;
+ -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next= ;;
+ *) next= ;;
+ esac
+ fi
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n ""$3""; then
+ dnl libtool is used for linking. Use -R options.
+ for dir in $rpathdirs; do
+ $1="${$1}${$1:+ }-R$dir"
+ done
+ else
+ dnl The linker is used for linking directly.
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user
+ dnl must pass all path elements in one option.
+ alldirs=
+ for dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="${$1}${$1:+ }$flag"
+ done
+ fi
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([$1])
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644
index 0000000..0465f47
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib and lib64.
+ dnl On glibc systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+ dnl the compiler's default mode by looking at the compiler's library search
+ dnl path. If at least one of its elements ends in /lib64 or points to a
+ dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+ dnl Otherwise we use the default, namely "lib".
+ dnl On Solaris systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+ dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+ dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+ dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+ dnl symlink is missing, so we set acl_libdirstem2 too.
+ AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+ [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+ ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+ ])
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/m4/lock.m4 b/m4/lock.m4
new file mode 100644
index 0000000..9111933
--- /dev/null
+++ b/m4/lock.m4
@@ -0,0 +1,316 @@
+# lock.m4 serial 7 (gettext-0.17)
+dnl Copyright (C) 2005-2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests for a multithreading library to be used.
+dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
+dnl USE_PTH_THREADS, USE_WIN32_THREADS
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+
+AC_DEFUN([gl_LOCK_EARLY],
+[
+ AC_REQUIRE([gl_LOCK_EARLY_BODY])
+])
+
+dnl The guts of gl_LOCK_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_LOCK_EARLY_BODY],
+[
+ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+ dnl influences the result of the autoconf tests that test for *_unlocked
+ dnl declarations, on AIX 5 at least. Therefore it must come early.
+ AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+ AC_BEFORE([$0], [gl_ARGP])dnl
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+ dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+ dnl AC_GNU_SOURCE.
+ m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+ [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+ [AC_REQUIRE([AC_GNU_SOURCE])])
+ dnl Check for multithreading.
+ AC_ARG_ENABLE(threads,
+AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
+AC_HELP_STRING([--disable-threads], [build without multithread safety]),
+ [gl_use_threads=$enableval],
+ [case "$host_os" in
+ dnl Disable multithreading by default on OSF/1, because it interferes
+ dnl with fork()/exec(): When msgexec is linked with -lpthread, its child
+ dnl process gets an endless segmentation fault inside execvp().
+ osf*) gl_use_threads=no ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # For using <pthread.h>:
+ case "$host_os" in
+ osf*)
+ # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ # groks <pthread.h>. cc also understands the flag -pthread, but
+ # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # 2. putting a flag into CPPFLAGS that has an effect on the linker
+ # causes the AC_TRY_LINK test below to succeed unexpectedly,
+ # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ ;;
+ esac
+ # Some systems optimize for single-threaded programs by default, and
+ # need special flags to disable these optimizations. For example, the
+ # definition of 'errno' in <errno.h>.
+ case "$host_os" in
+ aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+ solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+ esac
+ fi
+])
+
+dnl The guts of gl_LOCK. Needs to be expanded only once.
+
+AC_DEFUN([gl_LOCK_BODY],
+[
+ AC_REQUIRE([gl_LOCK_EARLY_BODY])
+ gl_threads_api=none
+ LIBTHREAD=
+ LTLIBTHREAD=
+ LIBMULTITHREAD=
+ LTLIBMULTITHREAD=
+ if test "$gl_use_threads" != no; then
+ dnl Check whether the compiler and linker support weak declarations.
+ AC_MSG_CHECKING([whether imported symbols can be declared weak])
+ gl_have_weak=no
+ AC_TRY_LINK([extern void xyzzy ();
+#pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes])
+ AC_MSG_RESULT([$gl_have_weak])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_LOCK_EARLY_BODY.
+ AC_CHECK_HEADER(pthread.h, gl_have_pthread_h=yes, gl_have_pthread_h=no)
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ gl_have_pthread=
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_mutex_lock((pthread_mutex_t*)0);
+ pthread_mutexattr_init((pthread_mutexattr_t*)0);],
+ [gl_have_pthread=yes])
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test -n "$gl_have_pthread"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ AC_CHECK_LIB(pthread, pthread_kill,
+ [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ case "$host_os" in
+ solaris* | hpux*)
+ AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], 1,
+ [Define if the pthread_in_use() detection is hard.])
+ esac
+ ])
+ else
+ # Some library is needed. Try libpthread and libc_r.
+ AC_CHECK_LIB(pthread, pthread_kill,
+ [gl_have_pthread=yes
+ LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
+ LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
+ if test -z "$gl_have_pthread"; then
+ # For FreeBSD 4.
+ AC_CHECK_LIB(c_r, pthread_kill,
+ [gl_have_pthread=yes
+ LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
+ LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
+ fi
+ fi
+ if test -n "$gl_have_pthread"; then
+ gl_threads_api=posix
+ AC_DEFINE([USE_POSIX_THREADS], 1,
+ [Define if the POSIX multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_POSIX_THREADS_WEAK], 1,
+ [Define if references to the POSIX multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
+ # pthread_rwlock_* functions.
+ AC_CHECK_TYPE([pthread_rwlock_t],
+ [AC_DEFINE([HAVE_PTHREAD_RWLOCK], 1,
+ [Define if the POSIX multithreading library has read/write locks.])],
+ [],
+ [#include <pthread.h>])
+ # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif],
+ [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1,
+ [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+ fi
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
+ gl_have_solaristhread=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lthread"
+ AC_TRY_LINK([#include <thread.h>
+#include <synch.h>],
+ [thr_self();],
+ [gl_have_solaristhread=yes])
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_solaristhread"; then
+ gl_threads_api=solaris
+ LIBTHREAD=-lthread
+ LTLIBTHREAD=-lthread
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_SOLARIS_THREADS], 1,
+ [Define if the old Solaris multithreading library can be used.])
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_SOLARIS_THREADS_WEAK], 1,
+ [Define if references to the old Solaris multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ fi
+ fi
+ if test "$gl_use_threads" = pth; then
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_LINKFLAGS(pth)
+ gl_have_pth=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lpth"
+ AC_TRY_LINK([#include <pth.h>], [pth_self();], gl_have_pth=yes)
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_pth"; then
+ gl_threads_api=pth
+ LIBTHREAD="$LIBPTH"
+ LTLIBTHREAD="$LTLIBPTH"
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_PTH_THREADS], 1,
+ [Define if the GNU Pth multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_PTH_THREADS_WEAK], 1,
+ [Define if references to the GNU Pth multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ else
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
+ if { case "$host_os" in
+ mingw*) true;;
+ *) false;;
+ esac
+ }; then
+ gl_threads_api=win32
+ AC_DEFINE([USE_WIN32_THREADS], 1,
+ [Define if the Win32 multithreading API can be used.])
+ fi
+ fi
+ fi
+ fi
+ AC_MSG_CHECKING([for multithread API to use])
+ AC_MSG_RESULT([$gl_threads_api])
+ AC_SUBST(LIBTHREAD)
+ AC_SUBST(LTLIBTHREAD)
+ AC_SUBST(LIBMULTITHREAD)
+ AC_SUBST(LTLIBMULTITHREAD)
+])
+
+AC_DEFUN([gl_LOCK],
+[
+ AC_REQUIRE([gl_LOCK_EARLY])
+ AC_REQUIRE([gl_LOCK_BODY])
+ gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [
+ AC_REQUIRE([AC_C_INLINE])
+])
+
+dnl Survey of platforms:
+dnl
+dnl Platform Available Compiler Supports test-lock
+dnl flavours option weak result
+dnl --------------- --------- --------- -------- ---------
+dnl Linux 2.4/glibc posix -lpthread Y OK
+dnl
+dnl GNU Hurd/glibc posix
+dnl
+dnl FreeBSD 5.3 posix -lc_r Y
+dnl posix -lkse ? Y
+dnl posix -lpthread ? Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 5.2 posix -lc_r Y
+dnl posix -lkse Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
+dnl
+dnl NetBSD 1.6 --
+dnl
+dnl OpenBSD 3.4 posix -lpthread Y OK
+dnl
+dnl MacOS X 10.[123] posix -lpthread Y OK
+dnl
+dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11 posix -lpthread N (cc) OK
+dnl Y (gcc)
+dnl
+dnl IRIX 6.5 posix -lpthread Y 0.5
+dnl
+dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
+dnl -lpthread (gcc) Y
+dnl
+dnl Cygwin posix -lpthread Y OK
+dnl
+dnl Any of the above pth -lpth 0.0
+dnl
+dnl Mingw win32 N OK
+dnl
+dnl BeOS 5 --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl OK if all three tests terminate OK,
+dnl 0.5 if the first test terminates OK but the second one loops endlessly,
+dnl 0.0 if the first test already loops endlessly.
diff --git a/m4/longdouble.m4 b/m4/longdouble.m4
new file mode 100644
index 0000000..25590f4
--- /dev/null
+++ b/m4/longdouble.m4
@@ -0,0 +1,31 @@
+# longdouble.m4 serial 2 (gettext-0.15)
+dnl Copyright (C) 2002-2003, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+dnl This file is only needed in autoconf <= 2.59. Newer versions of autoconf
+dnl have a macro AC_TYPE_LONG_DOUBLE with identical semantics.
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+ AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+ [if test "$GCC" = yes; then
+ gt_cv_c_long_double=yes
+ else
+ AC_TRY_COMPILE([
+ /* The Stardent Vistra knows sizeof(long double), but does not support it. */
+ long double foo = 0.0;
+ /* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+ ], ,
+ gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+ fi])
+ if test $gt_cv_c_long_double = yes; then
+ AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+ fi
+])
diff --git a/m4/longlong.m4 b/m4/longlong.m4
new file mode 100644
index 0000000..a72e53b
--- /dev/null
+++ b/m4/longlong.m4
@@ -0,0 +1,109 @@
+# longlong.m4 serial 13
+dnl Copyright (C) 1999-2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+ dnl If cross compiling, assume the bug isn't important, since
+ dnl nobody cross compiles for this platform as far as we know.
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <limits.h>
+ @%:@ifndef LLONG_MAX
+ @%:@ define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ @%:@ define LLONG_MAX (HALF - 1 + HALF)
+ @%:@endif]],
+ [[long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;]])],
+ [ac_cv_type_long_long_int=yes],
+ [ac_cv_type_long_long_int=no],
+ [ac_cv_type_long_long_int=yes])],
+ [ac_cv_type_long_long_int=no])])
+ if test $ac_cv_type_long_long_int = yes; then
+ AC_DEFINE([HAVE_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `long long int'.])
+ fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [ac_cv_type_unsigned_long_long_int=yes],
+ [ac_cv_type_unsigned_long_long_int=no])])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `unsigned long long int'.])
+ fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+ AC_LANG_PROGRAM(
+ [[/* Test preprocessor. */
+ #if ! (-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ error in preprocessor;
+ #endif
+ #if ! (18446744073709551615ULL <= -1ull)
+ error in preprocessor;
+ #endif
+ /* Test literals. */
+ long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ unsigned long long int ull = 18446744073709551615ULL;
+ /* Test constant expressions. */
+ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[/* Test availability of runtime routines for shift and division. */
+ long long int llmax = 9223372036854775807ll;
+ unsigned long long int ullmax = 18446744073709551615ull;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll)
+ | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+ | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/m4/nls.m4 b/m4/nls.m4
new file mode 100644
index 0000000..93df8d3
--- /dev/null
+++ b/m4/nls.m4
@@ -0,0 +1,32 @@
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE([nls],
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT([$USE_NLS])
+ AC_SUBST([USE_NLS])
+])
diff --git a/m4/po.m4 b/m4/po.m4
new file mode 100644
index 0000000..d4bc262
--- /dev/null
+++ b/m4/po.m4
@@ -0,0 +1,453 @@
+# po.m4 serial 24 (gettext-0.19)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+ AC_REQUIRE([AC_PROG_SED])dnl
+ AC_REQUIRE([AM_NLS])dnl
+
+ dnl Release version of the gettext macros. This is used to ensure that
+ dnl the gettext macros and po/Makefile.in.in are in sync.
+ AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+ dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+ case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+ *) MSGFMT_015=$MSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([GMSGFMT_015])
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([XGETTEXT_015])
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+ dnl Installation directories.
+ dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+ dnl have to define it here, so that it can be used in po/Makefile.
+ test -n "$localedir" || localedir='${datadir}/locale'
+ AC_SUBST([localedir])
+
+ dnl Support for AM_XGETTEXT_OPTION.
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+ AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+ AC_CONFIG_COMMANDS([po-directories], [[
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ POMAKEFILEDEPS="POTFILES.in"
+ # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # The set of available languages was given in configure.in.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done]],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake < 1.5.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ fi
+
+ # A sed script that extracts the value of VARIABLE from a Makefile.
+ tab=`printf '\t'`
+ sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+ # Seen the first line of the variable definition.
+ s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+ ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+ fi
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ fi
+
+ sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ tab=`printf '\t'`
+ if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+ # Add dependencies that cannot be formulated as a simple suffix rule.
+ for lang in $ALL_LINGUAS; do
+ frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+ cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+ done
+ fi
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/m4/printf-posix.m4 b/m4/printf-posix.m4
new file mode 100644
index 0000000..14ba612
--- /dev/null
+++ b/m4/printf-posix.m4
@@ -0,0 +1,44 @@
+# printf-posix.m4 serial 3 (gettext-0.17)
+dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+ gt_cv_func_printf_posix,
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+ [
+ AC_EGREP_CPP(notposix, [
+#if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+ ], gt_cv_func_printf_posix="guessing no",
+ gt_cv_func_printf_posix="guessing yes")
+ ])
+ ])
+ case $gt_cv_func_printf_posix in
+ *yes)
+ AC_DEFINE(HAVE_POSIX_PRINTF, 1,
+ [Define if your printf() function supports format strings with positions.])
+ ;;
+ esac
+])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644
index 0000000..0921e1e
--- /dev/null
+++ b/m4/progtest.m4
@@ -0,0 +1,91 @@
+# progtest.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1996-2003, 2005, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.50])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+ ac_executable_p="test -x"
+else
+ ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+ [[\\/]]* | ?:[[\\/]]*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ IFS="$ac_save_IFS"
+ test -z "$ac_dir" && ac_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+ echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+ break 2
+ fi
+ fi
+ done
+ done
+ IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$][$1])
+else
+ AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
diff --git a/m4/size_max.m4 b/m4/size_max.m4
new file mode 100644
index 0000000..6cb4868
--- /dev/null
+++ b/m4/size_max.m4
@@ -0,0 +1,68 @@
+# size_max.m4 serial 6
+dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS(stdint.h)
+ dnl First test whether the system already has SIZE_MAX.
+ AC_MSG_CHECKING([for SIZE_MAX])
+ AC_CACHE_VAL([gl_cv_size_max], [
+ gl_cv_size_max=
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], gl_cv_size_max=yes)
+ if test -z "$gl_cv_size_max"; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'. Try hard to find a definition that can
+ dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+ AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+ [#include <stddef.h>
+#include <limits.h>], size_t_bits_minus_1=)
+ AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+ [#include <stddef.h>], fits_in_uint=)
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_TRY_COMPILE([#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ], [], fits_in_uint=0)
+ fi
+ dnl We cannot use 'expr' to simplify this expression, because 'expr'
+ dnl works only with 'long' integers in the host environment, while we
+ dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+ ])
+ AC_MSG_RESULT([$gl_cv_size_max])
+ if test "$gl_cv_size_max" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4
new file mode 100644
index 0000000..db9a8ac
--- /dev/null
+++ b/m4/stdint_h.m4
@@ -0,0 +1,26 @@
+# stdint_h.m4 serial 6
+dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h,
+ [AC_TRY_COMPILE(
+ [#include <sys/types.h>
+#include <stdint.h>],
+ [uintmax_t i = (uintmax_t) -1; return !i;],
+ gl_cv_header_stdint_h=yes,
+ gl_cv_header_stdint_h=no)])
+ if test $gl_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4
new file mode 100644
index 0000000..641c489
--- /dev/null
+++ b/m4/uintmax_t.m4
@@ -0,0 +1,30 @@
+# uintmax_t.m4 serial 10
+dnl Copyright (C) 1997-2004, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ test $ac_cv_type_unsigned_long_long_int = yes \
+ && ac_type='unsigned long long' \
+ || ac_type='unsigned long'
+ AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+ [Define to unsigned long or unsigned long long
+ if <stdint.h> and <inttypes.h> don't define.])
+ else
+ AC_DEFINE(HAVE_UINTMAX_T, 1,
+ [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4
new file mode 100644
index 0000000..9fae98e
--- /dev/null
+++ b/m4/ulonglong.m4
@@ -0,0 +1,48 @@
+# ulonglong.m4 serial 6
+dnl Copyright (C) 1999-2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.60, but can be removed once we
+# assume 2.61 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[unsigned long long int ull = 18446744073709551615ULL;
+ typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[unsigned long long int ullmax = 18446744073709551615ull;
+ return (ull << 63 | ull >> 63 | ull << i | ull >> i
+ | ullmax / ull | ullmax % ull);]])],
+ [ac_cv_type_unsigned_long_long_int=yes],
+ [ac_cv_type_unsigned_long_long_int=no])])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `unsigned long long int'.])
+ fi
+])
+
+# This macro is obsolescent and should go away soon.
+AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ ac_cv_type_unsigned_long_long=$ac_cv_type_unsigned_long_long_int
+ if test $ac_cv_type_unsigned_long_long = yes; then
+ AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+ [Define if you have the 'unsigned long long' type.])
+ fi
+])
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 0000000..2ff6330
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,52 @@
+# visibility.m4 serial 1 (gettext-0.15)
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ AC_MSG_CHECKING([for simple visibility declarations])
+ AC_CACHE_VAL(gl_cv_cc_visibility, [
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ AC_TRY_COMPILE(
+ [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);],
+ [],
+ gl_cv_cc_visibility=yes,
+ gl_cv_cc_visibility=no)
+ CFLAGS="$gl_save_CFLAGS"])
+ AC_MSG_RESULT([$gl_cv_cc_visibility])
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+ AC_SUBST([CFLAG_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644
index 0000000..cde2129
--- /dev/null
+++ b/m4/wchar_t.m4
@@ -0,0 +1,20 @@
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644
index 0000000..af5ed93
--- /dev/null
+++ b/m4/wint_t.m4
@@ -0,0 +1,28 @@
+# wint_t.m4 serial 2 (gettext-0.17)
+dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+ fi
+])
diff --git a/m4/xsize.m4 b/m4/xsize.m4
new file mode 100644
index 0000000..85bb721
--- /dev/null
+++ b/m4/xsize.m4
@@ -0,0 +1,13 @@
+# xsize.m4 serial 3
+dnl Copyright (C) 2003-2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_HEADERS(stdint.h)
+])
diff --git a/missing b/missing
new file mode 100755
index 0000000..f62bbae
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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, 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, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/po/ChangeLog b/po/ChangeLog
new file mode 100644
index 0000000..668a6c2
--- /dev/null
+++ b/po/ChangeLog
@@ -0,0 +1,9 @@
+2016-06-14 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.in.in: New file, from gettext-0.19.7.
+
+2016-06-14 gettextize <bug-gnu-gettext@gnu.org>
+
+ * Makefile.in.in: Upgrade to gettext-0.19.7.
+ * Rules-quot: Upgrade to gettext-0.19.7.
+
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..3931552
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,2 @@
+# Set of available languages for gentoo.
+ca de es es_MX fr it ja_JP.UTF-8 pl ru_RU.cp1251 ru_RU.CP1251 ru_RU.KOI8-R ru_RU.koi8r ru_RU.UTF-8 ru_RU.utf8 sv
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..8f34f00
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,483 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+#
+# Origin: gettext-0.19.7
+GETTEXT_MACRO_VERSION = 0.19
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SED = @SED@
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+# When building gettext-tools, we prefer to use the built programs
+# rather than installed programs. However, we can't do that when we
+# are cross compiling.
+CROSS_COMPILING = @CROSS_COMPILING@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
+POFILESDEPS_yes = $(POFILESDEPS_)
+POFILESDEPS_no =
+POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
+
+DISTFILESDEPS_ = update-po
+DISTFILESDEPS_yes = $(DISTFILESDEPS_)
+DISTFILESDEPS_no =
+DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+ @echo "$(MSGFMT) -c -o $@ $<"; \
+ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+ @lang=`echo $* | sed -e 's,.*/,,'`; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+ sed -e '/^#/d' $< > t-$@
+ mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+CHECK_MACRO_VERSION = \
+ test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+ exit 1; \
+ }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+ @$(CHECK_MACRO_VERSION)
+ test ! -f $(srcdir)/$(DOMAIN).pot || \
+ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+ @test ! -f $(srcdir)/$(DOMAIN).pot || { \
+ echo "touch stamp-po" && \
+ echo timestamp > stamp-poT && \
+ mv stamp-poT stamp-po; \
+ }
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+# The determination of whether the package xyz is a GNU one is based on the
+# heuristic whether some file in the top level directory mentions "GNU xyz".
+# If GNU 'find' is available, we avoid grepping through monster files.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ package_gnu="$(PACKAGE_GNU)"; \
+ test -n "$$package_gnu" || { \
+ if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
+ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \
+ -size -10000000c -exec grep 'GNU @PACKAGE@' \
+ /dev/null '{}' ';' 2>/dev/null; \
+ else \
+ LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
+ fi; \
+ } | grep -v 'libtool:' >/dev/null; then \
+ package_gnu=yes; \
+ else \
+ package_gnu=no; \
+ fi; \
+ }; \
+ if test "$$package_gnu" = "yes"; then \
+ package_prefix='GNU '; \
+ else \
+ package_prefix=''; \
+ fi; \
+ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+ else \
+ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+ fi; \
+ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$${package_prefix}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ esac
+ test ! -f $(DOMAIN).po || { \
+ if test -f $(srcdir)/$(DOMAIN).pot-header; then \
+ sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \
+ cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po; \
+ rm -f $(DOMAIN).1po; \
+ fi; \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+ else \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ else \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+ $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(POFILESDEPS)
+ @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+ if test -f "$(srcdir)/$${lang}.po"; then \
+ test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+ cd $(srcdir) \
+ && { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+ *) \
+ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+ esac; \
+ }; \
+ else \
+ $(MAKE) $${lang}.po-create; \
+ fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ for file in Makevars; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+ fi; \
+ done; \
+ done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+installdirs-data-no:
+installdirs-data-yes:
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ fi; \
+ done; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+uninstall-data-no:
+uninstall-data-yes:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ done; \
+ done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+ rm -f remove-potcdate.sed
+ rm -f stamp-poT
+ rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ dists="$$dists Makevars.template"; \
+ fi; \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ dists="$$dists $(DOMAIN).pot stamp-po"; \
+ fi; \
+ if test -f $(srcdir)/ChangeLog; then \
+ dists="$$dists ChangeLog"; \
+ fi; \
+ for i in 0 1 2 3 4 5 6 7 8 9; do \
+ if test -f $(srcdir)/ChangeLog.$$i; then \
+ dists="$$dists ChangeLog.$$i"; \
+ fi; \
+ done; \
+ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+ for file in $$dists; do \
+ if test -f $$file; then \
+ cp -p $$file $(distdir) || exit 1; \
+ else \
+ cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+ fi; \
+ done
+
+update-po: Makefile
+ $(MAKE) $(DOMAIN).pot-update
+ test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+ $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+ @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+ exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+ @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+ *) \
+ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+ esac; \
+ }; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+ @:
+
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+ cd $(top_builddir) \
+ && @SHELL@ ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644
index 0000000..8f4cccf
--- /dev/null
+++ b/po/Makevars
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --sort-by-file --keyword=_ --keyword=N_ --width=256 --from-code=UTF-8
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
+# package. (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.) Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright. The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Emil Brink
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = Emil Brink
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used. It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..3197e5a
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,64 @@
+src/cfg_buttonlayout.c
+src/cfg_buttons.c
+src/cfg_cmdcfg.c
+src/cfg_cmdseq.c
+src/cfg_controls.c
+src/cfg_dirpane.c
+src/cfg_errors.c
+src/cfg_menus.c
+src/cfg_nag.c
+src/cfg_paths.c
+src/cfg_styles.c
+src/cfg_types.c
+src/cfg_windows.c
+src/children.c
+src/cmd_about.c
+src/cmd_chmod.c
+src/cmd_chown.c
+src/cmd_configure.c
+src/cmd_copy.c
+src/cmd_copyas.c
+src/cmd_delete.c
+src/cmd_dpfocus.c
+src/cmd_dpfocusisrch.c
+src/cmd_generic.c
+src/cmd_getsize.c
+src/cmd_info.c
+src/cmd_join.c
+src/cmd_mkdir.c
+src/cmd_move.c
+src/cmd_moveas.c
+src/cmd_quit.c
+src/cmd_rename.c
+src/cmd_renamere.c
+src/cmd_renameseq.c
+src/cmd_select.c
+src/cmd_split.c
+src/cmd_symlink.c
+src/cmd_viewtext.c
+src/cmdarg.c
+src/cmdgrab.c
+src/cmdseq.c
+src/cmdseq_dialog.c
+src/color_dialog.c
+src/configure.c
+src/dialog.c
+src/dirpane.c
+src/dpformat.c
+src/errors.c
+src/gentoo.c
+src/gfam.c
+src/guiutil.c
+src/icon_dialog.c
+src/iconutil.c
+src/menus.c
+src/nag_dialog.c
+src/overwrite.c
+src/progress.c
+src/sizeutil.c
+src/style_dialog.c
+src/styles.c
+src/textview.c
+src/types.c
+src/window.c
+src/xmlutil.c
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644
index 0000000..baf6528
--- /dev/null
+++ b/po/Rules-quot
@@ -0,0 +1,58 @@
+# This file, Rules-quot, can be copied and used freely without restrictions.
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+ $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+ $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+ @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ ll=`echo $$lang | sed -e 's/@.*//'`; \
+ LC_ALL=C; export LC_ALL; \
+ cd $(srcdir); \
+ if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
+ | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
+ { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
+ $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
+ ;; \
+ *) \
+ $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
+ ;; \
+ esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
+ ; then \
+ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+ rm -f $$tmpdir/$$lang.new.po; \
+ else \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "creation of $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+en@quot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+ rm -f *.insert-header
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644
index 0000000..4b937aa
--- /dev/null
+++ b/po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
+s/“/“/g
+s/â€/â€/g
+s/‘/‘/g
+s/’/’/g
diff --git a/po/ca.gmo b/po/ca.gmo
new file mode 100644
index 0000000..2bea70c
--- /dev/null
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..0393eac
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,2955 @@
+# translation of de.po to Catalan
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR Emil Brink.
+# Innocent De Marchi <tangram.peces@gmail.com>, 2011-2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2015-01-17 19:08+0100\n"
+"Last-Translator: Innocent De Marchi <tangram.peces@gmail.com>\n"
+"Language-Team: Innocent De Marchi <tangram.peces@gmail.com>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.10\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "A l'esquerra dels botons d'ordres"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "A dreta dels botons d'ordres"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Estàtic (sense separació)"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Panell"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Estàtic"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Aquesta pàgina no permet controlar la forma d'ubicació del panell de "
+"Funcions Ràpides en relació al\n"
+"panell que conté els Botons d'Ordres. És una casta d'anclatge; la idea\n"
+"és proporcionar una major flexibilitat en l'administració dels botons i "
+"permetre la\n"
+"creació de més panells de botons integrats en el programa. Però això encara "
+"està per fer.\n"
+"\n"
+"Fins el moment, es proporciona la funcionalitat semblat a quan les funcions "
+"ràpides\n"
+"eren una funció especial amb la seva pàgina pròpia de configuració (fins a "
+"la versió 0.11.24 de gentoo), per el seu acomod.\n"
+"Per trobar un panell de funcions ràpides, canviau a la pàgina de Definicions "
+"i feu servir l'opció d'entrada del menú\n"
+"del cantó superior esquerra de la pàgina."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Posició del panell de Funcions Ràpides"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Estil d'espaiat mitjançer"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Posició"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Establir l'ample de Fila"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Predeterminat"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Si us plau, Confirmeu"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "De debò voleu eliminar la fila de botons seleccionada?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Borrar|_Cancelar"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Seleccionar l'amplada de la nova fila"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Canviar l'amplada de la fila"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Editar el color del fons"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Editar el color del primer pla"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etiqueta"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Ordre"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Tecla"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Colors"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Fons..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Restablir predeterminat"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Primer pla..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Dreceres"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Netejar"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Copiar colors a"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Copiar a"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Canviar amb"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Afegir fila..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Eliminar fila"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Abaix"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Amplada de fila"
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Amunt"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Panell"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Principal"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Secundari"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Consell"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Banderes"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "¿Refinar?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "¿Mostrar consell?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Botons"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definicions"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Opcions"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Seleccionar predeterminat"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Obrint clau"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Tancant clau"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "El primer seleccionat"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Primer seleccionat, desseleccionat"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "El primer seleccionat, amb l'adreça"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "El primer selecciona, amb l'adreça, desseleccionat"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "El primer seleccionat (panell de desti)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "El primer selecciona sense cometes"
+
+#: src/cfg_cmdseq.c:631
+msgid "First selected, no extension"
+msgstr "Primer seleccionat, sense extensió"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Tos els seleccionats"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Tots els seleccionats, desseleccionar"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Tots els seleccionats amb l'adreça"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Tots els seleccionats, amb les adreces, desseleccionar"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Tots els seleccionats (panell de desti)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Tots els seleccionats, sense cometes"
+
+#: src/cfg_cmdseq.c:638
+msgid "All selected, no extensions"
+msgstr "Tots els seleccionats, sense extensió"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Adreça al directori del panell d'origen"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Adreça al directori del panell de desti"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Adreça al directori personal"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Adreça del panell de l'esquerra"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Adreça del panell de la dreta"
+
+#: src/cfg_cmdseq.c:644
+msgid "URI of first selected"
+msgstr "URI del primer seleccionat"
+
+#: src/cfg_cmdseq.c:645
+msgid "URI of first selected, unselect"
+msgstr "URI del primer seleccionat, desseleccionar"
+
+#: src/cfg_cmdseq.c:646
+msgid "URI of first selected, no quotes"
+msgstr "URI del primer seleccionat sense cometes"
+
+#: src/cfg_cmdseq.c:647
+msgid "URIs of all selected"
+msgstr "URI de tots els seleccionats"
+
+#: src/cfg_cmdseq.c:648
+msgid "URIs of all selected, unselect"
+msgstr "URI de tots els seleccionats, desseleccionar"
+
+#: src/cfg_cmdseq.c:649
+msgid "URIs of all selected, no quotes"
+msgstr "URI de tots els seleccionats, sense cometes"
+
+#: src/cfg_cmdseq.c:650
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "URI de tots els seleccionats, sense cometes"
+
+#: src/cfg_cmdseq.c:651
+msgid "URI of first selected (destination pane)"
+msgstr "URI del primer seleccionat (panell de desti)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Caixa de selecció"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Entrada fent servir menú"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Textw d'entrada"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Botó d'opció d'entrada (dona VERTADER o FALS)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Agregar etiqueta a la finestra d'entrada"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Agregar una barra de separació a la finestra d'entrada"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Valor de $NAME (entorn)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID de gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Directori arrel del usuari <NOM>"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NOM"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Seleccionar codi"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(No hi ha opcions disponibles)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Executar en segon pla?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Matar instància anterior?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Sobreviu tancar?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Capturar sortida?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "Requereix selecció d'origen?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "Requereix selecció de destí?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "CD origen?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "CD destí?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Actualitzar l'origen?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Actualitzar destí?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "General"
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr "Abans"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr "Després"
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Predefinits"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Externs"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Afegir fila"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nom"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definició"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Repetir la seqüència fins acabar amb la selecció original?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Afegir"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Ordres"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Esquerra"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Centre"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Dreta"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Baixar"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Pujar"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Les tecles següents de modificació cal\n"
+"mantenir-les pitjades en clicar amb el ratolí\n"
+"per executar l'ordre."
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Editar modificadors"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Controls"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Funcions globals ràpides del teclat"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Panell de control dels icones del ratolí"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Botó"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Editar modificadors..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Click-M-Click combinació"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Límit de temps"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ignorar el bloqueig numèric (tecla Bloq Num) per a tots els enllaços?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Nota: Les opcions per a la configuració del botó del ratolí\n"
+"son ambigües: el mateix botó+modificador\n"
+"es fa servir per a més d'una funció. Aixó\n"
+"pot fer que se comportin d'una manera una mica estranya..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Advertència"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_d'Acord"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Afegir caràcter de tipus?"
+
+#: src/cfg_dirpane.c:337
+msgid "Append \"→ destination\" on Links?"
+msgstr "Afegir \"→ desti\" en els enllaços?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Marca cada 3 dígits?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Dígits de precisió"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Mostrar la mida del directori del sistema d'arxius"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Format"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s Opcions"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Contingut"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Justificació"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Títol"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Amplada"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centre"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Opcions bàsiques"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Editar el contingut de la columna"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Títol predeterminat"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Directoris primer"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Directoris al final"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Mesclar directoris"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "A l'esquerra de la llista"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "A la dreta de la llista"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Predeterminat del sistema"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Copiar des de %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Copiar a %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Intercanviar amb %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Columnes"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Tipus de continguts disponibles"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Tipus de continguts seleccionats"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Editar..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Eliminar"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Ordenar"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Ordenar per"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Mode"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Ordre Invers?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ignorar majúscules/minúscules"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Directori predeterminat"
+
+#: src/cfg_dirpane.c:1111
+msgid "Starting Directory"
+msgstr "Directori inicial"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Obtindre l'actual"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Des de historial"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Ruta superior?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "És possible amagar?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Sempre amb barres de desplazamient?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Botó pujar gran?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr "Voleu establir la font personalitzada?"
+
+#: src/cfg_dirpane.c:1156
+msgid "Rubber banding Selection?"
+msgstr "Requereix selecció de destí?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Posició de la barra de desplaçament"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Horitzontal"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Vertical"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "No rastretjar"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Proporció"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Mida, panell esquerre"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Mida, panell dreta"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientació del panell"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Rastrejar Divisió"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "pixeles"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Recordar les files seleccionades?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Desar les llistes d'historial?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Panells de directoris"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Divisió de panells"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historial"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr "Contingut 'Blocs' obsoletes"
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"La columna de \"Blocs\" ja no s'admet, \n"
+"però la configuració en fa us. S'eliminarà \n"
+"automàticament."
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr "Contingut 'Mida de Bloc' obsolet."
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"La columna 'Mida de bloc' ja no es fa servir, \n"
+"però la seva configuració personalitzada la fa servir.\n"
+"S'eliminarà automàticament."
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Errors"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr "Presentació de missatges d'error i d'estat."
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr "Barra d'estat per sobre dels panells"
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr "Barra de títol de la finestra principal."
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr "Finestra de diàleg separada"
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Alarma en cas d'error?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menús"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+"Faci clic en el botó per restablir el %zu emmagatzemat \"No tornar a mostrar "
+"aquest quadre de diàleg de nou\" resposta."
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr "Persistent"
+
+#: src/cfg_nag.c:110
+msgid "Reset All"
+msgstr "Restablir tot"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr "Editar l'adreça de directori"
+
+#: src/cfg_paths.c:72
+msgid "_Cancel"
+msgstr "_Cancel·lar"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr "_Obre"
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Icons"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Iniciant amb punto (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Coincidències en ER"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Cap"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Adreces i amagar"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Adreces"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Amagar entrades"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Cap)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Acció eliminar"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Editar color"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Retornar a l'ordre heretada"
+
+#: src/cfg_styles.c:563
+msgid "Select Command ..."
+msgstr "Seleccionar ordre ..."
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Nova propietat de l'acció"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "alguna cosa"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Eliminar aquest estil eliminarà també\n"
+"tots els derivats. N'estau segur?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Confirmar eliminar"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Color de fons"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Color de primer pla"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Icone"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Text per pre-visualitzar estil de fila)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Pre-visualitzar"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Sobreescriure els pares?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Elegir..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Afegir acció..."
+
+#: src/cfg_styles.c:826
+msgid "Edit Command"
+msgstr "Editar l'ordre"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Pare"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Propietats heretades"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visual"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Accions"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Tipus d'arxius"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Estils"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Clic per canviar..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nou Tipus)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-Dev"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-Dev"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Dir"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Arxius"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Enllaç"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Sòcol"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Lectura"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "Establir GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "Establir UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Estàtic (Sticky)"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Executable"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Modificable"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Identificar 'arxiu' (ER)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Identificar nom (ER)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Requereix extensió"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identificació"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Requerir tipus"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Requerir protecció"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Glob?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Estil del tipus"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Estil"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Tipus"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Finestres de diàleg al centre de la pantalla"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Finestres de diàleg segueixen el ratolí"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Finestres de diàleg situades per l'administrador de finestra"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Finestres"
+
+#: src/cfg_windows.c:102
+msgid "Window Borders"
+msgstr "Limits de finestra"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Posició de diàlegs "
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Ha fallat l'execució de \"%s\""
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Error"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr ""
+"No ha estat possible finalitzar el procés fill \"%s\" (pid=%d)--alerta de "
+"zombie"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr "CHARSET natiu: \"%s\"."
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr "Nom de l'arxiu de codificació: \"%s\"."
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Versió %s (GTK+ versió %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2015 per Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Aquest programa es programari lliure i no hi ha ABSOLUTAMENT CAP\n"
+"GARANTÃA. Llegeixi l'arxiu COPYING per a més detalls.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Suportat, fent servir cadenes de text integrades en anglès"
+
+#: src/cmd_about.c:157
+#, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Podeu contactar amb l'autor de gentoo per Internet\n"
+"Correu electrònic: <a href=\"mailto:%s\">%s</a>; s'agraeixen \n"
+"opinions, suggeriments/informes d'errors i d'altres.\n"
+"\n"
+"Podeu obtenir la darrera versió del programa\n"
+"a la web oficial del projecte gentoo a\n"
+"<a href=\"%s\">%s</a>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Quant a gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_d'Acord (Espera per més)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Establir bits de protecció per a \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Grup"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Altres"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Propietari"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Especial"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Execució"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lectura"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Establir GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Establir UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Escriptura"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bits de protecció"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr "Literals"
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr "Octal"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Tot"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Activar"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Restablir"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Recursiu en els directoris?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "No tocar directoris?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Canviar mode"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Establir propietari per a '%s'"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Usuari"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Canviar pertinença"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Desar els canvis en la configuració en sortir?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr "Error en copiar FIFO: %s"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr "Error en copiar un fitxer especial: %s"
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+"Error en copiar un fitxer especial: no es tracta d'una ruta d'accés local"
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Existeix - Seguir amb la còpia?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Copiant..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Preservar dates en copiar?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr "Ignorar errades de còpia d'atributs (Date, propietari, mode)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Ignorar destinació fallida si la mida és igual?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Mida del buffer"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Escriviu el nom per a la còpia de \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Escriviu el nom per a el clon de \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Ja existeix - Continuar amb la clonacio?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Clonant..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Copiant com..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Escriviu el nom per a l'enllaç \"%s\" com"
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Escriviu el nom per a el clon de l'enllaç de \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Ja existeix - Procedir amb l'enllaç simbòlic?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Copiar com"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Clonar"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Enllaç simbòlica com"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Clonar enllaç simbòlic"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"no s'ha pogut eliminar degut a restriccions d'accés.\n"
+"Intentar canviar la protecció i tornar a provar?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Recordar resposta (canvia la configuració)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Problema d'accés"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Canviar|Abandonar"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "Segur que voleu eliminar \"%s\"?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Eliminant..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Errada d'accés"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Preguntar al usuari|Intentar Canviar permisos i tornar a provar|Errada"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr "L'orde DpFocus és obsoleta"
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+"L'orde <tt>DpFocus</tt> s'ha eliminat i ja no es fa servir. Si us plau, "
+"elimineu els enllaços de teclat o del ratolí que la fan servir i feu servir "
+"la llista GTK+ predeterminada per al control del cursor."
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "|Buscar"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_d'Acord|To_ts|_Saltar|_Cancel·lar"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_d'Acord|_Saltar|_Cancel·lar"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Obtenint mides..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Eliminar selecció en acabar?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: src/cmd_info.c:74
+#, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr ""
+"%s directoris, %s arxius,\n"
+"%u enllaços simbòlics, %u arxius especials"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr "Valor"
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Enllaç a"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Tipus"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Localització"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Mida"
+
+#: src/cmd_info.c:237
+#, c-format
+msgid "%s (%s bytes)"
+msgstr "%s (%s bytes)"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Conté"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Informació d' 'Arxiu'"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Accedit"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modificat"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Canviat"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Generat"
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr "Bàsic"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr "Atributs"
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Obtenint Informació..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Mostrar sortida d' 'arxiu'?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Format de la date d'accés"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Modificar el format de la data"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Canviar el format de la data"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Mida de la marca de separació"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Ja existeix - Continuar amb afegir?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Afegint..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Feu clic i arrossegar arxius per ordenar, després feu clic en afegir."
+
+#: src/cmd_join.c:213
+#, c-format
+msgid "The total size is %s (%s)."
+msgstr "La mida total és %s (%s)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "La mida total és %lu bytes."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Escriviu el nom de l'arxiu de destí"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Afegir"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Afegir|_Cancel·lar"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Ja existeix - Seguir amb MkDir"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Escriviu el nom del nou directori"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Generar directori"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Accedir (cd) al nou directori?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Enfocar el directori nou?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Ja existeix - Continuar amb moure?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Traslladant..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Escriviu el nom a moure \"%s\" com"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr "Nom de destinació incorrecte per a \"Moure com\""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Moure com..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Moure com"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"És possible que hi hagi canvis pendents de desar en la configuració.\n"
+"Els canvis es perdran en sortir sense dasar-los. De debó voleu sortir?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Confirmar Sortir"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Tanca|_Desar, llavors Tanca|_Cancel·lar"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "De debò voleu sortir?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Escriviu el nou nom per a \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Ja existeix - Seguir amb canviar el nom?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Canviar el nom"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr "Canviar el nom d'arxiu únic en context (sense diàlegs)?"
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr "Pre-selecció automàtica"
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr "Cap|Nom complet|Només nom|Només extensió"
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Buscar una cadena de text en tots els arxius i caniar-la\n"
+"amb una altra cadena de text."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Reemplaçar"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Con"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Reemplaçar tot?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Simple"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Executar 'Des de' ER en cada arxiu, desant\n"
+"les coincidències d'expressions entre parèntesi. Després canviar\n"
+"qualsevol ocurrència de $n en 'A', on n és l'índex \n"
+"(comptant a partir de l'1) d'una sub-expressió, amb el text\n"
+"que coincideixi i fer servir el resultat com a un nou nom d'arxiu."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "De"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "A"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Expressió regular"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+"Busca cada caràcter en el text 'De', i reemplaça\n"
+"qualsevol ocurrència pel caràcter corresponent en el text 'A'\n"
+"Després, qualsevol caràcter en el text 'Treure' és eliminat del\n"
+"nom de l'arxiu, i el resultat es fa servir com a nou nom per a cada arxiu."
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr "Mapa"
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+"Canviar el tipus de lletra (majúscula/minúscula)\n"
+"del nom d'arxiu(s) seleccionat(s)."
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Minúscules?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Majúscules?"
+
+#: src/cmd_renamere.c:503
+msgid "Upper Case Initial?"
+msgstr "Majúscules inicials?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Tipus de lletra"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "Canviar el nom ER"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, decimal"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, Hex (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, Hex (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, Octal"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Aquesta ordre canvia el nom de tots els arxius seleccionats\n"
+"a una seqüència numèrica. Els controls d'abaix permeten\n"
+"definir com son generats els noms."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Començar a"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Base"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precisió"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Cap"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Coa"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Suposa"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Canviar el nom sequencialment"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Totes les files|Seleccionats|No seleccionats"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Tots els tipus|Només directoris|Tot menys els directoris|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Seleccionar|Des-seleccionar|Activar|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Acció"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Grup"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "Tractar ER com a patró global"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Invertir coincidència de ER?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Requerir coincidència en el nom complet?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Seleccionar fent servir ER"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+"Escriviu l'ordre shell a executar. El contingut\n"
+"seleccionat serà afegit al final de l'ordre.\n"
+"L'acció es realitza a la sortida exitosa."
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "d'Acord|Cancel·lar"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Seleccionar fent servir una ordre shell"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Dividir \"%s\".\n"
+"L'arxiu és %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Dividir \"%s\".\n"
+"L'arxiu és %s"
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Ja existeix - Continuar amb dividir?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Dividir a mida fixa"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Mida del segment"
+
+#: src/cmd_split.c:432
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr "1457000 bytes (3.5\" disquetera)"
+
+#: src/cmd_split.c:433
+msgid "10485760 bytes (10 MB)"
+msgstr "10485760 bytes (10 Mb)"
+
+#: src/cmd_split.c:434
+msgid "26214400 bytes (25 MB)"
+msgstr "26214400 bytes (25 Mb)"
+
+#: src/cmd_split.c:435
+msgid "52428800 bytes (50 MB)"
+msgstr "52428800 bytes (50 Mb)"
+
+#: src/cmd_split.c:436
+msgid "78643200 bytes (75 MB)"
+msgstr "78643200 bytes (75 Mb)"
+
+#: src/cmd_split.c:437
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 bytes (95 Mb, unitat de disc Zip)"
+
+#: src/cmd_split.c:459
+msgid "Fixed Count Split"
+msgstr "Dividir a mida fixa"
+
+#: src/cmd_split.c:462
+msgid "Segment Count"
+msgstr "Mida del segment"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr "Nombre actual, únic per a cada arxiu creat"
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr "El valor de la caixa de la base"
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr "La quantitat que l'índex canviarà per a cada arxiu"
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr "El nombre total d'arxius que seran generats"
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr "El valor de l'índex per al darrer arxiu que serà generat"
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr "Les parts desplaçades en el fitxer original"
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Mida fixa, nombre variable de trossos"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Nombre fix de trossos, mides variables"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Dividir"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Format del nom"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Pas"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr "Emplenar els nombres amb zero?"
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr "Desplaçament"
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Ja existeix - Continuar generant l'enllaç?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "d'Acord"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Seleccioneu la destinació de l'enllaç"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Contingut"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Editar l'enllaç simbòlic"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Generar enllaç simbòlic"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Primer comprovació hexadecimal"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr "Tancar amb la tecla de la fletxa esquerra?"
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "actiu"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "cert"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "si"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Sortida de %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"No és possible executar l'ordre \"%s\"\n"
+"No es reconeix aquesta ordre,"
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Predefinits (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Definits per l'usuari (%u)"
+
+#: src/cmdseq_dialog.c:239
+msgid "Select a command, or type part of its name."
+msgstr "Seleccioni una ordre o teclegi el començament del seu nom."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Seleccionar ordre"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "No és possible obrir l'arxiu de configuració per escriure"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Desar"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr "Informació del directori de l'arxiu de configuració"
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+"No s'ha llegit la configuració des del directori predeterminat actual.\n"
+"Feu servir el botó «Desar» de la finestra de Configuració per actualitzar-la."
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"La versió de l'arxiu de configuració (%s) no coincideix\n"
+"amb la versió del programa(%s)"
+
+#: src/configure.c:574
+#, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"No s'ha trobat cap arxiu de configuració; s'ha cercat a:\n"
+"\"%s\",\n"
+"\"%s\" i\n"
+"\"%s\".\n"
+"S'ha fet servir la configuració mínima pre-definida."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_d'Acord|Cancel·lar"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "i%u/%u directoris, %u/%u arxius"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr " (%s/%s)"
+
+#: src/dirpane.c:521
+#, c-format
+msgid ", %s (%s) used"
+msgstr ", %s (%s) utilitzats"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s lliure"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Pujar al directori superior"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Escriviu la ruta, a continuació, premeu Intro per anar-hi"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "H"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Feu clic per habilitar/deshabilitar la regla Amaga (quan ho\n"
+"premi, la regla amagar està activada i les coincidències estan ocultes.)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Blocs"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "BMida"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Mida del bloc"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Mode, numèric"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Mode, text"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "NEnllaç"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Nombre d'enllaços"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "ID del propietari"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Uid"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nom del propietari"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Propietari"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Gid"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "ID de grup"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Grup"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nom del grup"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Dispositiu"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Nombre de dispositiu"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DispMaj"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Nombre del dispositiu, més gran"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DispMen"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Nombre del dispositiu, el menor"
+
+#: src/dpformat.c:50
+msgid "Time of Last Access"
+msgstr "Data del darrer acces"
+
+#: src/dpformat.c:51
+msgid "Time of Last Modification"
+msgstr "Data de la darrera modificació"
+
+#: src/dpformat.c:52
+msgid "Time of Creation"
+msgstr "Data de generació"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr "Data del darrer canvi"
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Escriviu el nom"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "I"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr "URI"
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr "URI (sense prefixe de l'arxiu)"
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Impossible %s \"%s\": %s (codi %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Impossible %s \"%s\" (codi %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Impossible %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Impossible %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr "Informe de la versió en la sortida estàndard i sortida."
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr "Informe dels detalls interns de configuració regional, i sortir."
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr "Permet l'execució de gentoo per l'usuari root. Podria ser perillós!"
+
+#: src/gentoo.c:479
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"No carregar l'arxiu de configuració ~/.config/gentoo/gentoorc; fer servir "
+"els valors predeterminats."
+
+#: src/gentoo.c:480
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"No carregar l'arxiu de configuració GTK+ ~/.config/gentoo/gtkrc; fer servir "
+"els valores predeterminats del sistema."
+
+#: src/gentoo.c:481
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"No carregar l'arxiu de configuració ~/.config/gentoo/dirhistory; fer servir "
+"els valors predeterminats."
+
+#: src/gentoo.c:482
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Executar COMMAND, una ordre de gentoo. Fer-ho abans de permetre la "
+"interacció de l'usuari, però després de llegir el fitxer de configuració. Es "
+"possible fer-ho servir moltes vegades per tal d'executar diverses ordres en "
+"seqüència."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr "COMMAND"
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr "DIR"
+
+#: src/gentoo.c:484
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Fer servir DIR com a camí per al panell esquerre. Reescriu el predeterminat "
+"(i el historial)"
+
+#: src/gentoo.c:485
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Fer servir DIR com a camí per al panell dret. Reescriu el predeterminat (i "
+"el historial)"
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr "Imprimir una llista de totes les ordres integrades i sortir"
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr "- gestor d'arxius gràfic amb GTK+"
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr "No s'ha pogut analitzar les opcions de línia d'ordres: %s\n"
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Per executar com a root, feu servir les opcions '--root-ok'\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Impossible iniciar el modul userinfo - no serà possible resoldre noms\n"
+"d'usuari"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v %s per Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr "Advertència de versió en desenvolupament"
+
+#: src/gentoo.c:629
+#, fuzzy
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+"Aquesta versió de gentoo és molt recent i poc provada. Hi ha hagut canvis "
+"importants en bona part de les funcions del programa des de la versió "
+"anterior. Si us plau, sigueu prudents en l'ús d'aquesta versió i assegureu-"
+"vos d'informar de les errades al autor. Gràcies."
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Progrés"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Elegir icone"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Carregant imatges dels icones"
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(No hi ha selecció)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "ExpReg..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Altres"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Tornar a examinar"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Seleccionar"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Executar..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Configuració..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Seleccionar Menú"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr "_Deixa de mostrar aquest missatge"
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_d'Acord|T_ot|_Saltar|Saltar T_ot|_Cancel·lar"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Total (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr "%u dia, %02u:%02u:%02u"
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr "%u dies, %02u:%02u:%02u"
+
+#: src/progress.c:346
+#, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Transcorregut %02d:%02d Velocitat %s/s ETA %s"
+
+#: src/sizeutil.c:31
+msgid "Unformatted Size"
+msgstr "Mida sense format"
+
+#: src/sizeutil.c:32
+msgid "Formatted Size, Without Unit"
+msgstr "Mida amb format, sense unitat."
+
+#: src/sizeutil.c:33
+msgid "Formatted Size, in Bytes"
+msgstr "Mida amb format, en bytes"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+msgid "bytes"
+msgstr "bytes"
+
+#: src/sizeutil.c:34
+msgid "Formatted Size, in Kilobytes"
+msgstr "Mida amb format, en kilobytes"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "Kb"
+
+#: src/sizeutil.c:35
+msgid "Formatted Size, in Megabytes"
+msgstr "Mida amb format, en megabytes"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "Mb"
+
+#: src/sizeutil.c:36
+msgid "Formatted Size, in Gigabytes"
+msgstr "Mida amb format, en gigabytes"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "Gb"
+
+#: src/sizeutil.c:37
+msgid "Formatted Size, in Terabytes"
+msgstr "Mida amb format, en megabytes"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr "Tb"
+
+#: src/sizeutil.c:38
+msgid "Formatted Size, Automatic Unit"
+msgstr "Mida amb format, unitats automàtiques"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Seleccionar estil"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Arrel"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Directori"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nou estil %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+"\n"
+"** La conversió del text des del joc de caràcters '%s' ha fallat: avortar."
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Línia %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Escriviu el nombre de línia o percentatge:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Anar a"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Escriviu el text a buscar (ER)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "No rompre línies noves?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Cerca"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+"Tens SIGPIPE en escriure en el procés 'file' (%s), sembla haver acabat abans "
+"d'hora."
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr "Impossible executar l'ordre 'file' :"
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Configurar gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Visualitzador de text"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Posició"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Alçada"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Establir en obrir?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Actualitzar en tancar?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Obtindre"
+
+#~ msgid "Ruled Rows?"
+#~ msgstr "Files controlades?"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr ""
+#~ "El mòdul XML ha emes un nombre real depenent de la configuració local"
+
+#~ msgid "New Style"
+#~ msgstr "Nou estil"
+
+#~ msgid "Before Execution"
+#~ msgstr "Abans de l'execució"
+
+#~ msgid "After Execution"
+#~ msgstr "Posterior a la execució"
+
+#~ msgid "Do not load the dirhistory file"
+#~ msgstr "No s'ha llegit l'arxiu «dirhistory»"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Tomar la fila amb el focus com seleccionada si no existeix una selecció "
+#~ "\"real\"?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Moure el focus a la darrera fila seleccionada/No seleccionada"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Obtindre l'actual"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Usar Diálogo para Reportar Errores?"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Tamaño sin Formato en Bytes"
+
+#~ msgid "Always Set"
+#~ msgstr "Siempre Establecer"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Estado de la Tecla 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Títulos de Paneles Activos"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Fila en Foco, No Seleccionada"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Fila en Foco, Seleccionada"
+
+#~ msgid "Beta Software"
+#~ msgstr "Software Beta"
+
+#~ msgid "Next Version?"
+#~ msgstr "Siguiente Versión?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Este modo dividir no ha sido\n"
+#~ "implementado aún... Lo sentimos."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento no sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Modo Numérico?"
+
+#~ msgid "Never"
+#~ msgstr "Nunca"
+
+#~ msgid "On Every Access"
+#~ msgstr "Cada vez que Accese"
+
+#~ msgid "Mounting"
+#~ msgstr "Montar"
+
+#~ msgid "Mount When?"
+#~ msgstr "Cuándo Montar?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Opciones de Montaje"
+
+#~ msgid "Mount Command"
+#~ msgstr "Comando para Montar"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Comando para Desmontar"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Solo Montar en los Directorios del Nivel más Alto?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Usar Diálogo de Error de Comando?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Desmontar al Salir de gentoo?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Soportado y activo."
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Soportado, pero no activado."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: No soportado."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No se puede copiar el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "Envolver Arriba y Abajo?"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "El directorio destino contiene al fuente."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Error en la expresión regular:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Usar mmap() para Acelerar Carga?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu bloques)"
+
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr "No usar FAM para detectar cambios en directorios vistos."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr "No fue posible iniciar montaje de datos - automontaje no funcionará"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Abrir FAM falló, error %d--FAM no será usado"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "La ejecución de \"%s %s\" falló:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montando \"%s\" en \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Anterior: %llu bytes, modificado en %s.\n"
+#~ "Nuevo: %llu bytes, modificado en %s."
+
+#~ msgid "File reading"
+#~ msgstr "Lectura de Archivo"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Seleccionar Código"
+
+#, fuzzy
+#~ msgid "Clr"
+#~ msgstr "Limpiar"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Tamaño del Buffer"
+
+#~ msgid "%s: Couldn't set text domain to \"%s\"\n"
+#~ msgstr "%s: No fue posible establecer el dominio del texto a \"%s\"\n"
+
+#~ msgid "Top"
+#~ msgstr "Inicio"
+
+#~ msgid "Bottom"
+#~ msgstr "Fin"
+
+#~ msgid "_Goto..."
+#~ msgstr "_Ir a..."
+
+#~ msgid "_Search..."
+#~ msgstr "_Buscar"
+
+#~ msgid "_Quit"
+#~ msgstr "_Salir"
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..c63e29a
--- /dev/null
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..206267f
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,3029 @@
+# translation of de.po to
+# translation of de.po to
+# translation of de.po to
+# translation of gentoo.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR Emil Brink.
+# Christoph Neuroth <delmonico@gmx.net>, 2004.
+# Jens Seidel <jensseidel@users.sf.net>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2004-02-16 20:13+0100\n"
+"Last-Translator: Christoph Neuroth <delmonico@gmx.net>\n"
+"Language-Team: <de@li.org>\n"
+"Language: de\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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "Links der Befehls-Knöpfe"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "Rechts der Befehls-Knöpfe"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Keine Trennung"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Verschiebbar"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Statisch"
+
+#: src/cfg_buttonlayout.c:75
+#, fuzzy
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Diese Seite lässt Sie einstellen wie die Tastenkürzel-Leiste in Relation zu "
+"der mit\n"
+"den Kommando-Buttons angeordnet ist. Sie ist mehr oder weniger ein "
+"Platzhalter;\n"
+"geplant ist, viel mehr Flexibilität in der Tasten-Verwaltung zur Verfügung "
+"zu stellen.\n"
+"\n"
+"In der Zwischenzeit bietet dies die Funktionalität die vorhanden war, als "
+"die Tastenkürzel\n"
+"ein Spezial-Feature mit eigener Konfigurations-Seite waren (bis "
+"einschließlich Vesion\n"
+"0.11.24 von gentoo).\n"
+"\n"
+"(Nicht übersetzt weil es da links oben irgendwie nichts gibt?)"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Position der Tastenkürzel-Leiste"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Trennungsart"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Layout"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Reihen-Breite einstellen"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Standard"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Bitte bestätigen"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Die aktuelle Knopf-Reihe wirklich löschen?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Löschen|_Abbrechen"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Breite für neue Reihe wählen"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Breite der Reihe ändern"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Hintergrundfarbe ändern"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Vordergrundfarbe ändern"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Beschriftung"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Befehl"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Taste"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Farben"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Hintergrund..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Auf Standard zurücksetzen"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Vordergrund..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Tastenkürzel"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Löschen"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Farben kopieren nach"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Kopieren nach"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Tauschen mit"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Reihe hinzufügen..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Reihe löschen"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Nach unten"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Reihen-Breite..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Nach oben"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Leiste"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Primär"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Sekundär"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Kurzinfo"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+#, fuzzy
+msgid "Flags"
+msgstr "Einstellungen"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Schmal?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Kurzinfo anzeigen?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Tasten"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definitionen"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Optionen"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Eingebaute auswählen"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Öffnende Klammer"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Schließende Klammer"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Erstes ausgewähltes Objekt"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Erstes ausgewähltes Objekt, abwählen"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Erstes ausgewähltes Objekt mit Pfad"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Erstes ausgewähltes Objekt mit Pfad, abwählen"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Erstes ausgewähltes Objekt (Ziel-Fenster)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Erstes ausgewähltes Objekt, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Erstes ausgewähltes Objekt, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Alle ausgewählten"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Alle ausgewählten, abwählen"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Alle ausgewählten mit Pfaden"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Alle ausgewählten mit Pfaden, abwählen"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Alle ausgewählten (Ziel-Fenster)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Alle ausgewählten, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Alle ausgewählten, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Pfad zum Verzeichnis des Quell-Fensters"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Pfad zum Verzeichnis des Ziel-Fensters"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Pfad zum \"home\"-Verzeichnis"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Pfad des linken Fensters"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Pfad des rechten Fensters"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Erstes ausgewähltes Objekt"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Erstes ausgewähltes Objekt, abwählen"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Erstes ausgewähltes Objekt, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Alle ausgewählten"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Alle ausgewählten, abwählen"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Alle ausgewählten, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Alle ausgewählten, keine Anführungszeichen"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Erstes ausgewähltes Objekt (Ziel-Fenster)"
+
+#: src/cfg_cmdseq.c:652
+#, fuzzy
+msgid "Input combo box"
+msgstr "Eingabe combo-box"
+
+#: src/cfg_cmdseq.c:653
+#, fuzzy
+msgid "Input using menu"
+msgstr "Eingabe mit Menü"
+
+#: src/cfg_cmdseq.c:654
+#, fuzzy
+msgid "Input string"
+msgstr "Zeichenkette eingeben"
+
+#: src/cfg_cmdseq.c:655
+#, fuzzy
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Eingabe Auswahl-Knopf (Ergebnis: TRUE/FALSE)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Beschriftung zum Eingabefenster hinzufügen"
+
+#: src/cfg_cmdseq.c:657
+#, fuzzy
+msgid "Add a separator bar to input window"
+msgstr "Einen Separator zum Eingabefenster hinzufügen"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Wert von $NAME (Umgebung)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "gentoo's PID"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Heim-Verzeichnis für Benutzer NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Code auswählen"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Keine Optionen verfügbar)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Im Hintergrund starten?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Vorherige Instanz beenden?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Beenden überleben?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Ausgabe abfangen?"
+
+#: src/cfg_cmdseq.c:912
+#, fuzzy
+msgid "Require Source Selection?"
+msgstr "Vorausgesetzter Schutz"
+
+#: src/cfg_cmdseq.c:916
+#, fuzzy
+msgid "Require Destination Selection?"
+msgstr "Vorausgesetzter Schutz"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "In Quellverzeichnis wechseln?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "In Zielverzeichnis wechseln?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Quelle erneut laden?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Ziel erneut laden?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "Allgemein"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "Vorher&Nachher"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Eingebaut"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Extern"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Reihe hinzufügen"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplikat"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Name"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definition"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Sequenz wiederholen bis keine Quelle mehr ausgewählt?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Befehle"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Links"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Mitte"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Rechts"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Mausrad nach unten"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Mausrad nach oben"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Die folgenden Modifizierungs-Tasten müssen\n"
+"gedrückt gehalten werden, wenn die Maustaste\n"
+"geklickt wird, um den Befehl auszuführen"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Modifizierer bearbeiten"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Steuerung"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Globale Tastenkürzel"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Verzeichnis-Fenster Maustasten"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Taste"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Modifizierer bearbeiten..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Click-M-Click Geste"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Zeit-Beschränkung"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Num Lock für alle ignorieren?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Achtung: Die Maustasten-Einstellungen\\ sind mehrdeutig: die selbe Taste"
+"+Modifizierer\n"
+"wird für mehr als eine Funktion benutzt.\n"
+"Dies könnte in einem merkwürdigen\n"
+"Verhalten resultieren..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Warnung"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Typ-Zeichen hinzufügen?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Bei Verknüpfung \"-> Ziel\" anhängen?"
+
+#: src/cfg_dirpane.c:359
+#, fuzzy
+msgid "Place Tick Every 3 Digits?"
+msgstr "Punkt alle 3 Zeichen setzen?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Nachkommastellen"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Dateisystem-Größe vom Verzeichnis anzeigen?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Format"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s Einstellungen"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Inhalt"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Ausrichtung"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Titel"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Breite"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Zentriert"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Basis-Einstellungen"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Spalten-Inhalt ändern"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Standard-Titel"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Verzeichnisse zuerst"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Verzeichnisse zuletzt"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Verzeichnisse gemischt"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Links der Liste"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Rechts der Liste"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "System-Standard"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Kopieren von %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Kopieren nach %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Tauschen mit %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Spalten"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Verfügbare Inhalts-Typen"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Ausgewählte Inhalts-Typen"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Bearbeiten..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Entfernen"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Sortieren"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Sortieren nach"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Modus"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Rückwärts sortieren?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Groß-/Kleinschreibung ignorieren?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Standard-Verzeichnis"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Verzeichnis erstellen"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Aktuelles wählen"
+
+#: src/cfg_dirpane.c:1117
+#, fuzzy
+msgid "From History"
+msgstr "Verlauf"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Pfad über Fenster?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Verstecken erlaubt?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Scroll-Leiste immer sichtbar?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Großer Verzeichnis-Hoch-Knopf?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "Vorausgesetzter Schutz"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Position der Scroll-Leiste"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "horizontal"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "vertikal"
+
+#: src/cfg_dirpane.c:1218
+#, fuzzy
+msgid "Don't Track"
+msgstr "Nicht verfolgen"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Verhältnis"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Größe des linken Fensters"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Größe des rechten Fensters"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Fenster-Ausrichtung"
+
+#: src/cfg_dirpane.c:1236
+#, fuzzy
+msgid "Split Tracking"
+msgstr "Verfolgung aufteilen"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "Pixel"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "ausgewählte Reihen merken?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Verlaufs-Listen speichern?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Verzeichnis-Fenster"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Fenster-Teilung"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Verlauf"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Fehler"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Bei Fehler Konsolen-Piep ertönen lassen?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menüs"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Auf Standard zurücksetzen"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Abbrechen"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Symbole"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Mit Punkt (.) beginnende"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Auf R.A. passende"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Keine"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Pfade & verbergen"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Pfade"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Einträge verbergen"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Keine)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Aktion löschen"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Farbe ändern"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Zum geerbten Befehl zurückkehren"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Befehl Auswählen"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Eigenschaften neuer Aktion"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "irgendetwas"
+
+#: src/cfg_styles.c:720
+#, fuzzy
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Diesen Stil zu löschen würde auch\n"
+"all seine Unterstile löschen. Sicher?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Löschen bestätigen"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Hintergrundfarbe"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Vordergrundfarbe"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Symbol"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Vorschau-Text)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Vorschau"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Ãœbergeordnete umgehen?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Wählen..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Aktion hinzufügen..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Befehl"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Ãœbergeordnetes Verzeichnis"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Ãœbernommene Eigenschaften"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visuell"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Aktionen"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Datei-Erkennung"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Stile"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - zum Ändern klicken..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Neuer Typ)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-Dev"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-Dev"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Verz"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Datei"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Verkn."
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Sockel"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Lesbar"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "SetGID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "SetUID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Ausführbar"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Beschreibbar"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Zutreffend auf 'datei' (R.A.)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Zutreffend auf Name (R.A.)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "vorrausgesetzte Endung"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Indentifikation"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Typ erforderlich"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Schutz erforderlich"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr ""
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Stil des Typs"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Stil"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Typen"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Dialog-Fenster auf dem Bildschirm zentrieren"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Dialog-Fenster folgt Maus"
+
+#: src/cfg_windows.c:86
+#, fuzzy
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Dialog-Fenster folgt Maus"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Fenster"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Fenster"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Dialog-Positionierung"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Ausführen von \"%s\" fehlgeschlagen"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Fehler"
+
+#: src/children.c:227
+#, fuzzy, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Konnte Kind \"%s\" nicht beenden (pid=%d)--zombie alert"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Version %s (GTK+ version %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2003 von Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Dies ist freie Software, und es gibt ABSOLUT KEINE\n"
+"GARANTIE. Lies die Datei COPYING für Einzelheiten.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Unterstützt, benutze Deutsche Übersetzung."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Der Autor von gentoo kann via E-Mail unter\n"
+"<emil@obsession.se> erreicht werden; bitte lass mich\n"
+"wissen, was du von diesem Programm hältst, sende\n"
+"Vorschläge, Fehlerberichte und so weiter.\n"
+"\n"
+"Custom widgets by J. Hanson <johan@tiq.com>.\n"
+"\n"
+"Die aktuellste Veröffentlichung von gentoo kann immer von\n"
+"der offiziellen Homepage unter <http://www.obsession.se/gentoo/>\n"
+" heruntergeladen werden. Neue Versionen werden normalerweise\n"
+"über den Freshmeat Dienst bekanntgegeben (<http://freshmeat.net>)."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Ãœber gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Warten für mehr)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Schutz-Bits für \"%s\" setzen:"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/cmd_chmod.c:199
+#, fuzzy
+msgid "Others"
+msgstr "Aus anderem Fenster übernehmen"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Besitzer"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Spezial"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Ausführen"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lesen"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "GID setzen"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "UID setzen"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Schreiben"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Schutz-Bits"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, Oktal"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Alle"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Umschalten"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Zurücksetzen"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Verzeichnis-Rekursion?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Verzeichnisse nicht ändern?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Modus ändern"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Besitzer für '%s' setzen:"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Benutzer"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Besitzer ändern"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Geänderte Einstellungen beim Beenden automatisch speichern?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" existiert bereits - mit dem Kopieren fortfahren?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Kopiere..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Datum beim Kopieren beibehalten?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Fehler beim Kopieren der Attribute (Datum, Besitzer, Modus) ignorieren?"
+
+#: src/cmd_copy.c:269
+#, fuzzy
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Fehlgeschlagenes Ziel lassen, wenn voll Größe?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Puffer-Größe"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Name für Kopie von \"%s\" eingeben"
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Name für Klon von \"%s\" eingeben"
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" existiert bereits - mit klonen fortfahren?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Klone..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Kopiere als..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Name für Verknüpfung von \"%s\""
+
+#: src/cmd_copyas.c:82
+#, fuzzy, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Name für Klon-Verknüpfung von \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" existiert bereits - mit verknüpfen vortfahren?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Kopieren als"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Klonen"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Symbolisch verknüpfen als"
+
+#: src/cmd_copyas.c:214
+#, fuzzy
+msgid "Symbolic Link Clone"
+msgstr "Symoblischer Verküpfungs-Klon"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"Konnte wegen Zugriffs-Einschränkungen nicht gelöscht werden.\n"
+"Versuchen, Rechte zu ändern und wiederholen?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Antwort merken (ändert Konfig.)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Zugriffs-Problem"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Ändern|Unberührt lassen"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "\"%s\" wirklich löschen?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Lösche..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Bei Zugriffsfehler"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Benutzer fragen|Automatisch ändern und erneut versuchen|Abbrechen"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+#, fuzzy
+msgid "ISearch"
+msgstr "ISuche"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK|A_lle|_Ãœberspringen|_Abbrechen"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|_Ãœberspringen|_Abbrechen"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Hole Größen..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Reihen abwählen wenn fertig?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s benutzt"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u Verz., %u Dateien, %u Sym. Verkn."
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Verknüpfen mit"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Typ"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Ort"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Größe"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu Bytes"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "enthält"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "'Datei' Info"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Zugegriffen"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modifiziert"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Geändert"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Erstellt"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Basis"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Bekomme Informationen..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "'Datei'-Ausgabe anzeigen?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Format des Zugriffs-Datums"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Format des Modifizerungs-Datums"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Format des Änderungs-Datums"
+
+#: src/cmd_info.c:390
+#, fuzzy
+msgid "Size Tick Mark"
+msgstr "Größen-Unterteiler-Zeichen"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" existiert bereits - mit Verbinden weitermachen?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Verbinde..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+"Dateien Klicken und Ziehen zum neu anordnen, dann klicken um zu verbinden."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Die Gesamtgröße beträgt %s (%lu Bytes)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Die Gesamtgröße beträgt %lu Bytes."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Name der Ziel-Datei eingeben"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Verbinden"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Verbinden|_Abbrechen"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" existiert bereits - mit MkDir fortfahren?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Name des zu erstellenden Verzeichnisses eingeben"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Verzeichnis erstellen"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "In neues Verzeichnis wechseln?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Neues Verzeichnis fokussieren?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" existiert bereits - mit verschieben fortfahren?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Verschiebe..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Name eingeben, um %s zu verschieben"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Verschiebe Als..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Verschieben als"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Es gibt nicht-gespeicherte Einstellungen.\n"
+"Beenden ohne zu speichern wird sie verwerfen. Wirklich Beenden?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Beenden bestätigen"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Beenden|_Speichern und beenden|_Abbrechen"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Wirklich beenden?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Neuen Namen für \"%s\" eingeben"
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" existiert bereits - mit umbenennen fortfahren?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Umbenennen"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Nach Zeichenkette in allen Dateinamen suchen und\n"
+"durch eine andere Kette ersetzen."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Ersetzen"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Durch"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Alle ersetzen?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Einfach"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Jeder Dateiname wird auf den 'Von'-R.A. untersucht,\n"
+"wobei Teilausdruck-Ãœbereinstimmungen gespeichert werden.\n"
+"Dann wird jedes Vorkommen von $n in 'Nach' durch den\n"
+"übereinstimmenden Text ersetzt, wobei n\n"
+"der Index (mit 1 beginnend) eines Teilausdrucks ist.\n"
+"Das Ergebnis wird als neuer Dateiname benutzt."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Von"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Nach"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Reg. Ausdr."
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+#, fuzzy
+msgid "Lower Case?"
+msgstr "Groß-/Kleinschreibung ignorieren?"
+
+#: src/cmd_renamere.c:501
+#, fuzzy
+msgid "Upper Case?"
+msgstr "Groß-/Kleinschreibung ignorieren?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Groß-/Kleinschreibung ignorieren?"
+
+#: src/cmd_renamere.c:506
+#, fuzzy
+msgid "Case"
+msgstr "Basis"
+
+#: src/cmd_renamere.c:508
+#, fuzzy
+msgid "RenameRE"
+msgstr "mit R.A. Umbenennen"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, Dezimal"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, Hex (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, Hex (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, Oktal"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Dieser Befehl ändert die Namen aller gewählten Dateien\n"
+"in eine Nummernfolge. Mit den Einstellungen unten\n"
+"lässt sich einstellen, wie die Namen geformt werden."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Starten bei"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Basis"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Präzision"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Kopf"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Schwanz"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Schätzen"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Sequentielles Umbenennen"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Alle Reihen|Ausgewählte|Nicht ausgewählte"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Alle Typen|Nur Verzeichnisse|Nur Nicht-Verzeichnisse"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Auswählen|Abwählen|Umkehren"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Aktion"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Setzen"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "R.A. als Glob-Muster behandeln?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "R.A. Ergebnisse umkehren?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Ãœbereinstimmung mit vollem Namen erforderlich?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Mit R.A. auswählen"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "OK|Cancel"
+msgstr "_OK|_Abbrechen"
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "Select using shell command"
+msgstr "Befehl Auswählen"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"\"%s\" aufteilen.\n"
+"Datei ist %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"\"%s\" aufteilen.\n"
+"Datei ist %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" existiert bereits - mit Aufteilen fortfahren?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Festgrößen-Aufteilung"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Teil-Größe"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 Dytes (3.5\" Diskette)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 Dytes (3.5\" Diskette)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 Dytes (3.5\" Diskette)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 Dytes (3.5\" Diskette)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 Dytes (3.5\" Diskette)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 Dytes (Zip Diskette)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Festgrößen-Aufteilung"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Teil-Größe"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Feste Größe, variable Anzahl von Teilen"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Feste Anzahl von Teilen, variable Größe"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Teilung"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Namens-Format"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Schritt"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" existiert bereits - mit Verknüpfen fortfahren?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Verknüpfungs-Ziel auswählen"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Inhalte"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Symbolische Verknüpfung bearbeiten"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Symbolische Verknüpfung erstellen"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Erst Hex-Prüfung"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "an"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "wahr"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "Ja"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Ausgabe von %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"Konnte unbekannten Befehl\n"
+"\"%s\" nicht ausführen."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Eingebaute (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Benutzerdefinierte (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Befehl wählen oder Anfang tippen\n"
+"und TAB drücken."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Befehl Auswählen"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Konnte Konfigurations-Datei für Ausgabe nicht öffnen"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Speichern"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"Konfigurations-Datei-Version (%s) stimmt nicht mit Programm-Version (%s) "
+"überein"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Konnte keine Konfigurations-Datei in \"%s\" und \"%s\"\n"
+"finden.\n"
+"Benutze eingebaute Minimal-Konfiguration."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|_Abbrechen"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u Verzeichnisse, %u/%u Dateien"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s benutzt"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s frei"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Zum übergeordneten Verzeichnis wechseln"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Pfad eingeben und Enter drücken, um dorthin zu gehen"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "V"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Klicken, um Verberge-Regel zu (de)aktivieren (Regel ist aktiv und passende "
+"Einträge werden verborgen, wenn Knopf gedrückt)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Blöcke"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "BGröße"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Block Größe"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Modus, numerisch"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Modus, Zeichenkette"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "NVerknüpfung"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Anzahl der Verknüpfungen"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Besitzer ID"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr ""
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Besitzer-Name"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr ""
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr ""
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Gruppen ID"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr ""
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Gruppen-Name"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Gerät"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Geräte-Nummer"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr ""
+
+#: src/dpformat.c:48
+#, fuzzy
+msgid "Device Number, major"
+msgstr "Gerätenummer, major"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr ""
+
+#: src/dpformat.c:49
+#, fuzzy
+msgid "Device Number, minor"
+msgstr "Gerätenummer, minor"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Datum des letzten Zugriffs"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Datum der letzen Modifikation"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Datum der Erstellung"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Typen-Name"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Konnte nicht %s \"%s\": %s (code %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Konnte nicht %s \"%s\" (code %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Konnte nicht %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Konnte nicht %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "Gib die Version auf der Standard-Ausgabe aus und beende."
+
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "Berichtet interne lokale Details und beendet."
+
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"Erlaubt gentoo, vom root-Benutzer gestartet zu werden. Könnte gefährlich "
+"sein."
+
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Benutze Standard-Werte, anstatt die Konfigurationsdatei ~/.gentoorc zu laden."
+
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Benutze Standard-Werte, anstatt die GTK+ Konfigurationsdatei ~/.gentoogtkrc "
+"zu laden."
+
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Benutze Standard-Werte, anstatt die Konfigurationsdatei ~/.gentoorc zu laden."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Führe ARG, einen gentoo-Befehl aus. Wird ausgeführt, bevor "
+"Benutzerinteraktion möglich ist, aber nachdem die Konfigurationsdatei "
+"eingelesen wurde. Kann mehrfach benutzt werden, um verschiedene Kommandos in "
+"Folge auszuführen."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Benutze ARG als Pfad für das linke Verzeichnis-Fenster. Setzt Standard und "
+"Verlauf außer Kraft."
+
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Benutze ARG als Pfad für das rechte Verzeichnis-Fenster. Setzt Standard und "
+"Verlauf außer Kraft."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Um als root auszuführen mit der Option '--root-ok' aufrufen\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Konnte Benutzer-Info-Modul nicht initialisieren - Benutzernamen-Auflösung "
+"wird nicht funktionieren"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s von Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Fortschritt"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Symbol wählen"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Lade Symbol-Grafiken..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(Keine Auswahl)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "RegAusdr..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Aus anderem Fenster übernehmen"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Aktualisieren"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Auswählen"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Ausführen..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Konfigurieren..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Menü auswählen"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_OK|A_lle|_Überspringen|_Alle überspringen|A_bbrechen"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Gesamt (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Verstrichen %02d:%02d Geschwindigkeit %s/s GVZ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Formatierte Größe, in Bytes"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Formatierte Größe, \"Schlaue\" Einheit"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Formatierte Größe, in Bytes"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "Ja"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Formatierte Größe, in Kilobytes"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr ""
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Formatierte Größe, in Megabytes"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr ""
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Formatierte Größe, in Gigabytes"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr ""
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Formatierte Größe, in Megabytes"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr ""
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Formatierte Größe, \"Schlaue\" Einheit"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Stil auswählen"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr ""
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Verzeichnis"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Neuer Stil %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Zeile %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Zeilennummer oder Prozent eingeben:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Gehe zu"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Such-Text eingeben (RE)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr ""
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Suchen"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "gentoo konfigurieren"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Text-Anzeiger"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Position"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Höhe"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Beim Öffnen setzen?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Beim schließen aktualisieren?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Aktuelle"
+
+#~ msgid "New Style"
+#~ msgstr "Neuer Stil"
+
+#~ msgid "Before Execution"
+#~ msgstr "Vor dem Ausführen"
+
+#~ msgid "After Execution"
+#~ msgstr "Nach der Ausführung"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Fokussierte Reihen als ausgewählte behandeln, wenn keine \"echte\" "
+#~ "Auswahl existiert?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Fokus auf letzte gewählte/abgewählte Reihe bewegen?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Aktuelles wählen"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Dialog benutzen um Fehler zu melden?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Pfad für Rechtsklick"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Rohgröße, in Bytes"
+
+#~ msgid "Always Set"
+#~ msgstr "Immer gesetzt"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Status der 'Steuerungs'-Taste"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Aktive Fenster-Titel"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Fokussierte, nicht-ausgewählte Reihe"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Fokussierte, ausgewählte Reihe"
+
+#~ msgid "Beta Software"
+#~ msgstr "Beta Software"
+
+#~ msgid "Next Version?"
+#~ msgstr "Nächste Version?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Dieser aufteilungs-Modus wurde noch\n"
+#~ "nicht implementiert... Sorry."
+
+#, fuzzy
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Sortieren nach Groß-/Kleinschreibung wird mit nicht-ASCII-Symbolen nicht "
+#~ "richtig funktionieren"
+
+#, fuzzy
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Sortieren ohne Groß-/Kleinschreibung wird mit nicht-ASCII-Symbolen nicht "
+#~ "richtig funktionieren"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu Bytes"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Numerischer Modus?"
+
+#~ msgid "Never"
+#~ msgstr "Nie"
+
+#~ msgid "On Every Access"
+#~ msgstr "Bei jedem Zugriff"
+
+#~ msgid "Mounting"
+#~ msgstr "Mounten"
+
+#~ msgid "Mount When?"
+#~ msgstr "Wann mounten?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Mount-Optionen"
+
+#~ msgid "Mount Command"
+#~ msgstr "Mount-Befehl"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Unmount-Befehl"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Nur bei Verzeichnissen höchster Ebene mounten?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Kommando-Fehler-Dialog benutzen?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Beim Beenden unmounten?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Unterstüzt und aktiviert."
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Unterstützt, aber nicht aktiviert."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Nicht unterstützt."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Konnte Verzeichnis \"%s\"\n"
+#~ "nicht nach \"%s\" kopieren:\n"
+#~ "die Quelle enthält das Ziel."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "Von oben nach unten springen und umgekehrt?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s Bytes,\n"
+#~ "%s Blöcke)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Konnte Verzeichnis \"%s\"\n"
+#~ "nicht nach \"%s\" verschieben:\n"
+#~ "die Quelle enthält das Ziel."
+
+#, fuzzy
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Konnte Verzeichnis \"%s\"\n"
+#~ "nicht nach \"%s\" verschieben:\n"
+#~ "die Quelle enthält das Ziel."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Fehler im Regulären Ausdruck:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "mmap() für schnelles Laden benutzen?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu Blöcke)"
+
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Kein FAM benutzen um automatisch Änderungen in angezeigten Verzeichnissen "
+#~ "anzuzeigen."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Konnte Mount-Daten nicht initialisieren - automounting wird nicht "
+#~ "funktionieren"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "FAM öffnen fehlgeschlagen, Fehler %d--FAM wird nicht benutzt"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Konnte FAM-Monitor nicht auf \"%s\" hinzufügen, Fehler %s (mit --no-fam "
+#~ "um zu umgehen)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Konnte FAM-Monitor nicht auf \"%s\" hinzufügen, Fehler %s (mit --no-fam "
+#~ "um zu umgehen)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Ausführen von \"%s %s\" fehlgeschlagen:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Mounte \"%s\" nach \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Alt: %Lu Bytes, geändert %s.\n"
+#~ "Neu: %Lu Bytes, geändert %s."
+
+#~ msgid "File reading"
+#~ msgstr "Datei lesen"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Code auswählen"
+
+#~ msgid "Clr"
+#~ msgstr "Löschen"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Puffer-Größe"
+
+#~ msgid "%s: Couldn't set text domain to \"%s\"\n"
+#~ msgstr "%s: Konnte die Text-Domäne nicht auf \"%s\" setzen\n"
+
+#~ msgid "Top"
+#~ msgstr "Spitze"
+
+#~ msgid "Bottom"
+#~ msgstr "Boden"
+
+#, fuzzy
+#~ msgid "_Goto..."
+#~ msgstr "Gehe zu..."
+
+#, fuzzy
+#~ msgid "_Search..."
+#~ msgstr "Suche..."
+
+#~ msgid "_Quit"
+#~ msgstr "Beenden"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Auswählen"
+
+#~ msgid "Close"
+#~ msgstr "Schließen"
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644
index 0000000..fedb6a0
--- /dev/null
+++ b/po/en@boldquot.header
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644
index 0000000..a9647fc
--- /dev/null
+++ b/po/en@quot.header
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/es.gmo b/po/es.gmo
new file mode 100644
index 0000000..2595610
--- /dev/null
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..da8d549
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,2958 @@
+# translation of de.po to Spanish
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR Emil Brink.
+# Innocent De Marchi <tangram.peces@gmail.com>, 2011-2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2015-01-17 19:09+0100\n"
+"Last-Translator: Innocent De Marchi <tangram.peces@gmail.com>\n"
+"Language-Team: Innocent De Marchi <tangram.peces@gmail.com>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.10\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "A la izquierda de los botones de comandos"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "A la derecha de los botones de comandos"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Estático (sin separación)"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Panel"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Estatico"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Esta página te permite controlar la forma de ubicarse del panel de Funciones "
+"Rápidas en relación al\n"
+"panel que contiene los Botones de Comandos. Es una clase de anclaje; el "
+"plan\n"
+"es proveer de mucha mayor flexibilidad en la administración de botones y "
+"soportar la\n"
+"creación de más paneles de botones integrados en el programa. Pero eso aún "
+"esta por venir.\n"
+"\n"
+"Por lo pronto, provee la funcionalidad que estaba presente cuando las "
+"funciones rápidas\n"
+"eran una función especial con su propia página de configuración (hasta la "
+"versión 0.11.24 de gentoo, incluida), para tu conveniencia.\n"
+"\n"
+"Para encontrar el panel de funciones rápidas, cambia a la página de "
+"Definiciones y usa la opción entrada del menu\n"
+"en la esquina superior izquierda de la página."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Posición del panel de Funciones Rápidas"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Estilo de espacio intermedio"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Posición"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Establecer Ancho de Fila"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Predeterminado"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Por favor, confirme"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "¿Está seguro que desea borrar la fila de botones seleccionada?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Borrar|_Cancelar"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Seleccionar el ancho de la nueva fila"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Cambiar el ancho de la fila"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Cambiar el color del fondo"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Cambiar el color del primer plano"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etiqueta"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Orden"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Tecla"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Colores"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Fondo..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Restablecer el predeterminado"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Frente..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Funciones rápidas"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Limpiar"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Copiar colores a"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Copiar a"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Cambiar con"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Añadir fila..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Borrar fila"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Abajo"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ancho de fila"
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Arriba"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Panel"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Principal"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Secundario"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Consejo"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Banderas"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "¿Refinar?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "¿Mostrar consejo?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Botones"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definiciones"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Opciones"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Seleccionar predeterminado"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Abriendo corchetes"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Cerrando corchetes"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "El primero seleccionado"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Seleccionado por primera vez, des-seleccionar"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "El primero seleccionado, con ruta"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "El primero seleccionado, con ruta, des-seleccionar"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "El primero seleccionado (panel de destino)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "El primero seleccionado sin comillas"
+
+#: src/cfg_cmdseq.c:631
+msgid "First selected, no extension"
+msgstr "El primero seleccionado, sin extensión"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Todos los seleccionados"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Todos los seleccionados, des-seleccionar"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Todos los seleccionados, con rutas"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Todos los seleccionados, con rutas, des-seleccionar"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Todos los seleccionados (panel de destino)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Todos los seleccionados, no comillas"
+
+#: src/cfg_cmdseq.c:638
+msgid "All selected, no extensions"
+msgstr "Todos los seleccionados, sin extensión"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Ruta al directorio del panel de origen"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Ruta al directorio del panel de destino"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Ruta al directorio home"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Ruta del panel izquierdo"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Ruta del panel derecho"
+
+#: src/cfg_cmdseq.c:644
+msgid "URI of first selected"
+msgstr "URI del primero seleccionado"
+
+#: src/cfg_cmdseq.c:645
+msgid "URI of first selected, unselect"
+msgstr "URI del seleccionado por primera vez, des-seleccionado"
+
+#: src/cfg_cmdseq.c:646
+msgid "URI of first selected, no quotes"
+msgstr "URI del primero seleccionado sin comillas"
+
+#: src/cfg_cmdseq.c:647
+msgid "URIs of all selected"
+msgstr "URI de todos los seleccionados"
+
+#: src/cfg_cmdseq.c:648
+msgid "URIs of all selected, unselect"
+msgstr "URI de todos los seleccionados, des-seleccionados"
+
+#: src/cfg_cmdseq.c:649
+msgid "URIs of all selected, no quotes"
+msgstr "URI de todos los seleccionados, sin comillas"
+
+#: src/cfg_cmdseq.c:650
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "URI de todos los seleccionados, sin comillas"
+
+#: src/cfg_cmdseq.c:651
+msgid "URI of first selected (destination pane)"
+msgstr "URI del primero seleccionado (panel de destino)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Caja de entrada"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Entrada usando menú"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Texto de entrada"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Botón de opcion de entrada (da VERDADERO o FALSO)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Agregar etiqueta a la ventana de entrada"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Agregar una barra de separación a la ventana de entrada"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Valor de $NAME (entorno)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID de gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Directorio raiz del usuario <NOMBRE>"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NOMBRE"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Seleccionar código"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(No hay opciones disponibles)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "¿Ejecutar en segundo plano?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "¿Matar la instancia anterior?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "¿Sobrevivir a abandonar?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "¿Capturar Salida?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "¿Requerir selección del origen?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "¿Requerir selección del destino?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "¿CD Fuente?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "¿CD Destino?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "¿Actualizar el origen?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "¿Actualizar el destino?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "General"
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr "Antes"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr "Después"
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Predefinidos"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Externas"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Agregar fila"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nombre"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definición"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "¿Repetir la secuencia hasta terminar con la seleccion de origen?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Agregar"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Borrar"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Órdenes"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Izquierda"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Centro"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Derecha"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Bajar"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Subir"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Las siguientes teclas de modificación deben\n"
+"mantenerse apretadas al hacer clic con el ratón\n"
+"para ejecutar la orden"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Editar modificadores"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Controles"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Funciones rápidas del teclado globales"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Panel de control de los iconos del ratón"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Botón"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Editar modificadores..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Maniobra Clic-M-Clic"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Límite de tiempo"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "¿Ignorar el bloqueo numérico (tecla Bloq Num) para todos los enlaces?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Nota: Las opciones para la configuración del botón del mouse\n"
+"son ambiguas: el mismo botón+modificador\n"
+"es usado para más de una función. Esto\n"
+"puede hacer que se comporten un poco extraño..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Advertencia"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_De acuerdo"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "¿Agregar caracter de tipo?"
+
+#: src/cfg_dirpane.c:337
+msgid "Append \"→ destination\" on Links?"
+msgstr "¿Agregar\"→ destino\" en enlaces?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "¿Marca cada 3 dígitos?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Digitos de precisión"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "¿Mostrar el tamaño de los directorios del sistema de archivos?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Formato"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s Opciones"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Contenido"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Justificación"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Título"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ancho"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centro"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Opciones básicas"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Editar el contenido de la columna"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Título predeterminado"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Directorios primero"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Directorios al final"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Mezclar directorios"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "A la izquierda de la lista"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "A la derecha de la lista"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Predeterminado del sistema"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Copiar desde %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Copiar a %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Intercambiar con %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Columnas"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Tipos de contenido disponibles"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Tipos de contenido seleccionados"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Editar..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Eliminar"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Ordenar"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Orden por"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Modo"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "¿Orden inverso?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "¿Ignorar mayúsculas/minúsculas?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Directorio predeterminado"
+
+#: src/cfg_dirpane.c:1111
+msgid "Starting Directory"
+msgstr "Directorio inicial"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Obtener el actual"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Desde historial"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "¿La ruta arriba?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "¿Permitir ocultar?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "¿Siempre barra de desplazamiento?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "¿Botón padre gigante?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr "¿Quiere establecer la fuente personalizada?"
+
+#: src/cfg_dirpane.c:1156
+msgid "Rubber banding Selection?"
+msgstr "¿Requerir selección del destino?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Barra de desplazamiento"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Horizontal"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Vertical"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "No Rastrear"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Proporción"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Tamaño, panel izquierdo"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Tamaño, panel derecho"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientación del panel"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Rastrear división"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "pixeles"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "¿Recordar las filas seleccionadas?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "¿Guardar las listas de historial?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Paneles de directorios"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Separación de paneles"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historial"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr "Contenido 'Bloques' obsoletas"
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"La columna de \"Blocks\" ya no se admite, \n"
+"pero la configuración sigue haciendo uso de ella. Se \n"
+"eliminará automáticamente."
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr "Contenido 'Block Size' obsoleto."
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"La columna 'Block Size' ya no se utiliza, \n"
+"pero su configuración personalizada hace uso de esta opción.\n"
+"Se eliminará automáticamente."
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Errores"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr "Presentación de mensages de error y de estado."
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr "Barra de estado por encima de los paneles"
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr "Bara de título de la ventana principal."
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr "Ventana de diálogo separada"
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "¿Alarma en caso de error?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menús"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+"Haga clic en el botón para restablecer el %zu almacenado \"No volver a "
+"mostrar este cuadro de diálogo de nuevo\" respuestas."
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr "Persistente"
+
+#: src/cfg_nag.c:110
+msgid "Reset All"
+msgstr "Restablecer todo"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr "Editar la ruta de directorio"
+
+#: src/cfg_paths.c:72
+msgid "_Cancel"
+msgstr "_Cancelar"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr "_Abrir"
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Ãconos"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Iniciando con punto (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Coincidencias en ER"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ninguno"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Rutas y Esconder"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Rutas"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Esconder entradas"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ninguno)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Acción Borrar"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Editar Color"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Restablecer orden heredada"
+
+#: src/cfg_styles.c:563
+msgid "Select Command ..."
+msgstr "Seleccionar orden ..."
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Nueva propiedad de la ccción"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "algo"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Borrar este estilo borrará también\n"
+"todos sus hijos. ¿Está seguro?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Confirmar eliminar"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Color de fondo"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Color de primer plano"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Ãcono"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Texto para previsualizar el estilo de la fila)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "¿Sobreescribir los padres?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Escoger..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Agregar acción..."
+
+#: src/cfg_styles.c:826
+msgid "Edit Command"
+msgstr "Edita la orden"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Padre"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Propiedades heredadas"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visual"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Acciones"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Tipos de archivos"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Estilos"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Clic para cambiar..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nuevo tipo)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-Dev"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-Dev"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Directorios"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Archivo"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Enlace"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Zócalo"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Lectura"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "Establecer GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "Establecer UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Estatico (Sticky)"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Ejecución"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Escritura"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Identificar 'archivo' (ER)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Identificar nombre (ER)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Requerir extensión"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identificación"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Requerir iipo"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Requerir protección"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "¿Glob?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Estilo de tipos"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Estilo"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Tipos"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Ventanas de diálogo entradas en la pantalla"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Las ventanas de diálogo siguen al puntero (ratón)"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Ventanas de diálogo colocadas por el gestor de ventanas"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Ventanas"
+
+#: src/cfg_windows.c:102
+msgid "Window Borders"
+msgstr "Limites de ventana"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Posición de diálogos "
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Falló la ejecución de \"%s\""
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Error"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "No se pudo finalizar el proceso hijo \"%s\" (pid=%d)--alerta de zombie"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr "CHARSET nativo: \"%s\"."
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr "Nombre del archivo de codificación: \"%s\"."
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Versión %s (GTK+ versión %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2015 por Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Este es software libre y no hay ABSOLUTAMENTE NINGUNA\n"
+"GARANTÃA. Lea el archivo COPYING para más detalles.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Soportado, usando cadenas de texto integrados en Inglés"
+
+#: src/cmd_about.c:157
+#, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"El autor de gentoo puede ser contactado via Internet\n"
+"Correo electrónico: <a href=\"mailto:%s\">%s</a>; se agradecen \n"
+"opiniones, sugerencias/informes de errores y demás.\n"
+"\n"
+"Puede encontrar la última versión de gentoo\n"
+"en el sitio oficial del proyecto gentoo en\n"
+"<a href=\"%s\">%s</a>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Acerca de gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_de acuerdo (Espera por más)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Establecer bits de protección para \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Grupo"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Otros"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Propietario"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Especial"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Ejecución"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lectura"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Establecer GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Establecer UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Escritura"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bits de Protección"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr "Literales"
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr "Octal"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Todo"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Activar"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Restablecer"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "¿Recursivo en Directorios?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "¿No tocar directorios?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Cambiar modo"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Establecer el propietario para '%s'"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Usuario"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Cambiar el propietario"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "¿Guardar los cambios en la configuración al salir?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr "Error al copiar FIFO: %s"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr "Error al copiar un fichero especial: %s"
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr "Error al copiar un fichero especial: no hay ruta de acceso loca"
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" ya existe - ¿Seguir con la copia?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Copiando..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "¿Mantener las fechas al copiar?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"¿Ignorar los fallos de al copiar los atributos (Fecha, Propietario, Modo)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "¿Ignorar el fallo en el destino en el caso de tamaño completo?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Tamaño del buffer"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Teclee el nombre para la copia de \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Teclee el nombre para el clón de \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Ya Existe - ¿Continuar con la clonación?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Clonando..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Copiando como..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Teclee el nombre para el enlace \"%s\" como"
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Teclee el nombre para el clon del enlace de \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Ya Existe - ¿Proceder con el enlace simbólico?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Copiar como"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Clonar"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Enlace simbólico como"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Clonar el enlace simbólico"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"no pudo ser borrado debido a restricciones de acceso.\n"
+"¿Intentar cambiar la protección y reintentar?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Recordar respuesta (altera la configuración)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Problema de acceso"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Cambiar|Abandonar"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "¿Seguro que quiere borrar \"%s\"?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Borrando..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Error de acceso"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Preguntar al usuario|Intentar cambiar los permisos y reintentar|Fallo"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr "La orden DpFocus es obsoleta"
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+"La orden <tt>DpFocus</tt> se ha elimnado y ya no se utiliza. Por favor, "
+"elimine los enlaces de teclado o del ratón que lo utilizan y hag uso de la "
+"lista GTK+ predeterminada para el control del cursor."
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "|Buscar"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_de Acuerdo|To_do|_Saltar|_Cancelar"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_de Acuerdo|_Saltar|_Cancelar"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Obteniendo tamaños..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "¿Des-seleccionar filas al terminar?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: src/cmd_info.c:74
+#, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr ""
+"%s directorios, %s archivos,\n"
+"%u enlaces simbólicos, %u archivos especiales"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr "Valor"
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Enlazar a"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Tipo"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Localización"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/cmd_info.c:237
+#, c-format
+msgid "%s (%s bytes)"
+msgstr "%s (%s bytes)"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Contiene"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Información de 'Archivo'"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Último acceso"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modificado"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Cambiado"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Generado"
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr "Básico"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr "Atributos"
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Obteniendo información..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "¿Mostrar 'archivo' de salida?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Formato de la fecha de acceso"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Modificar el formato de fecha"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Cambiar el formato de fecha"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Tamaño de la marca de graduación"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Ya Existe - ¿Continuar con la unión?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Uniendo..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+"Hacer Clic y arrastrar archivos para reordenar, después hacer clic en unir"
+
+#: src/cmd_join.c:213
+#, c-format
+msgid "The total size is %s (%s)."
+msgstr "El tamaño total es %s (%s)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "El tamaño total es %lu bytes."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Teclear el nombre del archivo destino"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Unir"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Unir|_Cancelar"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Ya Existe - ¿Seguir con MkDir (generar directorio)?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Teclee el nombre del directorio a generar"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Generar directorio"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "¿Entrar en el nuevo directorio?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "¿Enfocar el nuevo directorio?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Ya Existe - ¿Continuar con mover?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Moviendo..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Teclee el nombre para mover \"%s\" como"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr "Nombre de destino no válido para \"Mover como\""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Moviendo como..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Mover como"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Es posible que tenga cambios sin guardar en la configuración.\n"
+"Al salir sin guardar se perderán estos cambios. ¿Aún desea salir?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Confirmar Salir"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Salir|_Guardar, y después Salir|_Cancelar"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "¿Seguro que desea salir?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Teclee el nuevo nombre para \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Ya Existe - ¿Seguir con renombrar?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Renombrar"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr "¿Cambiar el nombre de archivo único en contexto (sin diálogos)?"
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr "Pre_selección automática"
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr "Ninguno|Nombre completo|Únicamente nombre|Únicamente extensión"
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Buscar una cadena de texto en todos los archivos y reemplazarla\n"
+"con otra cadena de texto."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Reemplazar"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Con"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "¿Reemplazar todo?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Simple"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Ejecutar 'Desde' ER en cada archivo, almacenando\n"
+"las coincidencias de expresiones entre paréntesis. Después reemplazar\n"
+"cualquier ocurrencia de $n en 'A', donde n es el índice \n"
+"(contando desde 1) de una sub-expresión, con el texto\n"
+"que coincide y usar el resultado como un nuevo nombre de archivo."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "De"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "A"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Expresion regular"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+"Busca cada caracter en el texto 'De', y sustituye\n"
+"cualquier ocurrencia por el caracter correspondiente en el texto 'A'\n"
+"Después, cualquier caracter en el texto 'Cambiar' es cambiado del\n"
+"nombre del archivo, y el resultado usado como el nuevo nombre de cada "
+"archivo."
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr "Mapa"
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+"Cambiar el tipo de letra (mayúscula/minúscula)\n"
+"del nombre de archivo(s) seleccionado(s)."
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "¿Minúsculas?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "¿Mayúsculas?"
+
+#: src/cmd_renamere.c:503
+msgid "Upper Case Initial?"
+msgstr "¿Mayúsculas iniciales?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Tipo de letra"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "RenombrarER"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, decimal"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, Hex (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, Hex (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, Octal"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Esta orden renombra todos los archivos seleccionados\n"
+"a una secuencia numérica. Los controles inferiores permiten\n"
+"definir cómo se generan los nombres."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Empezar en"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Base"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precisión"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Inicio"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Cola"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Invitado"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Renombrar secuencial"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Todo|Seleccionados|No seleccionados"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Cualquier tipo|Sólo directorios|Sólo no directorios|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Seleccionar|Des-seleccionar|Fijar|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Acción"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Grupo"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "¿Tratar ER como patrón global?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "¿Invertir coincidencia de ER?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "¿Exigir coincidencia en el nombre completo?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Seleccionar usando ER"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+"Teclee el comando shell a ejecutar. El contenido\n"
+"seleccionado será añadido al final de la orden.\n"
+"La acción se ejecutará al finalizar exitosamente."
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "de Acuerdo|Cancelar"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Seleccionar usando una orden shell"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Dividir \"%s\".\n"
+"Archivo es %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Dividir \"%s\".\n"
+"Archivo es %s"
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Ya existe - ¿Continuar con dividir?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Dividir a tamaño fijo"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Tamaño del segmento"
+
+#: src/cmd_split.c:432
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr "1457000 bytes (3.5\" disquetera)"
+
+#: src/cmd_split.c:433
+msgid "10485760 bytes (10 MB)"
+msgstr "10485760 bytes (10 Mb)"
+
+#: src/cmd_split.c:434
+msgid "26214400 bytes (25 MB)"
+msgstr "26214400 bytes (25 Mb)"
+
+#: src/cmd_split.c:435
+msgid "52428800 bytes (50 MB)"
+msgstr "52428800 bytes (50 Mb)"
+
+#: src/cmd_split.c:436
+msgid "78643200 bytes (75 MB)"
+msgstr "78643200 bytes (75 Mb)"
+
+#: src/cmd_split.c:437
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 bytes (95 Mb, unidad de disco Zip)"
+
+#: src/cmd_split.c:459
+msgid "Fixed Count Split"
+msgstr "Dividir a tamaño fijo"
+
+#: src/cmd_split.c:462
+msgid "Segment Count"
+msgstr "Tamaño del segmento"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr "Número actual, único para cada archivo generado"
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr "El valor del cajetin base"
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr "La cantidad que el índice va a cambiar para cada archivo"
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr "El número total de archivos que van a generarse"
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr "El valor del índice para el último archivo que se generará"
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr "La parte de desplazada en el archivo original"
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Tamaño fijo, número de partes variable"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Numero de partes fijo, tamaños variabes"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Dividir"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Formato del nombre"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Paso"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr "¿Números rellenados con ceros (\"Zero-Fil Numbers\")?"
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr "Desplazamiento"
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Ya Existe - ¿Continuar con el enlace?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "de Acuerdo"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Seleccione el destino del enlace"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Contenido"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Editar enlace simbólico"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Generar enlace simbólico"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Primero Hex-Check"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr "¿Cerrar con la tecla de la flecha izquierda?"
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "en"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "verdadero"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "si"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Salida de %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"Imposible ejecutar la orden \"%s\"\n"
+"(no se reconoce)."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Predefinidos (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Definidos por el usuario (%u)"
+
+#: src/cmdseq_dialog.c:239
+msgid "Select a command, or type part of its name."
+msgstr "Seleccione una orden o escriba parte de su nombre."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Seleccionar orden"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "No se puedo abrir el archivo de configuración para escritura"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Guardar"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr "Información del directorio del archivo de configuración"
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+"La configuración no se ha leído desde la localización por defecto.\n"
+"Utilice el botón «Guardar» de la ventana de configuración para actualizarla."
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"La versión del archivo de configuración (%s) no coincide\n"
+"con la versión del programa(%s)"
+
+#: src/configure.c:574
+#, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"No se ha podido encontrar ningún archivo de configuración; se buscó en:\n"
+"\"%s\",\n"
+"\"%s\" i\n"
+"\"%s\".\n"
+"Se utilizará la configuración mínima predefinida."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_de Acuerdo|Cancelar"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "i%u/%u dirs, %u/%u archivos"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr " (%s/%s)"
+
+#: src/dirpane.c:521
+#, c-format
+msgid ", %s (%s) used"
+msgstr ", %s (%s) utilizado"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s libre"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Subir al directorio padre"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Teclee la ruta, después presione Enter para cambiar a ese directorio"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "H"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Haga clic para habilitar/deshabilitar Esconder regla (Cuando está\n"
+"presionado, se activa la regla ocultar y las coincidencias.)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Bloques"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "BTamaño"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Tamaño del Bloque"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Modo, numérico"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Modo, texto"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "NEnlace"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Número de enlaces"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "ID del Propietario"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Uid"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nombre del propietario"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "UNombre"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Gid"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "ID de Grupo"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Gnombre"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nombre del Grupo"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Dispositivo"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Número del dispositivo"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DispMay"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Número del dispositivo, mayor"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DispMen"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Número del dispositivo, menor"
+
+#: src/dpformat.c:50
+msgid "Time of Last Access"
+msgstr "Fecha del último acceso"
+
+#: src/dpformat.c:51
+msgid "Time of Last Modification"
+msgstr "Fecha de la última modificación"
+
+#: src/dpformat.c:52
+msgid "Time of Creation"
+msgstr "Fecha de generación"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr "Hora del último cambio"
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Teclee el nombre"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "I"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr "URI"
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr "URI (sin prefijo del archivo)"
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "No fue posible %s \"%s\": %s (código %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "No fue posible %s \"%s\" (código %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "No fue posible %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "No fue posible %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr "Informar de la versión en la salida estándar y salir."
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr "Informar de los detalles locales y salir"
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr "Permite ejecutar gentoo al usuario root. Podría ser peligroso!"
+
+#: src/gentoo.c:479
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"No cargar el archivo de configuración ~/.config/gentoo/gentoorc; en su "
+"lugar, usar los valores predeterminados"
+
+#: src/gentoo.c:480
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"No cargar el archivo de configuración ~/.config/gentoo/gtkrc; en su lugar, "
+"usar los valores predeterminados del sistema"
+
+#: src/gentoo.c:481
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"No cargar el archivo ~/.config/gentoo/dirhistory; en su lugar, usar los "
+"valores predeterminados"
+
+#: src/gentoo.c:482
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Ejecute COMMAND, una orden de gentoo. Hacerlo antes de la interacción con el "
+"usuario, pero después de leer el archivo de configuración. Puede utilizarse "
+"muchas veces para ejecutar muchos órdenes secuencialmente."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr "COMMAND"
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr "DIR"
+
+#: src/gentoo.c:484
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Usar DIR como ruta para el panel izquierdo. Sobreescribe el predeterminado "
+"(e historial)"
+
+#: src/gentoo.c:485
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Usar DIR como ruta para el panel derecho. Sobreescribe el predeterminado (e "
+"historial)"
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr "Imprimir una lista de todos las órdener incorporados y salir"
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr "- gestor de archivos gráfico con GTK+"
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr "No se ha podido analizar las opciones de línea de órdenes: %s\n"
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Para ejecutar como root, invocar con la opción '--root-ok'\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"No fue posible iniciar el módulo userinfo - no será posible resolver "
+"nombres\n"
+"de usuario"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v %s por Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr "Advertencia de versión en desarrollo"
+
+#: src/gentoo.c:629
+#, fuzzy
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+"Esta versión de gentoo es muy reciente y poco probada. Ha habido cambios "
+"importantes en casi todas las partes del programa desde la versión anterior. "
+"Por favor, sea prudente en el uso de esta versión y asegúrese de informar de "
+"los errores y problemas al autor. Gracias."
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Progreso"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Escoger icono"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Cargando Imágenes de Iconos"
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(No hay Selección)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "ExpReg..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Otro"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Actualizar"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Seleccionar"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Ejecutar..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Configuración..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Seleccionar Menú"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr "_No volver a mostrar este cuadro de diálogo de nuevo"
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_de Acuerdo|To_do|_Saltar|Saltar _Todo|_Cancelar"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Total (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr "%u dia, %02u:%02u:%02u"
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr "%u dias, %02u:%02u:%02u"
+
+#: src/progress.c:346
+#, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Transcurrido %02d:%02d Velocidad %s/s ETA %s"
+
+#: src/sizeutil.c:31
+msgid "Unformatted Size"
+msgstr "Tamaño sin formato"
+
+#: src/sizeutil.c:32
+msgid "Formatted Size, Without Unit"
+msgstr "Tamaño con formato, sin unidad."
+
+#: src/sizeutil.c:33
+msgid "Formatted Size, in Bytes"
+msgstr "Tamaño con formato, en bytes"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+msgid "bytes"
+msgstr "bytes"
+
+#: src/sizeutil.c:34
+msgid "Formatted Size, in Kilobytes"
+msgstr "Tamaño con formato, en kilobytes"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "Kb"
+
+#: src/sizeutil.c:35
+msgid "Formatted Size, in Megabytes"
+msgstr "Tamaño con formato, en megabytes"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "Mb"
+
+#: src/sizeutil.c:36
+msgid "Formatted Size, in Gigabytes"
+msgstr "Tamaño con formato, en gigabytes"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "Gb"
+
+#: src/sizeutil.c:37
+msgid "Formatted Size, in Terabytes"
+msgstr "Tamaño con formato, en megabytes"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr "Tb"
+
+#: src/sizeutil.c:38
+msgid "Formatted Size, Automatic Unit"
+msgstr "Tamaño con formato, unidades automáticas"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Seleccionar estilo"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Raíz"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Directorio"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nuevo estilo %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+"\n"
+"** La conversión del texto desde el juego de carácteres '%s' ha fallado: "
+"suspendida."
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Línea %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Teclee el número de línea o porcentaje:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Ir a"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Teclee el texto a buscar (ER)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "¿No romper los saltos de línea?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Buscar"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+"Tiene SIGPIPE al escribir en el proceso 'file' (%s), parece haber terminado "
+"antes de tiempo."
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr "No se puede ejecutar la orden 'file' :"
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Confugurar gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Visualizador de texto"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Posición"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Altura"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "¿Establecer al abrir?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "¿Actualizar al cerrar?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Obtener"
+
+#~ msgid "Ruled Rows?"
+#~ msgstr "¿Filas controladas?"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr ""
+#~ "El módulo XML emitió un número real dependiente de la configuración local"
+
+#~ msgid "New Style"
+#~ msgstr "Nuevo estilo"
+
+#~ msgid "Before Execution"
+#~ msgstr "Previo a la ejecución"
+
+#~ msgid "After Execution"
+#~ msgstr "Posterior a la Ejecución"
+
+#~ msgid "Do not load the dirhistory file"
+#~ msgstr "No se ha leído el archivo «dirhistory»"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "¿Tratar la fila con foco como seleccionada si no hay una selección \"real"
+#~ "\"?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "¿Mover el foco a la última fila seleccionada/no seleccionada?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Obtener el actual"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Usar Diálogo para Reportar Errores?"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Tamaño sin Formato en Bytes"
+
+#~ msgid "Always Set"
+#~ msgstr "Siempre Establecer"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Estado de la Tecla 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Títulos de Paneles Activos"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Fila en Foco, No Seleccionada"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Fila en Foco, Seleccionada"
+
+#~ msgid "Beta Software"
+#~ msgstr "Software Beta"
+
+#~ msgid "Next Version?"
+#~ msgstr "Siguiente Versión?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Este modo dividir no ha sido\n"
+#~ "implementado aún... Lo sentimos."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento no sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Modo Numérico?"
+
+#~ msgid "Never"
+#~ msgstr "Nunca"
+
+#~ msgid "On Every Access"
+#~ msgstr "Cada vez que Accese"
+
+#~ msgid "Mounting"
+#~ msgstr "Montar"
+
+#~ msgid "Mount When?"
+#~ msgstr "Cuándo Montar?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Opciones de Montaje"
+
+#~ msgid "Mount Command"
+#~ msgstr "Comando para Montar"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Comando para Desmontar"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Solo Montar en los Directorios del Nivel más Alto?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Usar Diálogo de Error de Comando?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Desmontar al Salir de gentoo?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Soportado y activo."
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Soportado, pero no activado."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: No soportado."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No se puede copiar el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "Envolver Arriba y Abajo?"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "El directorio destino contiene al fuente."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Error en la expresión regular:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Usar mmap() para Acelerar Carga?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu bloques)"
+
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr "No usar FAM para detectar cambios en directorios vistos."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr "No fue posible iniciar montaje de datos - automontaje no funcionará"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Abrir FAM falló, error %d--FAM no será usado"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "La ejecución de \"%s %s\" falló:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montando \"%s\" en \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Anterior: %llu bytes, modificado en %s.\n"
+#~ "Nuevo: %llu bytes, modificado en %s."
+
+#~ msgid "File reading"
+#~ msgstr "Lectura de Archivo"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Seleccionar Código"
+
+#, fuzzy
+#~ msgid "Clr"
+#~ msgstr "Limpiar"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Tamaño del Buffer"
+
+#~ msgid "%s: Couldn't set text domain to \"%s\"\n"
+#~ msgstr "%s: No fue posible establecer el dominio del texto a \"%s\"\n"
+
+#~ msgid "Top"
+#~ msgstr "Inicio"
+
+#~ msgid "Bottom"
+#~ msgstr "Fin"
+
+#~ msgid "_Goto..."
+#~ msgstr "_Ir a..."
+
+#~ msgid "_Search..."
+#~ msgstr "_Buscar"
+
+#~ msgid "_Quit"
+#~ msgstr "_Salir"
diff --git a/po/es_MX.gmo b/po/es_MX.gmo
new file mode 100644
index 0000000..a033442
--- /dev/null
+++ b/po/es_MX.gmo
Binary files differ
diff --git a/po/es_MX.po b/po/es_MX.po
new file mode 100644
index 0000000..d3db1df
--- /dev/null
+++ b/po/es_MX.po
@@ -0,0 +1,2983 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2007-01-24 16:46+0000\n"
+"Last-Translator: Hugo F Ritter Vazquez <mahfrv@bristol.ac.uk>\n"
+"Language-Team: Language es-MX\n"
+"Language: es_MX\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "Izquierda de los Botones de Comandos"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "Derecha de los Botones de Comandos"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+#, fuzzy
+msgid "Paned"
+msgstr "Cambiado"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Estatico"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Esta página te permite controlar la forma de ubicarse del panel de Funciones "
+"Rápidas en relación al\n"
+"panel que contiene los Botones de Comandos. Es una clase de anclaje; el "
+"plan\n"
+"es proveer de mucha mayor flexibilidad en la administración de botones y "
+"soportar la\n"
+"creación de más que estos dos paneles de botones integrados en el programa. "
+"Pero eso aún esta por venir.\n"
+"\n"
+"Por lo pronto, provee la funcionalidad que estaba presente cuando las "
+"funciones rápidas\n"
+"eran una función especial con su propia página de configuración (hasta la "
+"versión 0.11.24 de gentoo, incluyendola), para tu conveniencia.\n"
+"\n"
+"Para encontrar el panel de funciones rápidas, cambia a la página de "
+"Definiciones y usa la opción entrada del menu\n"
+"en la esquina superior izquierda de la página."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Posición del panel de Funciones Rápidas"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Estilo de espacio intermedio"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr ""
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Establecer Ancho de Fila"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Predeterminado"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Favor de Confirmar"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Estás seguro que deseas borrar la fila de botones seleccionada?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Borrar|_Cancelar"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Seleccionar el Ancho de la Nueva Fila"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Cambiar el Ancho de la Fila"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Cambiar el Color del Fondo"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Cambiar el Color del Frente"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etiqueta"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Comando"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Teclas"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Colores"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Fondo..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Restablecer Predeterminado"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Frente..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Funciones Rápidas"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Limpiar"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Copiar Colores a"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Copiar a"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Cambiar con"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Añadir Fila..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Borrar Fila"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Abajo"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ancho de Fila"
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Arriba"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Panel"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Principal"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Secundario"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Consejo"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Banderas"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Refinar?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Mostrar Consejo?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Botones"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definiciones"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Opciones"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Seleccionar Predeterminado"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Llave abriendo"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Llave cerrando"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "El primero seleccionado"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Seleccionado por primera vez, des-seleccionar"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "El primero seleccionado, con ruta"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "El primero seleccionado, con ruta, des-seleccionar"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "El primero seleccionado (panel de destino)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "El primero seleccionado sin comillas"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "El primero seleccionado sin comillas"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Todos los seleccionados"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Todos los seleccionados, des-seleccionar"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Todos los seleccionados, con rutas"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Todos los seleccionados, con rutas, des-seleccionar"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Todos los seleccionados (panel de destino)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Todos los seleccionados, no comillas"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Todos los seleccionados, no comillas"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Ruta al directorio del panel de origen"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Ruta al directorio del panel de destino"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Ruta al directorio home"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Ruta del panel izquierdo"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Ruta del panel derecho"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "El primero seleccionado"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Seleccionado por primera vez, des-seleccionar"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "El primero seleccionado sin comillas"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Todos los seleccionados"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Todos los seleccionados, des-seleccionar"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Todos los seleccionados, no comillas"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Todos los seleccionados, no comillas"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "El primero seleccionado (panel de destino)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Caja de entrada"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Entrada usando menú"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Texto de entrada"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Botón de Opcion de entrada (da TRUE o FALSE)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Agregar etiqueta a la ventana de entrada"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Agregar una barra de separación a la ventana de entrada"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NOMBRE"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Valor de $NOMBRE (entorno)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID de gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Directorio home del usuario NOMBRE"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NOMBRE"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Seleccionar Código"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(No hay opciones disponibles)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Ejecutar en segundo plano?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Matar Instancia Anterior"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Sobrevivir Abandonar?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Capturar Salida?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "Requerir Selección del Fuente?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "Requerir Selección del Destino?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "CD Fuente?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "CD Destino?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Actualizar Fuente?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Actualizar Destino?"
+
+#: src/cfg_cmdseq.c:955
+#, fuzzy
+msgid "General"
+msgstr "Centro"
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr ""
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Predefinidos"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Externas"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Agregar Fila"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplicar"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nombre"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definición"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Repetir Secuencia Hasta Terminar con la Seleccion de Origen"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Agregar"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Borrar"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Comandos"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Izquierda"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Centro"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Derecha"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Bajar"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Subir"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Las siguientes teclas de modificación deben\n"
+"mantenerse apretadas al hacer click con el ratón\n"
+"para ejecutar el comando"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Editar Modificadores"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Controles"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Funciones Rápidas del Teclado Globales"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr ""
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Botón"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Editar Modificadores..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr ""
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Límite de tiempo"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr ""
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Nota: Las opciones para la configuración del botón del mouse\n"
+"son ambiguas: el mismo botón+modificador\n"
+"es usado para más de una función. Esto\n"
+"puede hacer que se comporten un poco extraño..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Advertencia"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Agregar Caracter de Tipo?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Agregar \"-> destino\" a Ligas?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Marca Cada 3 dígitos?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Digitos de Precisión"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Mostrar tamaño del Directorio en Sistema de Archivos"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Formato"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s Opciones"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Contenido"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Justificación"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Título"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ancho"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centro"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Opciones Básicas"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Editar Contenido de la Columna"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Título Predeterminado"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Directorios al Principio"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Directorios al Final"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Mezclar Directorios"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Izquierda de la Lista"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Derecha de la Lista"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Predeterminado"
+
+#: src/cfg_dirpane.c:1015
+#, fuzzy, c-format
+msgid "Copy From %s"
+msgstr "Copiar Desde"
+
+#: src/cfg_dirpane.c:1015
+#, fuzzy, c-format
+msgid "Copy To %s"
+msgstr "Copiar a"
+
+#: src/cfg_dirpane.c:1015
+#, fuzzy, c-format
+msgid "Swap With %s"
+msgstr "Intercambiar con"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Columnas"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Tipos de Contenido Disponibles"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Tipos de Contenido Seleccionados"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Editar..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Remover"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Ordenar"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Orden por"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Modo"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Orden Inverso?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ignorar mayúsculas/minúsculas"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Directorio Predeterminado"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Crear Directorio"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Obtener Actual"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Desde Historial"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Ruta Arriba?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Esconder permitido?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Siempre Barras de Desplazamiento?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Botón Subir Gigante?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "Requerir Selección del Destino?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Barra de Desplazamiento"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr ""
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "No Rastrear"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Proporción"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Tamaño, Panel Izquierdo"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Tamaño, Panel Derecho"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientación del Panel"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Rastrear División"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "pixeles"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Recordar Filas Seleccionadas?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Guardar Listas de Historial?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Paneles de Directorios"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Separación de Paneles"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historial"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Errores"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Alarma en Caso de Error?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menús"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Restablecer Predeterminado"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Cancelar"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Ãconos"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr ""
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr ""
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr ""
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Iniciando con Punto (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Coincidencias en ER"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ninguno"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Rutas y Esconder"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Rutas"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Esconder Etradas"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ninguno)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Acción Borrar"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Editar Color"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Restablecer Comando Heredado"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Seleccionar Comando"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Nueva Propiedad de la Acción"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "algo"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Borrar este estilo borrará también\n"
+"todos sus hijos. Estás seguro?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Comfirmar Borrar"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Color de Fondo"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Color Principal"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Ãcono"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Texto para Previsualizar Estilo de Fila)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Sobreescribir el del Padre?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Escoger..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Agregar Acción..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Comando"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Padre"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Propiedades Heredadas"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr ""
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Acciones"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Tipos de Archivos"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Estilos"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Click para Cambiar..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nuevo Tipo)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Archivo"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Liga"
+
+#: src/cfg_types.c:645
+#, fuzzy
+msgid "Socket"
+msgstr "Grupo"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Lectura"
+
+#: src/cfg_types.c:646
+#, fuzzy
+msgid "SetGID"
+msgstr "Establecer GID"
+
+#: src/cfg_types.c:646
+#, fuzzy
+msgid "SetUID"
+msgstr "Establecer UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+#, fuzzy
+msgid "Sticky"
+msgstr "Estatico"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Ejecución"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Escritura"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Identificar 'archivo' (ER)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Identificar Nombre (ER)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Requerir Extensión"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identificación"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Requerir Tipo"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Requerir Protección"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr ""
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Estilo del Tipo"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Estilo"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Tipos"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Ventanas de Diálogo al Centro de la Pantalla"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Ventanas de Diálogo Siguen el Mouse"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Ventanas de Diálogo Colocadas por el Manejador de Ventanas"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Ventanas"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Ventanas"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Posición de Diálogos "
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Falló la ejecución de \"%s\""
+
+#: src/children.c:89 src/dialog.c:275
+#, fuzzy
+msgid "Error"
+msgstr "Errores"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "No se pudo finalizar el proceso hijo \"%s\" (pid=%d)--alerta de zombie"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Versión %s (GTK+ version %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2005 por Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Este es software libre y no hay ABSOLUTAMENTE NINGUNA\n"
+"GARANTÃA. Lee el archivo COPYING para más detalles.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Soportado, usando strings integrados en Inglés"
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"El autor de gentoo puede ser contactado vía Internet\n"
+"Correo electrónico: <emil@obsession.se>; son bienvenidas \n"
+"opiniones, sugerencias/reportes de bugs y demás.\n"
+"\n"
+"Puedes encontrar la última versión de gentoo\n"
+"en el sitio oficial del proyecto gentoo en\n"
+"<http://www.obsession.se/gentoo/>. Las actualizaciones\n"
+"son anunciadas típicamente en el servicio de Freshmeat en\n"
+"<http://freshmeat.net/>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Acerca de gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Espera por Más)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Establecer bits de protección para \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Grupo"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Otros"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Propietario"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Especial"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Ejecución"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lectura"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Establecer GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Establecer UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Escritura"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bits de Protección"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr ""
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Todo"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr ""
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Restablecer"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Recursivo en Directorios?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "No tocar Directorios?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Cambiar Modo"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Establecer Propietario para '%s'"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Usuario"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Cambiar Pertenencia"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Guardar Cambios en la Configuración al Salir?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Existe - Seguir con la Copia?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Copiando..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Preservar Fechas al Copiar?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr "Ignorar Fallas de Copia de Atributos (Fecha, Propietario, Modo)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Abandonar Destino si Espacio Lleno?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Tamaño del Buffer"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Teclee Nombre para la Copia de \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Teclee Nombre para el Clón de \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Ya Existe - Continuar con la Clonación?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Clonando..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Copiando Como..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Teclee el Nombre para la Liga \"%s\" Como"
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Teclee el Nombre para el Clon de la Liga de \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Ya Existe - Proceder con Liga Simbólica?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Copiar Como"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Clonar"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Liga Simbólica Como"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Clonar Liga Simbólica"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"no pudo ser borrado debido a restricciones de acceso.\n"
+"Intentar abrir permisos y reintentar?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Recordar respuesta (altera la configuración)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Problema de Acceso"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Cambiar|Abandonar"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "Seguro que Quieres Borrar \"%s\"?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Borrando..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "En Falla de Acceso"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Preguntar al Usuario|Intentar Cambiar Permisos y Reintentar|Fallo"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+#, fuzzy
+msgid "ISearch"
+msgstr "Buscar"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK|A_ll|_Saltar|_Cancelar"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|_Saltar|_Cancelar"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Obteniendo tamaños..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Borrar Selección al Terminar?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s usado"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u dirs, %u archivos, %u ligas simbólicas"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Ligar a"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Tipo"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Localización"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr ""
+"%s (%s bytes,\n"
+"%s bloques)"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Contiene"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Información de 'Archivo'"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Accesado"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modificado"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Cambiado"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Creado"
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr ""
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Obteniendo Información..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Mostrar Salida de 'archivo'?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Formato de la Fecha de Acceso"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Modificar Formato de Fecha"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Cambiar Formato de Fecha"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Marca de Separación en Tamaño"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Ya Existe - Continuar con Juntar?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Juntando..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+"Hacer Click y Arrastrar Archivos para Reordenar, Después Hacer Click en "
+"Juntar"
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "El tamaño total es %s (%lu bytes)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "El tamaño total es %lu bytes."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Teclear Nombre del Archivo Destino"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Juntar"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Juntar|_Cancelar"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Ya Existe - Seguir con MkDir"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Teclea el Nombre del Directorio a Crear"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Crear Directorio"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Entrar al Nuevo Directorio?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Enfocar Nuevo Directorio?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Ya Existe - Continuar con Mover?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Moviendo..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Teclee el Nombre Mover \"%s\" Como"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Moviendo Como..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Mover Como"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Es posible que tengas cambios sin guardar en la configuración.\n"
+"Al salir sin guardar se perderán estos cambios. Aún deseas salir?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Confirmar Salir"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Salir|_Guardar, entonces Salir|_Cancelar"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Seguro que deseas salir?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Teclee el Nuevo Nombre para \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Ya Existe - Seguir con Renombrar?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Renombrar"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Buscar una cadena de texto en todos los archivos y reemplazarla\n"
+"con otra cena de texto."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Reemplazar"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Con"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Reemplazar Todo?"
+
+#: src/cmd_renamere.c:442
+#, fuzzy
+msgid "Simple"
+msgstr "Archivo"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Ejecutar 'From' ER en cada archivo, almacenando\n"
+"coincidencias de expresiones entre paréntesis. Después reemplazar\n"
+"cualquier ocurrencia de $n en 'A', donde n es el índice \n"
+"(empezando de 1) de una sub-expresión, con el texto\n"
+"que coincide y usar el resultado como un nuevo nombre de archivo."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "De"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "A"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Expresion Regular"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+"Busca cada caracter en el texto 'De', y sustutuye\n"
+"cualquier ocurrencia por el caracter correspondiente en el texto 'A'\n"
+"Después, cualquier caracter en el texto 'Remmover' es removido del\n"
+"nombre del archivo, y el resultado usado como el nuevo nombre de cada "
+"archivo."
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr "Mapa"
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+#, fuzzy
+msgid "Lower Case?"
+msgstr "Ignorar mayúsculas/minúsculas"
+
+#: src/cmd_renamere.c:501
+#, fuzzy
+msgid "Upper Case?"
+msgstr "Ignorar mayúsculas/minúsculas"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Ignorar mayúsculas/minúsculas"
+
+#: src/cmd_renamere.c:506
+#, fuzzy
+msgid "Case"
+msgstr "Cancelar"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "RenombrarER"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr ""
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Este comando renombra todos los archivos seleccionados\n"
+"a una secuencia numérica. Los controles abajo permiten\n"
+"definir cómo son formados los nombres."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Comenzar Wn"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr ""
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precisión"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Cabeza"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Cola"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Invitado"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Renombrar Secuencial"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Todo|Seleccionados|No seleccionados"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Cualquier tipo|Sólo directorios|Sólo no directorios|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Seleccionar|Des-seleccionar|Fijar|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Acción"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Grupo"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "Tratar ER como patrón global"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Invertir coincidencia de ER"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Requerir coincidencia en el nombre completo?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Seleccionar usando ER"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+"Teclee el comando shell a ejecutar. El contenido\n"
+"seleccionado será añadido al final del comando.\n"
+"Acción será realizada al finalizar exitosamente."
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "OK|Cancelar"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Seleccionar usando un comando shell"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Dividir \"%s\".\n"
+"Archivo es %s (%s)."
+
+#: src/cmd_split.c:276
+#, fuzzy, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Dividir \"%s\".\n"
+"Archivo es %s (%s)."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Ya existe - Continuar con dividir?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Dividir a tamaño fijo"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Tamño del segmento"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 bytes (3.5\" floppy)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 bytes (3.5\" floppy)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 bytes (3.5\" floppy)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 bytes (3.5\" floppy)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 bytes (3.5\" floppy)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 bytes (disco Zip)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Dividir a tamaño fijo"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Tamño del segmento"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Tamaño fijo, número de partes variable"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Numero de partes fijo, tamaños variabes"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Dividir"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Formato del Nombre"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Paso"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Ya Existe - Continuar con Crear Liga?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+#, fuzzy
+msgid "OK"
+msgstr "_OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Seleccione Destino de la Liga"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Contenido"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Editar Liga Simbólica"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Crear Liga Simbólica"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Primero Hex-Check"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "activo"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "verdadero"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "si"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Salida de %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Comando desconocido \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Predefinidos (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Definidos por el Usuario (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Seleccione un comando o teclee el inicio\n"
+"del nombre y presione TAB."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Seleccionar Comando"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "No se puedo abrir el archivo de configuración para escritura"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Guardar"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"La versión del archivo de configuración (%s) no coincide\n"
+"con la versión del programa(%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"No fue posible encontrar ningún archivo de configuración; se buscó\n"
+"en \"%s\" y \"%s\".\n"
+"Usando configuración mínima predefinida."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|Cancelar"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "i%u/%u dirs, %u/%u archivos"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s usado"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s libre"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Subir al directorio padre"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Teclee la ruta, después presione Enter para cambiar a ese directorio"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr ""
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Haga click para habilitar/deshabilitar Esconder regla (Cuando está\n"
+"presionado, esconder regla es activado y las coincidencias son escondidas.)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Bloques"
+
+#: src/dpformat.c:39
+#, fuzzy
+msgid "BSize"
+msgstr "Tamaño"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Tamaño del Bloque"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Modo, numérico"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Modo, texto"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "Nliga"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Número de ligas"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "ID del Propietario"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr ""
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nombre del propietario"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Unombre"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr ""
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "ID de Grupo"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Gnombre"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nombre del Grupo"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Dispositivo"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Número del dispositivo"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DispMay"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Número del dispositivo, mayor"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DispMen"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Número del dispositivo, menor"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Fecha del último acceso"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Fecha de la última Modificación"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Fecha de Creación"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Teclee Nombre"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "No fue posible %s \"%s\": %s (código %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "No fue posible %s \"%s\" (código %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "No fue posible %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "No fue posible %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "Imprimir la versión a salida estándar y salir."
+
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "Reportar detalles de locales internas y salir"
+
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr "Permite a gentoo correr por el usuario root. Podría ser peligroso."
+
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"No cargar el archivo de configuración ~/.gentoorc; en vez de eso, usar\n"
+"valores predeterminados."
+
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"No cargar el archivo de configuración ~/.gentoorc; en vez de eso, usar\n"
+"valores predeterminados del sistema."
+
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"No cargar el archivo de configuración ~/.gentoorc; en vez de eso, usar\n"
+"valores predeterminados."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Ejecuta ARG, un comando de gentoo. Hecho antes de la interacción con el\n"
+"usuario, pero después de leer el archivo de configuración. Puede ser usado\n"
+"muchas veces para ejecutar muchos comandos en secuencia."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Usar ARG como ruta para el panel izquierdo. Sobreescribe el predeterminado "
+"(e historial)"
+
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Usar ARG como ruta para el panel derecho. Sobreescribe el predeterminado (e "
+"historial)"
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Para ejecutar como root, invocar con la opción '--root-ok'\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"No fue posible iniciar el módulo userinfo - no será posible resolver "
+"nombres\n"
+"de usuario"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s por Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Progreso"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Escoger icono"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Cargando Imágenes de Iconos"
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(No hay Selección)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "ExpReg..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Otro"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Actualizar"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Seleccionar"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Ejecutar..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Configuración..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Seleccionar Menú"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_OK|Todo _l|_Saltar|Saltar Todo _A|_Cancelar"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr ""
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Transcurrido %02d:%02d Velocidad %s/s ETA %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Tamaño con Formato, en bytes"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Tamaño con formato, unidades \"inteligentes\""
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Tamaño con Formato, en bytes"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "si"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Tamaño con Formato, en kilobytes"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr ""
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Tamaño con formato, en megabytes"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr ""
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Tamaño con formato, en gigabytes"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr ""
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Tamaño con formato, en megabytes"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr ""
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Tamaño con formato, unidades \"inteligentes\""
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Seleccionar Estilo"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Raíz"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Directorio"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nuevo Estilo %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Línea %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Teclee el Número de Línea o Porcentaje:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Ir a"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Teclee el texto a buscar (ER)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "No romper líneas nuevas?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Buscar"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Confugurar gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Visualizador de Texto"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Posición"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Altura"
+
+#: src/window.c:203
+msgid "X"
+msgstr ""
+
+#: src/window.c:203
+msgid "Y"
+msgstr ""
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Establecer al Abrir?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Actualizar al Cerrar?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Obtener"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "Módulo XML emitió número real dependiente de local"
+
+#~ msgid "New Style"
+#~ msgstr "Nuevo Estilo"
+
+#~ msgid "Before Execution"
+#~ msgstr "Previo a la Ejecución"
+
+#~ msgid "After Execution"
+#~ msgstr "Posterior a la Ejecución"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Tomar la Fila con Foco como Seleccionada si no Existe una Selección \"Real"
+#~ "\"?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Mover Foco a la Última Fila Seleccionada/No Seleccionada"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Obtener Actual"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Usar Diálogo para Reportar Errores?"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Tamaño sin Formato en Bytes"
+
+#~ msgid "Always Set"
+#~ msgstr "Siempre Establecer"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Estado de la Tecla 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Títulos de Paneles Activos"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Fila en Foco, No Seleccionada"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Fila en Foco, Seleccionada"
+
+#~ msgid "Beta Software"
+#~ msgstr "Software Beta"
+
+#~ msgid "Next Version?"
+#~ msgstr "Siguiente Versión?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Este modo dividir no ha sido\n"
+#~ "implementado aún... Lo sentimos."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Ordenamiento no sensible a mayúsculas/minúsculas no funcionará\n"
+#~ "correctamente con caracteres no ASCII"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Modo Numérico?"
+
+#~ msgid "Never"
+#~ msgstr "Nunca"
+
+#~ msgid "On Every Access"
+#~ msgstr "Cada vez que Accese"
+
+#~ msgid "Mounting"
+#~ msgstr "Montar"
+
+#~ msgid "Mount When?"
+#~ msgstr "Cuándo Montar?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Opciones de Montaje"
+
+#~ msgid "Mount Command"
+#~ msgstr "Comando para Montar"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Comando para Desmontar"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Solo Montar en los Directorios del Nivel más Alto?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Usar Diálogo de Error de Comando?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Desmontar al Salir de gentoo?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Soportado y activo."
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Soportado, pero no activado."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: No soportado."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No se puede copiar el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "Envolver Arriba y Abajo?"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "el directorio fuente contiene al de destino."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "No es posible mover el directorio \"%s\"\n"
+#~ "a \"%s\":\n"
+#~ "El directorio destino contiene al fuente."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Error en la expresión regular:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Usar mmap() para Acelerar Carga?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu bloques)"
+
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr "No usar FAM para detectar cambios en directorios vistos."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr "No fue posible iniciar montaje de datos - automontaje no funcionará"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Abrir FAM falló, error %d--FAM no será usado"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "No es posible agregar monitor FAM a \"%s\", error %s\n"
+#~ "(reiniciar con --no-fam\n"
+#~ " podría evitar este problema)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "La ejecución de \"%s %s\" falló:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montando \"%s\" en \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Anterior: %llu bytes, modificado en %s.\n"
+#~ "Nuevo: %llu bytes, modificado en %s."
+
+#~ msgid "File reading"
+#~ msgstr "Lectura de Archivo"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Seleccionar Código"
+
+#, fuzzy
+#~ msgid "Clr"
+#~ msgstr "Limpiar"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Tamaño del Buffer"
+
+#~ msgid "%s: Couldn't set text domain to \"%s\"\n"
+#~ msgstr "%s: No fue posible establecer el dominio del texto a \"%s\"\n"
+
+#~ msgid "Top"
+#~ msgstr "Inicio"
+
+#~ msgid "Bottom"
+#~ msgstr "Fin"
+
+#~ msgid "_Goto..."
+#~ msgstr "_Ir a..."
+
+#~ msgid "_Search..."
+#~ msgstr "_Buscar"
+
+#~ msgid "_Quit"
+#~ msgstr "_Salir"
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644
index 0000000..ec10afd
--- /dev/null
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..94772d4
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,3014 @@
+# French translations for gentoo package.
+# Copyright (C) 2002 Emil Brink.
+# This file is distributed under the same license as the gentoo package.
+# Emil Brink <emil@obsession.se>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2002-08-29 20:17+0200\n"
+"Last-Translator: ROSSI Philippe <prossi@free.fr>\n"
+"Language-Team: Français <fr@li.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 0.9.6\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "A gauche"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "A droite"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Statique (sans séparation)"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Avec réglette"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Statique (avec séparation)"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Emplacement du panneau des raccourcis répertoires"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Séparation des boutons Répertoires/Commandes"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Emplacement"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Requête de gentoo"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Commandes"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Confirmez S'il vous plaît"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Désirez-vous réellement supprimer cette rangée de boutons ?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Supprimer|_Annuler"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Nombre de boutons pour cette nouvelle rangée"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Remanier le nombre de boutons pour cette rangée."
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Édition - Couleur du fond"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Édition - Couleur de la police"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Nom"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Commande "
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Raccourci"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Couleurs"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Fond..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Par défaut"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Police..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Répertoires"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Effacer"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Copier les couleurs vers..."
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Copier vers..."
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Échanger avec..."
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Ajout d'une rangée..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Supprimer"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "En bas"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Nbr de boutons..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "En haut"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Boutons de "
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Avant plan"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Arrière-plan"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Commentaire"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Affichage"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Étroit"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Afficher le commentaire (bulle d'aide)"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Boutons de commande"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Définitions"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Options"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Choix commande interne"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Accolade ouvrante"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Accolade fermante"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "1ère entrée sélectionnée"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "1ère entrée sélectionnée, désélectionnée"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "1ère entrée sélectionnée, avec chemin"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "1ère entrée sélectionnée, avec chemin, désélectionnée"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "1ère entrée sélectionnée (panneau de destination)"
+
+#: src/cfg_cmdseq.c:630
+#, fuzzy
+msgid "First selected, no quotes"
+msgstr "1ère entrée sélectionnée, désélectionnée"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "1ère entrée sélectionnée, désélectionnée"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Toutes entrées sélectionnées"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Toutes entrées sélectionnées, désélectionnées"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Toutes entrées sélectionnées, avec chemins"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Toutes entrées sélectionnées, avec chemins, désélectionnées"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Toutes entrées sélectionnées (panneau de destination)"
+
+#: src/cfg_cmdseq.c:637
+#, fuzzy
+msgid "All selected, no quotes"
+msgstr "Toutes entrées sélectionnées, avec chemins"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Toutes entrées sélectionnées, avec chemins"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Chemin du répertoire source"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Chemin du répertoire destination"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Chemin du répertoire personnel"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Chemin du panneau gauche"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Chemin du panneau droite"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "1ère entrée sélectionnée"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "1ère entrée sélectionnée, désélectionnée"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "1ère entrée sélectionnée, désélectionnée"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Toutes entrées sélectionnées"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Toutes entrées sélectionnées, désélectionnées"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Toutes entrées sélectionnées, avec chemins"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Toutes entrées sélectionnées, avec chemins"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "1ère entrée sélectionnée (panneau de destination)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Boîte de sélection "
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Boîte de menu"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Saisie de chaînes"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Contrôle du bouton (donne VRAI ou FAUX)"
+
+#: src/cfg_cmdseq.c:656
+#, fuzzy
+msgid "Add label to input window"
+msgstr "Titre de la fenêtre"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr ""
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Valeur de $NAME (variable d'environnement)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID de gentoo's"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Chemin du répertoire pour l'utilisateur NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Sélection d'une fonction"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Aucune option de disponible)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Démarrer en tâche de fond"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Fermer si ouvert"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Survivre en quittant"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Capture"
+
+#: src/cfg_cmdseq.c:912
+#, fuzzy
+msgid "Require Source Selection?"
+msgstr "Droits d'accès"
+
+#: src/cfg_cmdseq.c:916
+#, fuzzy
+msgid "Require Destination Selection?"
+msgstr "Droits d'accès"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "CD Source"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "CD Destination"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Re-analyser la source"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Re-analyser la destination"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "Général"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "Avant & Après"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Interne"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Externe"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Nouvelle entrée "
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplicata"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nom "
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Définition"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Repeat Sequence Until No Source Selection?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Ajouter"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Supprimer"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Commandes"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Gauche"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Milieu"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Droite"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Molette vers le bas"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Molette vers le haut"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"- Touche modificatrice -\n"
+"\n"
+"Vous pouvez assigner une touche(s) modificatrice(s)\n"
+"avec vos boutons de souris.\n"
+"Pour déclencher la commande, vous devrez \n"
+"maintenir celle(s)-ci enfoncée(s) et cliquez."
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Requête de gentoo"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Raccourcis clavier/souris"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Panneau de contrôle des raccourcis clavier"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Panneau de contrôle des boutons de souris"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Bouton"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Éditer touche modificatrice..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr ""
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr ""
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ignorer la touche clavier 'Verr num' pour tous les raccourcis"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Note : Les configurations du bouton de souris\n"
+"sont ambigu : si la même combinaison\n"
+"(bouton+touche modificatrice) est employée\n"
+"pour plus d'une fonction. Cela pourraient avoir\n"
+"un comportement assez mystérieux..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Avertissement"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Ajouter un type de caractère"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Ajouter \"-> destination\" sur les liens"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr ""
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr ""
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr ""
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr ""
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr ""
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Contenu"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Justification"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Titre"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Largeur "
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centrer"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Configurations de base"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Édition - Contenu colonne"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Titre"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Répertoires en premier "
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Fichiers en premier"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Mixte"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "A gauche"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "A droite"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Défaut"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Copier depuis le panneau de %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Copier vers le panneau de %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Échanger avec le panneau de %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Format de liste"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Types disponibles"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Types sélectionnés"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Éditer"
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Retirer"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Format d'affichage"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Trier par "
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Mode "
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Inverser l'ordre"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ignorer la casse"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Répertoire par défaut au démarrage"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Requête de gentoo"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Capturer (courant)"
+
+#: src/cfg_dirpane.c:1117
+#, fuzzy
+msgid "From History"
+msgstr "Historique"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Afficher le chemin au dessus"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Afficher les fichiers cachés"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Afficher l'ascenseur"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Bouton 'Parent' énorme"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "Droits d'accès"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Position ascenseurs"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Gauche/Droite"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Haut/Bas"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ne pas tracer"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Largeur proportionnelle"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Largeur du panneau gauche"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Largeur du panneau droit"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientation des panneaux"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Dimensions des panneaux"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "en pixels"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Sauvegarder les fichiers d'historique"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Panneaux"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Dimensions"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historique"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Gestion des Erreurs"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Activer le signal sonore pour les erreurs"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menus"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Par défaut"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Annuler"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Icônes "
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC "
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Cacher ceux commençant par un point (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Suivant la correspondance RE"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Tout voir"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Chemins & Caches"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Chemins d'accès"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Afficher/Cacher les fichiers"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Aucun)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Supprimer l'action"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Édition couleur"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Rétablir la commande"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Requête de gentoo"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Requête de gentoo"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "(commande à définir)"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"ATTENTION, en supprimant ce Style (parent),\n"
+"vous allez supprimer tous les Styles (enfants).\n"
+"Confirmez-vous la suppression ?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Requête de gentoo"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Couleur fond"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Couleur police"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Icône"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Style de rendu visuel)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Aperçu "
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Personnaliser"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Sélectionner..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Ajouter une Action..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Commande "
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Parent "
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Propriétés"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visuel"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Actions"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Associations de fichiers "
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Styles"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Cliquez pour changer..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nouveau type)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-Dev"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-Dev"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Répertoire"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Fichier"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Lien"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Socket"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Lecture"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "SGID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "SUID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Exécution"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Écriture"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Correspondance 'fichier'"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Correspondance de nom"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Motifs de fichiers"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identification"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Type"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Droits d'accès"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Glob ?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Type de style"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Style"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Types"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr ""
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Fenêtres principales"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Fenêtres principales"
+
+#: src/cfg_windows.c:120
+#, fuzzy
+msgid "Dialog Positioning"
+msgstr "Position"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "L'exécution de \"%s\" a échoué"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Erreur"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr ""
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Version %s (GTK+ version %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2002 par Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"C'est un logiciel libre, SANS AUCUNE GARANTIE. \n"
+"Lisez le fichier 'COPYING' pour plus de détails.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS : Supporté, utilise les chaînes internes Anglaise"
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"L'auteur de gentoo peut être joint via Internet\n"
+"par e-mail <emil@obsession.se>; n'hésitez pas à me\n"
+"communiquer vos impressions, suggestions, rapports\n"
+"de bug sur ce logiciel ainsi que sur les\n"
+"\n"
+"widgets de J. Hanson <johan@tiq.com>.\n"
+"\n"
+"La dernière version de gentoo est toujours disponible\n"
+"en téléchargement sur le site officiel :\n"
+" <http://www.obsession.se/gentoo/>\n"
+"Les sorties des nouvelles versions sont annoncées sur le\n"
+"service Freshmeat :\n"
+"<Http: // freshmeat.net />"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "A propos de gentoo..."
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Patientez...)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Bits de protection pour \"%s\" :"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Groupe"
+
+#: src/cmd_chmod.c:199
+#, fuzzy
+msgid "Others"
+msgstr "Autres"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Utilisateur"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Spécial"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Exécution"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lecture"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Set GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Set UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Écriture"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bits de protection"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr ""
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Tout"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Basculer"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Rétablir"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Appliquer aux sous-répertoires & fichiers"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Ne pas appliquer aux sous-répertoires"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Droits d'accès"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Propriété pour '%s' :"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Utilisateur"
+
+#: src/cmd_chown.c:204
+#, fuzzy
+msgid "Change Ownership"
+msgstr "Propriété"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Copie en cours..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Préserver les dates pendant la copie"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Abandonner, si l'espace libre de la destination est insuffisant"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Taille du tampon"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr ""
+"- Copier sous... -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr ""
+"- Duplicata -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Duplicata en cours..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Copie sous..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr ""
+"- Lien -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr ""
+"- Lien symbolique -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Copie sous..."
+
+#: src/cmd_copyas.c:210
+#, fuzzy
+msgid "Clone"
+msgstr "Fermer"
+
+#: src/cmd_copyas.c:212
+#, fuzzy
+msgid "Symbolic Link As"
+msgstr "Édition lien symbolique"
+
+#: src/cmd_copyas.c:214
+#, fuzzy
+msgid "Symbolic Link Clone"
+msgstr "Édition lien symbolique"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr ""
+
+#: src/cmd_delete.c:61
+#, fuzzy
+msgid "Access Problem"
+msgstr "Accédé "
+
+#: src/cmd_delete.c:61
+#, fuzzy
+msgid "Change|Leave Alone"
+msgstr "Droits d'accès"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr ""
+"- Suppression -\n"
+"\n"
+"Désirez-vous réellement supprimer \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Suppression..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr ""
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr ""
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+#, fuzzy
+msgid "ISearch"
+msgstr "Rechercher"
+
+#: src/cmd_generic.c:143
+#, fuzzy
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_Écraser| Écraser T_out |_Sauter|Sauter _Tout|_Annuler"
+
+#: src/cmd_generic.c:144
+#, fuzzy
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|Annuler"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Calcul de(s) taille(s) en cours..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Désélectionner automatiquement une fois terminer"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s libre"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u répertoire(s), %u fichier(s), %u Lien(s)"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Lier à"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Type"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Emplacement "
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Taille"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%u octets"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Contient"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Méta-Info "
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Accédé "
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modifié "
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Changé "
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Créé"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Base"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Collecte des informations"
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Afficher les méta-informations du fichier"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Format date d'accès"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Format date de modification"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Format date de changement"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Séparateur "
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Fusion en cours..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+"- Fusionner -\n"
+"\n"
+"a) Réorganisez l'ordre des fichiers à votre guise.\n"
+" Note: Pour déplacer un fichier, utilisez la\n"
+" souris (sélectionner, glisser, relâcher).\n"
+" b) Tapez le nom du fichier à créer.\n"
+" c) Cliquez sur Fusionner.\n"
+" "
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "La taille totale est de %s (%lu octets)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "La taille totale est de %lu octets"
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Nom du fichier à créer"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Requête de gentoo"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Fusionner|Annuler"
+
+#: src/cmd_mkdir.c:66
+#, fuzzy, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr ""
+"- Créer un répertoire -\n"
+"\n"
+"Entrer le nom du répertoire à créer"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Requête de gentoo"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Ouvrir automatiquement le nouveau répertoire"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Focus sur le nouveau répertoire"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Déplacement en cours..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr ""
+"- Déplacer sous... -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Déplacement sous en cours..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Requête de gentoo"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Vous avez modifier votre configuration.\n"
+"Désirez-vous vraiment quitter ?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Requête de gentoo"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Quitter|_Sauver & Quitter|_Annuler"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Êtes-vous sûrs que vous voulez quitter ?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr ""
+"- Renommer -\n"
+"\n"
+"Entrer le nouveau nom pour \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Requête de gentoo"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Recherche une sous-chaîne des éléments sélectionnés \n"
+" et la remplace par une nouvelle. "
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Chercher "
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Remplacer par "
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Tout remplacer"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Simple"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr ""
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr ""
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Exp Reg"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+#, fuzzy
+msgid "Lower Case?"
+msgstr "Ignorer la casse"
+
+#: src/cmd_renamere.c:501
+#, fuzzy
+msgid "Upper Case?"
+msgstr "Ignorer la casse"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Ignorer la casse"
+
+#: src/cmd_renamere.c:506
+#, fuzzy
+msgid "Case"
+msgstr "Base"
+
+#: src/cmd_renamere.c:508
+#, fuzzy
+msgid "RenameRE"
+msgstr "Requête de gentoo"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr ""
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr ""
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Base"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Précision"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr ""
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr ""
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr ""
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr ""
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Tout les éléments |Sélectionner|Désélectionner |"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Tous les types|Répertoires seulement|Exclure les répertoires |"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Sélectionner|Désélectionner |Basculer|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Action "
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "A faire sur "
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "Traiter RE avec Glob comme modèle"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Inverser la correspondance RE"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Exige une correspondance sur le nom entier"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Requête de gentoo - RegExp"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "OK|Cancel"
+msgstr "_OK|Annuler"
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "Select using shell command"
+msgstr "Requête de gentoo"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"- Découper -\n"
+"\n"
+"Découper le fichier \"%s\".\n"
+"Sa taille est de %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Découper le fichier \"%s\".\n"
+"Sa taille est de %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Taille de découpe fixée sur"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Taille de segment "
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 octets (3.5\" disquette)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 octets (3.5\" disquette)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 octets (3.5\" disquette)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 octets (3.5\" disquette)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 octets (3.5\" disquette)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr " 100431360 octets (disquette Zip)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Taille de découpe fixée sur"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Taille de segment "
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Taille fixée, nombre variable de parties"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Nombre de parties fixé, tailles variables"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Requête de gentoo"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Format de nom"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Pas"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr ""
+"ATTENTION\n"
+"\n"
+"Le fichier \"%s\" existe déjà!\n"
+"Que désirez-vous faire ?\n"
+" "
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Sélection de la cible pour ce lien"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Contenu "
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Édition lien symbolique"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Créer un lien symbolique"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Hex-Vérifié en premier "
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "sur"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "vrai"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "Oui"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Sortie de %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"Incapable d'exécuter cette commande\n"
+"elle est inconnue ? \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Interne à gentoo (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Définies par utilisateur (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"- Sélection d'une commande -\n"
+"\n"
+"Select a command, or type start\n"
+"of name and press TAB."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Requête de gentoo"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Impossible d'ouvrir le fichier de configuration..."
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Sauver"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"La version du fichier de configuration (%s) ne correspond pas à la version "
+"(%s) du programme."
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Impossible de trouver le fichier de configuration :\n"
+" \"%s\" et \"%s\".\n"
+"Utilise la configuration interne minimale."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|Annuler"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u répertoire(s) %u/%u fichier(s)"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s libre"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s libre"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Revenir en arrière."
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Entrez un chemin et appuyez sur la touche RETURN."
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "H"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr "Afficher ou ne pas afficher les fichiers cachés."
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Bloc"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "BTaille"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Taille de bloc"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Droits d'accès (numérique)"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Droits d'accès (chaîne)"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "Lien"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Nombre de lien"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Numéro d'identité du propriétaire"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Uid"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nom du propriétaire"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Propriétaire"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Gid"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Numéro d'identité du groupe d'appartenance'"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Groupe"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nom du groupe d'appartenance"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Périphérique"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Numéro de périphérique"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DevMaj"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Nombre majeur du périphérique"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DevMin"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Nombre mineur du périphérique"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Date de dernier accès"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Date de dernière modification"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Date de Création"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Nom du Type"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "|"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Impossible %s \"%s\": %s (code %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Impossible %s \"%s\" (code %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Impossible %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Impossible %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr ""
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr ""
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+
+#: src/gentoo.c:479
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+
+#: src/gentoo.c:480
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+
+#: src/gentoo.c:481
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+
+#: src/gentoo.c:482
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:485
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr ""
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s par Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Progression"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Choix d'une icône"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Chargement d'une icône graphique..."
+
+#: src/menus.c:284
+#, fuzzy
+msgid "(No Selection)"
+msgstr "Boutons de "
+
+#: src/menus.c:521
+#, fuzzy
+msgid "RegExp..."
+msgstr "Exp Reg"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Autres"
+
+#: src/menus.c:534
+#, fuzzy
+msgid "Rescan"
+msgstr "Lecture"
+
+#: src/menus.c:535
+#, fuzzy
+msgid "Select"
+msgstr "Boutons de "
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr ""
+
+#: src/menus.c:541
+#, fuzzy
+msgid "Configure..."
+msgstr "Duplicata en cours..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr ""
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_Écraser| Écraser T_out |_Sauter|Sauter _Tout|_Annuler"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Total (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Écoulé %02d:%02d Vitesse %s/s ETA %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Taille formatée, en octets"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Taille formatée, \"Smart\" Unité"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Taille formatée, en octets"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "Oui"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Taille formatée, en kilo-octets"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "Ko"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Taille formatée, en méga-octets"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "Mo"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Taille Formatée, en gigaoctets"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "Go"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Taille formatée, en méga-octets"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "B"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Taille formatée, \"Smart\" Unité"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Sélection d'un Style"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Répertoire"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nouveau Style %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Ligne %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Entrer un numéro de ligne ou un pourcentage :"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Aller"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Entrer le texte de recherche pour (RE)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr ""
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Rechercher"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Configuration de gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Visualiseur de texte"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Position"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Hauteur "
+
+#: src/window.c:203
+msgid "X"
+msgstr "X "
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y "
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Identique aux réglages ci-dessous"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Sauver ces réglages en quittant"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Capturer"
+
+#~ msgid "New Style"
+#~ msgstr "Nouveau Style"
+
+#~ msgid "Before Execution"
+#~ msgstr "Avant exécution"
+
+#~ msgid "After Execution"
+#~ msgstr "Après exécution"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Capturer (courant)"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Activer la boîte de dialogue pour les rapports d'erreurs"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Taille RAW, en octets"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Modifier l'état touche 'Ctrl'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Titre"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Désélectionner "
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Sélectionner "
+
+#~ msgid "Beta Software"
+#~ msgstr "Logiciel en version beta"
+
+#~ msgid "Next Version?"
+#~ msgstr "Version suivante ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Désolé, ce mode de découpe n'a pas\n"
+#~ "encore été implanté."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Le tri sensible à la casse ne travaillera pas correctement avec les "
+#~ "caractères non-ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Le tri insensible à la casse ne travaillera pas correctement avec les "
+#~ "caractères non-ASCII"
+
+#~ msgid "BYTES"
+#~ msgstr "OCTETS"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%u octets"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%u Ko"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%u Mo"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%u Go"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f Ko"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f Mo"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f Go"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Mode numérique"
+
+#~ msgid "Never"
+#~ msgstr "Jamais"
+
+#~ msgid "On Every Access"
+#~ msgstr "A chaque accès"
+
+#~ msgid "Mounting"
+#~ msgstr "Points de montage"
+
+#~ msgid "Mount When?"
+#~ msgstr "Quand les monter ?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Options de montage"
+
+#~ msgid "Mount Command"
+#~ msgstr "Commande de montage "
+
+#~ msgid "Unmount Command"
+#~ msgstr "Commande de démontage "
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Seulement les monter sur les répertoires de haut niveau"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Activer la boîte de dialogue pour les rapports d'erreurs"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Démonter en quittant gentoo"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM : Supporté et actif"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM : Supporté, mais non actif"
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM : Non supporté"
+
+#, fuzzy
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr "%s (%s octets)"
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Erreur d'expression régulière :\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Utiliser mmap() pour un chargement rapide"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu blocs)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "L'exécution de \"%s %s\" à échouée :\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montage \"%s\" sur \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "ancien : %u octets, modifié le %s.\n"
+#~ "Nouveau : %u octets, modifié le %s."
+
+#~ msgid "File reading"
+#~ msgstr "Lecture du fichier"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Sélection d'une fonction"
+
+#~ msgid "Clr"
+#~ msgstr "Clr"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Taille du tampon"
+
+#~ msgid "%Lu bytes"
+#~ msgstr "%Lu octets"
+
+#~ msgid "%Lu KB"
+#~ msgstr "%Lu Ko"
+
+#~ msgid "%Lu MB"
+#~ msgstr "%Lu Mo"
+
+#~ msgid "%Lu GB"
+#~ msgstr "%Lu Go"
+
+#~ msgid "Top"
+#~ msgstr "Haut"
+
+#~ msgid "Bottom"
+#~ msgstr "Bas"
+
+#, fuzzy
+#~ msgid "_Goto..."
+#~ msgstr "Aller à..."
+
+#, fuzzy
+#~ msgid "_Search..."
+#~ msgstr "Rechercher..."
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Boutons de "
+
+#~ msgid "Close"
+#~ msgstr "Fermer"
+
+#~ msgid "Menu"
+#~ msgstr "Menu"
+
+#~ msgid "Skip"
+#~ msgstr "Sauter"
diff --git a/po/gentoo.pot b/po/gentoo.pot
new file mode 100644
index 0000000..874949e
--- /dev/null
+++ b/po/gentoo.pot
@@ -0,0 +1,2557 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.20.7\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; the plan\n"
+"is to provide a lot more flexibility in the button management, and also to support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the Shortcuts\n"
+"were a special feature with their own configuration page (up to and including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr ""
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr ""
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr ""
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr ""
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr ""
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr ""
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr ""
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr ""
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr ""
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr ""
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr ""
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658 src/cfg_controls.c:682
+msgid "Command"
+msgstr ""
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr ""
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr ""
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr ""
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr ""
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr ""
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr ""
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr ""
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr ""
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr ""
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr ""
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr ""
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr ""
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr ""
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr ""
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr ""
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr ""
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr ""
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr ""
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr ""
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr ""
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr ""
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:631
+msgid "First selected, no extension"
+msgstr ""
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr ""
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:638
+msgid "All selected, no extensions"
+msgstr ""
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr ""
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr ""
+
+#: src/cfg_cmdseq.c:644
+msgid "URI of first selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:645
+msgid "URI of first selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:646
+msgid "URI of first selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:647
+msgid "URIs of all selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:648
+msgid "URIs of all selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:649
+msgid "URIs of all selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:650
+msgid "URIs of all selected, unselect, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:651
+msgid "URI of first selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr ""
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr ""
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr ""
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr ""
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr ""
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr ""
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr ""
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr ""
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr ""
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr ""
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr ""
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr ""
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867 src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653 src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670 src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673 src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr ""
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575 src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr ""
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr ""
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575 src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr ""
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr ""
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr ""
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr ""
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr ""
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr ""
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr ""
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr ""
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr ""
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr ""
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr ""
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr ""
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr ""
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr ""
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr ""
+
+#: src/cfg_dirpane.c:337
+msgid "Append \"→ destination\" on Links?"
+msgstr ""
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr ""
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr ""
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr ""
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397 src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409 src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421 src/cfg_dirpane.c:429
+msgid "Format"
+msgstr ""
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr ""
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988 src/cmd_select.c:365
+msgid "Content"
+msgstr ""
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr ""
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr ""
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr ""
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr ""
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr ""
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr ""
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr ""
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr ""
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr ""
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr ""
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr ""
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr ""
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr ""
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr ""
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr ""
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr ""
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr ""
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr ""
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr ""
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr ""
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr ""
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr ""
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr ""
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40 src/dpformat.c:41
+msgid "Mode"
+msgstr ""
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747 src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462 src/textview.c:620
+msgid "Ignore Case?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr ""
+
+#: src/cfg_dirpane.c:1111
+msgid "Starting Directory"
+msgstr ""
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr ""
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr ""
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+msgid "Rubber banding Selection?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr ""
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr ""
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr ""
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr ""
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr ""
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr ""
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr ""
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr ""
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr ""
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr ""
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr ""
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr ""
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid "Click the button below to reset the %zu stored 'Don't show this dialog again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+msgid "Reset All"
+msgstr ""
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+msgid "_Cancel"
+msgstr ""
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr ""
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr ""
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr ""
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr ""
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr ""
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr ""
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr ""
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr ""
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr ""
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr ""
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr ""
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr ""
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr ""
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr ""
+
+#: src/cfg_styles.c:563
+msgid "Select Command ..."
+msgstr ""
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr ""
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr ""
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr ""
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr ""
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr ""
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr ""
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr ""
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr ""
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr ""
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr ""
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr ""
+
+#: src/cfg_styles.c:826
+msgid "Edit Command"
+msgstr ""
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr ""
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr ""
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr ""
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr ""
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr ""
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr ""
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr ""
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr ""
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr ""
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr ""
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr ""
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr ""
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr ""
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr ""
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr ""
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr ""
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr ""
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr ""
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr ""
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr ""
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr ""
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr ""
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr ""
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr ""
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr ""
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr ""
+
+#: src/cfg_windows.c:102
+msgid "Window Borders"
+msgstr ""
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr ""
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr ""
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr ""
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr ""
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr ""
+
+#: src/cmd_about.c:136
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr ""
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr ""
+
+#: src/cmd_about.c:157
+#, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr ""
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr ""
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr ""
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr ""
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr ""
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr ""
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr ""
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr ""
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr ""
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr ""
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr ""
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr ""
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr ""
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr ""
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr ""
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr ""
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr ""
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr ""
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr ""
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr ""
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr ""
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr ""
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr ""
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr ""
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr ""
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr ""
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr ""
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr ""
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr ""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr ""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr ""
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr ""
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr ""
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr ""
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr ""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr ""
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr ""
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr ""
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr ""
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr ""
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr ""
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr ""
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr ""
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr ""
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr ""
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr ""
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr ""
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid "The <tt>DpFocus</tt> command has been deprecated and is no longer supported. Please remove any keyboard or mouse bindings that use it and look into using the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr ""
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr ""
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr ""
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr ""
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr ""
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#: src/cmd_info.c:74
+#, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr ""
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr ""
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr ""
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr ""
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr ""
+
+#: src/cmd_info.c:237
+#, c-format
+msgid "%s (%s bytes)"
+msgstr ""
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr ""
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr ""
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr ""
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr ""
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr ""
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr ""
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr ""
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr ""
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr ""
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr ""
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr ""
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr ""
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr ""
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr ""
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr ""
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+
+#: src/cmd_join.c:213
+#, c-format
+msgid "The total size is %s (%s)."
+msgstr ""
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr ""
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr ""
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr ""
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr ""
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr ""
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr ""
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr ""
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr ""
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr ""
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr ""
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr ""
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr ""
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr ""
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr ""
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr ""
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr ""
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr ""
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr ""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226 src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr ""
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr ""
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr ""
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr ""
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr ""
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr ""
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr ""
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr ""
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr ""
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr ""
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr ""
+
+#: src/cmd_renamere.c:503
+msgid "Upper Case Initial?"
+msgstr ""
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr ""
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr ""
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr ""
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr ""
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr ""
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr ""
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr ""
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr ""
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr ""
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr ""
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr ""
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr ""
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr ""
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr ""
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr ""
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr ""
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr ""
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr ""
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr ""
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr ""
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr ""
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr ""
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr ""
+
+#: src/cmd_split.c:432
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr ""
+
+#: src/cmd_split.c:433
+msgid "10485760 bytes (10 MB)"
+msgstr ""
+
+#: src/cmd_split.c:434
+msgid "26214400 bytes (25 MB)"
+msgstr ""
+
+#: src/cmd_split.c:435
+msgid "52428800 bytes (50 MB)"
+msgstr ""
+
+#: src/cmd_split.c:436
+msgid "78643200 bytes (75 MB)"
+msgstr ""
+
+#: src/cmd_split.c:437
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr ""
+
+#: src/cmd_split.c:459
+msgid "Fixed Count Split"
+msgstr ""
+
+#: src/cmd_split.c:462
+msgid "Segment Count"
+msgstr ""
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr ""
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr ""
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr ""
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr ""
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr ""
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr ""
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59 src/progress.c:224
+msgid "Cancel"
+msgstr ""
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275 src/nag_dialog.c:38
+msgid "OK"
+msgstr ""
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr ""
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr ""
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr ""
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr ""
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr ""
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr ""
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr ""
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr ""
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr ""
+
+#: src/cmdseq_dialog.c:239
+msgid "Select a command, or type part of its name."
+msgstr ""
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr ""
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr ""
+
+#: src/configure.c:278
+msgid "Save"
+msgstr ""
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+
+#: src/configure.c:574
+#, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr ""
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr ""
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, c-format
+msgid ", %s (%s) used"
+msgstr ""
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ""
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr ""
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr ""
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr ""
+
+#: src/dirpane.c:2088
+msgid "Click to enable/disable Hide rule (When pressed in, the hide rule is active, and matching entries are hidden)"
+msgstr ""
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr ""
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr ""
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr ""
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr ""
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr ""
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr ""
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr ""
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr ""
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr ""
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr ""
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr ""
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr ""
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr ""
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr ""
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr ""
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr ""
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr ""
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr ""
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr ""
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr ""
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr ""
+
+#: src/dpformat.c:50
+msgid "Time of Last Access"
+msgstr ""
+
+#: src/dpformat.c:51
+msgid "Time of Last Modification"
+msgstr ""
+
+#: src/dpformat.c:52
+msgid "Time of Creation"
+msgstr ""
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr ""
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr ""
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr ""
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr ""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr ""
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr ""
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr ""
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+
+#: src/gentoo.c:479
+msgid "Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use default values"
+msgstr ""
+
+#: src/gentoo.c:480
+msgid "Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use system defaults"
+msgstr ""
+
+#: src/gentoo.c:481
+msgid "Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty history"
+msgstr ""
+
+#: src/gentoo.c:482
+msgid "Run COMMAND, a gentoo command. Done before user interaction allowed, but after configuration file has been read in. Can be used many times to run several commands in sequence"
+msgstr ""
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+msgid "Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:485
+msgid "Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr ""
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr ""
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr ""
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr ""
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr ""
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr ""
+
+#: src/menus.c:533
+msgid "Other"
+msgstr ""
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr ""
+
+#: src/menus.c:535
+msgid "Select"
+msgstr ""
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr ""
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr ""
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr ""
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr ""
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr ""
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr ""
+
+#: src/sizeutil.c:31
+msgid "Unformatted Size"
+msgstr ""
+
+#: src/sizeutil.c:32
+msgid "Formatted Size, Without Unit"
+msgstr ""
+
+#: src/sizeutil.c:33
+msgid "Formatted Size, in Bytes"
+msgstr ""
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+msgid "bytes"
+msgstr ""
+
+#: src/sizeutil.c:34
+msgid "Formatted Size, in Kilobytes"
+msgstr ""
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr ""
+
+#: src/sizeutil.c:35
+msgid "Formatted Size, in Megabytes"
+msgstr ""
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr ""
+
+#: src/sizeutil.c:36
+msgid "Formatted Size, in Gigabytes"
+msgstr ""
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr ""
+
+#: src/sizeutil.c:37
+msgid "Formatted Size, in Terabytes"
+msgstr ""
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr ""
+
+#: src/sizeutil.c:38
+msgid "Formatted Size, Automatic Unit"
+msgstr ""
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr ""
+
+#: src/styles.c:114
+msgid "Root"
+msgstr ""
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr ""
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr ""
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr ""
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr ""
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr ""
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr ""
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr ""
+
+#: src/textview.c:629
+msgid "Search"
+msgstr ""
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr ""
+
+#: src/types.c:572
+#, c-format
+msgid "Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr ""
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr ""
+
+#: src/window.c:202
+msgid "Position"
+msgstr ""
+
+#: src/window.c:203
+msgid "Height"
+msgstr ""
+
+#: src/window.c:203
+msgid "X"
+msgstr ""
+
+#: src/window.c:203
+msgid "Y"
+msgstr ""
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr ""
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr ""
+
+#: src/window.c:249
+msgid "Grab"
+msgstr ""
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644
index 0000000..b26de01
--- /dev/null
+++ b/po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/it.gmo b/po/it.gmo
new file mode 100644
index 0000000..8945e44
--- /dev/null
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..6f1fe22
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,3044 @@
+# Italian translations for gentoo package.
+# Copyright (C) 2002-2004 Emil Brink.
+# This file is distributed under the same license as the gentoo package.
+# Francesco Cosoleto <cosoleto@free.fr>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2004-06-18 12:00+0100\n"
+"Last-Translator: Francesco Cosoleto <cosoleto@free.fr>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "A sinistra del pannello comandi"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "A destra del pannello comandi"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Nessuna spaziatura"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Ridimensionabile"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Con spaziatura"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Questa pagina permette di controllare come posizionare il pannello delle "
+"scorciatoie\n"
+"rispetto al pannello comandi principale. È pressocché un segnaposto, dato "
+"che il piano\n"
+"è quello di fornire una maggiore flessibilità nella gestione dei pulsanti e "
+"anche di\n"
+"consentire la creazione di altri pannelli oltre ai due già incorporati. Ma "
+"questo\n"
+"deve ancora accadere.\n"
+"\n"
+"Nel frattempo vengono fornite le funzionalità presenti quando le scorciatoie "
+"erano una\n"
+"caratteristica speciale con la loro pagina di configurazione (inclusa fino "
+"alla versione\n"
+"0.11.24 di gentoo), per comodità dell'utente.\n"
+"\n"
+"Per trovare il pannello delle scorciatoie, passare alla pagina delle "
+"definizioni e usare\n"
+"il menù delle opzioni nell'angolo in alto a sinistra."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Posizione pannello delle scorciatoie"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Stile di separazione"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Disposizione"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Imposta ampiezza"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Predefinito"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Conferma"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Cancellare veramente questa fila di pulsanti?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Cancella|_Annulla"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Selezionare ampiezza per la nuova fila"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Cambiare ampiezza della fila"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Modifica colore di sfondo"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Modifica colore di primo piano"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etichetta"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Comando"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Tasto"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Colori"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Sfondo..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Reimposta a predefinito"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Primo piano..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Scorciatoie"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Libera"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Copia colori a..."
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Copia a..."
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Scambia con..."
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Aggiungi riga..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Cancella riga"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Sotto"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ampiezza..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Su"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Foglio"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Primario"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Secondario"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Suggerimento"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Parametri"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Stringere?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Con suggerimento?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Pulsanti"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definizioni"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Opzioni"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Selezione comandi interni"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Graffa di apertura"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Graffa di chiusura"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Primo selezionato"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Primo selezionato, deseleziona"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Primo selezionato, con percorso"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Primo selezionato, con percorso, deseleziona"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Primo selezionato (pannello di destinazione)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Primo selezionato, senza virgolette"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Primo selezionato, senza virgolette"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Tutta la selezione"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Tutta la selezione, deseleziona"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Tutta la selezione, con percorsi"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Tutta la selezione, con percorsi, deseleziona"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Tutta la selezione (pannello di destinazione)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Tutta la selezione, senza virgolette"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Tutta la selezione, senza virgolette"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Percorso della directory del pannello sorgente"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Percorso della directory del pannello di destinazione"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Percorso della directory home"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Percorso del pannello sinistro"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Percorso del pannello destro"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Primo selezionato"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Primo selezionato, deseleziona"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Primo selezionato, senza virgolette"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Tutta la selezione"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Tutta la selezione, deseleziona"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Tutta la selezione, senza virgolette"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Tutta la selezione, senza virgolette"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Primo selezionato (pannello di destinazione)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Inserisce un combo box"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Per l'immissione tramite menù"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Per l'immissione di una stringa"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Inserisce un pulsante di verifica (che emette TRUE o FALSE)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Aggiunge il titolo alla finestra d'immissione"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Aggiunge una barra di separazione alla finestra d'immissione"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NOME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Valore di $NOME (variabile d'ambiente)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID di gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Directory home dell'utente NOME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NOME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Selezione codice"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Nessuna opzione disponibile)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Esegui in background?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Sopprimi l'istanza precedente?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Si deve tenere in vita all'uscita?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Cattura i dati uscenti?"
+
+#: src/cfg_cmdseq.c:912
+#, fuzzy
+msgid "Require Source Selection?"
+msgstr "Richiede protezione"
+
+#: src/cfg_cmdseq.c:916
+#, fuzzy
+msgid "Require Destination Selection?"
+msgstr "Richiede protezione"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "CD sorgente?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "CD destinazione?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Riesamina sorgente?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Riesamina destinazione?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "Generale"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "Prima & Dopo"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Interno"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Esterno"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Aggiungi riga"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplica"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nome"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definizione"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Ripetere la sequenza finché vi sono selezioni?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Aggiungi"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Cancella"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Comandi"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Sinistra"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Medio"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Destra"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Ruota verso il basso"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Ruota verso l'alto"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Uno o più di questi modificatori di\n"
+"tasto devono essere tenuti premuti\n"
+"quando il pulsante del mouse è\n"
+"cliccato per l'avvio del comando"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Cambia modificatori"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Controlli"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Scorciatoie di tastiera generali"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "I pulsanti del mouse sui pannelli delle directory"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Pulsante"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Cambia modificatori..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Manovra Click-M-Click"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Limite temporale"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ignorare «Bloc Num» per le associazioni di tastiera?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Nota: Le impostazioni per il controllo dei\n"
+"pulsanti del mouse presentano ambiguità: la\n"
+"stessa combinazione pulsante+modificatore\n"
+"è usata per più di una funzione. Questo\n"
+"potrebbe rendere il loro comportamento\n"
+"particolarmente bizzarro..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Attenzione"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Apporre carattere tipo?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Apporre \"-> destinazione\" sui collegamenti?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Porre un separatore ogni tre cifre?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Cifre di precisione"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Mostra la dimensione relativa al file system delle directory?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Formato"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "Impostazione '%s'"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Contenuto"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Giustificazione"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Titolo"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ampiezza"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centro"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Impostazioni base"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Modifica contenuto colonna"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Titolo predefinito"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Le directory prima"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Le directory per ultime"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Le directory mischiate"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "A sinistra dell'elenco"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "A destra dell'elenco"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Predefinito del sistema"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Copia da %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Copia a %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Scambia con %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Colonne"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Tipi di contenuto disponibili"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Tipi di contenuto selezionati"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Modifica..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Ordinamento"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Ordine per"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Modo"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Ordinamento invertito?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Maiuscole come minuscole?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Directory predefinita"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Crea directory"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Quella di adesso"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Dalla cronologia"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Il percorso posto in alto?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Abilita nascondimento?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Barra di scorrimento fissa?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "Richiede protezione"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Posizione barra di scorrimento"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Orizzontale"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Verticale"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Non tracciare"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Proporzione"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Dimensione, pannello sinistro"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Dimensione, pannello destro"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientamento pannelli"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Tracciamento della divisione"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "pixel"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Ricorda le righe selezionate?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Salva gli elenchi della cronologia?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Pannelli"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Divisione"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Cronologia"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Errori"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Emettere un beep in caso di errore?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menù"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Reimposta a predefinito"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Annulla"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Icone"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Inizianti con un punto"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Corrispondenti all'espressione regolare"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Nulla"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Percorsi e nascondimenti"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Percorsi"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Quali voci nascondere"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Niente)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Cancella azione"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Modifica colore"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Ritorna al comando ereditato"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Selezionare comando"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Nuova proprietà d'azione"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "qualcosa"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Cancellando questo stile si elimineranno anche\n"
+"tutti i suoi discendenti. Si è sicuri?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Conferma cancellazione"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Colore sfondo"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Colore primo piano"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Icona"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "Stile del testo della riga"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Anteprima"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Sostituisci l'ascendente?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Scelta..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Aggiungi azione..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Comando"
+
+# n.d.T: "Parent" -> "Directory precedente", "Precedente",
+# ossia tradotto nello stile Amiga.
+#
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Precedente"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Ereditamento proprietà"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visive"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "D'azione"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Riconoscimento file"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Stili"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Un clic per cambiare..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nuovo tipo)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "Device a blocchi"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "Device a caratteri"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Dir"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "File"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Collegamento"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Socket"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Leggibile"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "SetGID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "SetUID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Eseguibile"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Scrivibile"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Corrispondenti con \"file\" (RE)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Corrispondenti con il nome (RE)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Richiede suffisso"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identificazione"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Richiede tipo"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Richiede protezione"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr ""
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Stile del tipo"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Stile"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Tipi"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "La finestra di dialogo si pone al centro dello schermo"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "La finestra di dialogo segue il mouse"
+
+#: src/cfg_windows.c:86
+#, fuzzy
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "La finestra di dialogo segue il mouse"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Finestre"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Finestre"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Posizionamento dialogo"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Esecuzione di \"%s\" fallita"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Errore"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr ""
+"Non si è potuto terminare il processo figlio \"%s\" (pid=%d)--avviso zombie"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Versione %s (GTK+ versione %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2004 di Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Questo è software libero e privo ASSOLUTAMENTE DI\n"
+"OGNI GARANZIA. Leggere il file COPYING per dettagli.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Attivo, versione italiana di Francesco Cosoleto."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"L'autore di gentoo può essere contattato via Internet\n"
+"all'e-mail <emil@obsession.se>, in questo modo potete\n"
+"informarlo con le proprie considerazioni sul presente\n"
+"software, segnalare bug, suggerimenti o altro.\n"
+"\n"
+"Widget personalizzato di J. Hanson <johan@tiq.com>.\n"
+"\n"
+"L'ultima versione di gentoo può sempre essere prele-\n"
+"vata dall'home page ufficiale del progetto all'indirizzo\n"
+"<http://www.obsession.se/gentoo/>. Le nuove versioni sono\n"
+"solitamente annunciate su Freshmeat, il cui indirizzo è\n"
+"<http://freshmeat.net/>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Informazioni su gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Di più fra poco)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Imposta bit di protezione per \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Gruppo"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Altri"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Proprietario"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Speciale"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Esecuzione"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Lettura"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Set GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Set UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Scrittura"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bit di protezione"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, Ottale"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Tutti"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Inversione"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Precedente"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Addentrarsi nelle directory?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Non toccare le directory?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Cambia permessi"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Imposta la proprietà per \"%s\":"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Utente"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Cambia proprietà"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Salvataggio automatico in uscita delle modifiche alla configurazione?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" esiste già. Proseguire con la copia?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Copia in corso..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Mantieni le date originali nella copia?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr "Ignora la mancata copia degli attributi (data, proprietario, modo)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Non riuscendo, lasciar stare la destinazione se è completa?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Grandezza buffer"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Inserire nome per la copia di \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Inserire nome per il clone di \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" esiste già. Continuare con la clonazione?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Clonazione..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Copia con nome..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Inserire il nome con il quale collegare \"%s\""
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Inserire il nome per il collegamento clone di \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" esiste già. Proseguire con il collegamento simbolico?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Copia con nome"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Clona"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Collega simbolicamente con nome"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Clone di collegamento simbolico"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"non si è potuto eliminare per via di restrizioni nell'accesso.\n"
+"Si riprova cambiando la protezione?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Ricorda la risposta (altera la configurazione)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Problema di accesso"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Cambia|Lascia stare"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "Veramente cancellare \"%s\"?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Cancellazione..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "In caso di problemi d'accesso"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Chiedi all'utente|Autonomamente prova a cambiare, e ritenta|Annulla"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "Ricerca I."
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK|_Tutti|_Salta|_Annulla"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|_Salta|_Annulla"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Ottenimento delle dimensioni..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Deselezione delle righe dopo l'esecuzione?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s usati"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u dir, %u file, %u symlink"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Collegamento a"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Tipo"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Posizione"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Dimensione"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu byte"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Contiene"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Informazioni di \"file\""
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Ultimo accesso"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modificato"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Cambiato"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Creato"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Base"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Raccolta delle informazioni..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Mostra i dati di uscita di \"file\"?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Formato della data di accesso"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Formato della data di modifica"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Formato della data di cambiamento"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Segno marcatore della dimensione"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" esiste già. Proseguire con l'unione?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Unione..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Cliccare e trascinare i file da riordinare, quindi cliccare «Unisci»"
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "La dimensione totale è %s (%lu byte)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "La dimensione totale è %lu byte."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Inserire nome del file di destinazione"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Unione"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Unisci|_Annulla"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" esiste già. Proseguire con mkdir?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Inserire il nome della directory da creare"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Crea directory"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Portarsi nella nuova directory?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Il focus sulla nuova directory?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" esiste già. Continuare con lo spostamento?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Spostamento..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Inserire il nome con il quale spostare \"%s\""
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Spostamento con nome..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Sposta con nome"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Possono esserci dei cambiamenti nella configurazione non salvati\n"
+"Uscire senza salvare comporterà la loro perdita. Uscire veramente?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Conferma uscita"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Esci|_Salva, poi esci|_Annulla"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Si è sicuri di voler uscire?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Inserisci nuovo nome per \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" esiste già. Proseguire nel rinominare?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Rinomina"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Cerca una sottostringa in tutti i nomi di file\n"
+"e la sostituisce con un'altra."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Sostituisci"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Con"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Sostituisci tutti?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Semplice"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Esegue l'espressione regolare immessa in \"Da\" su\n"
+"ogni nome di file, serbando le corrispondenze di\n"
+"sottoespressione poste in parentesi, per poi sostituire\n"
+"ogni occorrenza di $n immessa in \"A\", dove n è\n"
+"l'indice (iniziante da 1) per una sottoespressione, con\n"
+"il testo che occorre. Quindi impiega il risultato come\n"
+"un nuovo nome di file."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Da"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "A"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Reg Exp"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+#, fuzzy
+msgid "Lower Case?"
+msgstr "Maiuscole come minuscole?"
+
+#: src/cmd_renamere.c:501
+#, fuzzy
+msgid "Upper Case?"
+msgstr "Maiuscole come minuscole?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Maiuscole come minuscole?"
+
+#: src/cmd_renamere.c:506
+#, fuzzy
+msgid "Case"
+msgstr "Base"
+
+#: src/cmd_renamere.c:508
+#, fuzzy
+msgid "RenameRE"
+msgstr "Rinomina"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, Decimale"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, Esadec. (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, Esadec. (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, Ottale"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Il comando rinomina tutti i file selezionati\n"
+"in una sequenza numerata. I controlli\n"
+"presenti permettono di definire come i nomi\n"
+"sono composti."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Inizio da"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Base"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precisione"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Testa"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Coda"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Ipotesi"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Rinomina sequenziale"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Tutte le righe|Parte selezionata|Parte deselezionata|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Tutti i tipi|Solo le directory|Solo non-directory|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Seleziona|Deseleziona|Inverti"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Azione"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Serie"
+
+#: src/cmd_select.c:453
+#, fuzzy
+msgid "Treat RE as Glob Pattern?"
+msgstr "Considera RE come un modello di glob?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Inversione della corrispondenza?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Richiesta la corrispondenza sull'intero nome?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Selezione con RE"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "OK|Cancel"
+msgstr "_OK|_Annulla"
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "Select using shell command"
+msgstr "Selezionare comando"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Suddivisione di \"%s\".\n"
+"Il file è di %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Suddivisione di \"%s\".\n"
+"Il file è di %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" esiste già. Continuare con la suddivisione?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Dimensione della suddivisione fissa"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Dimensione segmento"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 byte (3.5\" floppy)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 byte (3.5\" floppy)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 byte (3.5\" floppy)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 byte (3.5\" floppy)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 byte (3.5\" floppy)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 byte (Disco Zip)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Dimensione della suddivisione fissa"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Dimensione segmento"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Dimensione fissa, numero di parti variabile"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Numero di parti fisso, dimensioni variabili"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Suddivisione"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Formato del nome"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Passo"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" esiste già. Continuare con il collegamento?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Annulla"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Seleziona la destinazione del collegamento"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Contenuto"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Modifica collegamento simbolico"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Crea collegamento simbolico"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Controllo esadecimale per i primi"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "aperto"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "vero"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "sì"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Uscita di %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"Impossibile eseguire il comando\n"
+"non riconosciuto \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Interni (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Utente (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Selezionare un comando, o digitare\n"
+"l'inizio del suo nome e premere TAB."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Selezionare comando"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Non si è potuto aprire il file di configurazione per scriverlo"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Salva"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"La versione del file di configurazione (%s) non corrisponde con la versione "
+"del programma (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Non si è potuto trovare file di configurazione; è\n"
+"stato controllato in \"%s\" e in \"%s\".\n"
+"In uso la configurazione minima interna."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|_Annulla"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u dir, %u/%u file"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s usati"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s liberi"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Sale alla directory precedente"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Inserire il percorso, quindi premere «Invio»"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "N"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Un clic abilita/disabilita le regole per il nascondimento dei file. Premuto, "
+"renderà effettive le regole e le voci che le seguono non saranno visibili."
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Blocchi"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Dim. Blocco"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Grandezza blocco"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Permessi, formato numerico"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Permessi, formato testo"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "N° colleg."
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Numero di collegamenti"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "ID proprietario"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "ID utente"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nome proprietario"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Utente"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "ID gruppo"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "ID gruppo"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Gruppo"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nome gruppo"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Dispositivo"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Numero dispositivo"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DevMag"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Numero dispositivo, maggiore"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DevMin"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Numero dispositivo, minore"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Data dell'ultimo accesso"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Data dell'ultima modifica"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Data di creazione"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Nome tipo"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "I"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Non riuscito %s \"%s\": %s (codice %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Non riuscito %s \"%s\" (codice %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Non riuscito %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Non riuscito %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "Indica la versione allo standard output, poi esce."
+
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "Indica la versione allo standard output, poi esce."
+
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"Consente a gentoo di essere eseguito dall'utente root. Può essere pericoloso."
+
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Non carica ~/.gentoorc, il file di configurazione, per usare i valori "
+"predefiniti."
+
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Non carica ~/.gentoogtkrc, file di configurazione GTK+, usa le impostazioni "
+"di sistema"
+
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Non carica ~/.gentoorc, il file di configurazione, per usare i valori "
+"predefiniti."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Esegue ARG come un comando di gentoo. Viene eseguito prima di lasciare "
+"l'interazione all'utente, ma dopo aver letto il file di configurazione. Può "
+"essere usato più volte per eseguire più comandi in sequenza."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Usa ARG come percorso per il pannello sinistro. Non considererà altre "
+"impostazioni."
+
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Usa ARG come percorso per il pannello destro. Non considererà altre "
+"impostazioni."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Per eseguire come root, richiamare con l'opzione '--root-ok'\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Non si è potuto inizializzare il modulo userinfo - la risoluzione del nome "
+"utente non funzionerà"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s di Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Progressione"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Scelta dell'icona"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Caricamento icone..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(Nessuna selezione)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "RegExp..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Opposto"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Riesamina"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Seleziona"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Esegui..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Configura..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Selezione menù"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_OK|_Tutti|_Salta|Salta t_utti|_Annulla"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Totale (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Trascorso %02d:%02d Velocità %s/s ETA %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Dimensione impaginata, in byte"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Dimensione impaginata, in unità variabili"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Dimensione impaginata, in byte"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "sì"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Dimensione impaginata, in kilobyte"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "Kb"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Dimensione impaginata, in megabyte"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "Mb"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Dimensione impaginata, in gigabyte"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "Gb"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Dimensione impaginata, in megabyte"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "b"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Dimensione impaginata, in unità variabili"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Selezione stile"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Radice"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Directory"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nuovo stile %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Linea %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Inserire numero di linea o percentuale:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Vai a"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Inserire il testo da cercare (RE)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Non estendersi sulle linee?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Cerca"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Configurazione gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Visualizzatore testo"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Posizione"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Altezza"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Impostare all'apertura?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Aggiornare alla chiusura?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Preleva"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr ""
+#~ "Il modulo XML ha emesso un numero reale dipendente dalla localizzazione"
+
+#~ msgid "New Style"
+#~ msgstr "Nuovo stile"
+
+#~ msgid "Before Execution"
+#~ msgstr "Prima dell'esecuzione"
+
+#~ msgid "After Execution"
+#~ msgstr "Dopo l'esecuzione"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Considera la riga con il focus come selezione se non ve n'è una effettiva?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Sposta il focus all'ultima riga selezionata/deselezionata?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Quella di adesso"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Finestre di dialogo per la segnalazione di errori?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Clic con il pulsante destro sul percorso"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Dimensione non impaginata, in byte"
+
+#~ msgid "Always Set"
+#~ msgstr "Sempre impostato"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Altera lo stato del tasto «Control»"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Titolo del pannello quando attivo"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Riga con focus, non selezionata"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Riga con focus, selezionata"
+
+#~ msgid "Beta Software"
+#~ msgstr "Software in sviluppo"
+
+#~ msgid "Next Version?"
+#~ msgstr "Prossima versione?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Questa modalità di suddivisione non\n"
+#~ "è ancora stata implementata... Spiacenti."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "L'ordinamento non funzionerà pienamente con caratteri non-ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "L'ordinamento non funzionerà pienamente con caratteri non-ASCII"
+
+#~ msgid "BYTES"
+#~ msgstr "BYTE"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu byte"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu Kb"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu Mb"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu Gb"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f Kb"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f Mb"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f Gb"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Stile numerico?"
+
+#~ msgid "Never"
+#~ msgstr "Mai"
+
+#~ msgid "On Every Access"
+#~ msgstr "Su ogni accesso"
+
+#~ msgid "Mounting"
+#~ msgstr "Montaggio"
+
+#~ msgid "Mount When?"
+#~ msgstr "Quando montare?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Opzioni per montare"
+
+#~ msgid "Mount Command"
+#~ msgstr "Per montare, comando "
+
+#~ msgid "Unmount Command"
+#~ msgstr "Per smontare, comando "
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Monta soltanto in directory vuote?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Finestra di dialogo per gli errori?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Smonta quando gentoo termina?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Disponibile e attivo."
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Disponibile, ma non attivo."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Non disponibile"
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Non si può copiare la directory \"%s\"\n"
+#~ "in \"%s\":\n"
+#~ "la sorgente contiene la destinazione."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr ""
+#~ "In cima e in fondo all'elenco, consentire il movimento all'altra "
+#~ "estremità?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s byte,\n"
+#~ "%s blocchi)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Non si può copiare la directory \"%s\"\n"
+#~ "in \"%s\":\n"
+#~ "la sorgente contiene la destinazione."
+
+#, fuzzy
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Non si può copiare la directory \"%s\"\n"
+#~ "in \"%s\":\n"
+#~ "la sorgente contiene la destinazione."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Errore nell'espressione regolare:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Uso di mmap() per velocizzare il caricamento?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu blocchi)"
+
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Non impiega FAM per il rilevamento automatico dei cambiamenti nelle "
+#~ "directory visualizzate."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Non si è potuto inizializzare i dati per mount - il montaggio automatico "
+#~ "non funzionerà"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Apertura di FAM fallita, errore %d--FAM non sarà usato"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Non si è potuto aggiungere il monitor FAM su \"%s\", errore %s (riesegui "
+#~ "con --no-fam per ovviare, forse"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Non si è potuto aggiungere il monitor FAM su \"%s\", errore %s (riesegui "
+#~ "con --no-fam per ovviare, forse"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Esecuzione di \"%s %s\" fallita:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montaggio di \"%s\" su \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Vecchio: %Lu byte, cambiato il %s.\n"
+#~ "Nuovo: %Lu byte, cambiato il %s."
+
+#~ msgid "File reading"
+#~ msgstr "Lettura file"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Selezione codice"
+
+#~ msgid "Clr"
+#~ msgstr "Cancella"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Grandezza buffer"
+
+#~ msgid "Top"
+#~ msgstr "Inizio"
+
+#~ msgid "Bottom"
+#~ msgstr "Fine"
+
+#~ msgid "_Goto..."
+#~ msgstr "_Vai a..."
+
+#~ msgid "_Search..."
+#~ msgstr "_Cerca..."
+
+#~ msgid "_Quit"
+#~ msgstr "_Esci"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Seleziona"
+
+#~ msgid "Unnamed"
+#~ msgstr "Senza_nome"
+
+#~ msgid "Unnamed_%d"
+#~ msgstr "Senza_nome_%d"
+
+#~ msgid ""
+#~ "**Notice: Reference to obsolete command '%s' replaced by '%s' in %s\n"
+#~ msgstr "**Avviso: il comando obsoleto \"%s\" è sostituito da \"%s\" in %s\n"
diff --git a/po/ja_JP.UTF-8.gmo b/po/ja_JP.UTF-8.gmo
new file mode 100644
index 0000000..2b4c63e
--- /dev/null
+++ b/po/ja_JP.UTF-8.gmo
Binary files differ
diff --git a/po/ja_JP.UTF-8.po b/po/ja_JP.UTF-8.po
new file mode 100644
index 0000000..f7853b3
--- /dev/null
+++ b/po/ja_JP.UTF-8.po
@@ -0,0 +1,2731 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Emil Brink
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.50\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2004-12-23 20:09+0900\n"
+"Last-Translator: Tadashi Jokagi <elf@elf.no-ip.org>\n"
+"Language-Team: Japanese <LL@li.org>\n"
+"Language: ja_JP.UTF-8\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr ""
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "レイアウト"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr ""
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "デフォルト"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "確èªã—ã¦ãã ã•ã„"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr ""
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "削除(_D)|å–り消ã—(_D)"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr ""
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr ""
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "背景色編集"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "å‰é¢è‰²ç·¨é›†"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "ラベル"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "コマンド"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "キー"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "色"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "背景色..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "デフォルトã«ãƒªã‚»ãƒƒãƒˆ"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "å‰é¢è‰²..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "ショートカット"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "消去"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr ""
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr ""
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr ""
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr ""
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "シート"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr ""
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr ""
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ツールãƒãƒƒãƒ—"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "フラグ"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr ""
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr ""
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "ボタン"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr ""
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "オプション"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr ""
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr ""
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr ""
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr ""
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:631
+msgid "First selected, no extension"
+msgstr ""
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr ""
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:638
+msgid "All selected, no extensions"
+msgstr ""
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr ""
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "左パãƒãƒ«ã®ãƒ‘ス"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "å³ãƒ‘ãƒãƒ«ã®ãƒ‘ス"
+
+#: src/cfg_cmdseq.c:644
+msgid "URI of first selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:645
+msgid "URI of first selected, unselect"
+msgstr ""
+
+#: src/cfg_cmdseq.c:646
+msgid "URI of first selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:647
+msgid "URIs of all selected"
+msgstr ""
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "ã™ã¹ã¦ã®è¡Œ|é¸æŠžæ¸ˆã¿|未é¸æŠž|"
+
+#: src/cfg_cmdseq.c:649
+msgid "URIs of all selected, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:650
+msgid "URIs of all selected, unselect, no quotes"
+msgstr ""
+
+#: src/cfg_cmdseq.c:651
+msgid "URI of first selected (destination pane)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "入力コンボボックス"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr ""
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "文字列入力"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr ""
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr ""
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr ""
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr ""
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr ""
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr ""
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "一般"
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr ""
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "組ã¿è¾¼ã¿"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr ""
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr ""
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "複製"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "åå‰"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr ""
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "追加"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "削除"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "コマンド"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "å·¦"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "中央"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "å³"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "ホイールダウン"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "ホイールアップ"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr ""
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr ""
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "一般キーボードショートカット"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr ""
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "ボタン"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr ""
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr ""
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "時間制é™"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr ""
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "警告"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr ""
+
+#: src/cfg_dirpane.c:337
+msgid "Append \"→ destination\" on Links?"
+msgstr ""
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr ""
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr ""
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr ""
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr ""
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s 設定"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr ""
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr ""
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "タイトル"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "å¹…"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "中央"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "基本設定"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr ""
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "デフォルトタイトル"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr ""
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr ""
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr ""
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "一覧ã®å·¦"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "ä½ç½®ã‚‰ã®ã®å³"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "システムデフォルト"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "%s ã‹ã‚‰ã‚³ãƒ”ー"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "%s ã¸ã‚³ãƒ”ー"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "%s ã¨å…¥ã‚Œæ›¿ãˆ"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr ""
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "利用å¯èƒ½ãªã‚³ãƒ³ãƒ†ãƒ³ãƒˆã‚¿ã‚¤ãƒ—"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr ""
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "編集..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "削除"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr ""
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr ""
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "モード"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "逆ソートã—ã¾ã™ã‹?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "英大å°æ–‡å­—ã‚’åŒä¸€è¦–?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "デフォルトディレクトリ"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "ディレクトリ作æˆ"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr ""
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "履歴ã‹ã‚‰"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+msgid "Rubber banding Selection?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "スクロールãƒãƒ¼ä½ç½®"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "æ°´å¹³"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "åž‚ç›´"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr ""
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "左ペインサイズ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "å³ãƒšã‚¤ãƒ³ã‚µã‚¤ã‚º"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr ""
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr ""
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "ピクセル"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "履歴一覧をä¿å­˜ã—ã¾ã™ã‹?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr ""
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "ペイン分割"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "履歴"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "エラー"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr ""
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "メニュー"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "デフォルトã«ãƒªã‚»ãƒƒãƒˆ"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "å–り消ã—"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "アイコン"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr ""
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ドット(.)ã§å§‹ã¾ã‚‹"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr ""
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "ãªã—"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr ""
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "パス"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr ""
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "エントリを隠ã™"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "削除æ“作"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "カラー編集"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr ""
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "コマンドé¸æŠž"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "æ–°è¦æ“作プロパティ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr ""
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "削除確èª"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "背景色"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "å‰é¢è‰²"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "アイコン"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr ""
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "プレビュー"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr ""
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr ""
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "æ“作追加..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "コマンド"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "親"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr ""
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "ビジュアル"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "æ“作"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr ""
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "スタイル"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr ""
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(æ–°è¦ã‚¿ã‚¤ãƒ—)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "ブロックデãƒã‚¤ã‚¹"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "キャラクタデãƒã‚¤ã‚¹"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "ディレクトリ"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "ファイル"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "リンク"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "ソケット"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "読ã¿è¾¼ã¿å¯èƒ½"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "GID 設定"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "UID 設定"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "スティッキー"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "実行å¯èƒ½"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "書ãè¾¼ã¿å¯èƒ½"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr ""
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr ""
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr ""
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr ""
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr ""
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr ""
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr ""
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr ""
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "スタイル"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "種類"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "ダイアログウィンドウã¯ç”»é¢ã®ä¸­å¤®"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr ""
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr ""
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr ""
+
+#: src/cfg_windows.c:102
+msgid "Window Borders"
+msgstr ""
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "ダイアログä½ç½®"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "\"%s\" ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "エラー"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr ""
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s (GTK+ ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d.%d.%d)"
+
+#: src/cmd_about.c:136
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr ""
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr ""
+
+#: src/cmd_about.c:157
+#, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "gentoo ã«ã¤ã„ã¦"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr ""
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr ""
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "グループ"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr ""
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "所有者"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "スペシャル"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "実行"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "読ã¿è¾¼ã¿"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "GID 設定"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "UID 設定"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "書ãè¾¼ã¿"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr ""
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8 進数"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "ã™ã¹ã¦"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "トグル"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr ""
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr ""
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr ""
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "モード変更"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr ""
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "ユーザー"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "所有者変更"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - コピーを続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "コピー中..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr ""
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr ""
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "\"%s\" ã®ã‚³ãƒ”ーåを入力"
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "%s ã®è¤‡è£½åを入力"
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - 複製を続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "複製中..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr ""
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr ""
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr ""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - シンボリックリンクを続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr ""
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "複製"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr ""
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "シンボリックリンク複製"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr ""
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "アクセスå•é¡Œ"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr ""
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr ""
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "削除中..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr ""
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr ""
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr ""
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK<|ã™ã¹ã¦(_A)|飛ã°ã™(_S)|å–り消ã—(_C)"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|飛ã°ã™(_S)|å–り消ã—(_C)"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr ""
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr ""
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr "ã€%s 使用済ã¿"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€%u 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€%u 個ã®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "リンク先"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "種類"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "場所"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "サイズ"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu ãƒã‚¤ãƒˆ"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "内容"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "ファイルã®æƒ…å ±"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "最終アクセス"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "最終修正"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "最終変更"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr ""
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr ""
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "情報å–得中..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr ""
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "アクセス日付書å¼"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "修正日付書å¼"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "変更日付書å¼"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr ""
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - çµåˆã‚’続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "çµåˆä¸­..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "ç·ã‚µã‚¤ã‚ºã¯ %s ã§ã™ (%lu ãƒã‚¤ãƒˆ)"
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "ç·ã‚µã‚¤ã‚ºã¯ %lu ãƒã‚¤ãƒˆã§ã™ã€‚"
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr ""
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "çµåˆ"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "çµåˆ(_J)|å–り消ã—(_C)"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - ディレクトリ作æˆã‚’続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "作æˆã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã‚’入力"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "ディレクトリ作æˆ"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr ""
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr ""
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr ""
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr ""
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr ""
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr ""
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr ""
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "終了確èª"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr ""
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "本当ã«çµ‚了ã—ã¾ã™ã‹?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "\"%s\" ã®æ–°ã—ã„åå‰ã‚’入力"
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - å称変更を続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "å称変更"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "ç½®æ›"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr ""
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "ã™ã¹ã¦ç½®æ›ã—ã¾ã™ã‹?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr ""
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "差出人"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "宛先"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "æ­£è¦è¡¨ç¾"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+#, fuzzy
+msgid "Lower Case?"
+msgstr "英大å°æ–‡å­—ã‚’åŒä¸€è¦–?"
+
+#: src/cmd_renamere.c:501
+#, fuzzy
+msgid "Upper Case?"
+msgstr "英大å°æ–‡å­—ã‚’åŒä¸€è¦–?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "英大å°æ–‡å­—ã‚’åŒä¸€è¦–?"
+
+#: src/cmd_renamere.c:506
+#, fuzzy
+msgid "Case"
+msgstr "å–り消ã—"
+
+#: src/cmd_renamere.c:508
+#, fuzzy
+msgid "RenameRE"
+msgstr "å称変更"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10 進数"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16 進数 (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16 進数 (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8 進数"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr ""
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr ""
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr ""
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr ""
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr ""
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr ""
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr ""
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "ã™ã¹ã¦ã®è¡Œ|é¸æŠžæ¸ˆã¿|未é¸æŠž|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "ã™ã¹ã¦ã®ç¨®é¡ž|ディレクトリã®ã¿|éžãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã¿|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "é¸æŠž|é¸æŠžè§£é™¤|切り替ãˆ|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "æ“作"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "設定"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr ""
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr ""
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr ""
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr ""
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "OK|Cancel"
+msgstr "_OK|å–り消ã—(_C)"
+
+#: src/cmd_select.c:714
+#, fuzzy
+msgid "Select using shell command"
+msgstr "コマンドé¸æŠž"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - 分割を続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "固定サイズã§åˆ†å‰²"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "分割容é‡"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 ãƒã‚¤ãƒˆ (3.5 インãƒãƒ•ãƒ­ãƒƒãƒ”ー)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 ãƒã‚¤ãƒˆ (3.5 インãƒãƒ•ãƒ­ãƒƒãƒ”ー)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 ãƒã‚¤ãƒˆ (3.5 インãƒãƒ•ãƒ­ãƒƒãƒ”ー)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 ãƒã‚¤ãƒˆ (3.5 インãƒãƒ•ãƒ­ãƒƒãƒ”ー)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 ãƒã‚¤ãƒˆ (3.5 インãƒãƒ•ãƒ­ãƒƒãƒ”ー)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 ãƒã‚¤ãƒˆ (Zip ディスク)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "固定サイズã§åˆ†å‰²"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "分割容é‡"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr ""
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "å¯å¤‰ã‚µã‚¤ã‚ºã§åˆ†å‰²æ•°ã‚’固定"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "分割"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "å称書å¼"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "ステップ"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ - リンクを続ã‘ã¾ã™ã‹?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "å–り消ã—"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr ""
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr ""
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "シンボリックリンク編集"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr ""
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr ""
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "オン"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "真"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "ã¯ã„"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr ""
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr ""
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr ""
+
+#: src/cmdseq_dialog.c:239
+msgid "Select a command, or type part of its name."
+msgstr ""
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "コマンドé¸æŠž"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr ""
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "ä¿å­˜"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "設定ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³(%s)ã¯ãƒ—ログラムãƒãƒ¼ã‚¸ãƒ§ãƒ³(%s)ã¨ä¸€è‡´ã—ã¾ã›ã‚“。"
+
+#: src/configure.c:574
+#, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|å–り消ã—(_C)"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u ディレクトリã€%u/%u ファイル"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr "ã€%s 使用済ã¿"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr "ã€%s 空ã"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr ""
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr ""
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "H"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "ブロック"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "B サイズ"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "ブロック容é‡"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr ""
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr ""
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr ""
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr ""
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "所有者 ID"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "UID"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "所有者å"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "ユーザーå"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "GID"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "グループ ID"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "グループå"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "グループå"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "デãƒã‚¤ã‚¹"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "デãƒã‚¤ã‚¹ç•ªå·"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr ""
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr ""
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr ""
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr ""
+
+#: src/dpformat.c:50
+msgid "Time of Last Access"
+msgstr ""
+
+#: src/dpformat.c:51
+msgid "Time of Last Modification"
+msgstr ""
+
+#: src/dpformat.c:52
+msgid "Time of Creation"
+msgstr ""
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr ""
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr ""
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr ""
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr ""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr ""
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr ""
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr ""
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+
+#: src/gentoo.c:479
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+
+#: src/gentoo.c:480
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+
+#: src/gentoo.c:481
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+
+#: src/gentoo.c:482
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+#: src/gentoo.c:484
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:485
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr ""
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr ""
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr ""
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "アイコン画åƒèª­ã¿è¾¼ã¿ä¸­"
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr ""
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "æ­£è¦è¡¨ç¾..."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "ãã®ä»–"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "å†èµ°æŸ»"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "é¸æŠž"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "実行..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "設定..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "メニューé¸æŠž"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "|_OK|ã™ã¹ã¦(_L)|飛ã°ã™(_S)|ã™ã¹ã¦é£›ã°ã™(_A)|å–り消ã—(_C)|"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "åˆè¨ˆ (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr ""
+
+#: src/sizeutil.c:31
+msgid "Unformatted Size"
+msgstr ""
+
+#: src/sizeutil.c:32
+msgid "Formatted Size, Without Unit"
+msgstr ""
+
+#: src/sizeutil.c:33
+msgid "Formatted Size, in Bytes"
+msgstr ""
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "ã¯ã„"
+
+#: src/sizeutil.c:34
+msgid "Formatted Size, in Kilobytes"
+msgstr ""
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "キロãƒã‚¤ãƒˆ"
+
+#: src/sizeutil.c:35
+msgid "Formatted Size, in Megabytes"
+msgstr ""
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "メガãƒã‚¤ãƒˆ"
+
+#: src/sizeutil.c:36
+msgid "Formatted Size, in Gigabytes"
+msgstr ""
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ギガãƒã‚¤ãƒˆ"
+
+#: src/sizeutil.c:37
+msgid "Formatted Size, in Terabytes"
+msgstr ""
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "ãƒã‚¤ãƒˆ"
+
+#: src/sizeutil.c:38
+msgid "Formatted Size, Automatic Unit"
+msgstr ""
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "スタイルé¸æŠž"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr ""
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "ディレクトリ"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr ""
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr ""
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "行番å·ã‹ãƒ‘ーセントを入力:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr ""
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr ""
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr ""
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "検索"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "未知"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "gentoo 設定"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "テキスト閲覧"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ä½ç½®"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "高ã•"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr ""
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr ""
+
+#: src/window.c:249
+msgid "Grab"
+msgstr ""
+
+#~ msgid "New Style"
+#~ msgstr "æ–°è¦ã‚¹ã‚¿ã‚¤ãƒ«"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "親"
+
+#~ msgid "Always Set"
+#~ msgstr "常ã«è¨­å®š"
+
+#~ msgid "Beta Software"
+#~ msgstr "ベータソフトウェア"
+
+#~ msgid "Next Version?"
+#~ msgstr "次ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³?"
+
+#~ msgid "BYTES"
+#~ msgstr "ãƒã‚¤ãƒˆ"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu ãƒã‚¤ãƒˆ"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu キロãƒã‚¤ãƒˆ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu ギガãƒã‚¤ãƒˆ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f キロãƒã‚¤ãƒˆ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f メガãƒã‚¤ãƒˆ"
+
+#~ msgid "Mount Options"
+#~ msgstr "マウントオプション"
+
+#~ msgid "Mount Command"
+#~ msgstr "マウントコマンド"
+
+#~ msgid "Unmount Command"
+#~ msgstr "アンマウントコマンド"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "コマンドエラーダイアログを使ã„ã¾ã™ã‹?"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "gentoo を終了ã—ãŸã‚‰ãƒžã‚¦ãƒ³ãƒˆè§£é™¤ã—ã¾ã™ã‹?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: サãƒãƒ¼ãƒˆæ¸ˆã¿ã§ã€æœ‰åŠ¹ã§ã™ã€‚"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: サãƒãƒ¼ãƒˆæ¸ˆã¿ã§ã™ã€‚ã—ã‹ã—有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: サãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“。"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s ãƒã‚¤ãƒˆã€\n"
+#~ "%s ブロック)"
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "æ­£è¦è¡¨ç¾ã‚¨ãƒ©ãƒ¼:\n"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%sã€%Lu/%Lu ブロック)"
+
+#~ msgid "File reading"
+#~ msgstr "ファイル読ã¿è¾¼ã¿ä¸­"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "コマンド"
+
+#, fuzzy
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
+
+#~ msgid "Top"
+#~ msgstr "先頭"
+
+#~ msgid "Bottom"
+#~ msgstr "末尾"
+
+#~ msgid "_Goto..."
+#~ msgstr "移動(_G)..."
+
+#~ msgid "_Search..."
+#~ msgstr "検索(_S)..."
+
+#~ msgid "_Quit"
+#~ msgstr "終了(_Q)"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "é¸æŠž"
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644
index 0000000..df291f6
--- /dev/null
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..8c3fdaf
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,3048 @@
+# Polish translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Slawomir Mikula <zorba@silesianet.pl>, 2003.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.52\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-14 20:59+0200\n"
+"Last-Translator: Mikuła Sławomir <zorba@silesianet.pl>\n"
+"Language-Team: Polish <translators@gnome.pl>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "Z lewej strony Listwy Przycisków"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "Z prawej strony Listwy Przycisków"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Bez rozdzielenia"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Panele"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Statyczne"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Ta strona pozwala ci kontrolować w jaki sposób listwa skrótów jest \n"
+"umieszczana względem głównej listwy zawierającej komendy. Jest to mniej\n"
+" więcej pojemnik; zamiarem jest utworzenie większej elastyczności w \n"
+"zarządzaniu przyciskami, oraz umożliwić powstanie większej ilości \n"
+"wbudowanych listw z przyciskami. Ale jest to dopiero w fazie planów.\n"
+"\n"
+"W międzyczasie, to rozwiązanie stwarza funkcjonalność, która istniała \n"
+"wcześniej, gdzie Skróty miały osobną stronę konfiguracyjną (aż do 0.11.24).\n"
+"\n"
+"Aby znaleźć stronę konfiguracji Skrótów, przełącz się na stronę\n"
+" Przyciski, i użyj kontrolki opcji położonej w lewym górnym rogu strony \n"
+"do wybrania odpowiedniego menu."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Pozycja paska skrótów."
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Styl rozdzielenia"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "WyglÄ…d"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Ustal szerokość rzędów"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Domyślne"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Proszę potwierdź"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Czy rzeczywiście chcesz usunąć bieżący rząd?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Skasuj|_Anuluj"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Wybierz szerokość dla nowego rzędu"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Zmień długość rzędu"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Edytuj kolor tła"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Edytuj kolor"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etykieta"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Komenda"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Przycisk"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Kolory"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "TÅ‚o..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Domyślne ustawienia"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Kolor"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Skróty"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Czyść"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Kopiuj kolor do"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Kopiuj do"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Zamień z"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Dodaj rzÄ…d..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Usuń rząd"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "W dół"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Szerokość rzędu..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "W górę"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Sheet"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Pierwszy"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Drugi"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Podpowiedź"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Flagi"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Zwężyć?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Pokazać podpowiedź?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Przyciski"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definicje"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Opcje"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Wybierz wbudowany"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "OtwierajÄ…cy nawias klamrowy"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "ZamykajÄ…cy nawias klamrowy"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Pierwszy wybrany"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Pierwszy wybrany, odznacz"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Pierwszy wybrany, z scieżką"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Pierwszy wybrany, z scieżką, odznacz"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Pierwszy wybrany (docelowy panel)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Pierwszy wybrany, bez cudzysłowu"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Pierwszy wybrany, bez cudzysłowu"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Wszystkie wybrane"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Wszystkie wybrane, odznacz"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Wszystkie wybrane, z scieżkami"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Wszystkie wybrane, z scieżkami, odznacz"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Wszystkie wybrane (docelowy panel)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Wszystkie wybrane, bez cudzysłowów"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Wszystkie wybrane, bez cudzysłowów"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Scieżka do katalogu panelu źródłowego"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Scieżka do katalogu panelu docelowego"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Scieżka do katalogu domowego"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Scieżka lewego panelu"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Scieżka prawego panelu"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Pierwszy wybrany"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Pierwszy wybrany, odznacz"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Pierwszy wybrany, bez cudzysłowu"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Wszystkie wybrane"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Wszystkie wybrane, odznacz"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Wszystkie wybrane, bez cudzysłowów"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Wszystkie wybrane, bez cudzysłowów"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Pierwszy wybrany (docelowy panel)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Wejściowe okno wyboru"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Wejście używając menu"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Wejściowy ciąg"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Wejściowa fiszka (w wyniku TRUE lub FALSE)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Dodaj etykietę dla okna wejściowego"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Dodaj pasek separatora do okna wejściowego"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Wartość $NAME (środowisko)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Katalog domowy dla użytkownika NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Wybierz kod"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Brak opcji)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Uruchom w tle?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Zabij poprzedniÄ… instancjÄ™?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Przetrzymaj zakończenie?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Przechwyć wyjście?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "Wymaga zaznaczenia źródła?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "Wymaga zaznaczenia celu?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "CD źródłowy?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "CD docelowy?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Oczytaj ponownie źródło?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Odczytaj ponownie przeznaczenie?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "Ogólne"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "Przed&Po"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Wbudowane"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Zewnętrzne"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Dodaj rzÄ…d"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Powiel"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Nazwa"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definicja"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Powtarzaj sekwencję dopóki brak zaznaczenia w źródłowym?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Dodaj"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Usuń"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Komendy"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Lewy"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Åšrodkowy"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Prawy"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Kółko w dół"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Kółko w górę"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Poniższe klawisze <modyfikatory> muszą być przytrzymane\n"
+"równocześnie z klawiszem myszy aby wykonać komendę"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Edytuj modyfikatory"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Skróty klawiaturowe"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Globalne skróty klawiaturowe"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Klawisze Myszy"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Przycisk"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Edytuj modyfikatory..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Klik-M-Klik Gest"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Limit czasu"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ignoruj Num Lock dla każdego przypisania?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Informacja: Ustawienia klawiszy myszki \n"
+"sÄ… dwuznaczne: ten sam klawisz+ modyfikator\n"
+"są używane w więcej niż jednej funkcji. Może \n"
+"to powodować dziwne zachowanie się aplikacji..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Dołączany znak typu?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Dołączaj \"->przeznaczenie\" w dowiązaniach?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Umieść znacznik co 3 cyfry?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Precyzja"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Pokazuj wielkość"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Format"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s ustawienia"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Zawartość"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Wyrównanie"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Tytuł"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Szerokość"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Åšrodek"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Ustawienia podstawowe"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Edycja zawartości kolumny"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Domyślny tytuł"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Katalogi na poczÄ…tku"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Katalogi na końcu"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Katalogi mieszanie"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Z lewej strony listy"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Z prawej strony listy"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Domyślne systemowe"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Kopiuj z %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Kopiuj do %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Zamień z %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Kolumny"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Dostępna zawartość typów"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Wybrana zawartość typów"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Edytuj..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Usuń"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Sortowanie"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Sortuj z"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Tryb"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Odwrotne sortowanie?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ignoruj czcionkÄ™?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Domyślny katalog"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Utwórz katalog"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Pobierz obecny"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Z historii"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Ścieżka powyżej?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Dozwolone ukrywanie?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Zawsze scrollbar?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Duży przycisk \"do góry\"?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "Wymaga zaznaczenia celu?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Pozycja scrollbar'a"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Poziomo"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Pionowo"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Nie śledź"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Współczynnik"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Rozmiar, Lewy panel"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Rozmiar, Prawy panel"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Orientacja paneli"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Śledzenie podziału"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "pikseli"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Zapamiętaj wybrane rzędy ?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Zapisz historiÄ™?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Panele"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Podział paneli"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historia"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Błędy"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Brzęczyk systemowy przy błędzie?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menu"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Domyślne ustawienia"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Anuluj"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Ikony"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ZaczynajÄ…ce siÄ™ od kropki (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "OdpowiadajÄ…ce wzorcowi"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Żadne"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Ścieżki & Ukrywanie"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Ścieżki"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Ukrywaj wpisy"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(żadne)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Usuń zdarzenie"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Edytuj kolor"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Powróć do odziedziczonej komendy"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Wybór komendy"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Właściwości nowego zdarzenia"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "coÅ›"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Usunięcie tego stylu spowoduje usunięcie\n"
+"wszystkich styli potomnych. JesteÅ› pewien?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Potwierdź usunięcie"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Kolor tła"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Kolor główny"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Ikona"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Styl rzędu podgląd tekstu)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "PodglÄ…d"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Nadpisz macierzyste?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Wybierz..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Dodaj zdarzenie..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Komenda"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Macierzyste"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Potomne właściwości"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Wizualne"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Zdarzenia"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Rozpoznawanie plików"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Style"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Naciśnij aby zmienić..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Nowy typ)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-Dev"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-Dev"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Katalog"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Plik"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "DowiÄ…zanie"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Gniazdo"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Do odczytu"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "Z GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "Z UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "\"Sticky\""
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Wykonywalny"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Do zapisu"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Odpowiada wzorcowi pliku"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Odpowiada wzorcowi nazwy"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Wymaga rozszerzenia"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identyfikacja"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Wymaga typu"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Wymaga zabezpieczenia"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Globalnie?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Styl typu"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Styl"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Typy"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Okna dialogowe na środku ekranu"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Okna dialogowe w miejscu kursora myszy"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Okna dialogowe umieszczane zgodnie z politykÄ… zarzÄ…dcy okien"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Okna"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Okna"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Pozycjonowanie okien dialogowych"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Wykonanie \"%s\" nie powiodło się"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Nie można zakończyć \"%s\" (pid=%d) -- alarm: proces zombie"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Wersja %s (GTK+ wersja %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"To jest wolne oprogramowanie, i jako takie autor nie udziela\n"
+"JAKIEJKOLWIEK GWARANCJI działania. Przeczytaj plik COPYING\n"
+"dla uzyskania więcej szczegółów.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Wspierane, użwyane domyślne angielskie tłumaczenie."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Kontakt z autorem gentoo jest możliwy przez internet\n"
+"email : <emil@obsession.se>; czuj się zachęcony do \n"
+"przekazania mi co myślisz o tym oprogramowaniu, \n"
+"przekaż sugestie/raporty błędów itp.\n"
+"\n"
+"\n"
+"WÅ‚asne widgety - J. Hanson <johan@tiq.com>.\n"
+"\n"
+"Najnowsza wersja gentoo może być zawsze sciągnięta\n"
+"z oficjalnej strony projektu gentoo <http://www.obsession.se/gentoo/>.\n"
+"Nowe wersje są najczęsciej ogłaszane w serwisie Freshmeat \n"
+"<http://freshmeat.net/>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "O gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Czekaj na więcej)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Ustaw bity zabezpieczenia dla \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Grupa"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Inne/i"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Właściciel"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Specjalne"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Wykonaj"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Czytaj"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Ustaw GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Ustaw UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Zapis"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Bity zabezpieczenia"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ósemkowo"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Wszystko"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Zmień"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Odwróć"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "W głąb katalogów?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Bez uwzględnienia katalogów?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Zmiana trybu"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Ustaw właściciela dla '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Użytkownik"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Zmień właściciela"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Automatycznie zapisuj zmiany konfiguracji podczas wyjścia z programu ?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" już istnieje - kontynuować kopiowanie?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Kopiowanie..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Zachować daty podczas kopiowania?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr "Ignoruj błąd kopiowania atrybutów (Data, Właściciel, Tryb) ?\""
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Zostaw niedokończony cel jeśli pełny?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Wielkość bufora"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Podaj nazwÄ™ dla kopiowanego \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Podaj nazwÄ™ dla klonu \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" już istnieje - kontynuować klonowanie?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Klonowanie..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Kopiowanie jako..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Wprowadź nazwę dla dowiązania \"%s\" jako"
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Wprowadź nazwę dla dowiązania klonu \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" już istnieje - kontynuować dowiązanie symboliczne?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Kopiuj jako"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Klonowanie"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "DowiÄ…zanie symboliczne jako"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "DowiÄ…zanie symboliczne klon"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"Nie może zostać skasowany ze względu na ograniczenia dostępu.\n"
+"Spróbować zmienić zabezpieczenie i ponowić?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Zapamiętaj odpowiedź (zmienia konfigurację)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Problem dostępu"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Zmień| Pozostaw"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "Naprawdę skasować \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Usuwanie..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Błąd podczas dostępu"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "Zapytaj|Automatycznie spróbuj zmienić, wykonaj ponownie|Przerwij"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "lSzukaj"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK|_Wszystko|_Pomiń|_Anuluj"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|_Pomiń|_Anuluj"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Pobieranie rozmiaru..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Odznacz rzędy po wykonaniu?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s użyte"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u katalogów, %u plików, %u dowiązań symbolicznych"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Dowiąż do"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Typ"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Położenie"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Wielkość"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr ""
+"%u "
+"bajtĂłw"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Zawiera"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Informacja o pliku"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Czas dostępu"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Czas modyfikacji"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Czas zmiany"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Utworzony"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Baza"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Pobieranie informacji..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Pokaż wyjście pliku?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Format daty dostępu"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Format daty modyfikacji"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Format daty zmiany"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "WyglÄ…d znacznika"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" już istnieje - kontynuować łączenie?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "ÅÄ…czenie..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr ""
+"Kliknij i przeciągnij pliki aby zmienić porządek, Kliknij aby połączyć."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Całkowity rozmiar to %s (%lu bajtów)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Całkowity rozmiar to %lu bajtów."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Wprowadź docelową nazwę pliku"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Połącz"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Połącz|_Anuluj"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" już istnieje - kontynuować tworzenie katalogu?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Wprowadź nazwę katalogu do utworzenia"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Utwórz katalog"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "CD do nowego katalogu?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Podświetlenie nowego katalogu?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" już istnieje - kontynuować przeniesienie?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Przenoszenie..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Wprowadź nazwę do przeniesienia \"%s\" jako"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Przenoszenie jako..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "PrzenieÅ› jako"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Możesz mieć niezapisaną konfigurację.\n"
+"Przy wyjściu możesz je utracić. Naprawdę wyjść?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Potwierdź wyjście"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Wyjście|_Zapisz, potem wyjdź|_Anuluj"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Jesteś pewien, że chcesz wyjść?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Wprowadź nową nazwę dla \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" już istnieje - kontynuować zmianę nazwy?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Zmień nazwę"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr "Szukaj ciągu w każdej nazwie pliku, zamień je nowym ciągiem."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Zamień"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Z"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Zamień wszystko?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Proste"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Wykonaj \"Z wyr. reg.\" na każdym pliku, zapisując przetworzone\n"
+"podwyrażenia, które pasują. Zamień wystąpienie każdego $n w \"Do\",\n"
+"gdzie n jest indeksem (licząc od 1) podwyrażenia, z tekstem który pasuje,\n"
+" używając wyniku jako nowej nazwy pliku."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Z"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Do"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Wyr. Reg."
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+"Szukaj każdego znaku z pola 'Z' i zamień\n"
+"wszystkie znalezione elementy znakiem z pola 'Do'.\n"
+"Dodatkowo, wszystkie znaki z pola 'Usuń' zostaną usunięte z\n"
+"nazwy pliku. Rezultat zostanie użyty jako nowa nazwa dla każdego pliku."
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr "Mapa zamiany"
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "małymi literami?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "DUŻYMI LITERAMI?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "DUŻYMI LITERAMI?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Czcionka"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "Zmień używając wyrażeń regularnych"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, Dziesiętnie"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, szesnastkowo (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, szesnastkowo (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ósemkowo"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Ta komenda zmienia wszystkie wybrane pliki w \n"
+"numerowaną sekwencję. Kontrolki poniżej pozwalają\n"
+"zdefiniować formę nowych nazw."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Zacznj od"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Baza"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precyzja"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "PoczÄ…tkowy"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Końcowy"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Zgaduj"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Zmiana sekwencyjna"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Wszystkie rzędy|Zaznaczone|Odznaczone|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Wszytkie typy|Tylko katalogi|Bez katalogów|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Zaznacz|Odznacz|Odwróć|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Zdarzenie"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Ustaw"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "Traktuj wyr. reg. jako globalnÄ… maskÄ™?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Odwróć zaznaczenie wyr. reg.?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Wymaga zaznaczenia przy Pełnej nazwie?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Zaznacz używając wyr. reg."
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+"Wprowadź rozkaz powłoki do uruchomienia. Rozkaz\n"
+"będzie uzupełniony o zaznaczone elementy.\n"
+"Akcja zostanie wykonana w przypadku wyjścia z powłoki z sukcesem."
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "OK|Anuluj"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Wybierz używając rozkazu powłoki"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Podziel \"%s\".\n"
+"Plik jest %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Podziel \"%s\".\n"
+"Plik jest %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" już istnieje - kontynuować podział?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Ustalona wielkość podziału"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Wielkość segmentowa"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 bajtów (3.5\" dyskietka)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 bajtów (3.5\" dyskietka)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 bajtów (3.5\" dyskietka)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 bajtów (3.5\" dyskietka)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 bajtów (3.5\" dyskietka)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 bajtów (Dysk ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Ustalona wielkość podziału"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Wielkość segmentowa"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Ustalona wielkość, zmienne numery części"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Stałe numery części, zmienna wielkość"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Podziel"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Format nazwy"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Krok"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" juz istnieje - kontynuować dowiązanie?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Wybierz cel dla dowiÄ…zania"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Zawartość"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Edytuj dowiÄ…zanie symboliczne"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Utwórz dowiązanie symboliczne"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Najpierw Hex"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "w"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "prawda"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "tak"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Wyjście %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Nie można wykonać nieznanej komendy \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Wbudowane (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Zdefiniowane (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Wybierz komendÄ™, lub wpisz poczÄ…tek nazwy\n"
+"i wciśnij TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Wybór komendy"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Nie można otworzyć pliku konfiguracyjnego dla wyjścia"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Zapisz"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr ""
+"Wersja pliku konfiguracyjnego (%s) nie zgadza siÄ™ z wersjÄ… programu (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Nie można znaleźć pliku konfiguracyjnego; sprawdzono\n"
+"\"%s\" jak i \"%s\".\n"
+"Używanie wbudowanej minimalnej konfiguracji."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|_Anuluj"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u katalogów, %u/%u plików"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s użyte"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s wolne"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Przejdź do katalogu powyżej"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Wprowadź scieźkę, następnie naciśnij Return aby tam przejść"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "H"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Wciśnij, aby włączyć/wyłączyć regułę ukrywania (kiedy wciśnięty, reguła "
+"ukrywania jest aktywna, a wpisy sÄ… ukryte)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Bloki"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "BWielkość"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Wielkość bloków"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Tryb, numerycznie"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Tryb, ciÄ…g"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "N-linków"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Liczba dowiązań"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "ID właściciela"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Uid"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Nazwa właściciela"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "U-nazwa"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Gid"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "ID grupy"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "G-nazwa"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Nazwa grupy"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "UrzÄ…dzenie"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Numer urzÄ…dzenia"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "DevMaj"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Numer urządzenia, główny"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "DevMin"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Numer urzÄ…dzenia, poboczny"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Data ostatniego dostępu"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Data ostatniej modyfikacji"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Data utworzenia"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Nazwa typu"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "I"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Nie można %s \"%s\": %s (kod %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Nie można %s \"%s\" (kod %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Nie można %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Nie można %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440 #: src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "Wyświetl wersję na standardowe wyjście, potem zakończ."
+
+# src/gentoo.c:440 #: src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "Wyświetl wewnętrzne szczegóły lokalizacji, potem zakończ."
+
+# src/gentoo.c:441 #: src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr "Umożliwia uruchomienie programu jako root. Może być niebezpieczne."
+
+# src/gentoo.c:442 #: src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Nie ładuj pliku konfiguracyjnego ~/.gentoorc; zamiast tego użyj wartości "
+"domyślnych"
+
+# src/gentoo.c:443 #: src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Nie ładuł pliku konfiguracyjnego GTK+ : ~/.gentoogtkrc ; zamiast tego użyj "
+"domyślnego pliku systemowego."
+
+# src/gentoo.c:442 #: src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Nie ładuj pliku konfiguracyjnego ~/.gentoorc; zamiast tego użyj wartości "
+"domyślnych"
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Uruchom ARG, komenda gentoo. Polecenie zostanie wykonane przed umożliwieniem "
+"użytkownikowi interakcji, ale po odczycie pliku konfiguracyjnego. Może "
+"zostać użyte wielokrotnie, pozwalając na uruchomienie w sekwencji."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447 #: src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Używaj ARG jako ścieżki dla lewego panelu. Zamiast domyślnego (i historii)"
+
+# src/gentoo.c:448 #: src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Używaj ARG jako ścieżki dla prawego panelu. Zamiast domyślnego (i historii)"
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Uruchomiony przez root'a, uruchom z opcjÄ… --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Nie można zainicjalizować modułu userinfo - rozwiązywanie nazw użytkowników "
+"nie będzie działać."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Postęp"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Wybierz ikonÄ™"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Åadowanie grafik ikon..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(brak zaznaczenia)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Wyr. Reg."
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Inni"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Odczytaj ponownie"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Wybierz"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Uruchom..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Konfiguracja..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Wybierz menu"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_OK|_Wszystko|_Pomiń|Po_miń Wszystko|_Anuluj"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Całkowity (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Upłynęło %02d:%02d Prędkość %s/s ETA %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Wielkość formatowana, w bajtach"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Wielkość formatowana, \"Sprytne\" jednostki"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Wielkość formatowana, w bajtach"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "tak"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Wielkość formatowana, w kilobajtach"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "KB"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Wielkość formatowana, w megabajtach"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "MB"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Wielkość formatowana, w gigabajtach"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "GB"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Wielkość formatowana, w megabajtach"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "B"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Wielkość formatowana, \"Sprytne\" jednostki"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Wybierz styl"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Katalog"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Nowy styl %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Linia %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Wprowadź nomer linii lub procentowo:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Przejdź"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Wprowadź poszukiwany tekst dla (wyr. reg.)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Nie rozszerzaj nowych linii?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Szukaj"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Konfiguracja gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "PrzeglÄ…darka tekstu"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Pozycja"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Wysokość"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Ustaw przy otwarciu?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Uaktualnij przy wyjściu?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Pobierz"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML moduł wysłał zależny od locale numer"
+
+#~ msgid "New Style"
+#~ msgstr "Nowy styl"
+
+#~ msgid "Before Execution"
+#~ msgstr "Przed wykonaniem"
+
+#~ msgid "After Execution"
+#~ msgstr "Po wykonaniu"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Traktuj podświetlone rzędy jako zaznaczone jeśli nie istnieją \"prawdziwe"
+#~ "\" zaznaczenia?"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Przesuń podświetlenie do ostatnio zaznaczonego/odznaczonego rzędu?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "Pobierz obecny"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "Używaj okna dialogowego do raportu błędów?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Kliknięcie prawym klawiszem na ścieżkę"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Wielkość surowa, w bajtach"
+
+#~ msgid "Always Set"
+#~ msgstr "Zawsze ustaw"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Modyfikuj stan przycisku Control"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Aktywne tytuły paneli"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Podświetlony rząd, odznacz"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Podświetlony rząd, zaznacz"
+
+#~ msgid "Beta Software"
+#~ msgstr "Beta Software"
+
+#~ msgid "Next Version?"
+#~ msgstr "Kolejna wersja?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Ten tryb podziału nie został jescze \n"
+#~ "zaimplementowany... Przepraszam."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Sortowanie z uwzględnieniem wielkości czcionki nie będzie działało "
+#~ "poprawnie z znakami nie-ASCII"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr ""
+#~ "Sortowanie bez uwzględnienienia wielkości czcionki nie będzie działało "
+#~ "poprawnie z znakami nie-ASCII"
+
+#~ msgid "BYTES"
+#~ msgstr "BYTES"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr ""
+#~ "%u "
+#~ "bajtĂłw"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%u KB"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%u MB"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%u GB"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f KB"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f MB"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f GB"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Tryb numeryczny?"
+
+#~ msgid "Never"
+#~ msgstr "Nigdy"
+
+#~ msgid "On Every Access"
+#~ msgstr "Przy każdym dostępie"
+
+#~ msgid "Mounting"
+#~ msgstr "Montowanie"
+
+#~ msgid "Mount When?"
+#~ msgstr "Kiedy montować?"
+
+#~ msgid "Mount Options"
+#~ msgstr "Opcje montowania"
+
+#~ msgid "Mount Command"
+#~ msgstr "Komenda montowania"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Komenda odmontowania"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Montuj tylko katalogi najwyższego rzędu"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "Uzywaj dialogu błędu"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Odmontuj przy zamykaniu gentoo"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: Wspierane i aktywne"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: Wspierane, nieaktywne."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: nie wspierane."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Nie można skopiować katalogu \"%s\"\n"
+#~ "do \"%s\":\n"
+#~ "źródło zawiera katalog docelowy."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "Zawiń u góry i dołu?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s bajtów,\n"
+#~ "%s bloków)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Nie można przenieść katalogu \"%s\"\n"
+#~ "do \"%s\":\n"
+#~ "źródło zawiera katalog docelowy."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Nie można przenieść katalogu \"%s\"\n"
+#~ "do \"%s\":\n"
+#~ "katalog docelowy zawiera źródło."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Błąd wyrażenia regularnego:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "Używaj mmap() dla przyśpieszenia ładowania?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu bloków)"
+
+# src/gentoo.c:445 #: src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Nie używaj FAM do automatycznej detekcji zmian w bieżących katalogach."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Nie można zainicjalizować danych montowania - automatyczne montowanie nie "
+#~ "będzie działać"
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Dostęp do FAM nieudany, błąd %d--FAM nie zostanie użyte"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Nie można dodać monitora FAM \"%s\", błąd %s (uruchom z --no-fam aby "
+#~ "ominąc ten błąd, chyba)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Nie można dodać monitora FAM \"%s\", błąd %s (uruchom z --no-fam aby "
+#~ "ominąc ten błąd, chyba)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Wykoananie \"%s %s\" nieudane:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Montowanie \"%s\" w \"%s\"..."
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Stary: %llu bajtów, zmieniony %s.\n"
+#~ "Nowy: %llu bajtów, zmieniony %s."
+
+#~ msgid "File reading"
+#~ msgstr "Odczyt pliku"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Wybierz kod"
+
+#~ msgid "Clr"
+#~ msgstr "Clr"
+
+#~ msgid ""
+#~ "Convert all characters in filename to either\n"
+#~ "all-lower or all-upper case."
+#~ msgstr ""
+#~ "Zmień wszystkie znaki w nazwie pliku na \n"
+#~ "wszystkie duże litery lub wszystkie małe litery."
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Wielkość bufora dla operacji mmap()"
+
+#~ msgid "%s: Couldn't set text domain to \"%s\"\n"
+#~ msgstr "%s: Nie można zmienić domeny tekstu na \"%s\"\n"
+
+#~ msgid "%Lu bytes"
+#~ msgstr "%Lu bajtów"
+
+#~ msgid "%Lu KB"
+#~ msgstr "%Lu KB"
+
+#~ msgid "%Lu MB"
+#~ msgstr "%Lu MB"
+
+#~ msgid "%Lu GB"
+#~ msgstr "%Lu GB"
+
+#~ msgid "Top"
+#~ msgstr "Góra"
+
+#~ msgid "Bottom"
+#~ msgstr "Dół"
+
+#~ msgid "_Goto..."
+#~ msgstr "_Przejdź do..."
+
+#~ msgid "_Search..."
+#~ msgstr "_Szukaj..."
+
+#~ msgid "_Quit"
+#~ msgstr "_Wyjście"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Wybierz"
+
+#~ msgid "Close"
+#~ msgstr "Zamknij"
+
+#~ msgid "Skip"
+#~ msgstr "Pomiń"
+
+#~ msgid "Menu"
+#~ msgstr "Menu"
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644
index 0000000..0122c46
--- /dev/null
+++ b/po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
new file mode 100644
index 0000000..2436c49
--- /dev/null
+++ b/po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/ru_RU.CP1251.gmo b/po/ru_RU.CP1251.gmo
new file mode 100644
index 0000000..2deaf1f
--- /dev/null
+++ b/po/ru_RU.CP1251.gmo
Binary files differ
diff --git a/po/ru_RU.CP1251.po b/po/ru_RU.CP1251.po
new file mode 100644
index 0000000..3966ddf
--- /dev/null
+++ b/po/ru_RU.CP1251.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.CP1251\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/ru_RU.KOI8-R.gmo b/po/ru_RU.KOI8-R.gmo
new file mode 100644
index 0000000..a9f0ac2
--- /dev/null
+++ b/po/ru_RU.KOI8-R.gmo
Binary files differ
diff --git a/po/ru_RU.KOI8-R.po b/po/ru_RU.KOI8-R.po
new file mode 100644
index 0000000..d36aa49
--- /dev/null
+++ b/po/ru_RU.KOI8-R.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.KOI8-R\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/ru_RU.UTF-8.gmo b/po/ru_RU.UTF-8.gmo
new file mode 100644
index 0000000..ec832cb
--- /dev/null
+++ b/po/ru_RU.UTF-8.gmo
Binary files differ
diff --git a/po/ru_RU.UTF-8.po b/po/ru_RU.UTF-8.po
new file mode 100644
index 0000000..df4c8c0
--- /dev/null
+++ b/po/ru_RU.UTF-8.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.UTF-8\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/ru_RU.cp1251.gmo b/po/ru_RU.cp1251.gmo
new file mode 100644
index 0000000..9e43685
--- /dev/null
+++ b/po/ru_RU.cp1251.gmo
Binary files differ
diff --git a/po/ru_RU.cp1251.po b/po/ru_RU.cp1251.po
new file mode 100644
index 0000000..b6f4d4c
--- /dev/null
+++ b/po/ru_RU.cp1251.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.cp1251\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/ru_RU.koi8r.gmo b/po/ru_RU.koi8r.gmo
new file mode 100644
index 0000000..e767052
--- /dev/null
+++ b/po/ru_RU.koi8r.gmo
Binary files differ
diff --git a/po/ru_RU.koi8r.po b/po/ru_RU.koi8r.po
new file mode 100644
index 0000000..fcbf1e3
--- /dev/null
+++ b/po/ru_RU.koi8r.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.koi8r\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/ru_RU.utf8.gmo b/po/ru_RU.utf8.gmo
new file mode 100644
index 0000000..430e90d
--- /dev/null
+++ b/po/ru_RU.utf8.gmo
Binary files differ
diff --git a/po/ru_RU.utf8.po b/po/ru_RU.utf8.po
new file mode 100644
index 0000000..808be06
--- /dev/null
+++ b/po/ru_RU.utf8.po
@@ -0,0 +1,3005 @@
+# Russian translation of gentoo.
+# Copyright (C) 2002 Emil Brink
+# This file is distributed under the same license as the gentoo package.
+# Michael Y. Zaripov <m3@mail.ru>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo 0.11.51\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2008-07-13 20:20+0200\n"
+"Last-Translator: Michael Y. Zaripov <m3@mail.ru>\n"
+"Language-Team: \n"
+"Language: ru_RU.utf8\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "С левой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "С правой Ñтороны панели команд"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Без разделениÑ"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Панель"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "ПоÑтоÑнный"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Эта Ñтраница позволÑет выбрать раÑположение панели закладок \n"
+"отноÑительно панели команд. Закладки позволÑÑŽÑ‚ Вам назначить\n"
+"на чаÑто иÑпользуемые каталоги Ñпециальную кнопку и переходить \n"
+"в Ñти папки нажатием левой или Ñредней кнопки мышки \n"
+"Ð’Ñ‹ можете размеÑтить панель закладок Ñлева или Ñправа.\n"
+"Также выберите тип разделителÑ.\n"
+"\n"
+"ÐаÑтроить Ñаму панель можно переключившиÑÑŒ в раздел \n"
+"Кнопки - ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки вÑплывающего меню, \n"
+"раÑположенной в верхнем левом углу, выбрать Закладки"
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "РаÑположение панели закладок"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Тип разделителÑ"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Вид"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "УÑтановить ширину"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Подтвердите"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "ДейÑтвительно удалить текущую Ñтроку кнопок?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Удалить|_Отмена"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Выберите ширину новой Ñтроки"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Изменить ширину Ñтроки"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Изменить цвет фона"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Заголовок"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Команда"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Кнопка"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Цвета"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Фон..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Вернуть начальные"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Цвет"
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Закладки"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Убрать"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Копировать цвета"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Копировать"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "ОбменÑÑ‚ÑŒ"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Добавить Ñтроку..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Убрать Ñтроку"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Вниз"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Ширина Ñтроки..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Вверх"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "ЛиÑÑ‚"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "ОÑновнаÑ"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "ВторичнаÑ"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "ПодÑказка"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Флаги"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Сузить?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Показывать подÑказки"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Кнопки"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "ОпределениÑ"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Детали"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Выбрать вÑтроеные"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Открыть Ñкобу"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Закрыть Ñкобу"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Первый выбранный, Ñ Ð¿ÑƒÑ‚ÐµÐ¼, разотметить"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:631
+#, fuzzy
+msgid "First selected, no extension"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Ð’Ñе выбранные, Ñ Ð¿ÑƒÑ‚Ñми, разотметить"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Ð’Ñе выбранные(панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:638
+#, fuzzy
+msgid "All selected, no extensions"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Путь на панели иÑточника"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Путь на панели назначениÑ"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Домашний каталог"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Путь на левой панели"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Путь на правой панели"
+
+#: src/cfg_cmdseq.c:644
+#, fuzzy
+msgid "URI of first selected"
+msgstr "Первый выбранный"
+
+#: src/cfg_cmdseq.c:645
+#, fuzzy
+msgid "URI of first selected, unselect"
+msgstr "Первый выбранный, разотметить"
+
+#: src/cfg_cmdseq.c:646
+#, fuzzy
+msgid "URI of first selected, no quotes"
+msgstr "Первый выбранный, без кавычек"
+
+#: src/cfg_cmdseq.c:647
+#, fuzzy
+msgid "URIs of all selected"
+msgstr "Ð’Ñе выбранные"
+
+#: src/cfg_cmdseq.c:648
+#, fuzzy
+msgid "URIs of all selected, unselect"
+msgstr "Ð’Ñе выбранные, разотметить"
+
+#: src/cfg_cmdseq.c:649
+#, fuzzy
+msgid "URIs of all selected, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:650
+#, fuzzy
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "Ð’Ñе выбранные, без кавычек"
+
+#: src/cfg_cmdseq.c:651
+#, fuzzy
+msgid "URI of first selected (destination pane)"
+msgstr "Первый выбранный (панель назначениÑ)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Кнопка выбора"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Меню выбора"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Ввод Ñтрока"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Кнопки - флажки (ДÐ/ÐЕТ)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Заголовок окна диалога"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "ЛиниÑ-разделитель в окне ввода"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAME"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Значение $NAME (из окружениÑ)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "PID gentoo"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ NAME"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAME"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Выбрать код"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Ðет наÑтроек)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "ЗапуÑтить фоном?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "СнÑÑ‚ÑŒ предыдущую задачу?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Ðе Ñнимать при выходе?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "Показывать вывод?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "ОбÑзателен выбор иÑточника?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Перейти в каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Перейти в каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Перечитать каталог иÑточника?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Перечитать каталог назначениÑ?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "ОÑновные"
+
+#: src/cfg_cmdseq.c:958
+#, fuzzy
+msgid "Before"
+msgstr "До и поÑле"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr ""
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Ð’Ñтроеные"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Внешние"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Добавить Ñтроку"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Создать копию"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "ОпиÑание"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "ПовторÑÑ‚ÑŒ поÑледовательноÑÑ‚ÑŒ пока еÑÑ‚ÑŒ выбраные?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Добавить"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Убрать"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Команды"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "ЛеваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "СреднÑÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "ПраваÑ"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "КолеÑом вниз"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "КолеÑом вверх"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Следующие кнопки модификаторы должны\n"
+"быть нажаты во Ð²Ñ€ÐµÐ¼Ñ Ñ‰ÐµÐ»Ñ‡ÐºÐ° мышки"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Изменить модификаторы"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Управление"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "ОÑновные комбинации кнопок"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Клавиши мышки"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Кнопка"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Изменить модификаторы..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Щелк-Ðœ-Щелк возможноÑÑ‚ÑŒ"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Задержка"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ðе учитывать Num Lock Ð´Ð»Ñ Ð²Ñех комбинаций?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Важно: Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ мышки неоднозначны:\n"
+"одна ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и модификатора\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ чем одной цели. Это\n"
+"может привеÑти к их неожиданному поведению..."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_Да"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Добавить тип Ñимвола?"
+
+#: src/cfg_dirpane.c:337
+#, fuzzy
+msgid "Append \"→ destination\" on Links?"
+msgstr "Добавить \"->назначение\" в ÑÑылки?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Разделить разрÑды?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "ТочноÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Показать размер файловой ÑиÑтемы?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Формат"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "%s наÑтройки"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Содержание"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Выравнивание"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Заголовок"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Ширина"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "По центру"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Изменить Ñодержимое колонок"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Заголовок по умолчанию"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Каталоги вверху"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Каталоги внизу"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Каталоги как файлы"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Слева от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Справа от ÑпиÑка"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "По умолчанию"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Скопировать из %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Копировать в %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "ОбменÑÑ‚ÑŒ Ñ %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Колонки"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "ДоÑтупные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Выбраные типы Ñодержимого"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Сортировать"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Режим"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñортировка?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Ðе учитывать региÑÑ‚Ñ€?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Каталог по умолчанию"
+
+#: src/cfg_dirpane.c:1111
+#, fuzzy
+msgid "Starting Directory"
+msgstr "Создать каталог"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "ПоÑледний"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Путь Ñверху?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Разрешить Ñкрытие?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Бегунок вÑегда?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° Вверх?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr ""
+
+#: src/cfg_dirpane.c:1156
+#, fuzzy
+msgid "Rubber banding Selection?"
+msgstr "ОбÑзателен выбор назначениÑ?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "РаÑположение бегунка"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Горизонтально"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Вертикально"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Ðе изменÑÑ‚ÑŒ"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Соотношение"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Размер левой панели"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Размер правой панели"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "точки"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Запоминать выбраные Ñлементы?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "СохранÑÑ‚ÑŒ иÑторию?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Панели"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Разделитель"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "ИÑториÑ"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr ""
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Ошибки"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr ""
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr ""
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr ""
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr ""
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "ИÑпользовать Ñигнал динамика?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Меню"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr ""
+
+#: src/cfg_nag.c:110
+#, fuzzy
+msgid "Reset All"
+msgstr "Вернуть начальные"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr ""
+
+#: src/cfg_paths.c:72
+#, fuzzy
+msgid "_Cancel"
+msgstr "Отмена"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr ""
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Значки"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "ÐачинающиеÑÑ Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "УдовлетворÑющие уÑловию"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Ðет"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Пути & Скрытие"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Пути"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Скрытие"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ðет)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Удаление"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Изменить цвет"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "ОÑтавить только наÑледуемые"
+
+#: src/cfg_styles.c:563
+#, fuzzy
+msgid "Select Command ..."
+msgstr "Выберите команду"
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "СвойÑтва нового ÑобытиÑ"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "нечто"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Удаление Ñтого клаÑÑа повлечет также\n"
+"удаление вÑех потомков. Уверены?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Подтвердите удаление"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Цвет фона"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Цвет"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Значок"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Так будет выглÑдеть)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Переопределить?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Выберите..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Добавить дейÑтвие..."
+
+#: src/cfg_styles.c:826
+#, fuzzy
+msgid "Edit Command"
+msgstr "Команда"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Родитель"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "ÐаÑледуемые ÑвойÑтва"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Отображение"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "ДейÑтвиÑ"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Типы файлов"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "КлаÑÑÑ‹"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Щелкните Ð´Ð»Ñ Ñмены..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ðовый тип)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "B-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "C-УÑÑ‚Ñ€"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Каталог"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Файл"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "СÑылка"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Порт"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Чтение"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "С GID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "С UID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "ФикÑациÑ"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Выполнение"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "УÑловие на файл"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "УÑловие на имÑ"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "С раÑширением"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "РаÑпознавание"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Признаки"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Ðтрибуты"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Ð’Ñе?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "КлаÑÑ Ñтого типа"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "КлаÑÑ"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Типы"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Диалоговые окна в центре Ñкрана"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Диалоговые окна Ñ€Ñдом Ñ Ð¼Ñ‹ÑˆÐºÐ¾Ð¹"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Диалоговые окна раÑÑтавлÑÑŽÑ‚ÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼ менеджером"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Окна"
+
+#: src/cfg_windows.c:102
+#, fuzzy
+msgid "Window Borders"
+msgstr "Окна"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "РаÑположение диалоговых окон"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Выполнение \"%s\" Ñорвано"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Ðе могу выгрузить процеÑÑ \"%s\" (pid=%d) -- зомби"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr ""
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "ВерÑÐ¸Ñ %s (GTK+ верÑÐ¸Ñ %d.%d.%d)."
+
+#: src/cmd_about.c:136
+#, fuzzy
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2008 - Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Это открытое ПО и оно не дает ÐБСОЛЮТÐО ÐИКÐКИХ \n"
+"ГÐРÐÐТИЙ. ПодробноÑти прочтите в файле COPYING.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: ПоддерживаетÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вÑтроенных английÑких Ñтрок."
+
+#: src/cmd_about.c:157
+#, fuzzy, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Ðвтор Ñтой программы доÑтупен через Ñлектронную\n"
+"почту по адреÑу: <emil@obsession.se>; напишите ему\n"
+"что вы думаете об Ñтой программе, Ñообщайте о \n"
+"найденный ощибках и пожеланиÑÑ….\n"
+"ÐаÑтройки по умолчанию - J. Hanson <johan@tiq.com>.\n"
+"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ может быть загружена\n"
+"Ñ Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы <http://www.obsession.se/gentoo/>.\n"
+"Ðовые верÑии обычно Ñначала выкладываютÑÑ \n"
+"в \"Свежем мÑÑе\" - <http://freshmeat.net/>.\n"
+"О неточноÑÑ‚ÑÑ… перевода пишите Ðœ.Зарипову <m3for@mail.ru>"
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "О программе"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_ДР(Подождите продолжениÑ)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "УÑтановить права Ð´Ð»Ñ \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Группа"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Другие"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Владелец"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Специальные"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "ЗапуÑк"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Чтение"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "ИÑп. GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "ИÑп. UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "ЗапиÑÑŒ"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Биты прав"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr ""
+
+#: src/cmd_chmod.c:246
+#, fuzzy
+msgid "Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Переключить"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "СброÑить"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "Ð”Ð»Ñ Ñодержимого тоже?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Кроме каталогов?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Смена режима"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "УÑтановка владельца Ð´Ð»Ñ '%s':"
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Пользователь"
+
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Смена владельца"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ наÑтройки при выходе?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr ""
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr ""
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr ""
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить копирование?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Копирование..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "СохранÑÑ‚ÑŒ даты при копировании?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Игнорировать невозможноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² (Дата, Права, Владелец)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "ОÑтавлÑÑ‚ÑŒ незавершенные файлы еÑли нет меÑта?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Размер буфера"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ»Ð¾Ð½Ð° \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить клонирование?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Клонирую..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Копировать как..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑылки \"%s\" "
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð° ÑÑылки \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Копировать как"
+
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Клонировать"
+
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "СÑылка Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼"
+
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Клонирование ÑÑылки"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"не может быть удален из-за Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа.\n"
+"Попробовать ÑнÑÑ‚ÑŒ защиту и продолжить?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Запомнить ответ (менÑет наÑтройку)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Проблема доÑтупа"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Сменить|ОÑтавить"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "ДейÑтвительно удалить \"%s\" ?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Удаление..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Ð’ Ñлучае нехватки прав"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr "СпроÑить|ПопытатьÑÑ Ñменить и продолжить|Прервать"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr ""
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "ПоиÑк"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "ДÐ|Ð’Ñе|Ðет|Отмена"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_ДÐ|_Ðет|_Отмена"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Считаю размер..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "СнÑÑ‚ÑŒ выделение поÑле выполнениÑ?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr ", %s занÑто"
+
+#: src/cmd_info.c:74
+#, fuzzy, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr "%u каталогов, %u файлов, %u ÑÑылок"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr ""
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "СÑылка на"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Тип"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "РаÑположение"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Размер"
+
+#: src/cmd_info.c:237
+#, fuzzy, c-format
+msgid "%s (%s bytes)"
+msgstr "%Lu байт"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Содержание"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Прочитан"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Модифицирован"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Изменен"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Создан"
+
+#: src/cmd_info.c:298
+#, fuzzy
+msgid "Basic"
+msgstr "Форма"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr ""
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Сбор информации..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Показывать вывод?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Формат даты доÑтупа"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Формат даты модификации"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Формат даты изменениÑ"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Знак разделитель Ñ‚Ñ‹ÑÑч"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Продолжить объединение?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Объединение..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Выделите файлы, раÑположите по порÑдку и нажмите Собрать."
+
+#: src/cmd_join.c:213
+#, fuzzy, c-format
+msgid "The total size is %s (%s)."
+msgstr "Общий размер %s (%lu байт)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Общий размер %lu байт."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Собрать"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Собрать|_Отмена"
+
+# c-format
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" Уже ÑущеÑтвует - Ñоздать каталог?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Введите Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Создать каталог"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Перейти в каталог?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "УÑтановить курÑор?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить перемещение?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Перемещение..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ\"%s\" как"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr ""
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "ПеремеÑтить как..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "ПеремеÑтить как"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"У Ð²Ð°Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек.\n"
+"Выход без ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере изменений. Уверены?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Потвердите выход"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Выйти|_Сохранить,выйти|_Отмена"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "ДеÑтвительно хотите выйти?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Введите новое Ð¸Ð¼Ñ Ð´Ð»Ñ \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить переименование?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr ""
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr ""
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Ищет подÑтроку во вÑех именах файлов и заменÑет\n"
+"на другую подÑтроку."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Ðа"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ð’Ñе вхождениÑ?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "ПроÑтаÑ"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"ВычиÑлить выражение \"Ðайти\" на каждом файле\n"
+"Ñодержащем подÑтроку из выражениÑ. Затем заменить \n"
+"вÑе Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ $n в \"Заменить\" где n - номер \n"
+"(Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1) Ð¿Ð¾Ð´Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñовпадающим текÑтом\n"
+"поиÑка и иÑпользовать результат как новое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Ðайти"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Заменить"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Выражение"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr ""
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Ðижний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:503
+#, fuzzy
+msgid "Upper Case Initial?"
+msgstr "Верхний региÑÑ‚Ñ€?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Форма"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "ПереименоватьУСЛ"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, ДеÑÑтичнаÑ"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, ШеÑÑ‚Ð½Ð°Ð´Ñ†ÐµÑ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, ВоÑьмеричнаÑ"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Эта команда переименовывает вÑе выделенные\n"
+"файлы в нумерованную поÑледовательноÑÑ‚ÑŒ.\n"
+"Кнопки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ позволÑÑŽÑ‚ определить\n"
+"порÑдок Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½ файлов."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Ðачать Ñ"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Форма"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Кол-во знаков"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Ðачало"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Окончание"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "ПодÑтавить"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Переименование в поÑледовательноÑÑ‚ÑŒ"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Ð’Ñе Ñлементы|Отмеченные|Разотмеченные|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Ð’Ñе типы|Каталоги|Без каталогов|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Отметить|Разотметить|Перевернуть|"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "ДейÑтвие"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "УÑтановить"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "ИÑпользовать выражение как глоб. маÑку?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Ðе удовлетворÑющие выражению?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "По полному имени?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Выбор иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Выбер по конÑольной команде"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Разбить \"%s\".\n"
+"файл %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Разбить \"%s\".\n"
+"Файл %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить разбивку?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:432
+#, fuzzy
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:433
+#, fuzzy
+msgid "10485760 bytes (10 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:434
+#, fuzzy
+msgid "26214400 bytes (25 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:435
+#, fuzzy
+msgid "52428800 bytes (50 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:436
+#, fuzzy
+msgid "78643200 bytes (75 MB)"
+msgstr " 1457000 байт (3.5\" диÑкета)"
+
+#: src/cmd_split.c:437
+#, fuzzy
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 байт (ДиÑк ZIP)"
+
+#: src/cmd_split.c:459
+#, fuzzy
+msgid "Fixed Count Split"
+msgstr "Разбивка по размеру"
+
+#: src/cmd_split.c:462
+#, fuzzy
+msgid "Segment Count"
+msgstr "Размер куÑка"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr ""
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr ""
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr ""
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr ""
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr ""
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr ""
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "По определенному размеру чаÑти"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Ðа определенное количеÑтво чаÑтей"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Разбить"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Формат имени"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Шаг"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr ""
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr ""
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" Уже ÑущеÑтвует - продолжить Ñоздание ÑÑылки?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "ДÐ"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Выберите цель ÑÑылки"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Содержание"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Изменить ÑÑылку"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Создание ÑÑылки"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Проверить Ñимволы"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr ""
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "вкл"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "ИÑтина"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "да"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Вывод %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr "Ðе извеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Ð’Ñтроеные (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Определенные (%u)"
+
+#: src/cmdseq_dialog.c:239
+#, fuzzy
+msgid "Select a command, or type part of its name."
+msgstr ""
+"Выберите команду или наберите\n"
+"начало и нажмите TAB"
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Выберите команду"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Ðе могу открыть файл наÑтройки Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr ""
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек (%s) не Ñовпадает Ñ Ð²ÐµÑ€Ñией программы (%s)"
+
+#: src/configure.c:574
+#, fuzzy, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Ðе могу найти файл наÑтроек; его нет\n"
+"ни в \"%s\" ни в \"%s\".\n"
+"ИÑпользую вÑтроенную минимальную наÑтройку."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_ДÐ|_Отмена"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u каталогов, %u/%u файлов"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr ""
+
+#: src/dirpane.c:521
+#, fuzzy, c-format
+msgid ", %s (%s) used"
+msgstr ", %s занÑто"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s Ñвободно"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Перейти в родительÑкий каталог"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Введите путь и нажмите Ввод Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "С"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñкрытых Ñлементов(нажатое ÑоÑтоÑние "
+"обозначает Ñкрытие)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Блоков"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Блок"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Размер блока"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Права, в цифрах"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Права, Ñтрокой"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "СÑылок"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "ЧиÑло ÑÑылок"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ðомер владельца"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "Nвлад"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Владелец"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Nгруп"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Ðомер группы"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Группа"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "УÑтройÑтво"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Ðомер уÑтройÑтва"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "NУÑтрО"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Ðомер уÑтройÑтва, оÑновной"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "NУÑÑ‚Ñ€ÐО"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Ðомер уÑтройÑтва, неоÑновной"
+
+#: src/dpformat.c:50
+#, fuzzy
+msgid "Time of Last Access"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑтупа"
+
+#: src/dpformat.c:51
+#, fuzzy
+msgid "Time of Last Modification"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней модификации"
+
+#: src/dpformat.c:52
+#, fuzzy
+msgid "Time of Creation"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr ""
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Ð˜Ð¼Ñ Ñ‚Ð¸Ð¿Ð°"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "З"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr ""
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr ""
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Ðе могу %s \"%s\": %s (код %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Ðе могу %s \"%s\" (код %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Ðе могу %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Ðе могу %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr ""
+
+# src/gentoo.c:440
+#: src/gentoo.c:474
+#, fuzzy
+msgid "Report the version to standard output, and exit"
+msgstr "ВывеÑти номер верÑии и выйти."
+
+# src/gentoo.c:440
+#: src/gentoo.c:476
+#, fuzzy
+msgid "Report internal locale details, and exit"
+msgstr "ВывеÑти детали внутренней локализации и выйти."
+
+# src/gentoo.c:441
+#: src/gentoo.c:478
+#, fuzzy
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr ""
+"ПозволÑет запуÑкать gentoo под root'ом. Может привеÑти к печальным "
+"поÑледÑтвиÑм. "
+
+# src/gentoo.c:442
+#: src/gentoo.c:479
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+# src/gentoo.c:443
+#: src/gentoo.c:480
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ðе загружать наÑтройки GTK+ : ~/.gentoogtkrc; иÑпользовать ÑиÑтемные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+# src/gentoo.c:442
+#: src/gentoo.c:481
+#, fuzzy
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ðе загружать файл наÑтроек ~/.gentoorc; иÑпользовать наÑтройки по умолчанию."
+
+#: src/gentoo.c:482
+#, fuzzy
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"ЗапуÑтить ARG, команду gentoo. Команда запуÑкаетÑÑ Ð´Ð¾ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð°, но "
+"поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° наÑтроек. Возможно иÑпользовать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка "
+"неÑкольких разных команд."
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr ""
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr ""
+
+# src/gentoo.c:447
+#: src/gentoo.c:484
+#, fuzzy
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+# src/gentoo.c:448
+#: src/gentoo.c:485
+#, fuzzy
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"ИÑпользовать ARG как путь Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ панели. Переопределить путь по "
+"умолчанию(и иÑторию)."
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr ""
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr ""
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr ""
+
+#: src/gentoo.c:551
+#, fuzzy, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: Чтобы запуÑтить под root иÑпользуйте --root-ok\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Ðе могу найти модуль userinfo - определение имен пользователей не будет "
+"работать."
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s - Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr ""
+
+#: src/gentoo.c:629
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "СоÑтоÑние"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Выберите значок"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Загрузка значка ..."
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(нет выделениÑ)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Выражение"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "С другой панели"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Обновить"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Выбор"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Выполнить..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "ÐаÑтроить..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Выберите меню"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr ""
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_ДÐ|_Ð’Ñе|_Ðет|Ðи одного|_Отмена"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Ð’Ñего (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr ""
+
+#: src/progress.c:346
+#, fuzzy, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ %02d:%02d СкороÑÑ‚ÑŒ %s/c ОÑталоÑÑŒ %02u:%02u"
+
+#: src/sizeutil.c:31
+#, fuzzy
+msgid "Unformatted Size"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:32
+#, fuzzy
+msgid "Formatted Size, Without Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/sizeutil.c:33
+#, fuzzy
+msgid "Formatted Size, in Bytes"
+msgstr "Размер, в байтах"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+#, fuzzy
+msgid "bytes"
+msgstr "да"
+
+#: src/sizeutil.c:34
+#, fuzzy
+msgid "Formatted Size, in Kilobytes"
+msgstr "Размер, в килобайтах"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "КБ"
+
+#: src/sizeutil.c:35
+#, fuzzy
+msgid "Formatted Size, in Megabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "МБ"
+
+#: src/sizeutil.c:36
+#, fuzzy
+msgid "Formatted Size, in Gigabytes"
+msgstr "Размер, в гигабайтах"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "ГБ"
+
+#: src/sizeutil.c:37
+#, fuzzy
+msgid "Formatted Size, in Terabytes"
+msgstr "Размер, в мегабайтах"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+#, fuzzy
+msgid "TB"
+msgstr "Б"
+
+#: src/sizeutil.c:38
+#, fuzzy
+msgid "Formatted Size, Automatic Unit"
+msgstr "Размер,в \"умных\" единицах"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Выберите клаÑÑ"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Root"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Каталог"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ðовый клаÑÑ %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Строка %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Введите номер Ñтроки или процент:"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "Перейти"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка (Выражение)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Ðе раÑпределÑÑ‚ÑŒ новые линии?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr ""
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "ÐаÑтройка"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "ПроÑмотр текÑта"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "ПозициÑ"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "УÑтановить при открытии?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Сохранить при закрытии?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Захватить"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML модуль выдал локально-завиÑимый номер"
+
+#~ msgid "New Style"
+#~ msgstr "Ðовый клаÑÑ"
+
+#~ msgid "Before Execution"
+#~ msgstr "Перед запуÑком"
+
+#~ msgid "After Execution"
+#~ msgstr "ПоÑле запуÑка"
+
+#~ msgid "Treat Focused Row As Selection If No \"Real\" Selection Exists?"
+#~ msgstr ""
+#~ "Обрабатывать курÑор как выделение, еÑли нет \"ÐаÑтоÑщего\" выделениÑ"
+
+#~ msgid "Move Focus to Last Selected/Deselected Row?"
+#~ msgstr "Ставить курÑор на поÑледний выбранный Ñлемент?"
+
+#, fuzzy
+#~ msgid "Current"
+#~ msgstr "ВзÑÑ‚ÑŒ текущие"
+
+#~ msgid "Use Dialog to Report Errors?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº?"
+
+#~ msgid "Path Right Click"
+#~ msgstr "Правый щелчок на пути"
+
+#~ msgid "Raw Size, in Bytes"
+#~ msgstr "Сырой размер, в байтах"
+
+#~ msgid "Always Set"
+#~ msgstr "Ð’Ñегда включено"
+
+#~ msgid "Modify 'Control' Key State"
+#~ msgstr "Изменить ÑоÑтоÑние кнопки 'Control'"
+
+#~ msgid "Active Pane Titles"
+#~ msgstr "Заголовок активной панели"
+
+#~ msgid "Focused Row, Unselected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, не отмеченаÑ"
+
+#~ msgid "Focused Row, Selected"
+#~ msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñтрока, отмеченнаÑ"
+
+#~ msgid "Beta Software"
+#~ msgstr "Бета верÑиÑ"
+
+#~ msgid "Next Version?"
+#~ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ?"
+
+#~ msgid ""
+#~ "This splitting mode has not been\n"
+#~ "implemented yet... Sorry."
+#~ msgstr ""
+#~ "Режим разбивки еще не \n"
+#~ "реализован... Извините."
+
+#~ msgid ""
+#~ "Case-sensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid ""
+#~ "Case-insensitive sorting will not work correctly with non-ASCII characters"
+#~ msgstr "Сортировка без учета региÑтра работает неверно Ñ Ñ€ÑƒÑÑкими буквами"
+
+#~ msgid "BYTES"
+#~ msgstr "Байт"
+
+#, fuzzy
+#~ msgid "%%%s bytes"
+#~ msgstr "%Lu байт"
+
+#, fuzzy
+#~ msgid "%%%s KB"
+#~ msgstr "%Lu КБ"
+
+#, fuzzy
+#~ msgid "%%%s MB"
+#~ msgstr "%Lu МБ"
+
+#, fuzzy
+#~ msgid "%%%s GB"
+#~ msgstr "%Lu ГБ"
+
+#~ msgid "%.2f KB"
+#~ msgstr "%.2f КБ"
+
+#~ msgid "%.2f MB"
+#~ msgstr "%.2f МБ"
+
+#~ msgid "%.2f GB"
+#~ msgstr "%.2f ГБ"
+
+#~ msgid "Numerical Mode?"
+#~ msgstr "Учитывать длину?"
+
+#~ msgid "Never"
+#~ msgstr "Ðикогда"
+
+#~ msgid "On Every Access"
+#~ msgstr "При каждом обращении"
+
+#~ msgid "Mounting"
+#~ msgstr "Подключение"
+
+#~ msgid "Mount When?"
+#~ msgstr "Когда подключать?"
+
+#~ msgid "Mount Options"
+#~ msgstr "ÐаÑтройка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¸Ñков"
+
+#~ msgid "Mount Command"
+#~ msgstr "Команда подключениÑ"
+
+#~ msgid "Unmount Command"
+#~ msgstr "Команда отключениÑ"
+
+#~ msgid "Only Mount on Toplevel Directories?"
+#~ msgstr "Подключать только в корневом каталоге?"
+
+#~ msgid "Use Command Error Dialog?"
+#~ msgstr "ИÑпользовать диалог Ð´Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
+
+#~ msgid "Unmount When gentoo Quits?"
+#~ msgstr "Отключать при выходе?"
+
+#~ msgid "FAM: Supported and active."
+#~ msgstr "FAM: ПоддерживаетÑÑ Ð¸ включено"
+
+#~ msgid "FAM: Supported, but not active."
+#~ msgstr "FAM: ПоддерживаетÑÑ, но не включено."
+
+#~ msgid "FAM: Not supported."
+#~ msgstr "FAM: Ðе поддерживаетÑÑ."
+
+#~ msgid ""
+#~ "Can't copy directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу копировать \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(копирование Ñамого в ÑебÑ)."
+
+#~ msgid "Wrap Around At Top And Bottom?"
+#~ msgstr "ПереÑкакивать в другой конец ÑпиÑка?"
+
+#~ msgid ""
+#~ "%s (%s bytes,\n"
+#~ "%s blocks)"
+#~ msgstr ""
+#~ "%s (%s байт),\n"
+#~ "%s блоков)"
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the source contains the destination."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить каталог \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(назначение - подпапка иÑточника)."
+
+#~ msgid ""
+#~ "Can't move directory \"%s\"\n"
+#~ "to \"%s\":\n"
+#~ "the destination contains the source."
+#~ msgstr ""
+#~ "Ðе могу перемеÑтить \"%s\"\n"
+#~ "в \"%s\"\n"
+#~ "(иÑточник - подпапка назначениÑ)."
+
+#~ msgid "Regular expression error:\n"
+#~ msgstr "Ошибка выражениÑ:\n"
+
+#~ msgid "Use mmap() to Speed Loading?"
+#~ msgstr "ИÑпользовать mmap() Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸?"
+
+#, fuzzy
+#~ msgid " (%%s/%%s, %%%s/%%%s blocks)"
+#~ msgstr " (%s/%s, %Lu/%Lu блоков)"
+
+# src/gentoo.c:445
+#~ msgid ""
+#~ "Do not use FAM to automatically detect changes in viewed directories."
+#~ msgstr ""
+#~ "Ðе иÑпользовать FAM Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в проÑмотриваемый каталогах."
+
+#~ msgid "Couldn't initialize mount data - automounting won't work"
+#~ msgstr ""
+#~ "Ðе могу найти опиÑание подключений диÑков - автоподключение не будет "
+#~ "работать."
+
+#~ msgid "FAM open failed, error %d--FAM will not be used"
+#~ msgstr "Ðе могу открыть FAM, ошибка %d - FAM не иÑпользую"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't cancel FAM monitor: %s (restart with --no-fam to go around, "
+#~ "perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Couldn't add FAM monitor on \"%s\": %s (restart with --no-fam to go "
+#~ "around, perhaps)"
+#~ msgstr ""
+#~ "Ðе могу добавить монитор FAM \"%s\", ошибка %s (может запуÑтить Ñ --no-"
+#~ "fam ?)"
+
+#~ msgid "Execution of \"%s %s\" failed:\n"
+#~ msgstr "Выполнение \"%s %s\" прервано:\n"
+
+#~ msgid "Mounting \"%s\" on \"%s\"..."
+#~ msgstr "Подключение \"%s\" в \"%s\"..."
+
+# c-format
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Old: %%%s bytes, changed on %%s,\n"
+#~ "New: %%%s bytes, changed on %%s."
+#~ msgstr ""
+#~ "\n"
+#~ "Старое: %llu байт, изменен %s.\n"
+#~ "Ðовое: %llu байт, изменен %s."
+
+#~ msgid "File reading"
+#~ msgstr "Чтение файла"
+
+#, fuzzy
+#~ msgid "Pick Command ..."
+#~ msgstr "Выбрать код"
+
+#~ msgid "Clr"
+#~ msgstr "Ðет"
+
+#~ msgid "Buffer Size for mmap()"
+#~ msgstr "Размер буфера Ð´Ð»Ñ mmap()"
+
+#~ msgid "Top"
+#~ msgstr "Ðачало"
+
+#~ msgid "Bottom"
+#~ msgstr "Конец"
+
+#~ msgid "_Goto..."
+#~ msgstr "Перейти..."
+
+#~ msgid "_Search..."
+#~ msgstr "ПоиÑк..."
+
+#~ msgid "_Quit"
+#~ msgstr "Выход"
+
+#, fuzzy
+#~ msgid "SelectShell"
+#~ msgstr "Выбор"
+
+#~ msgid "Close"
+#~ msgstr "Закрыть"
diff --git a/po/stamp-po b/po/stamp-po
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/po/sv.gmo b/po/sv.gmo
new file mode 100644
index 0000000..9d841d7
--- /dev/null
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..81febd9
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,2726 @@
+# Swedish translations for gentoo package.
+# Copyright (C) 2002-2014 Emil Brink.
+# This file is distributed under the same license as the gentoo package.
+# Emil Brink <emil@obsession.se>, 2002-2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gentoo\n"
+"Report-Msgid-Bugs-To: Emil Brink\n"
+"POT-Creation-Date: 2016-06-14 11:33+0200\n"
+"PO-Revision-Date: 2002-06-15 17:47+0200\n"
+"Last-Translator: Emil Brink <emil@obsession.se>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Left of Command Buttons"
+msgstr "Till vänster om standardknapparna"
+
+#: src/cfg_buttonlayout.c:65
+msgid "Right of Command Buttons"
+msgstr "Till höger om standardknapparna"
+
+#: src/cfg_buttonlayout.c:66
+msgid "No Padding"
+msgstr "Ingen utfyllnad"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Paned"
+msgstr "Delad"
+
+#: src/cfg_buttonlayout.c:66
+msgid "Static"
+msgstr "Statisk"
+
+#: src/cfg_buttonlayout.c:75
+msgid ""
+"This page lets you control how the Shortcuts button sheet is positioned "
+"relative to\n"
+"the one holding the main Command Buttons. It is more or less a place-holder; "
+"the plan\n"
+"is to provide a lot more flexibility in the button management, and also to "
+"support the\n"
+"creation of more than these two built-in sheets of buttons. But that has yet "
+"to happen.\n"
+"\n"
+"In the meantime, this provides the functionality that was present when the "
+"Shortcuts\n"
+"were a special feature with their own configuration page (up to and "
+"including version\n"
+"0.11.24 of gentoo), for your convenience.\n"
+"\n"
+"To find the Shortcut sheet, switch to the Definitions page, and use the "
+"option menu widget\n"
+"in the top left corner of the page."
+msgstr ""
+"Denna sida låter dig kontrollera hur knapparket Genvägar placeras relativt "
+"till arket Standard,\n"
+"som innehåller de vanliga kommandoknapparna. Det är en tillfällig lösning; "
+"en hel del mer flexibilitet\n"
+"för knappplaceringen är planerat, liksom möjligheten att själv skapa fler "
+"knappark än de två som nu\n"
+"finns inbyggda. Men detta har inte hänt, än.\n"
+"\n"
+"Under tiden bibehåller denna sida de möjligheter som fanns i gentoo när "
+"genvägarna var en speciell\n"
+"uppsättning knappar med sin egen konfigurationssida (den försvann i version "
+"0.11.25). Allt för din\n"
+"bekvämlighet.\n"
+"\n"
+"För att hitta arket Genvägar, byt tillbaka till definitionssidan, och använd "
+"menyn i sidans övre vänstra hörn."
+
+#: src/cfg_buttonlayout.c:88
+msgid "Shortcut Sheet Position"
+msgstr "Placera genvägarna"
+
+#: src/cfg_buttonlayout.c:102
+msgid "Separation Style"
+msgstr "Separationssätt"
+
+#: src/cfg_buttonlayout.c:116
+msgid "Layout"
+msgstr "Placering"
+
+#: src/cfg_buttons.c:308
+msgid "Set Row Width"
+msgstr "Sätt radbredd"
+
+#: src/cfg_buttons.c:326 src/cfg_buttons.c:757
+msgid "Default"
+msgstr "Standard"
+
+#: src/cfg_buttons.c:437 src/overwrite.c:49
+msgid "Please Confirm"
+msgstr "Bekräfta"
+
+#: src/cfg_buttons.c:437
+msgid "Really delete current button row?"
+msgstr "Ta bort nuvarande knapprad?"
+
+#: src/cfg_buttons.c:437 src/cfg_styles.c:721
+msgid "_Delete|_Cancel"
+msgstr "_Ta bort|Av_bryt"
+
+#: src/cfg_buttons.c:461
+msgid "Select Width for New Row"
+msgstr "Välj bredd för ny rad"
+
+#: src/cfg_buttons.c:464
+msgid "Change Width of Row"
+msgstr "Ändra radbredd"
+
+#: src/cfg_buttons.c:613
+msgid "Edit Background Color"
+msgstr "Ändra bakgrundsfärg"
+
+#: src/cfg_buttons.c:663
+msgid "Edit Foreground Color"
+msgstr "Ändra förgrundsfärg"
+
+#: src/cfg_buttons.c:688
+msgid "Label"
+msgstr "Etikett"
+
+#: src/cfg_buttons.c:698 src/cfg_controls.c:605 src/cfg_controls.c:658
+#: src/cfg_controls.c:682
+msgid "Command"
+msgstr "Kommando"
+
+#: src/cfg_buttons.c:709 src/cfg_controls.c:599
+msgid "Key"
+msgstr "Tangent"
+
+#: src/cfg_buttons.c:722
+msgid "Colors"
+msgstr "Färger"
+
+#: src/cfg_buttons.c:726
+msgid "Background..."
+msgstr "Bakgrund..."
+
+#: src/cfg_buttons.c:727 src/cfg_buttons.c:733
+msgid "Reset to Default"
+msgstr "Återställ"
+
+#: src/cfg_buttons.c:732
+msgid "Foreground..."
+msgstr "Förgrund..."
+
+#: src/cfg_buttons.c:757
+msgid "Shortcuts"
+msgstr "Genvägar"
+
+#: src/cfg_buttons.c:758
+msgid "Clear"
+msgstr "Töm"
+
+#: src/cfg_buttons.c:758
+msgid "Copy Colors To"
+msgstr "Kopiera färger till"
+
+#: src/cfg_buttons.c:758
+msgid "Copy To"
+msgstr "Kopiera till"
+
+#: src/cfg_buttons.c:758
+msgid "Swap With"
+msgstr "Byt med"
+
+#: src/cfg_buttons.c:759
+msgid "Add Row..."
+msgstr "Lägg till rad..."
+
+#: src/cfg_buttons.c:759 src/cfg_cmdseq.c:966
+msgid "Delete Row"
+msgstr "Ta bort rad"
+
+#: src/cfg_buttons.c:759
+msgid "Down"
+msgstr "Ner"
+
+#: src/cfg_buttons.c:759
+msgid "Row Width..."
+msgstr "Radbredd..."
+
+#: src/cfg_buttons.c:759
+msgid "Up"
+msgstr "Upp"
+
+#: src/cfg_buttons.c:770
+msgid "Sheet"
+msgstr "Ark"
+
+#: src/cfg_buttons.c:784
+msgid "Primary"
+msgstr "Första"
+
+#: src/cfg_buttons.c:786
+msgid "Secondary"
+msgstr "Andra"
+
+#: src/cfg_buttons.c:791
+msgid "Tooltip"
+msgstr "Tips"
+
+#: src/cfg_buttons.c:799 src/cfg_dirpane.c:1127
+msgid "Flags"
+msgstr "Flaggor"
+
+#: src/cfg_buttons.c:801
+msgid "Narrow?"
+msgstr "Smal?"
+
+#: src/cfg_buttons.c:805
+msgid "Show Tooltip?"
+msgstr "Visa tips?"
+
+#: src/cfg_buttons.c:840
+msgid "Buttons"
+msgstr "Knappar"
+
+#: src/cfg_buttons.c:841 src/cfg_cmdseq.c:1080
+msgid "Definitions"
+msgstr "Definitioner"
+
+#: src/cfg_cmdcfg.c:66
+msgid "Options"
+msgstr "Val"
+
+#: src/cfg_cmdseq.c:607
+msgid "Select Builtin"
+msgstr "Välj inbyggt"
+
+#: src/cfg_cmdseq.c:623
+msgid "Opening brace"
+msgstr "Vänster måsvinge"
+
+#: src/cfg_cmdseq.c:624
+msgid "Closing brace"
+msgstr "Höger måsvinge"
+
+#: src/cfg_cmdseq.c:625
+msgid "First selected"
+msgstr "Första valda"
+
+#: src/cfg_cmdseq.c:626
+msgid "First selected, unselect"
+msgstr "Första valda, välj av"
+
+#: src/cfg_cmdseq.c:627
+msgid "First selected, with path"
+msgstr "Första valda, med sökväg"
+
+#: src/cfg_cmdseq.c:628
+msgid "First selected, with path, unselect"
+msgstr "Första valda, med sökväg, välj av"
+
+#: src/cfg_cmdseq.c:629
+msgid "First selected (destination pane)"
+msgstr "Första valda (destinationspanel)"
+
+#: src/cfg_cmdseq.c:630
+msgid "First selected, no quotes"
+msgstr "Första valda, utan citat"
+
+#: src/cfg_cmdseq.c:631
+msgid "First selected, no extension"
+msgstr "Första valda, utan ändelse"
+
+#: src/cfg_cmdseq.c:632
+msgid "All selected"
+msgstr "Alla valda"
+
+#: src/cfg_cmdseq.c:633
+msgid "All selected, unselect"
+msgstr "Alla valda, välj av"
+
+#: src/cfg_cmdseq.c:634
+msgid "All selected, with paths"
+msgstr "Alla valda, med sökvägar"
+
+#: src/cfg_cmdseq.c:635
+msgid "All selected, with paths, unselect"
+msgstr "Alla valda, med sökvägar, välj av"
+
+#: src/cfg_cmdseq.c:636
+msgid "All selected (destination pane)"
+msgstr "Alla valda (målpanel)"
+
+#: src/cfg_cmdseq.c:637
+msgid "All selected, no quotes"
+msgstr "Alla valda, utan citat"
+
+#: src/cfg_cmdseq.c:638
+msgid "All selected, no extensions"
+msgstr "Alla valda, utan ändelser"
+
+#: src/cfg_cmdseq.c:639
+msgid "Path to source pane's directory"
+msgstr "Sökväg till källpanels katalog"
+
+#: src/cfg_cmdseq.c:640
+msgid "Path to destination pane's directory"
+msgstr "Sökväg till målpanels katalog"
+
+#: src/cfg_cmdseq.c:641
+msgid "Path to home directory"
+msgstr "Sökväg till hemkatalog"
+
+#: src/cfg_cmdseq.c:642
+msgid "Path of left pane"
+msgstr "Vänster panels sökväg"
+
+#: src/cfg_cmdseq.c:643
+msgid "Path of right pane"
+msgstr "Höger panels sökväg"
+
+#: src/cfg_cmdseq.c:644
+msgid "URI of first selected"
+msgstr "URI för första valda"
+
+#: src/cfg_cmdseq.c:645
+msgid "URI of first selected, unselect"
+msgstr "URI för första valda, välj av"
+
+#: src/cfg_cmdseq.c:646
+msgid "URI of first selected, no quotes"
+msgstr "URI för första valda, utan citat"
+
+#: src/cfg_cmdseq.c:647
+msgid "URIs of all selected"
+msgstr "URI:er för alla valda"
+
+#: src/cfg_cmdseq.c:648
+msgid "URIs of all selected, unselect"
+msgstr "URI:er för alla valda, välj av"
+
+#: src/cfg_cmdseq.c:649
+msgid "URIs of all selected, no quotes"
+msgstr "URI:er för alla valda, utan citat"
+
+#: src/cfg_cmdseq.c:650
+msgid "URIs of all selected, unselect, no quotes"
+msgstr "URI:er för alla valda, utan citat"
+
+#: src/cfg_cmdseq.c:651
+msgid "URI of first selected (destination pane)"
+msgstr "URI för första valda (destinationspanel)"
+
+#: src/cfg_cmdseq.c:652
+msgid "Input combo box"
+msgstr "Inmatning, valruta"
+
+#: src/cfg_cmdseq.c:653
+msgid "Input using menu"
+msgstr "Inmatning, meny"
+
+#: src/cfg_cmdseq.c:654
+msgid "Input string"
+msgstr "Inmatning, textsträng"
+
+#: src/cfg_cmdseq.c:655
+msgid "Input check button (gives TRUE or FALSE)"
+msgstr "Inmatning, kryssruta (ger TRUE eller FALSE)"
+
+#: src/cfg_cmdseq.c:656
+msgid "Add label to input window"
+msgstr "Lägg till etikett till inmatningsfönster"
+
+#: src/cfg_cmdseq.c:657
+msgid "Add a separator bar to input window"
+msgstr "Lägg till separatorstreck till inmatningsfönster"
+
+#: src/cfg_cmdseq.c:658
+msgid "$NAME"
+msgstr "$NAMN"
+
+#: src/cfg_cmdseq.c:658
+msgid "Value of $NAME (environment)"
+msgstr "Värdet av $NAMN (miljövariabel)"
+
+#: src/cfg_cmdseq.c:659
+msgid "gentoo's PID"
+msgstr "gentoos process-ID"
+
+#: src/cfg_cmdseq.c:660
+msgid "Home directory for user NAME"
+msgstr "Hemkatalog för användaren NAMN"
+
+#: src/cfg_cmdseq.c:660
+msgid "~NAME"
+msgstr "~NAMN"
+
+#: src/cfg_cmdseq.c:683 src/cmd_split.c:540
+msgid "Pick Code"
+msgstr "Välj kod"
+
+#: src/cfg_cmdseq.c:774
+msgid "(No Options Available)"
+msgstr "(Inga val tillgängliga)"
+
+#: src/cfg_cmdseq.c:810
+msgid "Run in Background?"
+msgstr "Kör i bakgrunden?"
+
+#: src/cfg_cmdseq.c:814
+msgid "Kill Previous Instance?"
+msgstr "Döda tidigare instans?"
+
+#: src/cfg_cmdseq.c:818
+msgid "Survive Quit?"
+msgstr "Överlev avslut?"
+
+#: src/cfg_cmdseq.c:824
+msgid "Capture Output?"
+msgstr "FÃ¥nga utmatning?"
+
+#: src/cfg_cmdseq.c:912
+msgid "Require Source Selection?"
+msgstr "Kräv källval?"
+
+#: src/cfg_cmdseq.c:916
+msgid "Require Destination Selection?"
+msgstr "Kräv destinationsval?"
+
+#: src/cfg_cmdseq.c:921
+msgid "CD Source?"
+msgstr "Byt till källkatalog?"
+
+#: src/cfg_cmdseq.c:924
+msgid "CD Destination?"
+msgstr "Byt till målkatalog?"
+
+#: src/cfg_cmdseq.c:938
+msgid "Rescan Source?"
+msgstr "Läs om källkatalog?"
+
+#: src/cfg_cmdseq.c:942
+msgid "Rescan Destination?"
+msgstr "Läs om målkatalog?"
+
+#: src/cfg_cmdseq.c:955
+msgid "General"
+msgstr "Allmänna"
+
+#: src/cfg_cmdseq.c:958
+msgid "Before"
+msgstr "Före"
+
+#: src/cfg_cmdseq.c:960
+msgid "After"
+msgstr "Efter"
+
+#: src/cfg_cmdseq.c:965
+msgid "Built-In"
+msgstr "Inbyggt"
+
+#: src/cfg_cmdseq.c:965
+msgid "External"
+msgstr "Externt"
+
+#: src/cfg_cmdseq.c:966
+msgid "Add Row"
+msgstr "Lägg till rad"
+
+#: src/cfg_cmdseq.c:966
+msgid "Duplicate"
+msgstr "Duplicera"
+
+#: src/cfg_cmdseq.c:994 src/cfg_styles.c:621 src/cfg_styles.c:867
+#: src/cfg_types.c:677 src/cmd_info.c:151 src/cmd_split.c:653
+#: src/cmd_symlink.c:213 src/dpformat.c:36
+msgid "Name"
+msgstr "Namn"
+
+#: src/cfg_cmdseq.c:1005
+msgid "Definition"
+msgstr "Definition"
+
+#: src/cfg_cmdseq.c:1060
+msgid "Repeat Sequence Until No Source Selection?"
+msgstr "Repetera så länge källval finns?"
+
+#: src/cfg_cmdseq.c:1069 src/cfg_controls.c:617 src/cfg_controls.c:670
+#: src/cfg_styles.c:899 src/cfg_types.c:779
+msgid "Add"
+msgstr "Lägg till"
+
+#: src/cfg_cmdseq.c:1072 src/cfg_controls.c:620 src/cfg_controls.c:673
+#: src/cfg_styles.c:902 src/cfg_types.c:792
+msgid "Delete"
+msgstr "Ta bort"
+
+#: src/cfg_cmdseq.c:1079
+msgid "Commands"
+msgstr "Kommandon"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1314 src/cfg_dirpane.c:1319
+msgid "Left"
+msgstr "Vänster"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Middle"
+msgstr "Mitten"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527 src/cfg_dirpane.c:575
+#: src/cfg_dirpane.c:1313 src/cfg_dirpane.c:1320
+msgid "Right"
+msgstr "Höger"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Down"
+msgstr "Hjul ner"
+
+#: src/cfg_controls.c:154 src/cfg_controls.c:527
+msgid "Wheel Up"
+msgstr "Hjul upp"
+
+#: src/cfg_controls.c:373
+msgid ""
+"The following modifier key(s) must\n"
+"be held down when the mouse button\n"
+"is clicked to trigger the command"
+msgstr ""
+"Dessa modifierartangenter måste hållas\n"
+"nedtryckta när musknappen klickas för\n"
+"att kommandot ska köra:"
+
+#: src/cfg_controls.c:386
+msgid "Edit Modifiers"
+msgstr "Ändra modifierare"
+
+#: src/cfg_controls.c:573
+msgid "Controls"
+msgstr "Kontroller"
+
+#: src/cfg_controls.c:580
+msgid "Global Keyboard Shortcuts"
+msgstr "Globala tangentbordsgenvägar"
+
+#: src/cfg_controls.c:627
+msgid "Dirpane Mouse Buttons"
+msgstr "Panelmusknappar"
+
+#: src/cfg_controls.c:652
+msgid "Button"
+msgstr "Knapp"
+
+#: src/cfg_controls.c:655
+msgid "Edit Modifiers..."
+msgstr "Ändra modifierare..."
+
+#: src/cfg_controls.c:680
+msgid "Click-M-Click Gesture"
+msgstr "Klick-F-Klick Gest"
+
+#: src/cfg_controls.c:690
+msgid "Time Limit"
+msgstr "Tidsgräns"
+
+#: src/cfg_controls.c:701
+msgid "Ignore Num Lock For All Bindings?"
+msgstr "Ignorera Num Lock för alla genvägar?"
+
+#: src/cfg_controls.c:731
+msgid ""
+"Note: The mouse button control settings\n"
+"are ambiguous: the same button+modifier\n"
+"is used for more than one function. This\n"
+"might make their behaviour pretty weird..."
+msgstr ""
+"Observera: musknappsinställningarna är\n"
+"tvetydiga: samma knapp+modifierare är\n"
+"bunden till mer än ett kommando. Detta\n"
+"kan leda till oförutsägbart beteende."
+
+#: src/cfg_controls.c:735
+msgid "Warning"
+msgstr "Varning"
+
+#: src/cfg_controls.c:735 src/children.c:89
+msgid "_OK"
+msgstr "_OK"
+
+#: src/cfg_dirpane.c:334
+msgid "Append Type Character?"
+msgstr "Lägg till typbokstav?"
+
+#: src/cfg_dirpane.c:337
+msgid "Append \"→ destination\" on Links?"
+msgstr "Lägg till \"→ mål\" för länkar?"
+
+#: src/cfg_dirpane.c:359
+msgid "Place Tick Every 3 Digits?"
+msgstr "Märke mellan var tredje siffra?"
+
+#: src/cfg_dirpane.c:370
+msgid "Digits of Precision"
+msgstr "Precision (antal siffror)"
+
+#: src/cfg_dirpane.c:383
+msgid "Show Dir's File System Size?"
+msgstr "Visa storlek för kataloger?"
+
+#: src/cfg_dirpane.c:389 src/cfg_dirpane.c:393 src/cfg_dirpane.c:397
+#: src/cfg_dirpane.c:401 src/cfg_dirpane.c:405 src/cfg_dirpane.c:409
+#: src/cfg_dirpane.c:413 src/cfg_dirpane.c:417 src/cfg_dirpane.c:421
+#: src/cfg_dirpane.c:429
+msgid "Format"
+msgstr "Format"
+
+#: src/cfg_dirpane.c:457
+#, c-format
+msgid "%s Settings"
+msgstr "Inställningar för %s"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:987 src/cfg_dirpane.c:988
+#: src/cmd_select.c:365
+msgid "Content"
+msgstr "Innehåll"
+
+#: src/cfg_dirpane.c:574
+msgid "Justification"
+msgstr "Justering"
+
+#: src/cfg_dirpane.c:574 src/cfg_dirpane.c:988
+msgid "Title"
+msgstr "Titel"
+
+#: src/cfg_dirpane.c:574 src/window.c:203
+msgid "Width"
+msgstr "Bredd"
+
+#: src/cfg_dirpane.c:575
+msgid "Center"
+msgstr "Centrera"
+
+#: src/cfg_dirpane.c:584
+msgid "Basic Settings"
+msgstr "Grundinställningar"
+
+#: src/cfg_dirpane.c:631
+msgid "Edit Column Content"
+msgstr "Ändra kolumninnehåll"
+
+#: src/cfg_dirpane.c:987
+msgid "Default Title"
+msgstr "Förvald titel"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories First"
+msgstr "Kataloger först"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Last"
+msgstr "Kataloger sist"
+
+#: src/cfg_dirpane.c:1013
+msgid "Directories Mixed"
+msgstr "Kataloger blandade"
+
+#: src/cfg_dirpane.c:1014
+msgid "Left of List"
+msgstr "Vänster om listan"
+
+#: src/cfg_dirpane.c:1014
+msgid "Right of List"
+msgstr "Höger om listan"
+
+#: src/cfg_dirpane.c:1014
+msgid "System Default"
+msgstr "Systemstandard"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy From %s"
+msgstr "Kopiera från %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Copy To %s"
+msgstr "Kopiera till %s"
+
+#: src/cfg_dirpane.c:1015
+#, c-format
+msgid "Swap With %s"
+msgstr "Byt med %s"
+
+#: src/cfg_dirpane.c:1032
+msgid "Columns"
+msgstr "Kolumner"
+
+#: src/cfg_dirpane.c:1037
+msgid "Available Content Types"
+msgstr "Tillgängliga innehållstyper"
+
+#: src/cfg_dirpane.c:1054
+msgid "Selected Content Types"
+msgstr "Valda innehållstyper"
+
+#: src/cfg_dirpane.c:1066 src/cfg_styles.c:781
+msgid "Edit..."
+msgstr "Ändra..."
+
+#: src/cfg_dirpane.c:1067 src/cmd_renamere.c:488
+msgid "Remove"
+msgstr "Ta bort"
+
+#: src/cfg_dirpane.c:1081
+msgid "Sorting"
+msgstr "Sortering"
+
+#: src/cfg_dirpane.c:1084
+msgid "Sort On"
+msgstr "Sortera efter"
+
+#: src/cfg_dirpane.c:1088 src/cmd_split.c:595 src/dpformat.c:40
+#: src/dpformat.c:41
+msgid "Mode"
+msgstr "Läge"
+
+#: src/cfg_dirpane.c:1094
+msgid "Inverse Sorting?"
+msgstr "Sortera baklänges?"
+
+#: src/cfg_dirpane.c:1097 src/cfg_paths.c:255 src/cfg_types.c:747
+#: src/cmd_renamere.c:434 src/cmd_renamere.c:464 src/cmd_select.c:462
+#: src/textview.c:620
+msgid "Ignore Case?"
+msgstr "Skilj ej gemener/versaler?"
+
+#: src/cfg_dirpane.c:1105
+msgid "Default Directory"
+msgstr "Startkatalog"
+
+#: src/cfg_dirpane.c:1111
+msgid "Starting Directory"
+msgstr "Startkatalogen"
+
+#: src/cfg_dirpane.c:1114
+msgid "Grab Current"
+msgstr "Spara nuvarande"
+
+#: src/cfg_dirpane.c:1117
+msgid "From History"
+msgstr "Från historiken"
+
+#: src/cfg_dirpane.c:1130
+msgid "Path Above?"
+msgstr "Sökvägen ovanför?"
+
+#: src/cfg_dirpane.c:1134
+msgid "Hide Allowed?"
+msgstr "Använd Dölj-regel?"
+
+#: src/cfg_dirpane.c:1138
+msgid "Scrollbar Always?"
+msgstr "Alltid rullningslist?"
+
+#: src/cfg_dirpane.c:1142
+msgid "Huge Parent Button?"
+msgstr "Stor förälderkatalogsknapp?"
+
+#: src/cfg_dirpane.c:1147
+msgid "Set Custom Font?"
+msgstr "Använd eget typsnitt?"
+
+#: src/cfg_dirpane.c:1156
+msgid "Rubber banding Selection?"
+msgstr "Använd gummibandsmarkering?"
+
+#: src/cfg_dirpane.c:1164
+msgid "Scrollbar Position"
+msgstr "Rullningslistposition"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Horizontal"
+msgstr "Horisontell"
+
+#: src/cfg_dirpane.c:1217 src/cfg_windows.c:85
+msgid "Vertical"
+msgstr "Vertikal"
+
+#: src/cfg_dirpane.c:1218
+msgid "Don't Track"
+msgstr "Följ inte"
+
+#: src/cfg_dirpane.c:1218
+msgid "Ratio"
+msgstr "Förhållande"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Left Pane"
+msgstr "Storlek, vänster panel"
+
+#: src/cfg_dirpane.c:1218
+msgid "Size, Right Pane"
+msgstr "Storlek, höger panel"
+
+#: src/cfg_dirpane.c:1222
+msgid "Pane Orientation"
+msgstr "Panelplacering"
+
+#: src/cfg_dirpane.c:1236
+msgid "Split Tracking"
+msgstr "Följ delning"
+
+#: src/cfg_dirpane.c:1262
+msgid "pixels"
+msgstr "bildpunkter"
+
+#: src/cfg_dirpane.c:1289
+msgid "Remember Selected Rows?"
+msgstr "Lagra valda rader?"
+
+#: src/cfg_dirpane.c:1292
+msgid "Save History Lists?"
+msgstr "Spara historielistor?"
+
+#: src/cfg_dirpane.c:1309 src/cfg_dirpane.c:1318
+msgid "Dir Panes"
+msgstr "Katalogpaneler"
+
+#: src/cfg_dirpane.c:1321
+msgid "Pane Split"
+msgstr "Paneldelning"
+
+#: src/cfg_dirpane.c:1322
+msgid "History"
+msgstr "Historik"
+
+#: src/cfg_dirpane.c:1754
+msgid "'Blocks' Content Deprecated"
+msgstr "Innehållstypen 'Block' stöds inte längre"
+
+#: src/cfg_dirpane.c:1755
+msgid ""
+"The 'Blocks' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"Innehållstypen 'Blocks' för kolumner stöds inte längre,\n"
+"men din konfiguration använder den fortfarande. Den kommer\n"
+"nu att tas bort automatiskt."
+
+#: src/cfg_dirpane.c:1761
+msgid "'Block Size' Content Deprecated"
+msgstr "Innehållstypen 'Block Size' stöds inte längre."
+
+#: src/cfg_dirpane.c:1762
+msgid ""
+"The 'Block Size' column content type is no longer supported,\n"
+"but your configuration is still making use of it. It will be\n"
+"automatically removed."
+msgstr ""
+"Innehållstypen 'Block Size' för kolumner stöds inte längre,\n"
+"men din konfiguration använder den fortfarande. Den kommer\n"
+"nu att tas bort automatiskt."
+
+#: src/cfg_errors.c:48
+msgid "Errors"
+msgstr "Fel"
+
+#: src/cfg_errors.c:55
+msgid "Error and Status Message Display"
+msgstr "Fel- och statusmeddelandevisning"
+
+#: src/cfg_errors.c:57
+msgid "Status Bar, Above Panes"
+msgstr "I statusraden, ovanför katalogpanelerna"
+
+#: src/cfg_errors.c:60
+msgid "Main Window's Title Bar"
+msgstr "I huvudfönstrets titel"
+
+#: src/cfg_errors.c:63
+msgid "Separate Dialog"
+msgstr "I en separat dialog"
+
+#: src/cfg_errors.c:69
+msgid "Cause Console Beep on Error?"
+msgstr "Ring i terminalklockan vid fel?"
+
+#: src/cfg_menus.c:44
+msgid "Menus"
+msgstr "Menyer"
+
+#: src/cfg_nag.c:78
+#, c-format
+msgid ""
+"Click the button below to reset the %zu stored 'Don't show this dialog "
+"again' responses."
+msgstr ""
+"Klicka på knappen nedanför för att återställa alla\n"
+"%zu sparade 'Visa inte den här dialogen igen'-svar."
+
+#: src/cfg_nag.c:100
+msgid "Nagging"
+msgstr "Gnäll"
+
+#: src/cfg_nag.c:110
+msgid "Reset All"
+msgstr "Återställ alla"
+
+#: src/cfg_paths.c:72 src/cfg_paths.c:105
+msgid "Edit path"
+msgstr "Redigera sökväg"
+
+#: src/cfg_paths.c:72
+msgid "_Cancel"
+msgstr "_Avbryt"
+
+#: src/cfg_paths.c:72
+msgid "_Open"
+msgstr "_Öppna"
+
+#: src/cfg_paths.c:179
+msgid "Icons"
+msgstr "Ikoner"
+
+#: src/cfg_paths.c:180
+msgid "GTK+ RC"
+msgstr "GTK+ RC"
+
+#: src/cfg_paths.c:181
+msgid "fstab"
+msgstr "fstab"
+
+#: src/cfg_paths.c:182
+msgid "mtab"
+msgstr "mtab"
+
+#: src/cfg_paths.c:184
+msgid "Beginning With Dot (.)"
+msgstr "Namn som börjar med punkt (.)"
+
+#: src/cfg_paths.c:184
+msgid "Matching RE"
+msgstr "Namn som matchar reg. uttryck"
+
+#: src/cfg_paths.c:184 src/cmd_chmod.c:252 src/menus.c:519
+msgid "None"
+msgstr "Inga"
+
+#: src/cfg_paths.c:190
+msgid "Paths & Hide"
+msgstr "Sökvägar & Dölj"
+
+#: src/cfg_paths.c:197
+msgid "Paths"
+msgstr "Sökvägar"
+
+#: src/cfg_paths.c:236
+msgid "Hide Entries"
+msgstr "Dölj filer"
+
+#: src/cfg_styles.c:180 src/cfg_types.c:233 src/iconutil.c:31 src/menus.c:19
+msgid "(None)"
+msgstr "(Ingen)"
+
+#: src/cfg_styles.c:202 src/cfg_styles.c:459 src/cfg_styles.c:829
+msgid "Delete Action"
+msgstr "Radera åtgärd"
+
+#: src/cfg_styles.c:428 src/color_dialog.c:42
+msgid "Edit Color"
+msgstr "Ändra färg"
+
+#: src/cfg_styles.c:459
+msgid "Revert to Inherited Command"
+msgstr "Återgå till ärvt kommando"
+
+#: src/cfg_styles.c:563
+msgid "Select Command ..."
+msgstr "Välj kommando ..."
+
+#: src/cfg_styles.c:626
+msgid "New Action Property"
+msgstr "Ny åtgärd"
+
+#: src/cfg_styles.c:634
+msgid "something"
+msgstr "nånting"
+
+#: src/cfg_styles.c:720
+msgid ""
+"Deleting this style will also delete\n"
+"all its children. Are you sure?"
+msgstr ""
+"Om du tar bort den här stilen kommer\n"
+"alla stilar som har den som förälder\n"
+"att försvinna. Är du säker?"
+
+#: src/cfg_styles.c:721
+msgid "Confirm Delete"
+msgstr "Bekräfta borttagande"
+
+#: src/cfg_styles.c:744
+msgid "Background Color"
+msgstr "Bakgrundsfärg"
+
+#: src/cfg_styles.c:744
+msgid "Foreground Color"
+msgstr "Förgrundsfärg"
+
+#: src/cfg_styles.c:744 src/dpformat.c:55
+msgid "Icon"
+msgstr "Ikon"
+
+#: src/cfg_styles.c:746
+msgid "(Row Style Preview Text)"
+msgstr "(Förhandsgranska radstil)"
+
+#: src/cfg_styles.c:754 src/cmd_renameseq.c:358 src/cmd_split.c:661
+msgid "Preview"
+msgstr "Exempel"
+
+#: src/cfg_styles.c:777
+msgid "Override Parent's?"
+msgstr "Ersätt förälderns?"
+
+#: src/cfg_styles.c:781
+msgid "Pick..."
+msgstr "Välj..."
+
+#: src/cfg_styles.c:823
+msgid "Add Action..."
+msgstr "Lägg till åtgärd..."
+
+#: src/cfg_styles.c:826
+msgid "Edit Command"
+msgstr "Redigera kommando"
+
+#: src/cfg_styles.c:873 src/menus.c:532
+msgid "Parent"
+msgstr "Förälder"
+
+#: src/cfg_styles.c:886
+msgid "Inherited Properties"
+msgstr "Ärvda egenskaper"
+
+#: src/cfg_styles.c:890
+msgid "Visual"
+msgstr "Visuella"
+
+#: src/cfg_styles.c:892
+msgid "Actions"
+msgstr "Åtgärder"
+
+#: src/cfg_styles.c:909
+msgid "File Recognition"
+msgstr "Filigenkänning"
+
+#: src/cfg_styles.c:910
+msgid "Styles"
+msgstr "Stilar"
+
+#: src/cfg_types.c:192
+#, c-format
+msgid "%s - Click to Change..."
+msgstr "%s - Klicka för att byta..."
+
+#: src/cfg_types.c:506
+msgid "(New Type)"
+msgstr "(Ny typ)"
+
+#: src/cfg_types.c:645
+msgid "B-Dev"
+msgstr "Blockenhet"
+
+#: src/cfg_types.c:645
+msgid "C-Dev"
+msgstr "Teckenenhet"
+
+#: src/cfg_types.c:645
+msgid "Dir"
+msgstr "Katalog"
+
+#: src/cfg_types.c:645
+msgid "FIFO"
+msgstr "FIFO-kö"
+
+#: src/cfg_types.c:645
+msgid "File"
+msgstr "Fil"
+
+#: src/cfg_types.c:645
+msgid "Link"
+msgstr "Länk"
+
+#: src/cfg_types.c:645
+msgid "Socket"
+msgstr "Socket"
+
+#: src/cfg_types.c:646
+msgid "Readable"
+msgstr "Läsbar"
+
+#: src/cfg_types.c:646
+msgid "SetGID"
+msgstr "SetGID"
+
+#: src/cfg_types.c:646
+msgid "SetUID"
+msgstr "SetUID"
+
+#: src/cfg_types.c:646 src/cmd_chmod.c:200
+msgid "Sticky"
+msgstr "Klibbig"
+
+#: src/cfg_types.c:647
+msgid "Executable"
+msgstr "Exekverbar"
+
+#: src/cfg_types.c:647
+msgid "Writable"
+msgstr "Skrivbar"
+
+#: src/cfg_types.c:648
+msgid "Match 'file' (RE)"
+msgstr "Matcha 'file' (RU)"
+
+#: src/cfg_types.c:648
+msgid "Match Name (RE)"
+msgstr "Matcha namn (RU)"
+
+#: src/cfg_types.c:648
+msgid "Require Suffix"
+msgstr "Kräv ändelse"
+
+#: src/cfg_types.c:688
+msgid "Identification"
+msgstr "Identifikation"
+
+#: src/cfg_types.c:690
+msgid "Require Type"
+msgstr "Kräv typ"
+
+#: src/cfg_types.c:704
+msgid "Require Protection"
+msgstr "Kräv skyddsflaggor"
+
+#: src/cfg_types.c:742
+msgid "Glob?"
+msgstr "Skal?"
+
+#: src/cfg_types.c:758
+msgid "Type's Style"
+msgstr "Typens stil"
+
+#: src/cfg_types.c:760
+msgid "Style"
+msgstr "Stil"
+
+#: src/cfg_types.c:800
+msgid "Types"
+msgstr "Typer"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Center On Screen"
+msgstr "Dialoger öppnas mitt på skärmen"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Follow Mouse"
+msgstr "Dialoger öppnas under muspekaren"
+
+#: src/cfg_windows.c:86
+msgid "Dialog Windows Positioned by Window Manager"
+msgstr "Dialoger placeras av fönsterhanteraren"
+
+#: src/cfg_windows.c:94
+msgid "Windows"
+msgstr "Fönster"
+
+#: src/cfg_windows.c:102
+msgid "Window Borders"
+msgstr "Fönsterramar"
+
+#: src/cfg_windows.c:120
+msgid "Dialog Positioning"
+msgstr "Dialogplacering"
+
+#: src/children.c:88
+#, c-format
+msgid "Execution of \"%s\" Failed"
+msgstr "Exekvering av \"%s\" misslyckades"
+
+#: src/children.c:89 src/dialog.c:275
+msgid "Error"
+msgstr "Fel"
+
+#: src/children.c:227
+#, c-format
+msgid "Couldn't terminate child \"%s\" (pid=%d)--zombie alert"
+msgstr "Kunde inte avsluta barnprocessen \"%s\" (pid=%d)--zombievarning"
+
+#: src/cmd_about.c:54
+#, c-format
+msgid "Native CHARSET: \"%s\"."
+msgstr "Teckenkodning (CHARSET): \"%s\"."
+
+#: src/cmd_about.c:68
+#, c-format
+msgid "Filename encoding: \"%s\"."
+msgstr "Teckenkodning för filnamn: \"%s\"."
+
+#: src/cmd_about.c:133
+#, c-format
+msgid "Version %s (GTK+ version %d.%d.%d)."
+msgstr "Version %s (GTK+ version %d.%d.%d)."
+
+#: src/cmd_about.c:136
+msgid "(c) 1998-2016 by Emil Brink, Obsession Development.\n"
+msgstr "(c) 1998-2016 av Emil Brink, Obsession Development.\n"
+
+#: src/cmd_about.c:138
+msgid ""
+"This is free software, and there is ABSOLUTELY NO\n"
+"WARRANTY. Read the file COPYING for more details.\n"
+msgstr ""
+"Det här är fri mjukvara, och det finns INGA SOM\n"
+"HELST GARANTIER. Läs filen COPYING för detaljer.\n"
+
+#: src/cmd_about.c:144
+msgid "NLS: Supported, using built-in English strings."
+msgstr "NLS: Aktivt, svensk översättning av Emil Brink."
+
+#: src/cmd_about.c:157
+#, c-format
+msgid ""
+"The author of gentoo can be reached via Internet\n"
+"e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+"me know what you think of this software, give\n"
+"suggestions/bug reports, and so on.\n"
+"\n"
+"The latest release of gentoo can always be down-\n"
+"loaded from the official gentoo project homepage at\n"
+"<a href=\"%s\">%s</a>."
+msgstr ""
+"Upphovsmannen till gentoo kan nås på mejl till\n"
+"<a href=\"mailto:%s\">%s</a>; dina åsikter om programmet,\n"
+"förslag på förbättringar/felrapporter och så vidare,\n"
+"är välkomna.\n"
+"\n"
+"Den senaste versionen av gentoo kan alltid laddas\n"
+"ner från den officiella hemsidan för projektet, på\n"
+"<a href=\"%s\">%s</a>."
+
+#: src/cmd_about.c:172
+msgid "About gentoo"
+msgstr "Om gentoo"
+
+#: src/cmd_about.c:172
+msgid "_OK (Wait for More)"
+msgstr "_OK (Vänta för mer)"
+
+#: src/cmd_chmod.c:98
+#, c-format
+msgid "Set protection bits for \"%s\":"
+msgstr "Sätt skyddsflaggor för \"%s\":"
+
+#: src/cmd_chmod.c:199 src/cmd_chown.c:174 src/cmd_info.c:282
+msgid "Group"
+msgstr "Grupp"
+
+#: src/cmd_chmod.c:199
+msgid "Others"
+msgstr "Andra"
+
+#: src/cmd_chmod.c:199 src/cmd_info.c:275
+msgid "Owner"
+msgstr "Ägare"
+
+#: src/cmd_chmod.c:199
+msgid "Special"
+msgstr "Speciella"
+
+#: src/cmd_chmod.c:200
+msgid "Execute"
+msgstr "Exekvera"
+
+#: src/cmd_chmod.c:200
+msgid "Read"
+msgstr "Läs"
+
+#: src/cmd_chmod.c:200
+msgid "Set GID"
+msgstr "Sätt GID"
+
+#: src/cmd_chmod.c:200
+msgid "Set UID"
+msgstr "Sätt UID"
+
+#: src/cmd_chmod.c:200
+msgid "Write"
+msgstr "Skriv"
+
+#: src/cmd_chmod.c:222
+msgid "Protection Bits"
+msgstr "Skyddsflaggor"
+
+#: src/cmd_chmod.c:233
+msgid "Textual"
+msgstr "Som text"
+
+#: src/cmd_chmod.c:246
+msgid "Octal"
+msgstr "Oktalt"
+
+#: src/cmd_chmod.c:251 src/menus.c:518
+msgid "All"
+msgstr "Alla"
+
+#: src/cmd_chmod.c:253 src/menus.c:520
+msgid "Toggle"
+msgstr "Växla"
+
+#: src/cmd_chmod.c:254
+msgid "Revert"
+msgstr "Återgå"
+
+#: src/cmd_chmod.c:266 src/cmd_chown.c:199 src/cmd_info.c:386
+msgid "Recurse Directories?"
+msgstr "GÃ¥ igenom kataloger rekursivt?"
+
+#: src/cmd_chmod.c:269
+msgid "Don't Touch Directories?"
+msgstr "Ändra inte på kataloger?"
+
+#: src/cmd_chmod.c:274
+msgid "Change Mode"
+msgstr "Ändra skyddsflaggor"
+
+#: src/cmd_chown.c:57
+#, c-format
+msgid "Set Ownership for '%s':"
+msgstr "Sätt ägare för \"%s\""
+
+#: src/cmd_chown.c:174
+msgid "User"
+msgstr "Användare"
+
+#
+#: src/cmd_chown.c:204
+msgid "Change Ownership"
+msgstr "Ändra ägare"
+
+#: src/cmd_configure.c:50
+msgid "Automatically Save Changed Configuration on Exit?"
+msgstr "Spara ändrad konfiguration automatiskt vid avslut?"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying FIFO: %s"
+msgstr "Fel vid kopiering av FIFO-kö: %s"
+
+#: src/cmd_copy.c:106
+#, c-format
+msgid "Error copying special file: %s"
+msgstr "Fel vid kopiering av specialfil: %s"
+
+#: src/cmd_copy.c:112
+msgid "Error copying special file: no local path"
+msgstr "Fel vid kopiering av specialfil: inget lokalt filnamn"
+
+#: src/cmd_copy.c:225 src/cmd_copyas.c:63
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Copy?"
+msgstr "\"%s\" finns redan - kopiera över ändå?"
+
+#: src/cmd_copy.c:226
+msgid "Copying..."
+msgstr "Kopierar..."
+
+#: src/cmd_copy.c:267
+msgid "Preserve Dates During Copy?"
+msgstr "Behåll datum på kopior?"
+
+#: src/cmd_copy.c:268
+msgid "Ignore Failure to Copy Attributes (Date, Owner, Mode)?"
+msgstr ""
+"Ignorera misslyckad sättning av attribut (datum, ägare, skyddsflaggor)?"
+
+#: src/cmd_copy.c:269
+msgid "Leave Failed Destination if Full Size?"
+msgstr "Lämna fullstor målfil vid fel?"
+
+#: src/cmd_copy.c:270 src/cmd_viewtext.c:204
+msgid "Buffer Size"
+msgstr "Buffertstorlek"
+
+#: src/cmd_copyas.c:50
+#, c-format
+msgid "Enter Name for Copy of \"%s\""
+msgstr "Ange namn för kopia av \"%s\""
+
+#: src/cmd_copyas.c:52
+#, c-format
+msgid "Enter Name for Clone of \"%s\""
+msgstr "Ange namn för klon av \"%s\""
+
+#: src/cmd_copyas.c:65
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Clone?"
+msgstr "\"%s\" finns redan - skriv över med klon?"
+
+#: src/cmd_copyas.c:66
+msgid "Cloning..."
+msgstr "Klonar..."
+
+#: src/cmd_copyas.c:66
+msgid "Copying As..."
+msgstr "Kopierar som..."
+
+#: src/cmd_copyas.c:80
+#, c-format
+msgid "Enter Name to Link \"%s\" As"
+msgstr "Ange namn för länk till \"%s\""
+
+#: src/cmd_copyas.c:82
+#, c-format
+msgid "Enter Name for Link Clone of \"%s\""
+msgstr "Ange namn för länkklon av \"%s\""
+
+#: src/cmd_copyas.c:92
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Symlink?"
+msgstr "\"%s\" finns redan - länka över?"
+
+#: src/cmd_copyas.c:201 src/cmd_copyas.c:208
+msgid "Copy As"
+msgstr "Kopiera som"
+
+#
+#: src/cmd_copyas.c:210
+msgid "Clone"
+msgstr "Klona"
+
+#
+#: src/cmd_copyas.c:212
+msgid "Symbolic Link As"
+msgstr "Skapa symbolisk länk som"
+
+#
+#: src/cmd_copyas.c:214
+msgid "Symbolic Link Clone"
+msgstr "Klona som symbolisk länk"
+
+#: src/cmd_delete.c:56
+#, c-format
+msgid ""
+"%s\n"
+"could not be deleted due to access restrictions.\n"
+"Attempt to change protection and retry?"
+msgstr ""
+"%s\n"
+"kunde inte raderas på grund av skyddsflaggor.\n"
+"Prova ändring och försöka igen?"
+
+#: src/cmd_delete.c:59
+msgid "Remember the answer (alters config)"
+msgstr "Kom ihåg svaret (ändrar konfigurationen)"
+
+#: src/cmd_delete.c:61
+msgid "Access Problem"
+msgstr "Ã…tkomstproblem"
+
+#: src/cmd_delete.c:61
+msgid "Change|Leave Alone"
+msgstr "Ändra|Rör inte"
+
+#: src/cmd_delete.c:215
+#, c-format
+msgid "Really Delete \"%s\"?"
+msgstr "Verkligen ta bort \"%s\"?"
+
+#: src/cmd_delete.c:216
+msgid "Deleting..."
+msgstr "Raderar..."
+
+#: src/cmd_delete.c:279
+msgid "On Access Failure"
+msgstr "Vid åtkomstfel"
+
+#: src/cmd_delete.c:280
+msgid "Ask User|Automatically Try Changing, and Retry|Fail"
+msgstr ""
+"Fråga användaren|Försök automatiskt att ändra, och försök igen|Misslyckas"
+
+#: src/cmd_dpfocus.c:21
+msgid "DpFocus Command is Deprecated"
+msgstr "Kommandot DpFocus stöds inte längre"
+
+#: src/cmd_dpfocus.c:22
+msgid ""
+"The <tt>DpFocus</tt> command has been deprecated and is no longer supported. "
+"Please remove any keyboard or mouse bindings that use it and look into using "
+"the default GTK+ list view's cursor controls."
+msgstr ""
+"Kommandot <tt>DpFocus</tt> stöds inte längre. Ta bort alla referenser till "
+"kommandot (t.ex. från genvägar och musbindningar), och använd istället GTK+:"
+"s inbyggda markörsystem."
+
+#: src/cmd_dpfocusisrch.c:163
+msgid "ISearch"
+msgstr "Sök"
+
+#: src/cmd_generic.c:143
+msgid "_OK|A_ll|_Skip|_Cancel"
+msgstr "_OK|A_lla|_Skippa|Skippa _alla|Av_bryt"
+
+#: src/cmd_generic.c:144
+msgid "_OK|_Skip|_Cancel"
+msgstr "_OK|_Skippa|Av_bryt"
+
+#: src/cmd_getsize.c:51
+msgid "Getting sizes..."
+msgstr "Hämtar storlekar..."
+
+#: src/cmd_getsize.c:134
+msgid "Unselect Rows When Done?"
+msgstr "Avvälj rader?"
+
+#: src/cmd_info.c:68 src/errors.c:84
+#, c-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: src/cmd_info.c:74
+#, c-format
+msgid ""
+"%s dirs, %s files,\n"
+"%u symlinks, %u special files"
+msgstr ""
+"%s kataloger, %s filer,\n"
+"%u länkar, %u speciella filer"
+
+#: src/cmd_info.c:153
+msgid "Value"
+msgstr "Värde"
+
+#: src/cmd_info.c:204
+msgid "Link To"
+msgstr "Länka till"
+
+#: src/cmd_info.c:221 src/cmd_select.c:350 src/dpformat.c:54
+msgid "Type"
+msgstr "Typ"
+
+#: src/cmd_info.c:224
+msgid "Location"
+msgstr "Plats"
+
+#: src/cmd_info.c:227 src/cmd_split.c:658 src/dpformat.c:37 src/window.c:202
+msgid "Size"
+msgstr "Storlek"
+
+#: src/cmd_info.c:237
+#, c-format
+msgid "%s (%s bytes)"
+msgstr "%s (%s byte)"
+
+#: src/cmd_info.c:248
+msgid "Contains"
+msgstr "Innehåller"
+
+#: src/cmd_info.c:265
+msgid "'File' Info"
+msgstr "'File' säger"
+
+#: src/cmd_info.c:293 src/dpformat.c:50
+msgid "Accessed"
+msgstr "Använd"
+
+#: src/cmd_info.c:294 src/dpformat.c:51
+msgid "Modified"
+msgstr "Modifierad"
+
+#: src/cmd_info.c:295 src/dpformat.c:53
+msgid "Changed"
+msgstr "Ändrad"
+
+#: src/cmd_info.c:296 src/dpformat.c:52
+msgid "Created"
+msgstr "Skapad"
+
+#: src/cmd_info.c:298
+msgid "Basic"
+msgstr "Grundläggande"
+
+#: src/cmd_info.c:302
+msgid "Attributes"
+msgstr "Attribut"
+
+#: src/cmd_info.c:352
+msgid "Getting Information..."
+msgstr "Hämtar information..."
+
+#: src/cmd_info.c:384
+msgid "Show 'file' Output?"
+msgstr "Visa utmatning från 'file'?"
+
+#: src/cmd_info.c:387
+msgid "Access Date Format"
+msgstr "Datumformat för Använd"
+
+#: src/cmd_info.c:388
+msgid "Modify Date Format"
+msgstr "Datumformat för Modiferad"
+
+#: src/cmd_info.c:389
+msgid "Change Date Format"
+msgstr "Datumformat för Ändrad"
+
+#: src/cmd_info.c:390
+msgid "Size Tick Mark"
+msgstr "Märke i storlek"
+
+#: src/cmd_join.c:75
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Join?"
+msgstr "\"%s\" finns redan - skriv över med hopslagen fil?"
+
+#: src/cmd_join.c:106
+msgid "Joining..."
+msgstr "Slår ihop..."
+
+#: src/cmd_join.c:204
+msgid "Click and Drag Files to Reorder, Then Click Join."
+msgstr "Klicka och dra för att ändra ordning, klicka sedan \"Slå ihop\"."
+
+#: src/cmd_join.c:213
+#, c-format
+msgid "The total size is %s (%s)."
+msgstr "Total storlek är %s (%s)."
+
+#: src/cmd_join.c:216
+#, c-format
+msgid "The total size is %lu bytes."
+msgstr "Total storlek är %lu byte."
+
+#: src/cmd_join.c:260
+msgid "Enter Destination File Name"
+msgstr "Ange målfilnamn"
+
+#: src/cmd_join.c:275
+msgid "Join"
+msgstr "Slå ihop"
+
+#: src/cmd_join.c:275
+msgid "_Join|_Cancel"
+msgstr "_Slå ihop|Av_bryt"
+
+#: src/cmd_mkdir.c:66
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With MkDir?"
+msgstr "\"%s\" finns redan - skapa katalog ändå?"
+
+#: src/cmd_mkdir.c:120
+msgid "Enter Name of Directory to Create"
+msgstr "Ange namn för ny katalog"
+
+#: src/cmd_mkdir.c:129
+msgid "Make Directory"
+msgstr "Skapa katalog"
+
+#: src/cmd_mkdir.c:152
+msgid "CD Into New Directory?"
+msgstr "Byt till skapad katalog?"
+
+#: src/cmd_mkdir.c:153
+msgid "Focus New Directory?"
+msgstr "Fokusera skapad katalog?"
+
+#: src/cmd_move.c:144 src/cmd_moveas.c:52
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Move?"
+msgstr "\"%s\" finns redan - flytta fil dit ändå?"
+
+#: src/cmd_move.c:145
+msgid "Moving..."
+msgstr "Flyttar..."
+
+#: src/cmd_moveas.c:42
+#, c-format
+msgid "Enter Name to Move \"%s\" As"
+msgstr "Ange namn att flytta \"%s\" som"
+
+#: src/cmd_moveas.c:67
+msgid "Invalid destination name for MoveAs"
+msgstr "Otillåtet destinationsnamn för MoveAs"
+
+#: src/cmd_moveas.c:75
+msgid "Moving As..."
+msgstr "Flyttar som..."
+
+#: src/cmd_moveas.c:106 src/cmd_moveas.c:114
+msgid "Move As"
+msgstr "Flytta som"
+
+#: src/cmd_quit.c:40
+msgid ""
+"You may have some unsaved configuration changes.\n"
+"Quitting without saving will lose them. Really quit?"
+msgstr ""
+"Det verkar finnas konfigurationsändringar, som kommer att\n"
+"förloras om gentoo avslutas utan att de sparats. Avsluta?"
+
+#: src/cmd_quit.c:42 src/cmd_quit.c:54
+msgid "Confirm Quitting"
+msgstr "Bekräfta"
+
+#: src/cmd_quit.c:42
+msgid "_Quit|_Save, then Quit|_Cancel"
+msgstr "_Avsluta|_Spara och avsluta|Av_bryt"
+
+#: src/cmd_quit.c:54
+msgid "Are you sure you want to quit?"
+msgstr "Vill du verkligen avsluta?"
+
+#: src/cmd_rename.c:164
+#, c-format
+msgid "Enter New Name For \"%s\""
+msgstr "Ange nytt namn för \"%s\""
+
+#: src/cmd_rename.c:174 src/cmd_renamere.c:143 src/cmd_renamere.c:226
+#: src/cmd_renamere.c:268 src/cmd_renamere.c:367 src/cmd_renameseq.c:152
+#, c-format
+msgid "\"%s\" Already Exists - Proceed With Rename?"
+msgstr "\"%s\" finns redan - skriv över med omdöpt fil?"
+
+#: src/cmd_rename.c:377
+msgid "Rename"
+msgstr "Döp om"
+
+#: src/cmd_rename.c:394
+msgid "Rename Single File In-Place (Without Dialog)?"
+msgstr "Döp om enskilda filer på plats (utan dialog)?"
+
+#: src/cmd_rename.c:395
+msgid "Automatically Pre-Select"
+msgstr "Förvälj automatiskt"
+
+#: src/cmd_rename.c:395
+msgid "None|Entire Name|Filename Only|Extension Only"
+msgstr "Inget|Hela namnet|Endast filnamnet|Endast ändelse"
+
+#: src/cmd_renamere.c:419
+msgid ""
+"Look for substring in all filenames, and replace\n"
+"it with another string."
+msgstr ""
+"Leta efter delsträng i alla filnamn, och\n"
+"ersätt den med en annan sträng."
+
+#: src/cmd_renamere.c:422
+msgid "Replace"
+msgstr "Ersätt"
+
+#: src/cmd_renamere.c:428
+msgid "With"
+msgstr "Med"
+
+#: src/cmd_renamere.c:438
+msgid "Replace All?"
+msgstr "Ersätt alla?"
+
+#: src/cmd_renamere.c:442
+msgid "Simple"
+msgstr "Enkel"
+
+#: src/cmd_renamere.c:446
+msgid ""
+"Execute the 'From' RE on each filename, storing\n"
+"parenthesised subexpression matches. Then replace\n"
+"any occurance of $n in 'To', where n is the index\n"
+"(counting from 1) of a subexpression, with the text\n"
+"that matched, and use the result as a new filename."
+msgstr ""
+"Kör det reguljära uttrycket \"Från\" på varje filnamn, och\n"
+"lagra matchingar för deluttryck inom parenteser. Ersätt sedan\n"
+"varje förekomst av $n i \"Till\", där n (mellan 1 och 9) är numret\n"
+"på ett deluttryck, med texten som matchade, och använd resultatet\n"
+"som nytt filnamn."
+
+#: src/cmd_renamere.c:453 src/cmd_renamere.c:478
+msgid "From"
+msgstr "Från"
+
+#: src/cmd_renamere.c:459 src/cmd_renamere.c:484
+msgid "To"
+msgstr "Till"
+
+#: src/cmd_renamere.c:467
+msgid "Reg Exp"
+msgstr "Reguljärt uttryck"
+
+#: src/cmd_renamere.c:472
+msgid ""
+"Look for each character in the 'From' string, and replace\n"
+"any hits with the corresponding character in the 'To' string.\n"
+"Then, any characters in the 'Remove' string are removed from\n"
+"the filename, and the result used as the new name for each file."
+msgstr ""
+"Titta efter varje tecken i 'Från'-strängen, och ersätt\n"
+"alla funna tecken med motsvarande tecken ur 'Till'-strängen.\n"
+"Därefter plockas alla tecken som finns med i 'Ta bort'-strängen\n"
+"bort, och resultatet används som nytt filnamn för varje fil."
+
+#: src/cmd_renamere.c:493
+msgid "Map"
+msgstr "Mappa"
+
+#: src/cmd_renamere.c:497
+msgid ""
+"Changes the case (upper/lower) of the characters\n"
+"in the selected filename(s)."
+msgstr ""
+"Ändrar skiftläge (versaler/gemener) på alla bokstäver\n"
+"i det valda filnamnet (eller filnamnen)."
+
+#: src/cmd_renamere.c:499
+msgid "Lower Case?"
+msgstr "Gemener"
+
+#: src/cmd_renamere.c:501
+msgid "Upper Case?"
+msgstr "Versaler"
+
+#: src/cmd_renamere.c:503
+msgid "Upper Case Initial?"
+msgstr "Versal initial?"
+
+#: src/cmd_renamere.c:506
+msgid "Case"
+msgstr "Gemener/versaler"
+
+#: src/cmd_renamere.c:508
+msgid "RenameRE"
+msgstr "Döp om med reguljära uttryck"
+
+#: src/cmd_renameseq.c:281
+msgid "10, Decimal"
+msgstr "10, decimalt"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (A-F)"
+msgstr "16, hexadecimalt (A-F)"
+
+#: src/cmd_renameseq.c:281
+msgid "16, Hex (a-f)"
+msgstr "16, hexadecimalt (a-f)"
+
+#: src/cmd_renameseq.c:281
+msgid "8, Octal"
+msgstr "8, oktalt"
+
+#: src/cmd_renameseq.c:306
+msgid ""
+"This command renames all selected files\n"
+"into a numbered sequence. The controls\n"
+"below let you define how the names are\n"
+"formed."
+msgstr ""
+"Detta kommando döper om valda filer så att\n"
+"en numrerad sekvens skapas. Kontrollerna\n"
+"nedan låter dig styra hur namnen bildas."
+
+#: src/cmd_renameseq.c:313
+msgid "Start At"
+msgstr "Starta på"
+
+#: src/cmd_renameseq.c:325 src/cmd_split.c:614
+msgid "Base"
+msgstr "Bas"
+
+#: src/cmd_renameseq.c:333
+msgid "Precision"
+msgstr "Precision"
+
+#: src/cmd_renameseq.c:340
+msgid "Head"
+msgstr "Start"
+
+#: src/cmd_renameseq.c:347
+msgid "Tail"
+msgstr "Slut"
+
+#: src/cmd_renameseq.c:354
+msgid "Guess"
+msgstr "Gissa"
+
+#: src/cmd_renameseq.c:369
+msgid "Sequential Rename"
+msgstr "Sekvensiell omdöpning"
+
+#: src/cmd_select.c:347
+msgid "All rows|Selected|Unselected|"
+msgstr "Alla rader|Valda|Ovalda|"
+
+#: src/cmd_select.c:348
+msgid "All types|Directories only|Non-directories only|"
+msgstr "Alla typer|Endast kataloger|Endast icke-kataloger|"
+
+#: src/cmd_select.c:349
+msgid "Select|Unselect|Toggle|"
+msgstr "Välj|Avvälj|Växla¦"
+
+#: src/cmd_select.c:350 src/menus.c:537
+msgid "Action"
+msgstr "Åtgärd"
+
+#: src/cmd_select.c:350
+msgid "Set"
+msgstr "Mängd"
+
+#: src/cmd_select.c:453
+msgid "Treat RE as Glob Pattern?"
+msgstr "Behandla RU som skalmönster?"
+
+#: src/cmd_select.c:456
+msgid "Invert RE Matching?"
+msgstr "Invertera RU-matchningen?"
+
+#: src/cmd_select.c:459
+msgid "Require Match on Full Name?"
+msgstr "Kräv matching på hela namn?"
+
+#: src/cmd_select.c:473
+msgid "Select Using RE"
+msgstr "Välj med reguljärt uttryck"
+
+#: src/cmd_select.c:707
+msgid ""
+"Enter shell command to run. The command\n"
+"will have the selected content appended.\n"
+"Action is performed on successful exit."
+msgstr ""
+"Ange skalkommando att köra. Kommandot\n"
+"får det valda innehållet tillagt på slutet,\n"
+"och vald åtgärd görs om exekvering lyckas."
+
+#: src/cmd_select.c:714
+msgid "OK|Cancel"
+msgstr "_OK|Av_bryt"
+
+#: src/cmd_select.c:714
+msgid "Select using shell command"
+msgstr "Välj med skalkommando"
+
+#: src/cmd_split.c:274
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s (%s)."
+msgstr ""
+"Dela \"%s\".\n"
+"Filen är %s (%s)."
+
+#: src/cmd_split.c:276
+#, c-format
+msgid ""
+"Split \"%s\".\n"
+"File is %s."
+msgstr ""
+"Dela \"%s\".\n"
+"Filen är %s."
+
+#: src/cmd_split.c:353
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Split?"
+msgstr "\"%s\" finns redan - skriv över med del av fil?"
+
+#: src/cmd_split.c:427
+msgid "Fixed Size Split"
+msgstr "Dela till konstant storlek"
+
+#: src/cmd_split.c:429
+msgid "Segment Size"
+msgstr "Delstorlek"
+
+#: src/cmd_split.c:432
+msgid "1457000 bytes (3.5\" floppy)"
+msgstr "1457000 byte (3.5-tums diskett)"
+
+#: src/cmd_split.c:433
+msgid "10485760 bytes (10 MB)"
+msgstr "10485760 byte (3.5-tums diskett)"
+
+#: src/cmd_split.c:434
+msgid "26214400 bytes (25 MB)"
+msgstr "26214400 byte (25 MB)"
+
+#: src/cmd_split.c:435
+msgid "52428800 bytes (50 MB)"
+msgstr "52428800 byte (50 MB)"
+
+#: src/cmd_split.c:436
+msgid "78643200 bytes (75 MB)"
+msgstr "78643200 byte (75 MB)"
+
+#: src/cmd_split.c:437
+msgid "100431360 bytes (95 MB, Zip disk)"
+msgstr "100431360 byte (95 MB, Zip-skiva)"
+
+#: src/cmd_split.c:459
+msgid "Fixed Count Split"
+msgstr "Dela till konstant storlek"
+
+#: src/cmd_split.c:462
+msgid "Segment Count"
+msgstr "Delstorlek"
+
+#: src/cmd_split.c:508
+msgid "Current part number, unique for every created file"
+msgstr "Nuvarande delnummer, unikt för varje skapad fil"
+
+#: src/cmd_split.c:509
+msgid "The value from the Base box"
+msgstr "Värdet från Bas-rutan"
+
+#: src/cmd_split.c:510
+msgid "The amount that index will change for each file"
+msgstr "Hur mycket indexet ska ändras för varje fil"
+
+#: src/cmd_split.c:511
+msgid "The total number of files that will be created"
+msgstr "Det totala antalet filer som kommer att skapas"
+
+#: src/cmd_split.c:512
+msgid "The value of index for the last file to be created"
+msgstr "Indexets värde för sista filen som skapas"
+
+#: src/cmd_split.c:513
+msgid "The part's offset into the original file"
+msgstr "Delens position i originalfilen"
+
+#: src/cmd_split.c:575
+msgid "Fixed size, variable number of parts"
+msgstr "Konstant storlek, variabelt antal delar"
+
+#: src/cmd_split.c:576
+msgid "Fixed number of parts, variable sizes"
+msgstr "Konstant antal delar, variabel delstorlek"
+
+#: src/cmd_split.c:585 src/cmd_split.c:668
+msgid "Split"
+msgstr "Dela"
+
+#: src/cmd_split.c:604
+msgid "Name Format"
+msgstr "Namnformat"
+
+#: src/cmd_split.c:620
+msgid "Step"
+msgstr "Steg"
+
+#: src/cmd_split.c:629
+msgid "Zero-Fill Numbers?"
+msgstr "Nollfyll numren?"
+
+#: src/cmd_split.c:650
+msgid "Offset"
+msgstr "Offset"
+
+#: src/cmd_symlink.c:68 src/cmd_symlink.c:254
+#, c-format
+msgid "\"%s\" Already Exists - Continue With Link?"
+msgstr "\"%s\" finns redan - länka över?"
+
+#: src/cmd_symlink.c:161 src/configure.c:281 src/icon_dialog.c:59
+#: src/progress.c:224
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/cmd_symlink.c:161 src/configure.c:275 src/dialog.c:275
+#: src/nag_dialog.c:38
+msgid "OK"
+msgstr "OK"
+
+#: src/cmd_symlink.c:161
+msgid "Select Link Target"
+msgstr "Välj länkmål"
+
+#: src/cmd_symlink.c:220
+msgid "Contents"
+msgstr "Innehåll"
+
+#: src/cmd_symlink.c:233
+msgid "Edit Symbolic Link"
+msgstr "Ändra symbolisk länk"
+
+#: src/cmd_symlink.c:238
+msgid "Create Symbolic Link"
+msgstr "Skapa symbolisk länk"
+
+#: src/cmd_viewtext.c:205
+msgid "Hex-Check First"
+msgstr "Binärtesta första"
+
+#: src/cmd_viewtext.c:206
+msgid "Exit on Left Arrow Key?"
+msgstr "Stäng när vänster piltangent trycks ner?"
+
+#: src/cmdarg.c:201
+msgid "on"
+msgstr "på"
+
+#: src/cmdarg.c:201
+msgid "true"
+msgstr "sant"
+
+#: src/cmdarg.c:201
+msgid "yes"
+msgstr "ja"
+
+#: src/cmdgrab.c:173
+#, c-format
+msgid "Output of %s (pid %d)"
+msgstr "Utmatning från %s (pid %d)"
+
+#: src/cmdseq.c:351 src/cmdseq.c:366
+#, c-format
+msgid ""
+"Unable to execute unknown\n"
+"command \"%s\"."
+msgstr ""
+"Kan inte exekvera okänt\n"
+"kommando \"%s\"."
+
+#: src/cmdseq_dialog.c:160
+#, c-format
+msgid "Built-Ins (%u)"
+msgstr "Inbyggda (%u)"
+
+#: src/cmdseq_dialog.c:165
+#, c-format
+msgid "User Defined (%u)"
+msgstr "Användardefinierade (%u)"
+
+#: src/cmdseq_dialog.c:239
+msgid "Select a command, or type part of its name."
+msgstr "Välj ett kommando, eller skriv en del av namnet."
+
+#: src/cmdseq_dialog.c:253
+msgid "Select Command"
+msgstr "Välj kommando"
+
+#: src/configure.c:240
+msgid "Couldn't open configuration file for output"
+msgstr "Kunde inte öppna konfigurationsfilen för skrivning"
+
+#: src/configure.c:278
+msgid "Save"
+msgstr "Spara"
+
+#: src/configure.c:551
+msgid "Configuration Path Notice"
+msgstr "Meddelande angående inställningsfil"
+
+#: src/configure.c:551
+msgid ""
+"Configuration was not loaded from the current default location.\n"
+"Press Save in the Configuration window to update."
+msgstr ""
+"Inställningsfilen laddades inte från standardplatsen.\n"
+"Öppna Inställningsfönstret och klicka Spara för att uppdatera."
+
+#: src/configure.c:562
+#, c-format
+msgid "Config file version (%s) doesn't match program version (%s)"
+msgstr "Konfigurationsfilens version (%s) matchar inte programmets (%s)"
+
+#: src/configure.c:574
+#, c-format
+msgid ""
+"Couldn't find any configuration file; checked:\n"
+"\"%s\",\n"
+"\"%s\" and\n"
+"\"%s\".\n"
+"Using built-in minimal configuration."
+msgstr ""
+"Hittade ingen konfigurationsfil, testade:\n"
+"\"%s\",\n"
+"\"%s\" och\n"
+"\"%s\".\n"
+"Använder inbyggd minimal konfiguration."
+
+#: src/dialog.c:122 src/dialog.c:246
+msgid "_OK|_Cancel"
+msgstr "_OK|Av_bryt"
+
+#: src/dirpane.c:505
+#, c-format
+msgid "%u/%u dirs, %u/%u files"
+msgstr "%u/%u kataloger, %u/%u filer"
+
+#: src/dirpane.c:510
+#, c-format
+msgid " (%s/%s)"
+msgstr " (%s/%s)"
+
+#: src/dirpane.c:521
+#, c-format
+msgid ", %s (%s) used"
+msgstr ", %s (%s) använt"
+
+#: src/dirpane.c:523
+#, c-format
+msgid ", %s free"
+msgstr ", %s ledigt"
+
+#: src/dirpane.c:2060 src/dirpane.c:2108
+msgid "Move up to the parent directory"
+msgstr "Gå till katalogen ovanför denna"
+
+#: src/dirpane.c:2083
+msgid "Enter path, then press Return to go there"
+msgstr "Ange katalog, och tryck Retur för att gå dit"
+
+#: src/dirpane.c:2084
+msgid "H"
+msgstr "D"
+
+#: src/dirpane.c:2088
+msgid ""
+"Click to enable/disable Hide rule (When pressed in, the hide rule is active, "
+"and matching entries are hidden)"
+msgstr ""
+"Klicka för att sätta på/stänga av Dölj-regeln (när knappen är intryckt, är "
+"regeln aktiv, och matchande filer döljs)"
+
+#: src/dpformat.c:38
+msgid "Blocks"
+msgstr "Block"
+
+#: src/dpformat.c:39
+msgid "BSize"
+msgstr "Blockstorlek"
+
+#: src/dpformat.c:39
+msgid "Block Size"
+msgstr "Blockstorlek"
+
+#: src/dpformat.c:40
+msgid "Mode, numerical"
+msgstr "Skyddsflaggor, som tal"
+
+#: src/dpformat.c:41
+msgid "Mode, string"
+msgstr "Skyddsflaggor, som text"
+
+#: src/dpformat.c:42
+msgid "Nlink"
+msgstr "Länkar"
+
+#: src/dpformat.c:42
+msgid "Number of links"
+msgstr "Antal länkar"
+
+#: src/dpformat.c:43
+msgid "Owner ID"
+msgstr "Ägar-ID"
+
+#: src/dpformat.c:43
+msgid "Uid"
+msgstr "ÄgarID"
+
+#: src/dpformat.c:44
+msgid "Owner Name"
+msgstr "Ägarnamn"
+
+#: src/dpformat.c:44
+msgid "Uname"
+msgstr "Ägarnamn"
+
+#: src/dpformat.c:45
+msgid "Gid"
+msgstr "Grupp-id"
+
+#: src/dpformat.c:45
+msgid "Group ID"
+msgstr "Grupp-ID"
+
+#: src/dpformat.c:46
+msgid "Gname"
+msgstr "Grupp"
+
+#: src/dpformat.c:46
+msgid "Group Name"
+msgstr "Gruppnamn"
+
+#: src/dpformat.c:47
+msgid "Device"
+msgstr "Enhet"
+
+#: src/dpformat.c:47
+msgid "Device Number"
+msgstr "Enhetsnummer"
+
+#: src/dpformat.c:48
+msgid "DevMaj"
+msgstr "Enhet"
+
+#: src/dpformat.c:48
+msgid "Device Number, major"
+msgstr "Enhetsnummer, major"
+
+#: src/dpformat.c:49
+msgid "DevMin"
+msgstr "Enhet"
+
+#: src/dpformat.c:49
+msgid "Device Number, minor"
+msgstr "Enhetsnummer, minor"
+
+#: src/dpformat.c:50
+msgid "Time of Last Access"
+msgstr "Datum för senaste åtkomst"
+
+#: src/dpformat.c:51
+msgid "Time of Last Modification"
+msgstr "Datum för senaste modifiering"
+
+#: src/dpformat.c:52
+msgid "Time of Creation"
+msgstr "Datum för skapande"
+
+#: src/dpformat.c:53
+msgid "Time of Last Change"
+msgstr "Datum för senaste ändring"
+
+#: src/dpformat.c:54
+msgid "Type Name"
+msgstr "Typnamn"
+
+#: src/dpformat.c:55
+msgid "I"
+msgstr "I"
+
+#: src/dpformat.c:56
+msgid "URI"
+msgstr "URI"
+
+#: src/dpformat.c:56
+msgid "URI (without file prefix)"
+msgstr "URI (utan file-prefix)"
+
+#: src/errors.c:59
+#, c-format
+msgid "Couldn't %s \"%s\": %s (code %d)"
+msgstr "Kunde inte %s \"%s\": %s (kod %d)"
+
+#: src/errors.c:61
+#, c-format
+msgid "Couldn't %s \"%s\" (code %d)"
+msgstr "Kunde inte %s \"%s\" (kod %d)"
+
+#: src/errors.c:66
+#, c-format
+msgid "Couldn't %s \"%s\""
+msgstr "Kunde inte %s \"%s\""
+
+#: src/errors.c:68
+#, c-format
+msgid "Couldn't %s"
+msgstr "Kunde inte %s"
+
+#: src/errors.c:88
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: src/gentoo.c:474
+msgid "Report the version to standard output, and exit"
+msgstr "Ange versionsnumret på standardutmatning, och avsluta"
+
+#: src/gentoo.c:476
+msgid "Report internal locale details, and exit"
+msgstr "Ange interna lokaliseringsdetaljer, och avsluta"
+
+#: src/gentoo.c:478
+msgid "Allows gentoo to be run by the root user. Could be dangerous!"
+msgstr "Tillåter att gentoo körs av rotanvändaren. Kan vara farligt!"
+
+#: src/gentoo.c:479
+msgid ""
+"Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use "
+"default values"
+msgstr ""
+"Ladda inte konfigurationsfilen ~/.config/gentoo/gentoorc; använd istället "
+"standardvärden"
+
+#: src/gentoo.c:480
+msgid ""
+"Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use "
+"system defaults"
+msgstr ""
+"Ladda inte GTK+-konfigurationssfilen ~/.config/gentoo/gtkrc; använd istället "
+"systemets standardvärden"
+
+#: src/gentoo.c:481
+msgid ""
+"Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty "
+"history"
+msgstr ""
+"Ladda inte ~/.config/gentoo/dirhistory; starta istället med tom historik"
+
+#: src/gentoo.c:482
+msgid ""
+"Run COMMAND, a gentoo command. Done before user interaction allowed, but "
+"after configuration file has been read in. Can be used many times to run "
+"several commands in sequence"
+msgstr ""
+"Kör KOMMANDO, ett gentoo-kommando. Görs innan användaren kan börja "
+"interagera, men efter konfigurationsfilen har lästs in. Kan användas många "
+"gånger för att köra flera kommandon efter varandra"
+
+#: src/gentoo.c:483
+msgid "COMMAND"
+msgstr "KOMMANDO"
+
+#: src/gentoo.c:484 src/gentoo.c:485
+msgid "DIR"
+msgstr "KATALOG"
+
+#: src/gentoo.c:484
+msgid ""
+"Use DIR as path for the left directory pane. Overrides default (and history)"
+msgstr ""
+"Använd KATALOG som sökväg för vänster panel. Ersätter standardsökväg (och "
+"historia)"
+
+#: src/gentoo.c:485
+msgid ""
+"Use DIR as path for the right directory pane. Overrides default (and history)"
+msgstr ""
+"Använd KATALOG som sökväg för höger panel. Ersätter standardsökväg (och "
+"historia)"
+
+#: src/gentoo.c:486
+msgid "Print a list of all built-in commands, and exit"
+msgstr "Skriv ut en lista av alla inbyggda kommandon, och avsluta"
+
+#: src/gentoo.c:506
+msgid "- a graphical file manager using GTK+"
+msgstr "- en grafisk filhanterare baserad på GTK+"
+
+#: src/gentoo.c:511
+#, c-format
+msgid "Failed to parse command line options: %s\n"
+msgstr "Misslyckades med att tolka kommandoradparametrarna: %s\n"
+
+#: src/gentoo.c:551
+#, c-format
+msgid "%s: To allow running as root, use the '--root-ok' option\n"
+msgstr "%s: För att köra som rotanvändaren, ange växeln '--root-ok'\n"
+
+#: src/gentoo.c:588
+msgid "Couldn't initialize userinfo module - username resolving won't work"
+msgstr ""
+"Kunde inte initialisera användarinformationen - hemkataloguppslagning ej "
+"möjlig"
+
+#: src/gentoo.c:622
+#, c-format
+msgid "gentoo v%s by Emil Brink <emil@obsession.se>"
+msgstr "gentoo v%s av Emil Brink <emil@obsession.se>"
+
+#: src/gentoo.c:629
+msgid "Development Version Warning"
+msgstr "Varning, utvecklingsversion"
+
+#: src/gentoo.c:629
+#, fuzzy
+msgid ""
+"This version of gentoo is considered somewhat new and untested.\n"
+"There have been major changes to almost all parts of the program since the "
+"previous version.\n"
+"Please be a bit careful, and make sure you report any problem to the author. "
+"Thanks."
+msgstr ""
+"Den här versionen av gentoo anses vara ganska ny och därmed otestad. Stora "
+"förändringar har gjorts i nästan alla viktiga delar av programmet sedan den "
+"förra versionsserien. Försök vara extra försiktig, och rapportera eventuella "
+"problem till upphovsmannen. Tack."
+
+#: src/guiutil.c:111
+msgid "Progress"
+msgstr "Status"
+
+#: src/icon_dialog.c:52
+msgid "Pick Icon"
+msgstr "Välj ikon"
+
+#: src/icon_dialog.c:59
+msgid "Loading Icon Graphics..."
+msgstr "Laddar ikongrafik"
+
+#: src/menus.c:284
+msgid "(No Selection)"
+msgstr "(Inga valda filer)"
+
+#: src/menus.c:521
+msgid "RegExp..."
+msgstr "Reguljärt uttryck"
+
+#: src/menus.c:533
+msgid "Other"
+msgstr "Andra"
+
+#: src/menus.c:534
+msgid "Rescan"
+msgstr "Uppdatera"
+
+#: src/menus.c:535
+msgid "Select"
+msgstr "Välj"
+
+#: src/menus.c:539
+msgid "Run..."
+msgstr "Kör..."
+
+#: src/menus.c:541
+msgid "Configure..."
+msgstr "Konfigurera..."
+
+#: src/menus.c:618
+msgid "Select Menu"
+msgstr "Välj meny"
+
+#: src/nag_dialog.c:35
+msgid "_Don't show this dialog again"
+msgstr "Visa _inte den här dialogen igen"
+
+#: src/overwrite.c:49
+msgid "_OK|A_ll|_Skip|Skip _All|_Cancel"
+msgstr "_OK|A_lla|_Skippa|Skippa _alla|Av_bryt"
+
+#: src/progress.c:210
+#, c-format
+msgid "Total (%s)"
+msgstr "Total (%s)"
+
+#: src/progress.c:307
+#, c-format
+msgid "%u day, %02u:%02u:%02u"
+msgstr "%u dag, %02u:%02u:%02u"
+
+#: src/progress.c:309
+#, c-format
+msgid "%u days, %02u:%02u:%02u"
+msgstr "%u dagar, %02u:%02u:%02u"
+
+#: src/progress.c:346
+#, c-format
+msgid "Elapsed %02d:%02d Speed %s/s ETA %s"
+msgstr "Tid %02d:%02d Hastighet %s/s Klar ca %s"
+
+#: src/sizeutil.c:31
+msgid "Unformatted Size"
+msgstr "Oformaterad storlek"
+
+#: src/sizeutil.c:32
+msgid "Formatted Size, Without Unit"
+msgstr "Formaterad storlek, utan enhet"
+
+#: src/sizeutil.c:33
+msgid "Formatted Size, in Bytes"
+msgstr "Formaterad storlek, i byte"
+
+#: src/sizeutil.c:33 src/sizeutil.c:159
+msgid "bytes"
+msgstr "byte"
+
+#: src/sizeutil.c:34
+msgid "Formatted Size, in Kilobytes"
+msgstr "Formaterad storlek, i kilobyte"
+
+#: src/sizeutil.c:34 src/sizeutil.c:163
+msgid "KB"
+msgstr "KB"
+
+#: src/sizeutil.c:35
+msgid "Formatted Size, in Megabytes"
+msgstr "Formaterad storlek, i megabyte"
+
+#: src/sizeutil.c:35 src/sizeutil.c:167
+msgid "MB"
+msgstr "MB"
+
+#: src/sizeutil.c:36
+msgid "Formatted Size, in Gigabytes"
+msgstr "Formaterad storlek, i gigabyte"
+
+#: src/sizeutil.c:36 src/sizeutil.c:171
+msgid "GB"
+msgstr "GB"
+
+#: src/sizeutil.c:37
+msgid "Formatted Size, in Terabytes"
+msgstr "Formaterad storlek, i terabyte"
+
+#: src/sizeutil.c:37 src/sizeutil.c:175
+msgid "TB"
+msgstr "TB"
+
+#: src/sizeutil.c:38
+msgid "Formatted Size, Automatic Unit"
+msgstr "Formaterad storlek, automatisk enhet"
+
+#: src/style_dialog.c:40
+msgid "Select Style"
+msgstr "Välj stil"
+
+#: src/styles.c:114
+msgid "Root"
+msgstr "Rot"
+
+#: src/styles.c:120 src/types.c:292 src/types.c:295
+msgid "Directory"
+msgstr "Katalog"
+
+#: src/styles.c:893
+#, c-format
+msgid "New Style %u"
+msgstr "Ny stil %u"
+
+#: src/textview.c:202
+#, c-format
+msgid ""
+"\n"
+"** Text conversion from charset '%s' failed, aborting."
+msgstr ""
+"\n"
+"** Textkonvertering från teckenuppsättningen '%s' misslyckades, avbryter."
+
+#: src/textview.c:421
+#, c-format
+msgid "Line %d (%.0f%%)"
+msgstr "Rad %d (%.0f%%)"
+
+#: src/textview.c:471
+msgid "Enter Line Number or Percentage:"
+msgstr "Ange radnummer eller procenttal"
+
+#: src/textview.c:477
+msgid "Goto"
+msgstr "GÃ¥ till"
+
+#: src/textview.c:612
+msgid "Enter Text to Search For (RE)"
+msgstr "Ange söktext (reguljärt uttryck)"
+
+#: src/textview.c:623
+msgid "Don't Span Newlines?"
+msgstr "Passera ej nyrad?"
+
+#: src/textview.c:629
+msgid "Search"
+msgstr "Sök"
+
+#: src/types.c:287
+msgid "Unknown"
+msgstr "Okänd"
+
+#: src/types.c:572
+#, c-format
+msgid ""
+"Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated "
+"prematurely."
+msgstr ""
+"Signalen SIGPIPE inträffade vid kommunikation med 'file'-processen (%s), det "
+"verkar som om 'file' oväntat har avslutats."
+
+#: src/types.c:578
+msgid "Unable to run spawn 'file' command: "
+msgstr "Kunde inte starta 'file'-kommandot: "
+
+#: src/window.c:81
+msgid "Configure gentoo"
+msgstr "Konfigurera gentoo"
+
+#: src/window.c:87
+msgid "Text Viewer"
+msgstr "Textvisare"
+
+#: src/window.c:202
+msgid "Position"
+msgstr "Position"
+
+#: src/window.c:203
+msgid "Height"
+msgstr "Höjd"
+
+#: src/window.c:203
+msgid "X"
+msgstr "X"
+
+#: src/window.c:203
+msgid "Y"
+msgstr "Y"
+
+#: src/window.c:210
+msgid "Set on Open?"
+msgstr "Sätt vid öppning?"
+
+#: src/window.c:216
+msgid "Update on Close?"
+msgstr "Uppdatera vid stängning?"
+
+#: src/window.c:249
+msgid "Grab"
+msgstr "Plocka"
+
+#~ msgid "Ruled Rows?"
+#~ msgstr "Linjerade rader?"
+
+#~ msgid "XML module emitted locale-dependant real number"
+#~ msgstr "XML-modulen skrev ett locale-beroende reellt tal"
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..eb0194c
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,212 @@
+# -----------------------------------------------------------------------------
+# gentoo main makefile
+# -----------------------------------------------------------------------------
+
+headers=buttons.h \
+ buttonlayout.h \
+ cfg_buttons.h \
+ cfg_buttonlayout.h \
+ cfg_cmdcfg.h \
+ cfg_cmdseq.h \
+ cfg_controls.h \
+ cfg_dialogs.h \
+ cfg_dirpane.h \
+ cfg_errors.h\
+ cfg_menus.h \
+ cfg_module.h \
+ cfg_nag.h \
+ cfg_paths.h \
+ cfg_styles.h \
+ cfg_types.h \
+ cfg_windows.h \
+ children.h \
+ cmd_about.h \
+ cmd_activate.h \
+ cmd_chmod.h \
+ cmd_chown.h \
+ cmd_configure.h \
+ cmd_copy.h \
+ cmd_copyas.h \
+ cmd_delete.h \
+ cmd_direnter.h \
+ cmd_dirrescan.h \
+ cmd_dpfocus.h \
+ cmd_dpfocusisrch.h \
+ cmd_dpmisc.h \
+ cmd_file.h \
+ cmd_generic.h \
+ cmd_getsize.h \
+ cmd_info.h \
+ cmd_join.h \
+ cmd_menupopup.h \
+ cmd_mkdir.h \
+ cmd_move.h \
+ cmd_moveas.h \
+ cmd_parent.h \
+ cmd_quit.h \
+ cmd_rename.h \
+ cmd_renamere.h \
+ cmd_renameseq.h \
+ cmd_run.h \
+ cmd_select.h \
+ cmd_split.h \
+ cmd_swap.h \
+ cmd_symlink.h \
+ cmd_viewtext.h \
+ cmdarg.h \
+ cmdgrab.h \
+ cmdparse.h \
+ cmdseq.h \
+ cmdseq_config.h \
+ cmdseq_dialog.h \
+ color_dialog.h \
+ configure.h \
+ convstream.h \
+ commands.h \
+ controls.h \
+ dialog.h \
+ dirhistory.h \
+ dirpane.h \
+ dpformat.h \
+ errors.h \
+ events.h \
+ file.h \
+ fileutil.h \
+ gfam.h \
+ gentoo.h \
+ gnu-gettext.h \
+ guiutil.h \
+ hash_dialog.h \
+ icon_dialog.h \
+ iconutil.h \
+ list_dialog.h \
+ keyboard.h \
+ menus.h \
+ mntent_wrap.h \
+ miscutil.h \
+ nag_dialog.h \
+ odmultibutton.h \
+ overwrite.h \
+ progress.h \
+ queue.h \
+ sizeutil.h \
+ strutil.h \
+ style_dialog.h \
+ styles.h \
+ textview.h \
+ types.h \
+ userinfo.h \
+ window.h \
+ xmlutil.h
+
+modules=buttons.c \
+ buttonlayout.c \
+ cfg_buttons.c \
+ cfg_buttonlayout.c \
+ cfg_cmdcfg.c \
+ cfg_cmdseq.c \
+ cfg_controls.c \
+ cfg_dialogs.c \
+ cfg_dirpane.c \
+ cfg_errors.c\
+ cfg_menus.c \
+ cfg_nag.c \
+ cfg_paths.c \
+ cfg_styles.c \
+ cfg_types.c \
+ cfg_windows.c \
+ children.c \
+ cmd_about.c \
+ cmd_activate.c \
+ cmd_chmod.c \
+ cmd_chown.c \
+ cmd_configure.c \
+ cmd_copy.c \
+ cmd_copyas.c \
+ cmd_delete.c \
+ cmd_direnter.c \
+ cmd_dirrescan.c \
+ cmd_dpfocus.c \
+ cmd_dpfocusisrch.c \
+ cmd_dpmisc.c \
+ cmd_file.c \
+ cmd_generic.c \
+ cmd_getsize.c \
+ cmd_info.c \
+ cmd_join.c \
+ cmd_menupopup.c \
+ cmd_mkdir.c \
+ cmd_move.c \
+ cmd_moveas.c \
+ cmd_parent.c \
+ cmd_quit.c \
+ cmd_rename.c \
+ cmd_renamere.c \
+ cmd_renameseq.c \
+ cmd_run.c \
+ cmd_select.c \
+ cmd_split.c \
+ cmd_swap.c \
+ cmd_symlink.c \
+ cmd_viewtext.c \
+ cmdarg.c \
+ cmdgrab.c \
+ cmdparse.c \
+ cmdseq.c \
+ cmdseq_config.c \
+ cmdseq_dialog.c \
+ color_dialog.c \
+ configure.c \
+ controls.c \
+ convstream.c \
+ dialog.c \
+ dirhistory.c \
+ dirpane.c \
+ dpformat.c \
+ errors.c \
+ events.c \
+ file.c \
+ fileutil.c \
+ gfam.c \
+ gentoo.c \
+ guiutil.c \
+ hash_dialog.c \
+ icon_dialog.c \
+ iconutil.c \
+ keyboard.c \
+ list_dialog.c \
+ menus.c \
+ miscutil.c \
+ mntent_wrap.c \
+ nag_dialog.c \
+ odmultibutton.c \
+ overwrite.c \
+ progress.c \
+ queue.c \
+ sizeutil.c \
+ strutil.c \
+ style_dialog.c \
+ styles.c \
+ textview.c \
+ types.c \
+ userinfo.c \
+ window.c \
+ xmlutil.c
+
+# This is the compiled-in graphics. It's mostly default icons,
+# but also the logo for the About window.
+graphics=graphics
+
+# Targets ---------------------------------------------------------------------
+
+localedir=@localedir@
+
+AM_CFLAGS=@GENTOO_CFLAGS@ @GTK_CFLAGS@ -I../widgets \
+ -DPATH_CFG=\"$(sysconfdir)\" \
+ -DPATH_GRC=\"$$HOME/\" \
+ -DPATH_ICN=\"$(datadir)/gentoo/icons\"\
+ -DLOCALEDIR=\"$(localedir)\"
+
+bin_PROGRAMS=gentoo
+gentoo_SOURCES=$(headers) $(modules) $(graphics)
+gentoo_LDADD=@GTK_LIBS@ @MODULES_LIBS@
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..dc1fcd6
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,940 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -----------------------------------------------------------------------------
+# gentoo main makefile
+# -----------------------------------------------------------------------------
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = gentoo$(EXEEXT)
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__objects_1 =
+am__objects_2 = buttons.$(OBJEXT) buttonlayout.$(OBJEXT) \
+ cfg_buttons.$(OBJEXT) cfg_buttonlayout.$(OBJEXT) \
+ cfg_cmdcfg.$(OBJEXT) cfg_cmdseq.$(OBJEXT) \
+ cfg_controls.$(OBJEXT) cfg_dialogs.$(OBJEXT) \
+ cfg_dirpane.$(OBJEXT) cfg_errors.$(OBJEXT) cfg_menus.$(OBJEXT) \
+ cfg_nag.$(OBJEXT) cfg_paths.$(OBJEXT) cfg_styles.$(OBJEXT) \
+ cfg_types.$(OBJEXT) cfg_windows.$(OBJEXT) children.$(OBJEXT) \
+ cmd_about.$(OBJEXT) cmd_activate.$(OBJEXT) cmd_chmod.$(OBJEXT) \
+ cmd_chown.$(OBJEXT) cmd_configure.$(OBJEXT) cmd_copy.$(OBJEXT) \
+ cmd_copyas.$(OBJEXT) cmd_delete.$(OBJEXT) \
+ cmd_direnter.$(OBJEXT) cmd_dirrescan.$(OBJEXT) \
+ cmd_dpfocus.$(OBJEXT) cmd_dpfocusisrch.$(OBJEXT) \
+ cmd_dpmisc.$(OBJEXT) cmd_file.$(OBJEXT) cmd_generic.$(OBJEXT) \
+ cmd_getsize.$(OBJEXT) cmd_info.$(OBJEXT) cmd_join.$(OBJEXT) \
+ cmd_menupopup.$(OBJEXT) cmd_mkdir.$(OBJEXT) cmd_move.$(OBJEXT) \
+ cmd_moveas.$(OBJEXT) cmd_parent.$(OBJEXT) cmd_quit.$(OBJEXT) \
+ cmd_rename.$(OBJEXT) cmd_renamere.$(OBJEXT) \
+ cmd_renameseq.$(OBJEXT) cmd_run.$(OBJEXT) cmd_select.$(OBJEXT) \
+ cmd_split.$(OBJEXT) cmd_swap.$(OBJEXT) cmd_symlink.$(OBJEXT) \
+ cmd_viewtext.$(OBJEXT) cmdarg.$(OBJEXT) cmdgrab.$(OBJEXT) \
+ cmdparse.$(OBJEXT) cmdseq.$(OBJEXT) cmdseq_config.$(OBJEXT) \
+ cmdseq_dialog.$(OBJEXT) color_dialog.$(OBJEXT) \
+ configure.$(OBJEXT) controls.$(OBJEXT) convstream.$(OBJEXT) \
+ dialog.$(OBJEXT) dirhistory.$(OBJEXT) dirpane.$(OBJEXT) \
+ dpformat.$(OBJEXT) errors.$(OBJEXT) events.$(OBJEXT) \
+ file.$(OBJEXT) fileutil.$(OBJEXT) gfam.$(OBJEXT) \
+ gentoo.$(OBJEXT) guiutil.$(OBJEXT) hash_dialog.$(OBJEXT) \
+ icon_dialog.$(OBJEXT) iconutil.$(OBJEXT) keyboard.$(OBJEXT) \
+ list_dialog.$(OBJEXT) menus.$(OBJEXT) miscutil.$(OBJEXT) \
+ mntent_wrap.$(OBJEXT) nag_dialog.$(OBJEXT) \
+ odmultibutton.$(OBJEXT) overwrite.$(OBJEXT) progress.$(OBJEXT) \
+ queue.$(OBJEXT) sizeutil.$(OBJEXT) strutil.$(OBJEXT) \
+ style_dialog.$(OBJEXT) styles.$(OBJEXT) textview.$(OBJEXT) \
+ types.$(OBJEXT) userinfo.$(OBJEXT) window.$(OBJEXT) \
+ xmlutil.$(OBJEXT)
+am_gentoo_OBJECTS = $(am__objects_1) $(am__objects_2) $(am__objects_1)
+gentoo_OBJECTS = $(am_gentoo_OBJECTS)
+gentoo_DEPENDENCIES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(gentoo_SOURCES)
+DIST_SOURCES = $(gentoo_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATE = @DATE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GENTOO_CFLAGS = @GENTOO_CFLAGS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MODULES_CFLAGS = @MODULES_CFLAGS@
+MODULES_LIBS = @MODULES_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+
+# Targets ---------------------------------------------------------------------
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+headers = buttons.h \
+ buttonlayout.h \
+ cfg_buttons.h \
+ cfg_buttonlayout.h \
+ cfg_cmdcfg.h \
+ cfg_cmdseq.h \
+ cfg_controls.h \
+ cfg_dialogs.h \
+ cfg_dirpane.h \
+ cfg_errors.h\
+ cfg_menus.h \
+ cfg_module.h \
+ cfg_nag.h \
+ cfg_paths.h \
+ cfg_styles.h \
+ cfg_types.h \
+ cfg_windows.h \
+ children.h \
+ cmd_about.h \
+ cmd_activate.h \
+ cmd_chmod.h \
+ cmd_chown.h \
+ cmd_configure.h \
+ cmd_copy.h \
+ cmd_copyas.h \
+ cmd_delete.h \
+ cmd_direnter.h \
+ cmd_dirrescan.h \
+ cmd_dpfocus.h \
+ cmd_dpfocusisrch.h \
+ cmd_dpmisc.h \
+ cmd_file.h \
+ cmd_generic.h \
+ cmd_getsize.h \
+ cmd_info.h \
+ cmd_join.h \
+ cmd_menupopup.h \
+ cmd_mkdir.h \
+ cmd_move.h \
+ cmd_moveas.h \
+ cmd_parent.h \
+ cmd_quit.h \
+ cmd_rename.h \
+ cmd_renamere.h \
+ cmd_renameseq.h \
+ cmd_run.h \
+ cmd_select.h \
+ cmd_split.h \
+ cmd_swap.h \
+ cmd_symlink.h \
+ cmd_viewtext.h \
+ cmdarg.h \
+ cmdgrab.h \
+ cmdparse.h \
+ cmdseq.h \
+ cmdseq_config.h \
+ cmdseq_dialog.h \
+ color_dialog.h \
+ configure.h \
+ convstream.h \
+ commands.h \
+ controls.h \
+ dialog.h \
+ dirhistory.h \
+ dirpane.h \
+ dpformat.h \
+ errors.h \
+ events.h \
+ file.h \
+ fileutil.h \
+ gfam.h \
+ gentoo.h \
+ gnu-gettext.h \
+ guiutil.h \
+ hash_dialog.h \
+ icon_dialog.h \
+ iconutil.h \
+ list_dialog.h \
+ keyboard.h \
+ menus.h \
+ mntent_wrap.h \
+ miscutil.h \
+ nag_dialog.h \
+ odmultibutton.h \
+ overwrite.h \
+ progress.h \
+ queue.h \
+ sizeutil.h \
+ strutil.h \
+ style_dialog.h \
+ styles.h \
+ textview.h \
+ types.h \
+ userinfo.h \
+ window.h \
+ xmlutil.h
+
+modules = buttons.c \
+ buttonlayout.c \
+ cfg_buttons.c \
+ cfg_buttonlayout.c \
+ cfg_cmdcfg.c \
+ cfg_cmdseq.c \
+ cfg_controls.c \
+ cfg_dialogs.c \
+ cfg_dirpane.c \
+ cfg_errors.c\
+ cfg_menus.c \
+ cfg_nag.c \
+ cfg_paths.c \
+ cfg_styles.c \
+ cfg_types.c \
+ cfg_windows.c \
+ children.c \
+ cmd_about.c \
+ cmd_activate.c \
+ cmd_chmod.c \
+ cmd_chown.c \
+ cmd_configure.c \
+ cmd_copy.c \
+ cmd_copyas.c \
+ cmd_delete.c \
+ cmd_direnter.c \
+ cmd_dirrescan.c \
+ cmd_dpfocus.c \
+ cmd_dpfocusisrch.c \
+ cmd_dpmisc.c \
+ cmd_file.c \
+ cmd_generic.c \
+ cmd_getsize.c \
+ cmd_info.c \
+ cmd_join.c \
+ cmd_menupopup.c \
+ cmd_mkdir.c \
+ cmd_move.c \
+ cmd_moveas.c \
+ cmd_parent.c \
+ cmd_quit.c \
+ cmd_rename.c \
+ cmd_renamere.c \
+ cmd_renameseq.c \
+ cmd_run.c \
+ cmd_select.c \
+ cmd_split.c \
+ cmd_swap.c \
+ cmd_symlink.c \
+ cmd_viewtext.c \
+ cmdarg.c \
+ cmdgrab.c \
+ cmdparse.c \
+ cmdseq.c \
+ cmdseq_config.c \
+ cmdseq_dialog.c \
+ color_dialog.c \
+ configure.c \
+ controls.c \
+ convstream.c \
+ dialog.c \
+ dirhistory.c \
+ dirpane.c \
+ dpformat.c \
+ errors.c \
+ events.c \
+ file.c \
+ fileutil.c \
+ gfam.c \
+ gentoo.c \
+ guiutil.c \
+ hash_dialog.c \
+ icon_dialog.c \
+ iconutil.c \
+ keyboard.c \
+ list_dialog.c \
+ menus.c \
+ miscutil.c \
+ mntent_wrap.c \
+ nag_dialog.c \
+ odmultibutton.c \
+ overwrite.c \
+ progress.c \
+ queue.c \
+ sizeutil.c \
+ strutil.c \
+ style_dialog.c \
+ styles.c \
+ textview.c \
+ types.c \
+ userinfo.c \
+ window.c \
+ xmlutil.c
+
+
+# This is the compiled-in graphics. It's mostly default icons,
+# but also the logo for the About window.
+graphics = graphics
+AM_CFLAGS = @GENTOO_CFLAGS@ @GTK_CFLAGS@ -I../widgets \
+ -DPATH_CFG=\"$(sysconfdir)\" \
+ -DPATH_GRC=\"$$HOME/\" \
+ -DPATH_ICN=\"$(datadir)/gentoo/icons\"\
+ -DLOCALEDIR=\"$(localedir)\"
+
+gentoo_SOURCES = $(headers) $(modules) $(graphics)
+gentoo_LDADD = @GTK_LIBS@ @MODULES_LIBS@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+gentoo$(EXEEXT): $(gentoo_OBJECTS) $(gentoo_DEPENDENCIES) $(EXTRA_gentoo_DEPENDENCIES)
+ @rm -f gentoo$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gentoo_OBJECTS) $(gentoo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buttonlayout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buttons.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_buttonlayout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_buttons.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_cmdcfg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_cmdseq.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_controls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_dialogs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_dirpane.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_errors.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_menus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_nag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_paths.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_styles.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_types.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_windows.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/children.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_about.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_activate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_chmod.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_chown.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_configure.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_copy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_copyas.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_delete.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_direnter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_dirrescan.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_dpfocus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_dpfocusisrch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_dpmisc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_file.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_generic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_getsize.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_info.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_join.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_menupopup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_mkdir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_move.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_moveas.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_parent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_quit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_rename.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_renamere.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_renameseq.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_run.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_select.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_split.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_swap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_symlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd_viewtext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdarg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdgrab.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdseq.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdseq_config.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdseq_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configure.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/controls.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convstream.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirhistory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirpane.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dpformat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errors.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gentoo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfam.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guiutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icon_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iconutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyboard.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miscutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mntent_wrap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nag_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/odmultibutton.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overwrite.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sizeutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/style_dialog.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/styles.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textview.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/userinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlutil.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \
+ distclean distclean-compile distclean-generic distclean-tags \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am install-binPROGRAMS install-data install-data-am \
+ install-dvi install-dvi-am install-exec install-exec-am \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/buttonlayout.c b/src/buttonlayout.c
new file mode 100644
index 0000000..cbf0b15
--- /dev/null
+++ b/src/buttonlayout.c
@@ -0,0 +1,146 @@
+/*
+** 2002-05-31 - This is the beginning for something long overdue; layout for buttons.
+** In this initial version, there are only two "sheets" of buttons that
+** need to be laid out: the classic commands ("Default") and the one with
+** the shortcuts ("Shortcuts", really). In the future, I hope this will
+** expand a bit.
+*/
+
+#include "gentoo.h"
+
+#include "xmlutil.h"
+
+#include "buttonlayout.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Hold information about how the buttons are to be laid out. This will probably
+** be completely replaced by the "real" version, sometime in the future.
+*/
+struct ButtonLayout {
+ gboolean sc_right; /* Shortcuts to the right of default buttons? */
+ BtlSep sep_mode;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+ButtonLayout * btl_buttonlayout_new(void)
+{
+ ButtonLayout *btl;
+
+ btl = g_malloc(sizeof *btl);
+ btl->sc_right = FALSE;
+ btl->sep_mode = BTL_SEP_PANED;
+
+ return btl;
+}
+
+ButtonLayout * btl_buttonlayout_new_copy(const ButtonLayout *original)
+{
+ ButtonLayout *btl;
+
+ btl = btl_buttonlayout_new();
+ btl_buttonlayout_copy(btl, original);
+ return btl;
+}
+
+void btl_buttonlayout_copy(ButtonLayout *dest, const ButtonLayout *src)
+{
+ if(dest != NULL && src != NULL)
+ *dest = *src;
+}
+
+void btl_buttonlayout_destroy(ButtonLayout *btl)
+{
+ g_free(btl);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void btl_buttonlayout_set_right(ButtonLayout *btl, gboolean right)
+{
+ btl->sc_right = right;
+}
+
+gboolean btl_buttonlayout_get_right(const ButtonLayout *btl)
+{
+ return btl->sc_right;
+}
+
+void btl_buttonlayout_set_separation(ButtonLayout *btl, BtlSep sep)
+{
+ btl->sep_mode = sep;
+}
+
+BtlSep btl_buttonlayout_get_separation(const ButtonLayout *btl)
+{
+ return btl->sep_mode;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+GtkWidget * btl_buttonlayout_pack(const ButtonLayout *btl, GtkWidget *sheet_default, GtkWidget *sheet_shortcuts)
+{
+ GtkWidget *hbox, *left, *right, *sep, *pane;
+
+ /* If one of the two sheets is empty, return the other one, no fancy layout needed. */
+ if(sheet_default && !sheet_shortcuts)
+ return sheet_default;
+ else if(!sheet_default && sheet_shortcuts)
+ return sheet_shortcuts;
+ else if(!sheet_default && !sheet_shortcuts) /* Both sheets empty? */
+ return NULL;
+
+ left = btl->sc_right ? sheet_default : sheet_shortcuts;
+ right = btl->sc_right ? sheet_shortcuts : sheet_default;
+
+ switch(btl->sep_mode)
+ {
+ case BTL_SEP_NONE:
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), left, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), right, TRUE, TRUE, 0);
+ return hbox;
+ case BTL_SEP_SIMPLE:
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), left, TRUE, TRUE, 0);
+ sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+ gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), right, TRUE, TRUE, 0);
+ return hbox;
+ case BTL_SEP_PANED:
+ pane = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_paned_add1(GTK_PANED(pane), left);
+ gtk_paned_add2(GTK_PANED(pane), right);
+ return pane;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void btl_buttonlayout_save(const ButtonLayout *btl, FILE *out)
+{
+ xml_put_node_open(out, "ButtonLayout");
+ xml_put_node_open(out, "ShortcutSheet");
+ xml_put_boolean(out, "right", btl->sc_right);
+ xml_put_integer(out, "separation", btl->sep_mode);
+ xml_put_node_close(out, "ShortcutSheet");
+ xml_put_node_close(out, "ButtonLayout");
+}
+
+ButtonLayout * btl_buttonlayout_load(MainInfo *min, const XmlNode *node)
+{
+ gboolean tmp;
+ gint sep;
+
+ if((node = xml_tree_search(node, "ShortcutSheet")) == NULL)
+ return min->cfg.buttonlayout;
+
+ if(xml_get_boolean(node, "right", &tmp))
+ min->cfg.buttonlayout->sc_right = tmp;
+ if(xml_get_integer(node, "separation", &sep))
+ min->cfg.buttonlayout->sep_mode = sep;
+
+ return min->cfg.buttonlayout;
+}
diff --git a/src/buttonlayout.h b/src/buttonlayout.h
new file mode 100644
index 0000000..15d5a5f
--- /dev/null
+++ b/src/buttonlayout.h
@@ -0,0 +1,30 @@
+/*
+** 2002-05-31 - Interface for the (temporary) button layout module.
+*/
+
+#if !defined BUTTON_LAYOUT_H
+#define BUTTON_LAYOUT_H
+
+#include "xmlutil.h"
+
+typedef struct ButtonLayout ButtonLayout;
+
+typedef enum { BTL_SEP_NONE = 0, BTL_SEP_SIMPLE, BTL_SEP_PANED } BtlSep;
+
+extern ButtonLayout * btl_buttonlayout_new(void);
+extern ButtonLayout * btl_buttonlayout_new_copy(const ButtonLayout *original);
+extern void btl_buttonlayout_copy(ButtonLayout *dest, const ButtonLayout *src);
+extern void btl_buttonlayout_destroy(ButtonLayout *btl);
+
+extern void btl_buttonlayout_set_right(ButtonLayout *btl, gboolean right);
+extern gboolean btl_buttonlayout_get_right(const ButtonLayout *btl);
+
+extern void btl_buttonlayout_set_separation(ButtonLayout *btl, BtlSep sep);
+extern BtlSep btl_buttonlayout_get_separation(const ButtonLayout *btl);
+
+extern GtkWidget * btl_buttonlayout_pack(const ButtonLayout *btl, GtkWidget *sheet_default, GtkWidget *sheet_shortcuts);
+
+extern void btl_buttonlayout_save(const ButtonLayout *btl, FILE *out);
+extern ButtonLayout * btl_buttonlayout_load(MainInfo *min, const XmlNode *node);
+
+#endif /* BUTTON_LAYOUT_H */
diff --git a/src/buttons.c b/src/buttons.c
new file mode 100644
index 0000000..ad86d66
--- /dev/null
+++ b/src/buttons.c
@@ -0,0 +1,1245 @@
+/*
+** 1998-09-14 - A complete rewrite from scratch (original version written yesterday :().
+** Now handles a set of button "sheets". A sheet is a named collection of
+** button rows. Each row can contain an arbitrary number of buttons.
+** 1999-05-01 - Huge changes and increased data structure opacity to implement multi-
+** faceted widgets. Will probably be a huge win. :^)
+** 1999-05-12 - Found and fixed a couple of seemingly old memory allocation bugs.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "cmdseq.h"
+#include "menus.h"
+#include "odmultibutton.h"
+#include "strutil.h"
+#include "xmlutil.h"
+
+#include "buttons.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define BTN_DEFAULT_SHEET "Default"
+
+/* This holds the color for a face. It includes a 'valid' member since it's entierly
+** possible not to set the color (at all) for a face, thus getting the default color
+** for the current GTK+ theme (I hope/assume/think). Therefore we need to know if the
+** color is actually in-use or not.
+*/
+typedef struct {
+ gboolean valid;
+ GdkColor color;
+} BColor;
+
+struct Button { /* A run-time button definition, as stored in button banks. */
+ gchar label[BTN_FACES][BTN_LABEL_SIZE]; /* User-visible text to label button with. */
+ GString *cmdseq[BTN_FACES]; /* Command sequence to run when clicked. */
+ gchar key[BTN_FACES][KEY_NAME_SIZE]; /* Keyboard shortcut. */
+ BColor color[BTN_FACES][2]; /* Back- and foreground colors for each face. */
+ gchar menu[MNU_MENU_NAME_SIZE]; /* Name of menu bound to this button. */
+ gchar tooltip[BTN_TOOLTIP_SIZE]; /* Tooltip (help text) for this button. */
+ guint32 flags; /* Various flags. See BTF_XXX defines in header. */
+};
+
+struct ButtonRow { /* A single row of buttons. */
+ guint width; /* How many buttons in this row? */
+ Button *button; /* A vector of button definitions. */
+};
+
+struct ButtonSheet { /* A "sheet" of buttons; basically a list of rows. */
+ gchar label[BTN_LABEL_SIZE]; /* The list has a name, which might be handy in the future. */
+ guint height; /* Number of rows (length of <rows> list). */
+ guint visible; /* Number of rows to keep visible. */
+ guint top_row; /* Index of currently topmost visible row. */
+ GList *rows; /* List of rows for this sheet. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean button_set_face(GtkWidget *widget, BtnFace face);
+
+static ButtonSheet * btn_buttonsheet_new_default_commands(MainInfo *min);
+static ButtonSheet * btn_buttonsheet_new_default_shortcuts(MainInfo *min);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Set the given <bti> to the default (built-in) buttons. */
+void btn_buttoninfo_new_default(MainInfo *min, ButtonInfo *bti)
+{
+ ButtonSheet *bsh;
+
+ bti->sheets = NULL;
+ bsh = btn_buttonsheet_new_default_commands(min);
+ bti->sheets = g_list_append(bti->sheets, bsh);
+ bsh = btn_buttonsheet_new_default_shortcuts(min);
+ bti->sheets = g_list_append(bti->sheets, bsh);
+}
+
+/* 1998-09-15 - Copy <src> into <dst>, which really should be empty (or uninitialized). */
+void btn_buttoninfo_copy(ButtonInfo *dst, ButtonInfo *src)
+{
+ ButtonSheet *bsh;
+ GList *iter;
+
+ dst->sheets = NULL;
+
+ for(iter = src->sheets; iter != NULL; iter = g_list_next(iter))
+ {
+ if((bsh = btn_buttonsheet_copy(iter->data)) != NULL)
+ dst->sheets = g_list_append(dst->sheets, bsh);
+ }
+}
+
+/* 1998-12-25 - Add a buttonsheet to given buttoninfo. Really simple stuff. */
+void btn_buttoninfo_add_sheet(ButtonInfo *bti, ButtonSheet *bsh)
+{
+ GList *iter, *next;
+
+ if(bti == NULL || bsh == NULL)
+ return;
+ for(iter = bti->sheets; iter != NULL; iter = next)
+ {
+ next = g_list_next(iter);
+ if(strcmp(((ButtonSheet *) iter->data)->label, bsh->label) == 0)
+ {
+ bti->sheets = g_list_remove_link(bti->sheets, iter);
+ btn_buttonsheet_destroy(iter->data);
+ g_list_free_1(iter);
+ }
+ }
+ bti->sheets = g_list_append(bti->sheets, bsh);
+}
+
+/* 1998-09-15 - Destroy all button sheets described by <bti>. */
+void btn_buttoninfo_clear(ButtonInfo *bti)
+{
+ GList *iter;
+
+ for(iter = bti->sheets; iter != NULL; iter = g_list_next(iter))
+ btn_buttonsheet_destroy(iter->data);
+ g_list_free(bti->sheets);
+ bti->sheets = NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-01 - Save button face definitions. */
+static void save_button_faces(Button *b, FILE *out)
+{
+ const gchar *str, *str2;
+ guint i;
+ GdkColor col;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ if((str = btn_button_get_cmdseq(b, i)) != NULL)
+ {
+ xml_put_node_open(out, "BFace");
+ xml_put_uinteger(out, "face", i);
+ if((str2 = btn_button_get_label(b, i)) != NULL)
+ xml_put_text(out, "label", str2);
+ if((str2 = btn_button_get_cmdseq(b, i)) != NULL)
+ xml_put_text(out, "cmdseq", str2);
+ if((str2 = btn_button_get_key(b, i)) != NULL)
+ xml_put_text(out, "key", str2);
+ if(btn_button_get_color_bg(b, i, &col))
+ xml_put_color(out, "bg", &col);
+ if(btn_button_get_color_fg(b, i, &col))
+ xml_put_color(out, "fg", &col);
+ xml_put_node_close(out, "BFace");
+ }
+ }
+}
+
+/* 1998-09-15 - Save a single button. Note how we use the <pos> thing to allow suppression
+** of empty buttons on load.
+** 1999-05-01 - Adapted to the new multi-face view of buttons.
+*/
+static void save_button(Button *b, guint pos, FILE *out)
+{
+ const gchar *str;
+
+ if(!btn_button_is_blank(b)) /* Avoid saving completely empty buttons. */
+ {
+ xml_put_node_open(out, "Button");
+ xml_put_uinteger(out, "pos", pos);
+
+ xml_put_node_open(out, "BFaces");
+ save_button_faces(b, out);
+ xml_put_node_close(out, "BFaces");
+
+ if((str = btn_button_get_tooltip(b)) != NULL)
+ xml_put_text(out, "tooltip", str);
+ xml_put_uinteger(out, "flags", btn_button_get_flags(b));
+ xml_put_node_close(out, "Button");
+ }
+}
+
+/* 1998-09-15 - Save a row of buttons. */
+static void save_row(gpointer r, gpointer f)
+{
+ FILE *out = f;
+ ButtonRow *brw = r;
+ guint i;
+
+ xml_put_node_open(out, "ButtonRow");
+ xml_put_integer(out, "width", brw->width);
+ xml_put_node_open(out, "ButtonRowButtons");
+ for(i = 0; i < brw->width; i++)
+ save_button(brw->button + i, i, out);
+ xml_put_node_close(out, "ButtonRowButtons");
+ xml_put_node_close(out, "ButtonRow");
+}
+
+/* 1998-09-15 - Save a sheet of buttons. */
+static void save_sheet(gpointer s, gpointer f)
+{
+ FILE *out = f;
+ ButtonSheet *bsh = s;
+
+ xml_put_node_open(out, "ButtonSheet");
+ xml_put_text(out, "label", bsh->label);
+ xml_put_node_open(out, "ButtonSheetRows");
+ g_list_foreach(bsh->rows, save_row, f);
+ xml_put_node_close(out, "ButtonSheetRows");
+ xml_put_node_close(out, "ButtonSheet");
+}
+
+/* 1999-05-01 - Save all currently defined buttons. */
+void btn_buttoninfo_save(MainInfo *min, const ButtonInfo *bti, FILE *out, const gchar *tag)
+{
+ xml_put_node_open(out, tag);
+ g_list_foreach(bti->sheets, save_sheet, out);
+ xml_put_node_close(out, tag);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-01 - Load the face definitions for a given button. */
+static void load_button_faces(const XmlNode *node, gpointer button)
+{
+ Button *btn = button; /* Saves a few casts. */
+ const gchar *str;
+ guint face;
+ GdkColor tmp_c;
+
+ if(xml_get_uinteger(node, "face", &face))
+ {
+ if(xml_get_text(node, "label", &str))
+ btn_button_set_label(btn, face, str);
+ if(xml_get_text(node, "cmdseq", &str))
+ btn_button_set_cmdseq(btn, face, str);
+ if(xml_get_text(node, "key", &str))
+ btn_button_set_key(btn, face, str);
+ if(xml_get_color(node, "bg", &tmp_c))
+ btn_button_set_color_bg(btn, face, &tmp_c);
+ if(xml_get_color(node, "fg", &tmp_c))
+ btn_button_set_color_fg(btn, face, &tmp_c);
+ }
+}
+
+/* 1999-05-01 - Load a single button. Moved and adapted from cfg_buttons, where it used to
+** live up to now.
+** FIXMEFIXME - This function contains backwards-compatibility. Yuck. Remove later.
+*/
+static void load_button(const XmlNode *node, gpointer r)
+{
+ ButtonRow *brw = r;
+ Button *btn;
+ const gchar *str;
+ gint pos;
+ guint pos2;
+
+ if(xml_get_integer(node, "pos", &pos)) /* If position is signed, it's the old format. */
+ {
+ gint tmp;
+
+ btn = brw->button + pos;
+ if(xml_get_text(node, "label", &str))
+ btn_button_set_label(btn, BTN_PRIMARY, str);
+ if(xml_get_text(node, "cmd_seq", &str))
+ btn_button_set_cmdseq(btn, BTN_PRIMARY, str);
+ if(xml_get_text(node, "key", &str))
+ btn_button_set_key(btn, BTN_PRIMARY, str);
+
+ if(xml_get_text(node, "tooltip", &str))
+ btn_button_set_tooltip(btn, str);
+
+ if(xml_get_boolean(node, "narrow", &tmp))
+ btn_button_set_flags_boolean(btn, BTF_NARROW, tmp);
+ if(xml_get_boolean(node, "show_tooltip", &tmp))
+ btn_button_set_flags_boolean(btn, BTF_SHOW_TOOLTIP, tmp);
+ }
+ else if(xml_get_uinteger(node, "pos", &pos2)) /* If position is unsigned (more logical), we're modern. */
+ {
+ guint tmpu;
+ const XmlNode *bfaces;
+
+ btn = brw->button + pos2;
+
+ if((bfaces = xml_tree_search(node, "BFaces")) != NULL)
+ xml_node_visit_children(bfaces, load_button_faces, btn);
+
+ if(xml_get_text(node, "tooltip", &str))
+ btn_button_set_tooltip(btn, str);
+ if(xml_get_uinteger(node, "flags", &tmpu))
+ btn_button_set_flags(btn, tmpu);
+ }
+}
+
+static void load_row(const XmlNode *node, gpointer s)
+{
+ ButtonSheet *bsh = s;
+ ButtonRow *brw;
+ const XmlNode *data;
+ gint width;
+
+ if(xml_get_integer(node, "width", &width))
+ {
+ if(width >= 1)
+ {
+ if((brw = btn_buttonrow_new(width)) != NULL)
+ {
+ if((data = xml_tree_search(node, "ButtonRowButtons")) != NULL)
+ xml_node_visit_children(data, load_button, brw);
+ btn_buttonsheet_append_row(bsh, brw);
+ }
+ }
+ else
+ fprintf(stderr, "**BUTTONS: A row width of %d is unsupportedly silly\n", width);
+ }
+}
+
+static void load_sheet(const XmlNode *node, gpointer user)
+{
+ ButtonSheet *bsh;
+ const XmlNode *data;
+
+ if((bsh = btn_buttonsheet_new(NULL)) != NULL)
+ {
+ xml_get_text_copy(node, "label", bsh->label, sizeof bsh->label);
+ if((data = xml_tree_search(node, "ButtonSheetRows")) != NULL)
+ xml_node_visit_children(data, load_row, bsh);
+ btn_buttoninfo_add_sheet(user, bsh);
+ }
+}
+
+void btn_buttoninfo_load(MainInfo *min, ButtonInfo *bti, const XmlNode *node)
+{
+ xml_node_visit_children(node, load_sheet, bti);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-08 - If <base> is NULL, allocate <num> consequent buttons, and return a pointer to the
+** first one. If <base> is non-NULL, assume it to be the pointer to a vector of <num>
+** buttons, and just do the initialization. Note that if you allocate buttons on your
+** own, then calling this function is *mandatory* before using the button!
+*/
+Button * btn_button_new(Button *base, guint num)
+{
+ if(num > 0)
+ {
+ guint i, j;
+
+ if(base == NULL)
+ base = g_malloc(num * sizeof *base);
+ for(i = 0; i < num; i++)
+ {
+ for(j = 0; j < BTN_FACES; j++)
+ {
+ base[i].label[j][0] = '\0';
+ base[i].cmdseq[j] = NULL;
+ base[i].key[j][0] = '\0';
+ base[i].color[j][0].valid = FALSE;
+ base[i].color[j][1].valid = FALSE;
+ }
+ base[i].menu[0] = '\0';
+ base[i].tooltip[0] = '\0';
+ base[i].flags = 0U;
+ }
+ }
+ return base;
+}
+
+/* 1999-03-31 - Set the label of a button. */
+void btn_button_set_label(Button *btn, BtnFace face, const gchar *label)
+{
+ if(btn != NULL)
+ {
+ if(label != NULL)
+ g_strlcpy(btn->label[face], label, sizeof btn->label[face]);
+ else
+ btn->label[face][0] = '\0';
+ }
+}
+
+/* 1999-05-01 - Set the label of an already built button. The <widget> argument MUST be
+** a pointer to a widget as returned by btn_button_build(). Note that this
+** will use some magic to also change the corresponding definition (Button).
+*/
+void btn_button_set_label_widget(GtkWidget *widget, BtnFace face, const gchar *label)
+{
+ if((widget != NULL) && (label != NULL))
+ {
+ Button *btn = btn_button_get(widget);
+
+ btn_button_set_label(btn, face, label);
+ button_set_face(widget, face);
+ }
+}
+
+/* 1998-09-15 - Set a new command sequence for given button.
+** 1998-09-25 - Rewritten as a consequence of the new sequence format.
+** 1999-05-08 - Rewritten, since command sequences are now better handled as GStrings.
+*/
+void btn_button_set_cmdseq(Button *btn, BtnFace face, const gchar *seq)
+{
+ if(btn != NULL)
+ {
+ if(seq != NULL)
+ {
+ if(btn->cmdseq[face] != NULL)
+ g_string_assign(btn->cmdseq[face], seq);
+ else
+ btn->cmdseq[face] = g_string_new(seq);
+ }
+ else if(btn->cmdseq[face] != NULL)
+ {
+ g_string_free(btn->cmdseq[face], TRUE);
+ btn->cmdseq[face] = NULL;
+ }
+ }
+}
+
+/* 1999-03-11 - Set the keyboard accelerator name for this button. */
+void btn_button_set_key(Button *btn, BtnFace face, const gchar *key)
+{
+ if(btn != NULL)
+ {
+ if(key != NULL)
+ g_strlcpy(btn->key[face], key, sizeof btn->key[face]);
+ else
+ btn->key[face][0] = '\0';
+ }
+}
+
+/* 1999-05-01 - Set back- and foreground colors for given button face to <fg> and <bg>. Any of
+** the two colors can be NULL, in case it will be *ignored*, NOT reset! To reset,
+** use btn_button_set_color_XX() with a NULL color. Color me crazy on API design.
+*/
+void btn_button_set_colors(Button *btn, BtnFace face, const GdkColor *bg, const GdkColor *fg)
+{
+ if(btn != NULL)
+ {
+ if(bg != NULL)
+ {
+ btn->color[face][0].valid = TRUE;
+ btn->color[face][0].color = *bg;
+ }
+ if(fg != NULL)
+ {
+ btn->color[face][1].valid = TRUE;
+ btn->color[face][1].color = *fg;
+ }
+ }
+}
+
+/* 1999-05-02 - Set background color of indicated button's indicated face to <bg>. If
+** <bg> == NULL, the color is reset (marked as invalid internally).
+*/
+void btn_button_set_color_bg(Button *btn, BtnFace face, const GdkColor *bg)
+{
+ if(btn != NULL)
+ {
+ if((btn->color[face][0].valid = (bg != NULL)) != 0)
+ btn->color[face][0].color = *bg;
+ }
+}
+
+/* 1999-05-02 - Set background color of already constructed button. */
+void btn_button_set_color_bg_widget(GtkWidget *widget, BtnFace face, const GdkColor *bg)
+{
+ if(widget != NULL)
+ {
+ Button *btn = btn_button_get(widget);
+
+ btn_button_set_color_bg(btn, face, bg);
+ button_set_face(widget, face);
+ }
+}
+
+/* 1999-05-02 - Set foreground color of indicated button's indicated face to <bg>. If
+** <bg> == NULL, the color is reset (marked as invalid internally).
+*/
+void btn_button_set_color_fg(Button *btn, BtnFace face, const GdkColor *fg)
+{
+ if(btn != NULL)
+ {
+ if((btn->color[face][1].valid = (fg != NULL)) != 0)
+ btn->color[face][1].color = *fg;
+ }
+}
+
+/* 1999-05-02 - Set foreground color of already constructed button. */
+void btn_button_set_color_fg_widget(GtkWidget *widget, BtnFace face, const GdkColor *fg)
+{
+ if(widget != NULL)
+ {
+ Button *btn = btn_button_get(widget);
+
+ btn_button_set_color_fg(btn, face, fg);
+ button_set_face(widget, face);
+ }
+}
+
+/* 1999-05-01 - Get the definition from an instantiated widget. */
+Button * btn_button_get(GtkWidget *wid)
+{
+ if(wid != NULL)
+ return g_object_get_data(G_OBJECT(wid), "button");
+ return NULL;
+}
+
+/* 1999-05-01 - Return label for given button face. */
+const gchar * btn_button_get_label(Button *btn, BtnFace face)
+{
+ if((btn != NULL) && (btn->label[face][0] != '\0'))
+ return btn->label[face];
+ return NULL;
+}
+
+const gchar * btn_button_get_cmdseq(Button *btn, BtnFace face)
+{
+ if((btn != NULL) && (btn->cmdseq[face] != '\0'))
+ return btn->cmdseq[face]->str;
+ return NULL;
+}
+
+/* 1999-05-01 - Return pointer to keyboard accelerator key string for given button. */
+const gchar * btn_button_get_key(Button *btn, BtnFace face)
+{
+ if((btn != NULL) && (btn->key[face][0] != '\0'))
+ return btn->key[face];
+ return NULL;
+}
+
+/* 1999-05-01 - Return (in <bg>) the background color of <btn>. If the color has not
+** been previously set (it's not valid), *<bg> is untouched and FALSE is
+** returned. On success, TRUE is returned.
+*/
+gboolean btn_button_get_color_bg(Button *btn, BtnFace face, GdkColor *bg)
+{
+ if((btn != NULL) && (bg != NULL))
+ {
+ if(btn->color[face][0].valid)
+ {
+ *bg = btn->color[face][0].color;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* 1999-05-01 - Return (in <bg>) the background color of <btn>. If the color has not
+** been previously set (it's not valid), *<bg> is untouched and FALSE is
+** returned. On success, TRUE is returned.
+*/
+gboolean btn_button_get_color_fg(Button *btn, BtnFace face, GdkColor *fg)
+{
+ if((btn != NULL) && (fg != NULL))
+ {
+ if(btn->color[face][1].valid)
+ {
+ *fg = btn->color[face][1].color;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* 1999-01-13 - Just install a tooltip string. Really simple. */
+void btn_button_set_tooltip(Button *btn, const gchar *tip)
+{
+ if(btn != NULL)
+ {
+ if(tip != NULL)
+ g_strlcpy(btn->tooltip, tip, sizeof btn->tooltip);
+ else
+ btn->tooltip[0] = '\0';
+ }
+}
+
+/* 1999-05-01 - Return (strictly read-only) pointer to <btn>'s tooltip string. */
+const gchar * btn_button_get_tooltip(Button *btn)
+{
+ if((btn != NULL) && (btn->tooltip[0] != '\0'))
+ return btn->tooltip;
+ return NULL;
+}
+
+
+/* 1999-05-01 - Set the button's flags to (exactly) <flags>. */
+void btn_button_set_flags(Button *btn, guint32 flags)
+{
+ if(btn != NULL)
+ btn->flags = flags;
+}
+
+/* 1999-05-01 - Return the current flag values for <btn>. */
+guint32 btn_button_get_flags(Button *btn)
+{
+ if(btn != NULL)
+ return btn->flags;
+ return 0U;
+}
+
+/* 1999-05-01 - Make the flags indicated by <mask> (each) equal to <value>. This means,
+** that if <value> is TRUE, all masked flags will be set, else cleared.
+*/
+void btn_button_set_flags_boolean(Button *btn, guint32 mask, gboolean value)
+{
+ if(btn != NULL)
+ {
+ if(value)
+ btn->flags |= mask;
+ else
+ btn->flags &= ~mask;
+ }
+}
+
+/* 1999-05-01 - Return TRUE if and only if all masked flags of <btn> are set. */
+gboolean btn_button_get_flags_boolean(Button *btn, guint32 mask)
+{
+ if(btn != NULL)
+ return ((btn->flags & mask) == mask) ? TRUE : FALSE;
+ return FALSE;
+}
+
+/* 1999-05-01 - Returns TRUE if given button has no command sequence on any face, else FALSE. */
+gboolean btn_button_is_blank(Button *btn)
+{
+ guint i;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ if(btn_button_get_cmdseq(btn, i) != NULL)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* 1998-09-15 - Clear <btn> to some vacuum state. */
+void btn_button_clear(Button *btn)
+{
+ guint i;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ btn_button_set_label(btn, i, NULL);
+ btn_button_set_cmdseq(btn, i, NULL);
+ btn_button_set_key(btn, i, NULL);
+ btn->color[i][0].valid = FALSE; /* Invalidate back- and foreground colors. */
+ btn->color[i][1].valid = FALSE;
+ }
+ btn_button_set_tooltip(btn, NULL);
+ btn->flags = 0U;
+}
+
+/* 1998-09-15 - Swap the contents of the two buttons, without doing (dynamic) memory allocation. */
+void btn_button_swap(Button *a, Button *b)
+{
+ Button temp;
+
+ temp = *a;
+ *a = *b;
+ *b = temp;
+}
+
+/* 1998-09-15 - Write a copy of <src> into <dst>. */
+void btn_button_copy(Button *dst, Button *src)
+{
+ if((dst != NULL) && (src != NULL))
+ {
+ guint i;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ g_strlcpy(dst->label[i], src->label[i], sizeof dst->label[i]);
+ btn_button_set_cmdseq(dst, i, btn_button_get_cmdseq(src, i));
+ g_strlcpy(dst->key[i], src->key[i], sizeof dst->key[i]);
+ dst->color[i][0] = src->color[i][0];
+ dst->color[i][1] = src->color[i][1];
+ }
+ g_strlcpy(dst->menu, src->menu, sizeof dst->menu);
+ g_strlcpy(dst->tooltip, src->tooltip, sizeof dst->tooltip);
+ dst->flags = src->flags;
+ }
+}
+
+/* 1999-05-02 - Copy color information from <src> to <dst>. Can be made from other
+** function calls, but I felt lazy/overambitious.
+*/
+void btn_button_copy_colors(Button *dst, Button *src)
+{
+ if((dst != NULL) && (src != NULL))
+ {
+ guint i;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ dst->color[i][0] = src->color[i][0];
+ dst->color[i][1] = src->color[i][1];
+ }
+ }
+}
+
+/* 1998-09-15 - Destroy a button. Very simple, since buttons are never allocated separately. */
+void btn_button_destroy(Button *b)
+{
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-01 - This function gets called when the user clicks on an action button, regardless
+** of which "face" it was. This assumes that MainInfo as passed as last argument
+** to the btn_buttonsheet_build() call that resulted in the widget.
+** 2004-11-19 - Ported to use new ODMultiButton.
+*/
+static void evt_button_clicked(GtkWidget *wid, gpointer user)
+{
+ Button *btn;
+ MainInfo *min = user;
+ guint face = od_multibutton_get_index(OD_MULTIBUTTON(wid));
+
+ btn = g_object_get_data(G_OBJECT(wid), "button");
+ if((min != NULL) && (btn != NULL) && (btn->cmdseq[face] != NULL))
+ csq_execute(min, btn->cmdseq[face]->str);
+}
+
+/* 1999-05-01 - Update the face of an already constructed button, reading from the definition. */
+static gboolean button_set_face(GtkWidget *widget, BtnFace face)
+{
+ Button *btn;
+ gboolean ret = FALSE;
+
+ if((widget != NULL) && ((btn = g_object_get_data(G_OBJECT(widget), "button")) != NULL))
+ {
+ const gchar *lab;
+
+ if((lab = btn_button_get_label(btn, face)) != NULL)
+ {
+ GdkColor bgb, fgb, *bgp = NULL, *fgp = NULL;
+
+ if(btn_button_get_color_bg(btn, face, &bgb))
+ bgp = &bgb;
+ if(btn_button_get_color_fg(btn, face, &fgb))
+ fgp = &fgb;
+ od_multibutton_set_text(OD_MULTIBUTTON(widget), face, lab, bgp, fgp, NULL);
+ ret = TRUE;
+ }
+ gtk_widget_queue_draw(widget);
+ }
+ return ret;
+}
+
+/* 1998-09-15 - Build the single GTK+ button widget for the given <btn>. Connect its clicked
+** signal to <func>, passing it <user> on invocation.
+** 1999-05-01 - Rewritten; now builds an ODEmilButton instead, with multi-face support. Way cool.
+*/
+static GtkWidget * button_build(MainInfo *min, Button *btn, gboolean partial, GCallback func, gpointer user)
+{
+ GtkWidget *but;
+
+ if((but = od_multibutton_new()) != NULL)
+ {
+ gboolean set = FALSE;
+ BtnFace i;
+
+ gtk_widget_set_can_focus(but, FALSE);
+ g_object_set_data(G_OBJECT(but), "min", min);
+ g_object_set_data(G_OBJECT(but), "button", btn);
+
+ for(i = 0; i < BTN_FACES; i++)
+ set |= button_set_face(but, i);
+ g_signal_connect(G_OBJECT(but), "clicked", G_CALLBACK(func), user);
+ if(partial)
+ od_multibutton_set_config(OD_MULTIBUTTON(but), TRUE);
+ }
+ return but;
+}
+
+/* 1999-01-13 - Add a tooltip from the definition of <def>, if enabled, and return TRUE.
+** If the specified button doesn't use tooltips, don't do anything but
+** return FALSE.
+*/
+static gboolean button_tooltip(MainInfo *min, Button *def, GtkWidget *btn)
+{
+ if(btn_button_get_flags_boolean(def, BTF_SHOW_TOOLTIP) && (def->tooltip[0] != '\0'))
+ {
+ gtk_widget_set_tooltip_text(btn, def->tooltip);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-09-15 - Build GUI representation of given row. */
+static GtkWidget * buttonrow_build(MainInfo *min, ButtonRow *brw, gboolean partial, GCallback func, gpointer user)
+{
+ GtkWidget *hbox, *hbox2 = NULL, *btn;
+ guint i;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ for(i = 0; i < brw->width;)
+ {
+ if(btn_button_get_flags_boolean(&brw->button[i], BTF_NARROW))
+ {
+ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(; i < brw->width && btn_button_get_flags_boolean(&brw->button[i], BTF_NARROW); i++)
+ {
+ if((btn = button_build(min, brw->button + i, partial, func, user)) != NULL)
+ {
+ if(!partial)
+ button_tooltip(min, brw->button + i, btn);
+ g_object_set_data(G_OBJECT(btn), "row", brw);
+ gtk_box_pack_start(GTK_BOX(hbox2), btn, FALSE, FALSE, 0);
+ }
+ }
+ gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, TRUE, 0);
+ }
+ else
+ {
+ hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hbox2), TRUE);
+ for(; i < brw->width && !btn_button_get_flags_boolean(&brw->button[i], BTF_NARROW); i++)
+ {
+ if((btn = button_build(min, brw->button + i, partial, func, user)) != NULL)
+ {
+ if(!partial)
+ button_tooltip(min, brw->button + i, btn);
+ g_object_set_data(G_OBJECT(btn), "row", brw);
+ gtk_box_pack_start(GTK_BOX(hbox2), btn, TRUE, TRUE, 0);
+ }
+ }
+ gtk_box_pack_start(GTK_BOX(hbox), hbox2, TRUE, TRUE, 0);
+ }
+ }
+ return hbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-11-20 - Return a pointer to a fresh buttonrow holding <width> buttons. */
+ButtonRow * btn_buttonrow_new(gint width)
+{
+ ButtonRow *brw;
+
+ brw = g_malloc(sizeof *brw);
+ brw->width = width;
+ brw->button = btn_button_new(NULL, width);
+
+ return brw;
+}
+
+#define DEF_WIDTH (8)
+
+/* 1998-09-15 - Build the default button row. Just a few very basic functions. */
+ButtonRow * btn_buttonrow_new_default(MainInfo *min)
+{
+ ButtonRow *brw;
+ const gchar *lab[BTN_FACES * DEF_WIDTH] =
+ {"All", "Copy", "Move", "Delete", "Rename", "MkDir", "ChMod", "Configure",
+ "None", "Copy As", "Move As", NULL, NULL, NULL, "ChOwn", NULL };
+ const gchar *cmd[BTN_FACES * DEF_WIDTH] =
+ {"SelectAll", "Copy", "Move", "Delete", "Rename", "MkDir", "ChMod", "Configure",
+ "SelectNone", "CopyAs", "MoveAs", NULL, NULL, NULL, "ChOwn", NULL };
+ const gchar *key[BTN_FACES * DEF_WIDTH] =
+ {NULL, NULL, NULL, "Delete", "F2", NULL, NULL, "c",
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+ guint i, face, index;
+
+ if((brw = btn_buttonrow_new(DEF_WIDTH)) != NULL)
+ {
+ for(i = 0; i < brw->width; i++)
+ {
+ for(face = 0; face < BTN_FACES; face++)
+ {
+ index = i + DEF_WIDTH * face;
+ btn_button_set_label(brw->button + i, face, lab[index]);
+ btn_button_set_cmdseq(brw->button + i, face, cmd[index]);
+ if(key[index] != NULL)
+ btn_button_set_key(brw->button + i, face, key[index]);
+ }
+ }
+ }
+ return brw;
+}
+
+/* 1998-09-15 - Create a new buttonrow that is a copy of <src>.
+** 1999-05-08 - Rewritten. Now builds on existing routines and is generally better.
+*/
+ButtonRow * btn_buttonrow_copy(ButtonRow *src)
+{
+ ButtonRow *brw = NULL;
+
+ if((src != NULL) && ((brw = btn_buttonrow_new(src->width)) != NULL))
+ {
+ guint i;
+
+ for(i = 0; i < brw->width; i++)
+ btn_button_copy(brw->button + i, src->button + i);
+ }
+ return brw;
+}
+
+/* 1998-09-15 - Set the width of <brw> to <width> buttons. Keeps the buttons in the
+** (left-aligned) intersection, if any.
+*/
+void btn_buttonrow_set_width(ButtonRow *brw, guint width)
+{
+ guint i, j;
+
+ if((brw != NULL) && (width > 0))
+ {
+ if(width == brw->width) /* No change? */
+ return;
+
+ if(width < brw->width) /* Shrinking? */
+ {
+ for(i = width; i < brw->width; i++)
+ btn_button_destroy(brw->button + i);
+ }
+ brw->button = g_realloc(brw->button, width * sizeof *brw->button);
+ if(width > brw->width) /* Growing? Then init the new ones. */
+ {
+ for(i = brw->width; i < width; i++)
+ {
+ for(j = 0; j < sizeof brw->button[i].cmdseq / sizeof *brw->button[i].cmdseq; j++)
+ brw->button[i].cmdseq[j] = NULL;
+ btn_button_clear(brw->button + i);
+ }
+ }
+ brw->width = width;
+ }
+}
+
+/* 1999-05-01 - Get the width of the given button row. Simpler than setting it. :) */
+guint btn_buttonrow_get_width(ButtonRow *brw)
+{
+ if(brw != NULL)
+ return brw->width;
+ return 0U;
+}
+
+/* 1998-09-15 - Destroy a row of buttons.
+** 1999-01-05 - Adjusted for the new allocation style. One free() does it all.
+** 1999-05-12 - One free() is certainly not enough.
+*/
+void btn_buttonrow_destroy(ButtonRow *brw)
+{
+ guint i;
+
+ if(brw != NULL)
+ {
+ if(brw->button != NULL)
+ {
+ for(i = 0; i < brw->width; i++)
+ btn_button_destroy(brw->button + i);
+ g_free(brw->button);
+ }
+ g_free(brw);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Create a new empty buttonsheet labeled <label>. */
+ButtonSheet * btn_buttonsheet_new(const gchar *label)
+{
+ ButtonSheet *bsh;
+
+ bsh = g_malloc(sizeof *bsh);
+ if(label != NULL)
+ g_strlcpy(bsh->label, label, sizeof bsh->label);
+ bsh->height = 0;
+ bsh->visible = 0;
+ bsh->top_row = 0;
+ bsh->rows = NULL;
+
+ return bsh;
+}
+
+/* 1998-09-15 - Build the default button sheet, and return it.
+** 1999-01-05 - Fixed a *huge* bug, where the same row was added twice to the list!!
+*/
+static ButtonSheet * btn_buttonsheet_new_default_commands(MainInfo *min)
+{
+ ButtonSheet *bsh;
+ ButtonRow *brw;
+
+ bsh = g_malloc(sizeof *bsh);
+ g_strlcpy(bsh->label, BTN_DEFAULT_SHEET, sizeof bsh->label);
+ bsh->rows = NULL;
+ if((brw = btn_buttonrow_new_default(min)) != NULL)
+ btn_buttonsheet_append_row(bsh, brw);
+ if((brw = btn_buttonrow_new(8)) != NULL)
+ btn_buttonsheet_append_row(bsh, brw);
+ if((brw = btn_buttonrow_new(8)) != NULL)
+ btn_buttonsheet_append_row(bsh, brw);
+ return bsh;
+}
+
+/* 2002-05-23 - Build default shortcut buttonsheet. It's happening, slowly. */
+static ButtonSheet * btn_buttonsheet_new_default_shortcuts(MainInfo *min)
+{
+ ButtonSheet *bsh;
+ ButtonRow *brw;
+ const gchar *lab[] = { "Home", "Local", "/", "CD-ROM" },
+ *pth[] = { "$HOME", "/usr/local/", "/", "/cdrom/" };
+ gchar buf[1024];
+ guint i;
+
+ bsh = g_malloc(sizeof *bsh);
+ g_strlcpy(bsh->label, "Shortcuts", sizeof bsh->label);
+ bsh->rows = NULL;
+ for(i = 0; i < sizeof lab / sizeof *lab; i++)
+ {
+ brw = btn_buttonrow_new(1);
+ btn_button_set_label(brw->button, BTN_PRIMARY, lab[i]);
+ g_snprintf(buf, sizeof buf, "DirEnter 'dir=%s'", pth[i]);
+ btn_button_set_cmdseq(brw->button, BTN_PRIMARY, buf);
+ btn_buttonsheet_append_row(bsh, brw);
+ }
+ return bsh;
+}
+
+/* 1998-09-15 - Return a new, freshly allocated copy of <src>. The copy shares no memory with
+** the original (it is a "deep" copy).
+** 1998-12-23 - Rewritten slightly. Didn't use btn_buttonsheet_new(), which was silly.
+*/
+ButtonSheet * btn_buttonsheet_copy(ButtonSheet *src)
+{
+ ButtonSheet *bsh;
+ ButtonRow *brw;
+ GList *iter;
+
+ if((bsh = btn_buttonsheet_new(src->label)) != NULL)
+ {
+ for(iter = src->rows; iter != NULL; iter = g_list_next(iter))
+ {
+ if((brw = btn_buttonrow_copy(iter->data)) != NULL)
+ btn_buttonsheet_append_row(bsh, brw);
+ }
+ }
+ return bsh;
+}
+
+/* 1998-12-23 - Append row <brw> to the sheet <bsh>. */
+void btn_buttonsheet_append_row(ButtonSheet *bsh, ButtonRow *brw)
+{
+ if(bsh == NULL || brw == NULL)
+ return;
+ bsh->rows = g_list_append(bsh->rows, brw);
+ bsh->height = g_list_length(bsh->rows);
+}
+
+/* 1998-09-15 - Add a new row of buttons before <anchor> in <bsh>. If <anchor> is NULL, a new
+** row is created and appended. The new row will contain <width> buttons.
+** 1998-12-23 - Renamed from add_row to insert_row, since it confused me so much...
+*/
+void btn_buttonsheet_insert_row(ButtonSheet *bsh, ButtonRow *anchor, gint width)
+{
+ ButtonRow *nr;
+ GList *link;
+ gint pos;
+
+ if((nr = btn_buttonrow_new(width)) != NULL)
+ {
+ if((anchor != NULL) && (link = g_list_find(bsh->rows, anchor)) != NULL)
+ {
+ pos = g_list_position(bsh->rows, link);
+ bsh->rows = g_list_insert(bsh->rows, nr, pos);
+ bsh->height = g_list_length(bsh->rows);
+ }
+ else
+ btn_buttonsheet_append_row(bsh, nr);
+ }
+}
+
+/* 1998-09-15 - Delete row <brw> from sheet <bsh>. Frees all resources occupied by it
+** (except for any previously returned widgets, of course).
+*/
+void btn_buttonsheet_delete_row(ButtonSheet *bsh, ButtonRow *brw)
+{
+ bsh->rows = g_list_remove(bsh->rows, brw);
+ btn_buttonrow_destroy(brw);
+ bsh->height = g_list_length(bsh->rows);
+}
+
+/* 1998-09-19 - Move the row <brw> up (delta == -1) or down (delta == 1) in the sheet <bsh>.
+** The rows will "wrap" around at top and bottom of the sheet.
+*/
+void btn_buttonsheet_move_row(ButtonSheet *bsh, ButtonRow *brw, gint delta)
+{
+ GList *link;
+ gint pos, np;
+
+ link = g_list_find(bsh->rows, brw);
+ pos = g_list_position(bsh->rows, link);
+ bsh->rows = g_list_remove(bsh->rows, brw);
+ np = pos + delta;
+ if(np < 0)
+ np = g_list_length(bsh->rows);
+ else if(np > (gint) g_list_length(bsh->rows))
+ np = 0;
+ bsh->rows = g_list_insert(bsh->rows, brw, np);
+}
+
+/* 1999-05-18 - Get height (number of rows) of a given sheet. */
+guint btn_buttonsheet_get_height(ButtonSheet *bsh)
+{
+ if(bsh != NULL)
+ return bsh->height;
+ return 0U;
+}
+
+/* 1998-09-15 - Return pointer to sheet labeled <label>. */
+ButtonSheet * btn_buttonsheet_get(ButtonInfo *bti, const gchar *label)
+{
+ GList *iter;
+
+ if(label == NULL)
+ label = BTN_DEFAULT_SHEET;
+ for(iter = bti->sheets; iter != NULL; iter = g_list_next(iter))
+ {
+ if(strcmp(((ButtonSheet *) iter->data)->label, label) == 0)
+ return iter->data;
+ }
+ return NULL;
+}
+
+/* 1998-09-15 - Build GUI representation of given sheet. Note: the returned widget has not
+** ben gtk_widget_show()n.
+** 1999-05-12 - Now wraps the vbox holding the sheet's rows in a ODScrolledBox widget. Nice.
+*/
+static GtkWidget * buttonsheet_build(MainInfo *min, ButtonSheet *bsh, gboolean partial, GCallback func, gpointer user)
+{
+ GtkWidget *scbox, *vbox, *row;
+ GList *iter;
+
+ if(bsh->rows == NULL)
+ return NULL;
+
+ /* First, stack all rows in a vbox. */
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(iter = bsh->rows; iter != NULL; iter = g_list_next(iter))
+ {
+ if((row = buttonrow_build(min, iter->data, partial, func, user)) != NULL)
+ gtk_box_pack_start(GTK_BOX(vbox), row, FALSE, FALSE, 0);
+ }
+ /* Next, wrap the Shortcuts in a scrolled window, since the default buttons decide the height. */
+ if(strcmp(bsh->label, "Shortcuts") == 0)
+ {
+ scbox = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scbox), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scbox), vbox);
+ return scbox;
+ }
+ return vbox;
+}
+
+/* 1998-09-15 - Build the GTK+ GUI representation of sheet named <label>.
+** 1998-12-23 - Added the <partial> argument so it's there when GTK+ 1.2.0 is released
+** (if I live to see it). It's going to rule.
+*/
+GtkWidget * btn_buttonsheet_build(MainInfo *min, ButtonInfo *bti, const gchar *label, gboolean partial, GCallback func, gpointer user)
+{
+ GtkWidget *sheet = NULL;
+ GList *iter;
+
+ if(label == NULL)
+ label = BTN_DEFAULT_SHEET;
+ if(func == NULL)
+ func = G_CALLBACK(evt_button_clicked);
+ if(user == NULL)
+ user = min;
+ for(iter = bti->sheets; iter != NULL; iter = g_list_next(iter))
+ {
+ if(strcmp(((ButtonSheet *) iter->data)->label, label) == 0)
+ {
+ sheet = buttonsheet_build(min, iter->data, partial, func, user);
+ break;
+ }
+ }
+ return sheet;
+}
+
+/* 1999-03-11 - This gets called once for every widget in a row. If the widget is indeed a
+** button, everything is cool and we actually add the keyboard shortcut. If the
+** widget is a hbox, we need to recurse.
+** 1999-05-04 - Adapted for new multi-face buttons. Now lets the keyboard module directly
+** invoke the relevant command sequence, rather than going through an activation
+** event. Saves the trouble of extending the kbd module to support multi-argument
+** signals (which would be required for the activation event of ODEmilButton).
+*/
+static void btn_callback(GtkWidget *wid, gpointer user)
+{
+ Button *btn;
+ MainInfo *min = user;
+
+ if(OD_IS_MULTIBUTTON(wid) && ((btn = g_object_get_data(G_OBJECT(wid), "button")) != NULL))
+ {
+ const gchar *key, *cmd;
+ guint i;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ if(((key = btn_button_get_key(btn, i)) != NULL) && ((cmd = btn_button_get_cmdseq(btn, i)) != NULL))
+ kbd_context_entry_add(min->gui->kbd_ctx, key, KET_CMDSEQ, cmd);
+ }
+ }
+ else if(GTK_IS_BOX(wid))
+ gtk_container_foreach(GTK_CONTAINER(wid), btn_callback, user);
+}
+
+/* 1999-03-11 - This gets called once for every row in a sheet. */
+static void row_callback(GtkWidget *wid, gpointer user)
+{
+ if(GTK_IS_BOX(wid))
+ gtk_container_foreach(GTK_CONTAINER(wid), btn_callback, user);
+ else
+ fprintf(stderr, "**BUTTONS: Unexpected non-hbox widget found!\n");
+}
+
+/* 1999-03-11 - Add key entries for buttons *from the GTK+ sheet*! This is kind of complex,
+** since the structure of the sheet is non-trivial.
+** 2008-03-01 - Basically, For the "Shortcuts" sheet, it's a scrolled box, containing a
+** viewport, containing a vbox full of hboxes, full of hboxes, full of buttons.
+** For "Default" sheet, it's just a vbox. Simple!
+*/
+void btn_buttonsheet_built_add_keys(MainInfo *min, GtkContainer *sheet, gpointer user)
+{
+ if(user == NULL)
+ user = min;
+ else
+ fprintf(stderr, "**BUTTONS: Can't have non-NULL user pointer for key!\n");
+
+ /* Only need to dig out across the scrolled window for shortcuts, Default doesn't scroll. */
+ if(GTK_IS_SCROLLED_WINDOW(sheet))
+ sheet = GTK_CONTAINER(gtk_bin_get_child(GTK_BIN(gtk_bin_get_child(GTK_BIN(sheet)))));
+ gtk_container_foreach(sheet, row_callback, user); /* Visits each hbox. */
+}
+
+/* 1998-09-15 - Destroy a sheetful of buttons. */
+void btn_buttonsheet_destroy(ButtonSheet *bsh)
+{
+ GList *iter;
+
+ for(iter = bsh->rows; iter != NULL; iter = g_list_next(iter))
+ btn_buttonrow_destroy(iter->data);
+ g_list_free(bsh->rows);
+ g_free(bsh);
+}
diff --git a/src/buttons.h b/src/buttons.h
new file mode 100644
index 0000000..1670ec1
--- /dev/null
+++ b/src/buttons.h
@@ -0,0 +1,90 @@
+/*
+** 1998-09-15 - Header for the buttons module.
+** 1999-05-01 - Huge changes to incorporate the new multi-function button.
+*/
+
+#include "xmlutil.h"
+
+typedef struct Button Button;
+typedef struct ButtonRow ButtonRow;
+typedef struct ButtonSheet ButtonSheet;
+
+typedef enum { BTN_PRIMARY = 0, BTN_SECONDARY = 1, BTN_FACES } BtnFace;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* These are the flags available in each Button. Use the btn_button_XXX_flags() calls
+** to access these (a good idea, since nothing else is possible :).
+*/
+#define BTF_NARROW (1<<0) /* Is the button narrow? */
+#define BTF_SHOW_TOOLTIP (1<<1) /* Does the button show its tooltip string? */
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern void btn_buttoninfo_new_default(MainInfo *min, ButtonInfo *bti);
+extern void btn_buttoninfo_copy(ButtonInfo *dst, ButtonInfo *src);
+extern void btn_buttoninfo_add_sheet(ButtonInfo *bti, ButtonSheet *bsh);
+extern void btn_buttoninfo_clear(ButtonInfo *bti);
+
+extern void btn_buttoninfo_save(MainInfo *min, const ButtonInfo *bti, FILE *out, const gchar *tag);
+extern void btn_buttoninfo_load(MainInfo *min, ButtonInfo *bti, const XmlNode *node);
+
+/* Main button allocation routine. Probably not useful outside of the buttons module... */
+extern Button * btn_button_new(Button *base, guint num);
+
+/* Set/get functions for per-face properties. */
+
+extern void btn_button_set_label(Button *btn, BtnFace face, const gchar *label);
+extern void btn_button_set_label_widget(GtkWidget *widget, BtnFace face, const gchar *label);
+extern void btn_button_set_cmdseq(Button *btn, BtnFace face, const gchar *seq);
+extern void btn_button_set_key(Button *btn, BtnFace face, const gchar *key);
+extern void btn_button_set_colors(Button *btn, BtnFace face, const GdkColor *bg, const GdkColor *fg);
+extern void btn_button_set_color_bg(Button *btn, BtnFace face, const GdkColor *bg);
+extern void btn_button_set_color_bg_widget(GtkWidget *widget, BtnFace face, const GdkColor *bg);
+extern void btn_button_set_color_fg(Button *btn, BtnFace face, const GdkColor *fg);
+extern void btn_button_set_color_fg_widget(GtkWidget *widget, BtnFace face, const GdkColor *fg);
+
+/* Get definition from widget instance. */
+extern Button * btn_button_get(GtkWidget *wid);
+
+extern const gchar * btn_button_get_label(Button *btn, BtnFace face);
+extern const gchar * btn_button_get_cmdseq(Button *btn, BtnFace face);
+extern const gchar * btn_button_get_key(Button *btn, BtnFace face);
+extern gboolean btn_button_get_color_bg(Button *btn, BtnFace face, GdkColor *bg);/* Returns FALSE if color not valid. */
+extern gboolean btn_button_get_color_fg(Button *btn, BtnFace face, GdkColor *fg);
+extern const gchar * btn_button_get_menu(const Button *btn);
+
+extern void btn_button_set_tooltip(Button *btn, const gchar *tip);
+const gchar * btn_button_get_tooltip(Button *btn);
+
+extern void btn_button_set_flags(Button *btn, guint32 flags);
+extern guint32 btn_button_get_flags(Button *btn);
+extern void btn_button_set_flags_boolean(Button *btn, guint32 mask, gboolean value);
+extern gboolean btn_button_get_flags_boolean(Button *btn, guint32 mask);
+
+extern gboolean btn_button_is_blank(Button *btn);
+
+extern void btn_button_clear(Button *btn);
+extern void btn_button_swap(Button *a, Button *b);
+extern void btn_button_copy(Button *dst, Button *src);
+extern void btn_button_copy_colors(Button *dst, Button *src);
+extern void btn_button_destroy(Button *b);
+
+extern ButtonRow * btn_buttonrow_new(gint width);
+extern ButtonRow * btn_buttonrow_new_default(MainInfo *min);
+extern ButtonRow * btn_buttonrow_copy(ButtonRow *src);
+extern void btn_buttonrow_set_width(ButtonRow *brw, guint width);
+extern guint btn_buttonrow_get_width(ButtonRow *brw);
+extern void btn_buttonrow_destroy(ButtonRow *brw);
+
+extern ButtonSheet * btn_buttonsheet_new(const gchar *label);
+extern ButtonSheet * btn_buttonsheet_copy(ButtonSheet *src);
+extern void btn_buttonsheet_append_row(ButtonSheet *bsh, ButtonRow *brw);
+extern void btn_buttonsheet_insert_row(ButtonSheet *bsh, ButtonRow *brw, gint width);
+extern void btn_buttonsheet_delete_row(ButtonSheet *bsh, ButtonRow *brw);
+extern void btn_buttonsheet_move_row(ButtonSheet *bsh, ButtonRow *brw, gint delta);
+extern guint btn_buttonsheet_get_height(ButtonSheet *bsh);
+extern ButtonSheet * btn_buttonsheet_get(ButtonInfo *bti, const gchar *label);
+extern GtkWidget * btn_buttonsheet_build(MainInfo *min, ButtonInfo *bti, const gchar *label, gint partial, GCallback func, gpointer user);
+extern void btn_buttonsheet_built_add_keys(MainInfo *min, GtkContainer *sheet, gpointer user);
+extern void btn_buttonsheet_destroy(ButtonSheet *bsh);
diff --git a/src/cfg_buttonlayout.c b/src/cfg_buttonlayout.c
new file mode 100644
index 0000000..4bb3347
--- /dev/null
+++ b/src/cfg_buttonlayout.c
@@ -0,0 +1,169 @@
+/*
+** 2002-05-31 - A little configuration module for the button layout. This should hopefully
+** grow into something complex in the future, but for now, it's very basic
+** since it all it does is keep some stuff from the Shortcuts config.
+*/
+
+#include "gentoo.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+
+#include "cfg_buttonlayout.h"
+
+#define NODE "ButtonLayout"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+
+ GtkWidget *pos[2];
+ GtkWidget *sep[3];
+
+ ButtonLayout *edit;
+
+ MainInfo *min;
+ gboolean modified;
+} P_ButtonLayout;
+
+static P_ButtonLayout the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void set_widgets(P_ButtonLayout *page)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->pos[btl_buttonlayout_get_right(page->edit) == TRUE]), TRUE);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->sep[btl_buttonlayout_get_separation(page->edit)]), TRUE);
+}
+
+static void evt_pos_toggle(GtkWidget *wid, gpointer user)
+{
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ P_ButtonLayout *page = user;
+
+ btl_buttonlayout_set_right(page->edit, g_object_get_data(G_OBJECT(wid), "right") != NULL);
+ page->modified = TRUE;
+ }
+}
+
+static void evt_sep_toggle(GtkWidget *wid, gpointer user)
+{
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ P_ButtonLayout *page = user;
+
+ btl_buttonlayout_set_separation(page->edit, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "sep")));
+ page->modified = TRUE;
+ }
+}
+
+static GtkWidget * init(MainInfo *min, gchar **name)
+{
+ P_ButtonLayout *page = &the_page;
+ const gchar *plab[] = { N_("Left of Command Buttons"), N_("Right of Command Buttons") },
+ *slab[] = { N_("No Padding"), N_("Static"), N_("Paned") };
+ const BtlSep sep[] = { BTL_SEP_NONE, BTL_SEP_SIMPLE, BTL_SEP_PANED };
+ GtkWidget *label, *frame, *vbox;
+ guint i;
+ GSList *group = NULL;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->edit = NULL;
+
+ label = gtk_label_new(_("This page lets you control how the Shortcuts button sheet is positioned relative to\n"
+ "the one holding the main Command Buttons. It is more or less a place-holder; the plan\n"
+ "is to provide a lot more flexibility in the button management, and also to support the\n"
+ "creation of more than these two built-in sheets of buttons. But that has yet to happen.\n"
+ "\n"
+ "In the meantime, this provides the functionality that was present when the Shortcuts\n"
+ "were a special feature with their own configuration page (up to and including version\n"
+ "0.11.24 of gentoo), for your convenience.\n"
+ "\n"
+ "To find the Shortcut sheet, switch to the Definitions page, and use the option menu widget\n"
+ "in the top left corner of the page."));
+ gtk_box_pack_start(GTK_BOX(page->vbox), label, FALSE, FALSE, 5);
+
+ frame = gtk_frame_new(_("Shortcut Sheet Position"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < sizeof plab / sizeof *plab; i++)
+ {
+ page->pos[i] = gtk_radio_button_new_with_label(group, _(plab[i]));
+ if(i == 1)
+ g_object_set_data(G_OBJECT(page->pos[i]), "right", GINT_TO_POINTER(TRUE));
+ g_signal_connect(G_OBJECT(page->pos[i]), "toggled", G_CALLBACK(evt_pos_toggle), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->pos[i], FALSE, FALSE, 0);
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(page->pos[i]));
+ }
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), frame, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new(_("Separation Style"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0, group = NULL; i < sizeof slab / sizeof *slab; i++)
+ {
+ page->sep[i] = gtk_radio_button_new_with_label(group, _(slab[i]));
+ g_object_set_data(G_OBJECT(page->sep[i]), "sep", GINT_TO_POINTER(sep[i]));
+ g_signal_connect(G_OBJECT(page->sep[i]), "toggled", G_CALLBACK(evt_sep_toggle), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->sep[i], FALSE, FALSE, 0);
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(page->sep[i]));
+ }
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), frame, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(page->vbox);
+ cfg_tree_level_append(_("Layout"), page->vbox);
+ cfg_tree_level_end();
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void update(MainInfo *min)
+{
+ P_ButtonLayout *page = &the_page;
+
+ if(page->edit != NULL)
+ btl_buttonlayout_destroy(page->edit);
+ page->edit = btl_buttonlayout_new_copy(min->cfg.buttonlayout);
+ page->modified = FALSE;
+ set_widgets(page);
+}
+
+static void accept(MainInfo *min)
+{
+ P_ButtonLayout *page = &the_page;
+
+ if(page->modified)
+ {
+ btl_buttonlayout_destroy(min->cfg.buttonlayout);
+ min->cfg.buttonlayout = page->edit;
+ page->edit = NULL;
+ cfg_set_flags(CFLG_REBUILD_BOTTOM);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-05-31 - Save button layout data. Simple, just call the buttonlayout module. */
+static gint save(MainInfo *min, FILE *out)
+{
+ btl_buttonlayout_save(min->cfg.buttonlayout, out);
+ return TRUE;
+}
+
+/* 2002-05-31 - Load button layout settings. Again, pass it to the layout module. */
+static void load(MainInfo *min, const XmlNode *node)
+{
+ min->cfg.buttonlayout = btl_buttonlayout_load(min, node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cbl_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, init, update, accept, save, load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_buttonlayout.h b/src/cfg_buttonlayout.h
new file mode 100644
index 0000000..7f8fec6
--- /dev/null
+++ b/src/cfg_buttonlayout.h
@@ -0,0 +1,5 @@
+/*
+** 2002-05-31 - Another config module.
+*/
+
+extern const CfgModule * cbl_describe(MainInfo *min);
diff --git a/src/cfg_buttons.c b/src/cfg_buttons.c
new file mode 100644
index 0000000..a147259
--- /dev/null
+++ b/src/cfg_buttons.c
@@ -0,0 +1,914 @@
+/*
+** 1998-09-15 - Tired of hacking around in old code, I simply rewrite this configuration
+** page module from scratch. Nice since the definition of buttons and their
+** structuring has changed radically (for the second time this week...).
+** 1998-09-28 - Made the button editing directly in the page, no need for a dialog.
+** 1998-12-23 - Plenty of cleanups thanks to slightly changed buttons.c module.
+** 1999-03-13 - Adjustments for new dialog module.
+** 1999-05-01 - Huge rewrites to wedge the new multi-face button widget in here. Also made
+** the buttons.c module a lot more opaque, and even moved the load/save code
+** in there.
+** 1999-06-19 - Adapted for the new dialog module. Really helped.
+*/
+
+#include "gentoo.h"
+
+#include "buttons.h"
+#include "dialog.h"
+#include "strutil.h"
+#include "guiutil.h"
+#include "odmultibutton.h"
+#include "xmlutil.h"
+#include "cmdseq.h"
+#include "cmdseq_dialog.h"
+#include "color_dialog.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "cfg_cmdseq.h"
+
+#include "cfg_buttons.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define NODE "ButtonSheets"
+
+typedef enum { BM_NORMAL, BM_SELECTED, BM_COPY, BM_COPY_COLORS, BM_SWAP } BMode;
+
+typedef struct P_Buttons P_Buttons;
+
+typedef struct {
+ GtkWidget *frame; /* Frame holding the definition widgets. */
+ GtkWidget *label; /* Textual label (entry widget). */
+ guint label_sig;
+ GtkWidget *cmdseq; /* Command sequence (entry). */
+ guint cmdseq_sig;
+ GtkWidget *key; /* Keyboard shortcut (entry). */
+ GtkWidget *col_bg; /* Background color display, dialog request & clear button (multi-face). */
+ GtkWidget *col_fg; /* Ditto, foreground. */
+} BDef;
+
+struct P_Buttons {
+ GtkWidget *vbox; /* This practice is so old it has a beard. */
+ GtkWidget *scwin; /* A scrolled window that holds the button rows. */
+ GtkWidget *shvbox; /* The actual button sheet. */
+
+ GtkWidget *dvbox; /* All definitions. */
+ GtkWidget *dhbox; /* Actual function definitions (primary/secondary frames). */
+ BDef def[2]; /* Primary & secondary face definitions. */
+ GtkWidget *dtooltip; /* String widget for tooltip. */
+ GtkWidget *dnarrow; /* A check button for the narrow-flag. */
+ guint dnarsig; /* Signal identifer for the narrow flag. */
+ GtkWidget *dshowtip; /* Check button for "Show Tooltip?". */
+
+ GtkWidget *bcmd[4]; /* Button commands ("Edit", "Copy" etc.). */
+
+ GtkWidget *rcmd[5]; /* Row command buttons. */
+
+ MainInfo *min;
+ const gchar *cur_sheet; /* Label of sheet we're editing. */
+ gboolean modified;
+ ButtonInfo buttons; /* Editing copy of the button info. */
+ ButtonSheet *sheet; /* Points at the sheet being shown (currently always "Default"). */
+ GtkWidget *button; /* Currently selected button. */
+ BtnFace col_change_face; /* A kludge to get it into cdl_dialog() callback. Only for color changing! */
+ BMode mode;
+};
+
+static P_Buttons the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint evt_button_clicked(GtkWidget *wid, gpointer user);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-14 - When <state> is TRUE, set the background color of <btn> to something special,
+** indicating that it is selected. When it's FALSE, reset the color to normal.
+** 1999-05-05 - Thanks no niceties in the new widget used for buttons, this function has become
+** far simpler. No more (yucky) GtkStyles. Just a simple widget call. Function renamed.
+*/
+static void set_button_state(GtkWidget *btn, gboolean state)
+{
+ od_multibutton_set_config_selected(OD_MULTIBUTTON(btn), state);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void set_blocked_entry(GtkWidget *entry, const gchar *str, guint sig)
+{
+ if(sig > 0)
+ g_signal_handler_block(G_OBJECT(entry), sig);
+
+ if(str != NULL)
+ gtk_entry_set_text(GTK_ENTRY(entry), str);
+ else
+ gtk_entry_set_text(GTK_ENTRY(entry), "");
+
+ if(sig > 0)
+ g_signal_handler_unblock(G_OBJECT(entry), sig);
+}
+
+/* 1998-09-15 - Reset all widgets to their most idle states. */
+static void reset_widgets(P_Buttons *page)
+{
+ gint i;
+
+ page->button = NULL;
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ set_blocked_entry(page->def[i].label, "", page->def[i].label_sig);
+ set_blocked_entry(page->def[i].cmdseq, "", page->def[i].cmdseq_sig);
+ gtk_entry_set_text(GTK_ENTRY(page->def[i].key), "");
+ }
+ gtk_entry_set_text(GTK_ENTRY(page->dtooltip), "");
+ g_signal_handler_block(G_OBJECT(page->dnarrow), page->dnarsig);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dnarrow), FALSE);
+ g_signal_handler_unblock(G_OBJECT(page->dnarrow), page->dnarsig);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dshowtip), FALSE);
+ gtk_widget_set_sensitive(page->dvbox, FALSE);
+ for(i = 0; i < sizeof page->bcmd / sizeof page->bcmd[0]; i++)
+ gtk_widget_set_sensitive(page->bcmd[i], FALSE);
+
+ for(i = 1; i < sizeof page->rcmd / sizeof page->rcmd[0]; i++)
+ gtk_widget_set_sensitive(page->rcmd[i], FALSE);
+}
+
+/* 1998-09-15 - Set widgets to some fun states, now that a button is selected. */
+static void set_widgets(P_Buttons *page)
+{
+ Button *but;
+ guint i;
+
+ if((page->button != NULL) && ((but = btn_button_get(page->button)) != NULL))
+ {
+ const gchar *str;
+
+ for(i = 0; i < BTN_FACES; i++)
+ {
+ set_blocked_entry(page->def[i].label, btn_button_get_label(but, i), page->def[i].label_sig);
+ set_blocked_entry(page->def[i].cmdseq, btn_button_get_cmdseq(but, i), page->def[i].cmdseq_sig);
+ set_blocked_entry(page->def[i].key, btn_button_get_key(but, i), 0);
+ }
+ if((str = btn_button_get_tooltip(but)) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->dtooltip), str);
+ else
+ gtk_entry_set_text(GTK_ENTRY(page->dtooltip), "");
+ g_signal_handler_block(G_OBJECT(page->dnarrow), page->dnarsig);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dnarrow), btn_button_get_flags_boolean(but, BTF_NARROW));
+ g_signal_handler_unblock(G_OBJECT(page->dnarrow), page->dnarsig);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dshowtip), btn_button_get_flags_boolean(but, BTF_SHOW_TOOLTIP));
+ }
+ gtk_widget_set_sensitive(page->dvbox, TRUE);
+/* gtk_widget_grab_focus(page->def[0].label);*/
+ for(i = 0; i < sizeof page->bcmd / sizeof page->bcmd[0]; i++)
+ gtk_widget_set_sensitive(page->bcmd[i], TRUE);
+
+ for(i = 1; i < sizeof page->rcmd / sizeof page->rcmd[0]; i++)
+ gtk_widget_set_sensitive(page->rcmd[i], TRUE);
+}
+
+/* 1998-09-15 - Populate the scrolled window with a button sheet. */
+static void populate_scwin(P_Buttons *page)
+{
+ if(page->shvbox != NULL) /* The shvbox is made scrollable by gtk_container_add(), which inserts an extra parent. Hm. */
+ gtk_container_remove(GTK_CONTAINER(page->scwin), gtk_widget_get_parent(page->shvbox));
+ page->shvbox = NULL;
+
+ if((page->shvbox = btn_buttonsheet_build(page->min, &page->buttons, page->cur_sheet, TRUE, G_CALLBACK(evt_button_clicked), page)) != NULL)
+ {
+ gtk_container_add(GTK_CONTAINER(page->scwin), page->shvbox);
+ gtk_widget_show_all(page->shvbox);
+ }
+ reset_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Set the page's mode to normal (no button selected). */
+static void set_mode_normal(P_Buttons *page)
+{
+ if(page->button != NULL)
+ set_button_state(page->button, FALSE);
+ page->button = NULL;
+ page->mode = BM_NORMAL;
+ reset_widgets(page);
+}
+
+/* 1998-09-15 - Set normal mode, with <wid> selected. */
+static void set_mode_selected(P_Buttons *page, GtkWidget *wid)
+{
+ if(page->button != NULL)
+ set_button_state(page->button, FALSE);
+ if(page->button == wid)
+ {
+ set_mode_normal(page);
+ return;
+ }
+ set_button_state(wid, TRUE);
+ page->button = wid;
+ page->mode = BM_SELECTED;
+ set_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - One of the buttons in the sheet was clicked. */
+static gint evt_button_clicked(GtkWidget *wid, gpointer user)
+{
+ Button *but = btn_button_get(wid);
+ P_Buttons *page = user;
+ gint index = od_multibutton_get_index(OD_MULTIBUTTON(wid));
+
+ switch(page->mode)
+ {
+ case BM_NORMAL:
+ case BM_SELECTED:
+ set_mode_selected(page, wid);
+ gtk_widget_grab_focus(page->def[index].label);
+ break;
+ case BM_COPY:
+ page->modified = TRUE;
+ btn_button_copy(but, btn_button_get(page->button));
+ set_mode_normal(page);
+ populate_scwin(page);
+ break;
+ case BM_COPY_COLORS:
+ page->modified = TRUE;
+ btn_button_copy_colors(but, btn_button_get(page->button));
+ set_mode_normal(page);
+ populate_scwin(page);
+ break;
+ case BM_SWAP:
+ page->modified = TRUE;
+ btn_button_swap(but, btn_button_get(page->button));
+ set_mode_normal(page);
+ populate_scwin(page);
+ break;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - A button command ("Copy", "Swap" etc) was clicked. React.
+** 1998-09-28 - Cut out the stuff dealing with the "Edit" button, since the button's gone.
+*/
+static gint evt_bcmd_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+
+ switch(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "index")))
+ {
+ case 0:
+ page->mode = BM_COPY;
+ break;
+ case 1:
+ page->mode = BM_COPY_COLORS;
+ break;
+ case 2:
+ page->mode = BM_SWAP;
+ break;
+ case 3:
+ btn_button_clear(btn_button_get(page->button));
+ set_mode_normal(page);
+ populate_scwin(page);
+ page->modified = TRUE;
+ break;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Pop up a dialog asking (with <text>) for a width. Defaults to <width>, and
+** calls <func> if the user clicked OK.
+*/
+static void width_dialog(const gchar *text, gint width, void (*func)(gpointer userdata, guint width), gpointer userdata)
+{
+ Dialog *dlg;
+ GtkWidget *vbox, *label, *spin;
+ GtkAdjustment *adj;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(text);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+ spin = gtk_spin_button_new(NULL, 1, 0);
+ if((adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin))) != NULL)
+ {
+ gtk_adjustment_set_lower(adj, 1.0f);
+ gtk_adjustment_set_upper(adj, G_MAXINT); /* When it comes to arbitrary limits, this is a good one. */
+ gtk_adjustment_set_step_increment(adj, 1);
+ gtk_adjustment_set_page_increment(adj, 16);
+ gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(spin), adj);
+ }
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), width);
+ gtk_box_pack_start(GTK_BOX(vbox), spin, FALSE, FALSE, 0);
+ dlg = dlg_dialog_sync_new(vbox, _("Set Row Width"), NULL);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ func(userdata, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)));
+ dlg_dialog_sync_destroy(dlg);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Add a row of <width> buttons. This is a width_dialog() callback function. */
+static void add_row(gpointer user, guint width)
+{
+ P_Buttons *page = user;
+ ButtonRow *row = NULL;
+
+ page->modified = TRUE;
+
+ if(page->sheet == NULL)
+ {
+ page->sheet = btn_buttonsheet_new(_("Default"));
+ btn_buttoninfo_add_sheet(&page->buttons, page->sheet);
+ }
+ if(page->sheet != NULL)
+ {
+ if(page->button != NULL)
+ row = g_object_get_data(G_OBJECT(page->button), "row");
+ btn_buttonsheet_insert_row(page->sheet, row, width);
+ set_mode_normal(page);
+ populate_scwin(page);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Change the width of a row of buttons. A width_dialog() callback. */
+static void resize_row(gpointer user, guint width)
+{
+ P_Buttons *page = user;
+ ButtonRow *row;
+
+ if((row = g_object_get_data(G_OBJECT(page->button), "row")) != NULL)
+ {
+ if(width != btn_buttonrow_get_width(row)) /* Don't call set_width() in vain. */
+ {
+ page->modified = TRUE;
+ btn_buttonrow_set_width(row, width);
+ set_mode_normal(page);
+ populate_scwin(page);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-19 - Move the row of the currently selected button <delta> rows (-1=>up, 1=>down). */
+static void move_row(P_Buttons *page, gint delta)
+{
+ ButtonRow *row;
+
+ if(page->button == NULL)
+ return;
+ if(delta != -1 && delta != 1)
+ return;
+
+ if((row = g_object_get_data(G_OBJECT(page->button), "row")) != NULL)
+ {
+ page->modified = TRUE;
+ btn_buttonsheet_move_row(page->sheet, row, delta);
+ set_mode_normal(page);
+ populate_scwin(page);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-01-13 - This gets called as the user types around in the tooltip string. Inefficient. */
+static gint evt_dtooltip_changed(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *but;
+ const gchar *text;
+
+ if((page != NULL) && (page->button != NULL) && ((but = btn_button_get(page->button)) != NULL))
+ {
+ if((text = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ {
+ btn_button_set_tooltip(but, text);
+ page->modified = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-28 - The narrow-button was clicked, so grab & store its new value. */
+static gint evt_dnarrow_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *but;
+
+ if((page != NULL) && ((but = btn_button_get(page->button)) != NULL))
+ {
+ page->modified = TRUE;
+ btn_button_set_flags_boolean(but, BTF_NARROW, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)));
+ set_mode_normal(page);
+ reset_widgets(page);
+ populate_scwin(page);
+ }
+ return TRUE;
+}
+
+/* 1999-01-13 - User clicked the "Show Tooltip?" button, so grab current state. */
+static gint evt_dshowtip_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *but;
+
+ if((page != NULL) && (page->button != NULL) && ((but = btn_button_get(page->button)) != NULL))
+ {
+ btn_button_set_flags_boolean(but, BTF_SHOW_TOOLTIP, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)));
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void delete_row(P_Buttons *page)
+{
+ if(dlg_dialog_sync_new_simple_wait(_("Really delete current button row?"), _("Please Confirm"), _("_Delete|_Cancel")) == DLG_POSITIVE)
+ {
+ btn_buttonsheet_delete_row(page->sheet, (ButtonRow *) g_object_get_data(G_OBJECT(page->button), "row"));
+ set_mode_normal(page);
+ populate_scwin(page);
+ page->modified = TRUE;
+ }
+}
+
+/* 1998-09-15 - Row command button clicked, do something serious. */
+static gint evt_rcmd_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ ButtonRow *brw = NULL;
+ gint width = 8;
+
+ if(page->button != NULL)
+ {
+ brw = g_object_get_data(G_OBJECT(page->button), "row");
+ width = btn_buttonrow_get_width(brw);
+ }
+ switch(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "index")))
+ {
+ case 0: /* Add? */
+ width_dialog(_("Select Width for New Row"), width, add_row, page);
+ break;
+ case 1: /* Change width? */
+ width_dialog(_("Change Width of Row"), width, resize_row, page);
+ break;
+ case 2: /* Move up? */
+ move_row(page, -1);
+ break;
+ case 3: /* Move down? */
+ move_row(page, 1);
+ break;
+ case 4: /* Delete? */
+ delete_row(page);
+ break;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-01 - User changed a button label. Update definition accordingly. */
+static void evt_label_changed(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ const gchar *text;
+ BtnFace face;
+
+ if((page != NULL) && (page->button != NULL))
+ {
+ face = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "face"));
+ if((text = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ {
+ btn_button_set_label_widget(page->button, face, text);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 1999-05-01 - User edited the command sequence name. Update button definition. */
+static void evt_cmdseq_changed(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *btn;
+
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ const gchar *text;
+ BtnFace face;
+
+ face = (BtnFace) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "face"));
+ if((text = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ {
+ btn_button_set_cmdseq(btn, face, text);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 1999-05-01 - User clicked on the "details" button (magnifying glass) for cmdseq. Bring up
+** a dialog.
+*/
+static void evt_cmdseq_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *btn;
+
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ BtnFace face;
+ const gchar *csq;
+
+ face = (BtnFace) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "face"));
+ if((csq = csq_dialog_sync_new_wait(page->min, ccs_get_current())) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->def[face].cmdseq), csq); /* Rely on "changed" signal. */
+ }
+}
+
+/* 1999-05-01 - A key has been pressed in the "Key" entry box. Get key name and set it. */
+static void evt_key_press(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *btn;
+ gchar *key;
+
+ if((key = gtk_accelerator_name(evt->keyval, evt->state)) != NULL)
+ {
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ BtnFace face;
+
+ face = (BtnFace) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "face"));
+ gtk_entry_set_text(GTK_ENTRY(wid), key);
+ btn_button_set_key(btn, face, gtk_entry_get_text(GTK_ENTRY(wid)));
+ page->modified = TRUE;
+ }
+ g_free(key);
+ }
+}
+
+/* 1999-05-01 - Clear the key for the clicked face. */
+static void evt_key_clear_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Buttons *page = user;
+ Button *btn;
+
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ BtnFace face;
+
+ face = (BtnFace) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "face"));
+ gtk_entry_set_text(GTK_ENTRY(page->def[face].key), "");
+ btn_button_set_key(btn, face, NULL);
+ page->modified = TRUE;
+ }
+}
+
+/* 1999-05-02 - This gets called by cdl_dialog() (the color_dialog module) when the bg color changes. */
+static void col_bg_changed(const GdkRGBA *color, gpointer user)
+{
+ P_Buttons *page = user;
+ BtnFace face;
+ GdkColor color_old;
+
+ face = page->col_change_face;
+ gui_color_from_rgba(&color_old, color);
+ btn_button_set_color_bg_widget(page->button, face, &color_old);
+}
+
+/* 1999-05-02 - User clicked the background color multi-faced button. Either bring up a dialog,
+** letting user pick a new color, or reset the button's color to the default.
+*/
+static void evt_col_bg_clicked(GtkWidget *wid, gpointer user)
+{
+ BtnFace function = od_multibutton_get_index(OD_MULTIBUTTON(wid));
+ P_Buttons *page = user;
+ Button *btn;
+ gint tface = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "face"));
+
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ if(function == BTN_PRIMARY) /* Dialog-time? */
+ {
+ GdkColor old_old;
+ GdkRGBA old, *op = NULL;
+ guint res;
+
+ if(btn_button_get_color_bg(btn, tface, &old_old))
+ {
+ gui_rgba_from_color(&old, &old_old);
+ op = &old;
+ }
+ page->col_change_face = tface;
+ res = cdl_dialog_sync_new_wait(_("Edit Background Color"), col_bg_changed, op, page);
+ if(res == DLG_POSITIVE)
+ page->modified = TRUE;
+ else if(op != NULL)
+ btn_button_set_color_bg_widget(page->button, tface, &old_old);
+ }
+ else /* Time to reset color to system default. */
+ {
+ btn_button_set_color_bg_widget(page->button, tface, NULL);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 1999-05-02 - This gets called by cdl_dialog() (the color_dialog module) when the fg color changes. */
+static void col_fg_changed(const GdkRGBA *color, gpointer user)
+{
+ P_Buttons *page = user;
+ BtnFace face;
+ GdkColor color_old;
+
+ face = page->col_change_face;
+ gui_color_from_rgba(&color_old, color);
+ btn_button_set_color_fg_widget(page->button, face, &color_old);
+}
+
+/* 2008-11-28 - User clicked the foreground color multi-faced button. Either bring up a dialog,
+** letting user pick a new color, or reset the button's color to the default.
+*/
+static void evt_col_fg_clicked(GtkWidget *wid, gpointer user)
+{
+ BtnFace function = od_multibutton_get_index(OD_MULTIBUTTON(wid));
+ P_Buttons *page = user;
+ Button *btn;
+ gint tface = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "face"));
+
+ if((page != NULL) && ((btn = btn_button_get(page->button)) != NULL))
+ {
+ if(function == BTN_PRIMARY) /* Dialog-time? */
+ {
+ GdkColor old_old;
+ GdkRGBA old, *op = NULL;
+ guint res;
+
+ if(btn_button_get_color_fg(btn, tface, &old_old))
+ {
+ gui_rgba_from_color(&old, &old_old);
+ op = &old;
+ }
+ page->col_change_face = tface;
+ res = cdl_dialog_sync_new_wait(_("Edit Foreground Color"), col_fg_changed, op, page);
+ if(res == DLG_POSITIVE)
+ page->modified = TRUE;
+ else if(op != NULL)
+ btn_button_set_color_fg_widget(page->button, tface, &old_old);
+ }
+ else /* Time to reset color to system default. */
+ {
+ btn_button_set_color_fg_widget(page->button, tface, NULL);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 1999-04-24 - Initialize widgetry for a button definition box. Thanks to the new wonderful
+** widget (contributed by J. Hanson <johan@tiq.com>) we now have two actions per
+** button. Very Opus-ish, and very good.
+*/
+static void init_bdef(MainInfo *min, P_Buttons *page, BDef *def, const gchar *lab, BtnFace face)
+{
+ GtkWidget *grid, *label, *btn, *hbox;
+
+ def->frame = gtk_frame_new(lab);
+ grid = gtk_grid_new();
+
+ label = gtk_label_new(_("Label"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ def->label = gtk_entry_new();
+ gtk_widget_set_hexpand(def->label, TRUE);
+ gtk_widget_set_halign(def->label, GTK_ALIGN_FILL);
+ gtk_entry_set_max_length(GTK_ENTRY(def->label), BTN_LABEL_SIZE - 1);
+ g_object_set_data(G_OBJECT(def->label), "face", GUINT_TO_POINTER(face));
+ def->label_sig = g_signal_connect(G_OBJECT(def->label), "changed", G_CALLBACK(evt_label_changed), page);
+ gtk_grid_attach(GTK_GRID(grid), def->label, 1, 0, 2, 1);
+
+ label = gtk_label_new(_("Command"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ def->cmdseq = gtk_entry_new();
+ g_object_set_data(G_OBJECT(def->cmdseq), "face", GUINT_TO_POINTER(face));
+ def->cmdseq_sig = g_signal_connect(G_OBJECT(def->cmdseq), "changed", G_CALLBACK(evt_cmdseq_changed), page);
+ gtk_grid_attach(GTK_GRID(grid), def->cmdseq, 1, 1, 1, 1);
+ btn = gui_details_button_new();
+ g_object_set_data(G_OBJECT(btn), "face", GUINT_TO_POINTER(face));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_cmdseq_pick_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), btn, 2, 1, 1, 1);
+
+ label = gtk_label_new(_("Key"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1);
+ def->key = gtk_entry_new();
+ gtk_editable_set_editable(GTK_EDITABLE(def->key), FALSE);
+ g_object_set_data(G_OBJECT(def->key), "face", GUINT_TO_POINTER(face));
+ g_signal_connect(G_OBJECT(def->key), "key_press_event", G_CALLBACK(evt_key_press), page);
+ gtk_grid_attach(GTK_GRID(grid), def->key, 1, 2, 1, 1);
+
+ btn = gtk_button_new_from_icon_name("edit-clear", GTK_ICON_SIZE_MENU);
+ g_object_set_data(G_OBJECT(btn), "face", GUINT_TO_POINTER(face));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_key_clear_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), btn, 2, 2, 1, 1);
+
+ label = gtk_label_new(_("Colors"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 3, 1, 1);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ def->col_bg = od_multibutton_new();
+ od_multibutton_set_text(OD_MULTIBUTTON(def->col_bg), 0, _("Background..."), NULL, NULL, GUINT_TO_POINTER(face));
+ od_multibutton_set_text(OD_MULTIBUTTON(def->col_bg), 1, _("Reset to Default"), NULL, NULL, GUINT_TO_POINTER(face));
+ g_object_set_data(G_OBJECT(def->col_bg), "face", GINT_TO_POINTER(face));
+ g_signal_connect(G_OBJECT(def->col_bg), "clicked", G_CALLBACK(evt_col_bg_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), def->col_bg, TRUE, TRUE, 0);
+ def->col_fg = od_multibutton_new();
+ od_multibutton_set_text(OD_MULTIBUTTON(def->col_fg), 0, _("Foreground..."), NULL, NULL, GUINT_TO_POINTER(face));
+ od_multibutton_set_text(OD_MULTIBUTTON(def->col_fg), 1, _("Reset to Default"), NULL, NULL, GUINT_TO_POINTER(face));
+ g_object_set_data(G_OBJECT(def->col_fg), "face", GINT_TO_POINTER(face));
+ g_signal_connect(G_OBJECT(def->col_fg), "clicked", G_CALLBACK(evt_col_fg_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), def->col_fg, TRUE, TRUE, 0);
+ gtk_grid_attach(GTK_GRID(grid), hbox, 1, 3, 3, 1);
+
+ gtk_container_add(GTK_CONTAINER(def->frame), grid);
+}
+
+static void evt_sheet_activate(GtkWidget *wid, guint index, gpointer user)
+{
+ P_Buttons *page = user;
+
+ if(index == 0U)
+ page->cur_sheet = NULL;
+ else
+ page->cur_sheet = "Shortcuts"; /* Hardcoded, yes. */
+ page->sheet = btn_buttonsheet_get(&page->buttons, page->cur_sheet);
+ populate_scwin(page);
+}
+
+static GtkWidget * cbt_init(MainInfo *min, gchar **name)
+{
+ P_Buttons *page = &the_page;
+ const gchar *mlab[] = { N_("Default"), N_("Shortcuts"), NULL },
+ *blab[] = { N_("Copy To"), N_("Copy Colors To"), N_("Swap With"), N_("Clear") },
+ *rlab[] = { N_("Add Row..."), N_("Row Width..."), N_("Up"), N_("Down"), N_("Delete Row") };
+ GtkWidget *hbox, *optm, *sep, *label, *frame;
+ guint i;
+ gint expand;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->min = min;
+ page->button = NULL;
+ page->cur_sheet = NULL;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Sheet"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ optm = gui_build_combo_box(mlab, G_CALLBACK(evt_sheet_activate), page);
+ gtk_box_pack_start(GTK_BOX(hbox), optm, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(page->vbox), hbox, FALSE, FALSE, 0);
+
+ page->scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(page->scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->scwin, TRUE, TRUE, 0);
+ page->shvbox = NULL;
+
+ page->dvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ page->dhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ init_bdef(min, page, &page->def[0], _("Primary"), BTN_PRIMARY);
+ gtk_box_pack_start(GTK_BOX(page->dhbox), page->def[0].frame, TRUE, TRUE, 0);
+ init_bdef(min, page, &page->def[1], _("Secondary"), BTN_SECONDARY);
+ gtk_box_pack_start(GTK_BOX(page->dhbox), page->def[1].frame, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(page->dvbox), page->dhbox, TRUE, TRUE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Tooltip"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ page->dtooltip = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(page->dtooltip), BTN_TOOLTIP_SIZE - 1);
+ g_signal_connect(G_OBJECT(page->dtooltip), "changed", G_CALLBACK(evt_dtooltip_changed), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->dtooltip, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(page->dvbox), hbox, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new(_("Flags"));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->dnarrow = gtk_check_button_new_with_label(_("Narrow?"));
+ page->dnarsig = g_signal_connect(G_OBJECT(page->dnarrow), "clicked", G_CALLBACK(evt_dnarrow_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->dnarrow, TRUE, TRUE, 0);
+
+ page->dshowtip = gtk_check_button_new_with_label(_("Show Tooltip?"));
+ g_signal_connect(G_OBJECT(page->dshowtip), "clicked", G_CALLBACK(evt_dshowtip_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->dshowtip, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+
+ gtk_box_pack_start(GTK_BOX(page->dvbox), frame, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->dvbox, FALSE, FALSE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < sizeof page->bcmd / sizeof page->bcmd[0]; i++)
+ {
+ page->bcmd[i] = gtk_button_new_with_label(_(blab[i]));
+ g_object_set_data(G_OBJECT(page->bcmd[i]), "index", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(page->bcmd[i]), "clicked", G_CALLBACK(evt_bcmd_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->bcmd[i], TRUE, TRUE, 0);
+ }
+ gtk_box_pack_start(GTK_BOX(page->vbox), hbox, FALSE, FALSE, 5);
+
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start(GTK_BOX(page->vbox), sep, FALSE, FALSE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < sizeof page->rcmd / sizeof page->rcmd[0]; i++)
+ {
+ if(i == 2 || i == 3)
+ page->rcmd[i] = gtk_button_new_from_icon_name(i == 2 ? "go-up" : "go-down", GTK_ICON_SIZE_MENU);
+ else
+ page->rcmd[i] = gtk_button_new_with_label(_(rlab[i]));
+ g_object_set_data(G_OBJECT(page->rcmd[i]), "index", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(page->rcmd[i]), "clicked", G_CALLBACK(evt_rcmd_clicked), page);
+ expand = (i == 0) || (i == sizeof page->rcmd / sizeof page->rcmd[0] - 1);
+ gtk_box_pack_start(GTK_BOX(hbox), page->rcmd[i], expand, TRUE, expand ? 5 : 1);
+ }
+ gtk_box_pack_start(GTK_BOX(page->vbox), hbox, FALSE, FALSE, 5);
+
+ cfg_tree_level_begin(_("Buttons"));
+ cfg_tree_level_append(_("Definitions"), page->vbox);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(optm), 0); /* Do this last, so all handlers can run. */
+
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cbt_update(MainInfo *min)
+{
+ P_Buttons *page = &the_page;
+
+ page->min = min;
+ page->modified = FALSE;
+ btn_buttoninfo_copy(&page->buttons, &min->cfg.buttons);
+ page->sheet = btn_buttonsheet_get(&page->buttons, page->cur_sheet);
+ populate_scwin(page);
+ set_mode_normal(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cbt_accept(MainInfo *min)
+{
+ P_Buttons *page = &the_page;
+
+ if(page->modified)
+ {
+ btn_buttoninfo_clear(&min->cfg.buttons);
+ min->cfg.buttons = page->buttons;
+ page->buttons.sheets = NULL;
+ cfg_set_flags(CFLG_REBUILD_BOTTOM | CFLG_RESET_KEYBOARD);
+ page->modified = FALSE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Save out the button information to a fun file, using our pseudo-XML. */
+static gint cbt_save(MainInfo *min, FILE *out)
+{
+ btn_buttoninfo_save(min, &min->cfg.buttons, out, NODE);
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Load a bunch of button sheets in. */
+static void cbt_load(MainInfo *min, const XmlNode *node)
+{
+ btn_buttoninfo_load(min, &min->cfg.buttons, node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-16 - Hide the button config page. Just unselects any selected button. */
+static void cbt_hide(MainInfo *min)
+{
+ P_Buttons *page = &the_page;
+
+ if(page->button != NULL)
+ set_mode_normal(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cbt_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cbt_init, cbt_update, cbt_accept, cbt_save, cbt_load, cbt_hide };
+
+ return &desc;
+}
diff --git a/src/cfg_buttons.h b/src/cfg_buttons.h
new file mode 100644
index 0000000..67c7216
--- /dev/null
+++ b/src/cfg_buttons.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-15 - Header for the brand new button config module.
+*/
+
+extern const CfgModule * cbt_describe(MainInfo *min);
diff --git a/src/cfg_cmdcfg.c b/src/cfg_cmdcfg.c
new file mode 100644
index 0000000..5bd78bd
--- /dev/null
+++ b/src/cfg_cmdcfg.c
@@ -0,0 +1,167 @@
+/*
+** 1999-04-05 - Configuration module to deal with individual built-in commands'
+** configuration. Deep, huh? Relies heavily on the "cmdseq_config"
+** module.
+*/
+
+#include "gentoo.h"
+
+#include "cmdseq_config.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+
+#include "cfg_cmdcfg.h"
+
+#define NODE "CommandConfig"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ CmdCfg *cmc;
+ gpointer instance;
+ GtkWidget *gui;
+} CmdPair;
+
+typedef struct {
+ GtkWidget *vbox; /* This is required. */
+
+ MainInfo *min;
+ CmdPair *cmd; /* Vector of cmc-instance pairs. */
+ guint cmd_num; /* Length of above vector. */
+ guint cmd_index; /* Current, used during setup. */
+} P_CmdCfg;
+
+static P_CmdCfg the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Create editing instances for all registered cmc's out there. */
+static void create_instance(CmdCfg *cmc, gpointer user)
+{
+ P_CmdCfg *page = user;
+
+ page->cmd[page->cmd_index].cmc = cmc;
+ page->cmd[page->cmd_index].instance = cmc_instance_new_from_base(cmc);
+ page->cmd[page->cmd_index].gui = NULL;
+ page->cmd_index++;
+}
+
+/* 1999-04-05 - Initialize the command config interface. Actually quite simple. */
+static GtkWidget * ccc_init(MainInfo *min, gchar **name)
+{
+ P_CmdCfg *page = &the_page;
+ const gchar *label;
+ guint i;
+
+ page->min = min;
+ page->cmd_num = cmc_config_registered_num();
+ page->cmd = g_malloc(page->cmd_num * sizeof *page->cmd);
+ page->cmd_index = 0;
+ cmc_config_registered_foreach(create_instance, page);
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ gtk_widget_show_all(page->vbox);
+ cfg_tree_level_begin(_("Options"));
+ for(i = 0; i < page->cmd_num; i++)
+ {
+ label = cmc_config_get_name(page->cmd[i].cmc);
+ page->cmd[i].gui = gtk_label_new("(dummy)");
+ cfg_tree_level_append(label, page->cmd[i].gui);
+ }
+ cfg_tree_level_end();
+ cfg_tree_level_end();
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - The configuration window is opening up; make sure our page is up-to-date.
+** This involves refreshing the editing data from the base instances, and
+** building new widgets.
+*/
+static void ccc_update(MainInfo *min)
+{
+ P_CmdCfg *page = &the_page;
+ GtkWidget *subpage;
+ guint i;
+
+ for(i = 0; i < page->cmd_num; i++)
+ {
+ cmc_instance_copy_from_base(page->cmd[i].cmc, page->cmd[i].instance);
+ if((subpage = cmc_instance_build(page->cmd[i].cmc, page->cmd[i].instance)) != NULL)
+ {
+ cfg_tree_level_replace(page->cmd[i].gui, subpage);
+ page->cmd[i].gui = subpage;
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Accept the current settings, thus copying our editing instances over the
+** commands' base ones
+*/
+static void ccc_accept(MainInfo *min)
+{
+ P_CmdCfg *page = &the_page;
+ guint i;
+
+ for(i = 0; i < page->cmd_num; i++)
+ {
+ if(cmc_instance_get_modified(page->cmd[i].cmc, page->cmd[i].instance))
+ cmc_instance_copy_to_base(page->cmd[i].cmc, page->cmd[i].instance);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cmdcfg_save(CmdCfg *cmc, gpointer user)
+{
+ cmc_config_base_save(cmc, user);
+}
+
+/* 1999-04-05 - Write command configuration data into open file at <out>. Note that this does
+** not use the editing instances, since they are not necessarily up-to-date.
+*/
+static gint ccc_save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, NODE);
+ cmc_config_registered_foreach(cmdcfg_save, out);
+ xml_put_node_close(out, NODE);
+
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Look for node with <cmc>'s name in XML tree at <user>, and load (parse) the
+** data into the base instance.
+*/
+static void cmdcfg_load(CmdCfg *cmc, gpointer user)
+{
+ const XmlNode *tree = user, *data;
+
+ if((data = xml_tree_search(tree, cmc_config_get_name(cmc))) != NULL)
+ cmc_config_base_load(cmc, data);
+}
+
+/* 1999-04-05 - Load command config data from tree rooted at <node>. As all other config loaders,
+** this actually does *not* load into the editing copies of the data being configured,
+** but rather into the actual config data in use (the base instances here).
+*/
+static void ccc_load(MainInfo *min, const XmlNode *node)
+{
+ cmc_config_registered_foreach(cmdcfg_load, (gpointer) node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - That ever-present page describing function. */
+const CfgModule * ccc_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, ccc_init, ccc_update, ccc_accept, ccc_save, ccc_load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_cmdcfg.h b/src/cfg_cmdcfg.h
new file mode 100644
index 0000000..4fea997
--- /dev/null
+++ b/src/cfg_cmdcfg.h
@@ -0,0 +1,5 @@
+/*
+** 1999-04-05 - Another one of those boring one-liner headers.
+*/
+
+extern const CfgModule * ccc_describe(MainInfo *min);
diff --git a/src/cfg_cmdseq.c b/src/cfg_cmdseq.c
new file mode 100644
index 0000000..e34de6e
--- /dev/null
+++ b/src/cfg_cmdseq.c
@@ -0,0 +1,1294 @@
+/*
+** 1998-09-26 - A brand new command configuration page!
+** 1998-10-03 - There's a weird sensitivity bug with the command row type option menu...
+** 1999-03-09 - Redesigned the Before/After flag GUI. It's less stupid now, and vertically shorter.
+** 1999-06-19 - Adapted for the new dialog module.
+** 2000-07-02 - Initialized translation by marking strings and stuff.
+*/
+
+#include "gentoo.h"
+#include "guiutil.h"
+#include "cmdseq.h"
+#include "dialog.h"
+#include "hash_dialog.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "cfg_cmdseq.h"
+
+#define NODE "CmdSeqs"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Extra widgetry for built-in rows. Not very much. */
+ GtkWidget *vbox;
+ GtkWidget *label; /* Just a big fat label saying that there's nothing here. */
+} PX_Builtin;
+
+typedef struct { /* External command general flags. */
+ GtkWidget *vbox; /* A box that holds the page. */
+ GtkWidget *runbg; /* Run in background? */
+ GtkWidget *killprev; /* Kill previous instance? */
+ GtkWidget *survive; /* Survive quit? */
+ GtkWidget *graboutput; /* Grab output? */
+} PXE_General;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *reqsel_src;
+ GtkWidget *reqsel_dst;
+ GtkWidget *cdsrc;
+ GtkWidget *cddst;
+} PXE_BF;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *rssrc;
+ GtkWidget *rsdst;
+} PXE_AF;
+
+typedef struct { /* Extra widgetry for external commands. Plenty of flags. */
+ GtkWidget *nbook; /* A notebook. */
+ PXE_General gflags; /* General flags page. */
+ PXE_BF bf;
+ PXE_AF af;
+} PX_External;
+
+typedef struct {
+ GtkWidget *vbox; /* Standard. */
+ GtkListStore *store; /* Main list store, holding defined command sequences. */
+ GtkWidget *view; /* Main tree view. */
+
+ GtkWidget *nhbox; /* A hbox holding name label and entry. */
+ GtkWidget *name; /* Name entry widget. */
+
+ GtkWidget *dframe; /* Definition frame. */
+ GtkWidget *dbtn[3]; /* Definition row commands. */
+ GtkListStore *dstore; /* Tree model for the definition. */
+ gulong sig_delete; /* Handler for the "row_deleted" signal. */
+ GtkWidget *dview; /* Tree view for the definition. */
+ GtkWidget *dhbox; /* Hbox for type, definition, and pick button. */
+ GtkWidget *dtype; /* Type option menu, select built-in/external. */
+ GtkWidget *ddef; /* Row definition. */
+ GtkWidget *dpick; /* Pick button, for definition help. */
+
+ GtkWidget *dextra; /* Notebook for type-specific info (flags etc). */
+
+ GtkWidget *drepeat; /* Repeat-flag, global for sequence. */
+
+ PX_Builtin px_builtin;
+ PX_External px_external;
+
+ GtkWidget *bhbox; /* Command button hbox ("Add" & "Delete"). */
+ GtkWidget *badd, *bdel;
+
+ MainInfo *min; /* Very handy. */
+ GHashTable *cmdseq; /* Copies of all command sequences live here. */
+ gboolean modified; /* Has the page been modified? */
+} P_CmdSeq;
+
+static P_CmdSeq the_page;
+
+enum {
+ CMDSEQ_COLUMN_NAME,
+ CMDSEQ_COLUMN_CMDSEQ,
+
+ CMDSEQ_COLUMN_COUNT
+};
+
+enum {
+ DEF_COLUMN_TYPE,
+ DEF_COLUMN_DEF,
+ DEF_COLUMN_ROW,
+
+ DEF_COLUMN_COUNT
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void set_row_widgets(P_CmdSeq *page);
+static void reset_row_widgets(P_CmdSeq *page);
+static void evt_type_selected(GtkWidget *wid, guint index, gpointer user);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Copy the command sequence pointed to by <data>, and insert it into
+** both the "editing hash table" and the ListStore for the main list.
+*/
+static void copy_and_insert_cmdseq(gpointer key, gpointer data, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *seq;
+
+ if((seq = csq_cmdseq_copy(data)) != NULL)
+ {
+ GtkTreeIter titer;
+
+ csq_cmdseq_hash(&page->cmdseq, seq);
+
+ gtk_list_store_insert_with_values(page->store, &titer, -1, CMDSEQ_COLUMN_NAME, seq->name, CMDSEQ_COLUMN_CMDSEQ, seq, -1);
+ }
+}
+
+/* 1998-09-26 - Copy all current commands into our editing version, and also populate the
+** main list with a list of the available commands.
+*/
+static void populate_list(MainInfo *min, P_CmdSeq *page)
+{
+ page->cmdseq = NULL;
+ if(min->cfg.commands.cmdseq != NULL)
+ {
+ gtk_list_store_clear(page->store);
+ g_hash_table_foreach(min->cfg.commands.cmdseq, copy_and_insert_cmdseq, page);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static CmdSeq * cmdseq_get_selected(P_CmdSeq *page, GtkTreeIter *iter)
+{
+ GtkTreeIter local;
+ CmdSeq *cmdseq = NULL;
+
+ if(iter == NULL)
+ iter = &local;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), NULL, iter))
+ gtk_tree_model_get(GTK_TREE_MODEL(page->store), iter, CMDSEQ_COLUMN_CMDSEQ, &cmdseq, -1);
+
+ return cmdseq;
+}
+
+/* 2009-03-20 - Find the currently selected command row, and return pointer to it. */
+static CmdRow * cmdrow_get_selected(P_CmdSeq *page, GtkTreeIter *iter)
+{
+ GtkTreeIter local;
+ CmdRow *row = NULL;
+
+ if(page == NULL)
+ return NULL;
+ if(iter == NULL)
+ iter = &local;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dview)), NULL, iter))
+ gtk_tree_model_get(GTK_TREE_MODEL(page->dstore), iter, DEF_COLUMN_ROW, &row, -1);
+
+ return row;
+}
+
+static gboolean get_selections(P_CmdSeq *page, CmdSeq **cmdseq, CmdRow **row)
+{
+ if(cmdseq != NULL)
+ *cmdseq = cmdseq_get_selected(page, NULL);
+ if(row != NULL)
+ *row = cmdrow_get_selected(page, NULL);
+ return (cmdseq == NULL || *cmdseq != NULL) && (row == NULL || *row != NULL);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - We have a selection, so go ahead and populate the definition clist. */
+static void populate_dlist(P_CmdSeq *page)
+{
+ GtkTreeIter ti;
+ const GList *iter;
+ const CmdSeq *cs;
+ const CmdRow *row;
+
+ g_signal_handler_block(G_OBJECT(page->dstore), page->sig_delete);
+ gtk_list_store_clear(page->dstore);
+ if((cs = cmdseq_get_selected(page, &ti)) != NULL)
+ {
+ for(iter = cs->rows; iter != NULL; iter = g_list_next(iter))
+ {
+ row = iter->data;
+ gtk_list_store_insert_with_values(page->dstore, &ti, -1,
+ DEF_COLUMN_TYPE, csq_cmdrow_type_to_string(row->type),
+ DEF_COLUMN_DEF, row->def->str,
+ DEF_COLUMN_ROW, row,
+ -1);
+ }
+ }
+ g_signal_handler_unblock(G_OBJECT(page->dstore), page->sig_delete);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Reset all widgets to their most passive state. */
+static void reset_widgets(P_CmdSeq *page)
+{
+ gtk_entry_set_text(GTK_ENTRY(page->name), "");
+ gtk_widget_set_sensitive(page->nhbox, FALSE);
+
+ g_signal_handler_block(G_OBJECT(page->dstore), page->sig_delete);
+ gtk_list_store_clear(page->dstore);
+ g_signal_handler_unblock(G_OBJECT(page->dstore), page->sig_delete);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(page->dtype), 0);
+ gtk_entry_set_text(GTK_ENTRY(page->ddef), "");
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(page->dextra), 0);
+ reset_row_widgets(page);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->drepeat), FALSE);
+ gtk_widget_set_sensitive(page->dframe, FALSE);
+
+ gtk_widget_set_sensitive(page->bdel, FALSE);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-08 - Set the state of the command's repeat flag. Only available if no command row
+** runs in the background, will be automatically disabled as soon as a row is
+** given the background flag.
+*/
+static void set_repeat(P_CmdSeq *page)
+{
+ CmdSeq *cs;
+ CmdRow *row;
+ GList *iter;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+
+ for(iter = cs->rows; iter != NULL; iter = g_list_next(iter))
+ {
+ row = iter->data;
+ if((row->type == CRTP_EXTERNAL) && (row->extra.external.gflags & CGF_RUNINBG))
+ break;
+ }
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->drepeat),
+ (cs->flags & CSFLG_REPEAT) && (iter == NULL));
+ gtk_widget_set_sensitive(page->drepeat, iter == NULL);
+}
+
+/* 1998-09-26 - Set widgets in a state suitable to the current selection. */
+static void set_widgets(P_CmdSeq *page)
+{
+ CmdSeq *cs;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+
+ gtk_entry_set_text(GTK_ENTRY(page->name), cs->name);
+ gtk_widget_set_sensitive(page->nhbox, TRUE);
+
+ populate_dlist(page);
+ reset_row_widgets(page);
+ gtk_widget_set_sensitive(page->dframe, TRUE);
+ gtk_widget_set_sensitive(page->bdel, TRUE);
+ set_repeat(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_cmdseq_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ P_CmdSeq *page = user;
+ GtkTreeIter iter;
+ CmdSeq *cmdseq;
+
+ if((cmdseq = cmdseq_get_selected(page, &iter)) != NULL)
+ set_widgets(page);
+ else
+ reset_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - User is editing the name of the current sequence.
+** 2009-03-15 - Rewritten for GTK+ 2-based list handling. It resorts live, here in the future.
+*/
+static gint evt_name_changed(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ GtkTreeIter iter;
+ CmdSeq *cs;
+ const gchar *text;
+
+ if((cs = cmdseq_get_selected(page, &iter)) == NULL)
+ return TRUE;
+ if((text = gtk_entry_get_text(GTK_ENTRY(wid))) == NULL)
+ return TRUE;
+ csq_cmdseq_set_name(page->cmdseq, cs, text);
+ gtk_list_store_set(page->store, &iter,
+ CMDSEQ_COLUMN_NAME, text,
+ -1);
+ page->modified = TRUE;
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Set general flag widgets in <pxeg> to match <flags>. */
+static void set_cx_g_flags(PXE_General *pxeg, guint32 flags)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxeg->runbg), (flags & CGF_RUNINBG) != 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxeg->killprev), (flags & CGF_KILLPREV) != 0);
+ gtk_widget_set_sensitive(pxeg->killprev, (flags & CGF_RUNINBG) != 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxeg->graboutput), (flags & CGF_GRABOUTPUT) != 0);
+ gtk_widget_set_sensitive(pxeg->survive, (flags & CGF_RUNINBG) != 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxeg->survive), (flags & CGF_SURVIVE) != 0);
+}
+
+/* 1999-03-09 - Set visual state of before/after checkbuttons, according to <flags>. Sets for
+** the before group if <after> is FALSE, otherwise for the after group. Geddit?
+*/
+static void set_cx_ba_flags(PXE_BF *pxbf, PXE_AF *pxaf, guint after, guint32 flags)
+{
+ if(!after) /* Set "before" type flags, i.e. CD source XOR dest. */
+ {
+ guint st_src = FALSE, st_dst = FALSE; /* Guess a few states. */
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxbf->reqsel_src), (flags & CBAF_REQSEL_SOURCE) != 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxbf->reqsel_dst), (flags & CBAF_REQSEL_DEST) != 0);
+ if(flags & CBAF_CD_SOURCE)
+ st_src = TRUE;
+ else if(flags & CBAF_CD_DEST)
+ st_dst = TRUE;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxbf->cdsrc), st_src);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxbf->cddst), st_dst);
+ }
+ else /* Set "after" flags, i.e. rescan source IOR dest. */
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxaf->rssrc), (flags & CBAF_RESCAN_SOURCE) != 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pxaf->rsdst), (flags & CBAF_RESCAN_DEST) != 0);
+ }
+}
+
+/* 1998-09-27 - Set the "extra" widgets for the current row, which is known to be external. */
+static void set_cx_external_widgets(P_CmdSeq *page)
+{
+ CmdRow *row;
+ CX_Ext *ext;
+
+ if((row = cmdrow_get_selected(page, NULL)) == NULL)
+ return;
+
+ ext = &row->extra.external;
+
+ set_cx_g_flags(&page->px_external.gflags, ext->gflags);
+
+ set_cx_ba_flags(&page->px_external.bf, &page->px_external.af, FALSE, ext->baflags[0]);
+ set_cx_ba_flags(&page->px_external.bf, &page->px_external.af, TRUE, ext->baflags[1]);
+}
+
+/* 1998-09-27 - Set up widgets for row, assuming there is a row selected. */
+static void set_row_widgets(P_CmdSeq *page)
+{
+ CmdRow *row;
+ guint i;
+
+ if((row = cmdrow_get_selected(page, NULL)) == NULL)
+ return;
+ for(i = 1; i < sizeof page->dbtn / sizeof page->dbtn[0]; i++)
+ gtk_widget_set_sensitive(page->dbtn[i], TRUE);
+ gui_combo_box_set_blocked(page->dtype, TRUE);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(page->dtype), row->type);
+ gui_combo_box_set_blocked(page->dtype, FALSE);
+
+ gtk_entry_set_text(GTK_ENTRY(page->ddef), row->def->str);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(page->dextra), row->type);
+ gtk_widget_set_sensitive(page->dhbox, TRUE);
+ gtk_widget_set_sensitive(page->dextra, TRUE);
+ gtk_widget_set_sensitive(page->dframe, TRUE);
+
+ if(row->type == CRTP_EXTERNAL)
+ set_cx_external_widgets(page);
+}
+
+/* 1998-09-27 - Reset the row widgets. */
+static void reset_row_widgets(P_CmdSeq *page)
+{
+ guint i;
+
+ if(page != NULL)
+ {
+ for(i = 1; i < sizeof page->dbtn / sizeof page->dbtn[0]; i++)
+ gtk_widget_set_sensitive(page->dbtn[i], FALSE);
+ gtk_entry_set_text(GTK_ENTRY(page->ddef), "");
+ gtk_widget_set_sensitive(page->dhbox, FALSE);
+ gtk_widget_set_sensitive(page->dextra, FALSE);
+ }
+}
+
+/* 2009-03-20 - Row selection changed, so update widgetry. */
+static void evt_cmdrow_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ P_CmdSeq *page = user;
+ GtkTreeIter iter;
+
+ if(page == NULL)
+ return;
+ if(cmdrow_get_selected(page, &iter) != NULL)
+ set_row_widgets(page);
+ else
+ reset_row_widgets(page);
+}
+
+/* 1999-03-08 - User hit the "Repeat" check button, grab it and set sequence's flag
+** accordingly.
+*/
+static void evt_repeat_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ cs->flags |= CSFLG_REPEAT;
+ else
+ cs->flags &= ~CSFLG_REPEAT;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - User just hit the "Add Row" button, so let's do just that. */
+static void evt_addrow_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+ CmdRow *nr;
+ CRType type;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+ if((nr = cmdrow_get_selected(page, NULL)) != NULL)
+ type = nr->type;
+ else
+ type = CRTP_BUILTIN;
+
+ if((nr = csq_cmdrow_new(type, "", 0UL)) != NULL)
+ {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ csq_cmdseq_row_append(cs, nr);
+ gtk_list_store_insert_with_values(page->dstore, &iter, -1,
+ DEF_COLUMN_TYPE, csq_cmdrow_type_to_string(nr->type),
+ DEF_COLUMN_DEF, nr->def->str,
+ DEF_COLUMN_ROW, nr,
+ -1);
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dview)), &iter);
+ if((path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->dstore), &iter)) != NULL)
+ {
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->dview), path, NULL, TRUE, 0.5f, 0.5f);
+ gtk_tree_path_free(path);
+ }
+ gtk_widget_grab_focus(page->ddef);
+ page->modified = TRUE;
+ }
+}
+
+/* 1998-09-27 - Delete the current row from the current command sequence. */
+static void evt_delrow_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+ GtkTreeIter riter;
+ CmdRow *row;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+ if((row = cmdrow_get_selected(page, &riter)) == NULL)
+ return;
+ csq_cmdseq_row_delete(cs, row);
+ gtk_list_store_remove(page->dstore, &riter);
+ page->modified = TRUE;
+}
+
+/* 1998-09-27 - User wants to duplicate the current row. Fine. */
+static void evt_duprow_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+ GtkTreeIter riter;
+ CmdRow *row, *nr;
+ GtkTreePath *path;
+
+ if((cs = cmdseq_get_selected(page, NULL)) == NULL)
+ return;
+ if((row = cmdrow_get_selected(page, &riter)) == NULL)
+ return;
+
+ if((nr = csq_cmdrow_copy(row)) != NULL)
+ {
+ csq_cmdseq_row_append(cs, nr);
+ gtk_list_store_insert_with_values(page->dstore, &riter, -1,
+ DEF_COLUMN_TYPE, csq_cmdrow_type_to_string(nr->type),
+ DEF_COLUMN_DEF, nr->def->str,
+ DEF_COLUMN_ROW, nr,
+ -1);
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dview)), &riter);
+ if((path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->dstore), &riter)) != NULL)
+ {
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->dview), path, NULL, TRUE, 0.5f, 0.5f);
+ gtk_tree_path_free(path);
+ }
+ page->modified = TRUE;
+ }
+}
+
+static void evt_row_deleted(GtkTreeModel *model, GtkTreePath *path, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+ GtkTreeIter csiter, riter;
+ gboolean valid;
+ GList *rows = NULL;
+
+ if((cs = cmdseq_get_selected(page, &csiter)) == NULL)
+ return;
+
+ /* Massive simplification, that still feels slightly ugly: rather than
+ ** being all clever and replicating the move on the real model, we just
+ ** zzap the CmdSeq's rows and re-build based on the GtkListStore. No
+ ** point in freeing the rows though, so build a new list and "relink".
+ */
+ for(valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(page->dstore), &riter);
+ valid;
+ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(page->dstore), &riter))
+ {
+ CmdRow *row;
+ gtk_tree_model_get(GTK_TREE_MODEL(page->dstore), &riter, DEF_COLUMN_ROW, &row, -1);
+ rows = g_list_append(rows, row);
+ }
+ csq_cmdseq_rows_relink(cs, rows);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - User choose a new type for the current row. */
+static void evt_type_selected(GtkWidget *wid, guint index, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdRow *row;
+ GtkTreeIter iter;
+
+ if((row = cmdrow_get_selected(page, &iter)) == NULL)
+ return;
+
+ csq_cmdrow_set_type(row, (CRType) index);
+ gtk_list_store_set(page->dstore, &iter, DEF_COLUMN_TYPE, csq_cmdrow_type_to_string(row->type), -1);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(page->dextra), (CRType) index);
+ page->modified = TRUE;
+}
+
+/* 1998-09-27 - User changed the command definition, so we need to store the new one.
+** Notice how this routine avoids to rebuild the entire clist; this is
+** probably a good idea since the changes may be rapid.
+*/
+static void evt_def_changed(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdRow *row;
+ GtkTreeIter riter;
+ const gchar *def;
+
+ if((row = cmdrow_get_selected(page, &riter)) == NULL)
+ return;
+
+ if((def = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ {
+ csq_cmdrow_set_def(row, def);
+ gtk_list_store_set(page->dstore, &riter, DEF_COLUMN_DEF, def, -1);
+ page->modified = TRUE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Pop up a requester where the user can choose among all the built-in commands. */
+static void pick_builtin(P_CmdSeq *page)
+{
+ const gchar *cmd;
+
+ if((cmd = hdl_dialog_sync_new_wait(page->min->cfg.commands.builtin, _("Select Builtin"))) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->ddef), cmd);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Let user pick a special code sequence for use in external commands. This
+** is very simple, but becomes complex because I want to use a clist.
+*/
+static void pick_external(P_CmdSeq *page)
+{
+ Dialog *dlg;
+ GtkListStore *store;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkWidget *scwin, *view;
+ const gchar *code[] = { "\\{", N_("Opening brace"),
+ "\\}", N_("Closing brace"),
+ "f", N_("First selected"),
+ "fu", N_("First selected, unselect"),
+ "fp", N_("First selected, with path"),
+ "fpu", N_("First selected, with path, unselect"),
+ "fd", N_("First selected (destination pane)"),
+ "fQ", N_("First selected, no quotes"),
+ "fE", N_("First selected, no extension"),
+ "F", N_("All selected"),
+ "Fu", N_("All selected, unselect"),
+ "Fp", N_("All selected, with paths"),
+ "Fpu", N_("All selected, with paths, unselect"),
+ "Fd", N_("All selected (destination pane)"),
+ "FQ", N_("All selected, no quotes"),
+ "FE", N_("All selected, no extensions"),
+ "Ps", N_("Path to source pane's directory"),
+ "Pd", N_("Path to destination pane's directory"),
+ "Ph", N_("Path to home directory"),
+ "Pl", N_("Path of left pane"),
+ "Pr", N_("Path of right pane"),
+ "u", N_("URI of first selected"),
+ "uu", N_("URI of first selected, unselect"),
+ "uQ", N_("URI of first selected, no quotes"),
+ "U", N_("URIs of all selected"),
+ "Uu", N_("URIs of all selected, unselect"),
+ "UQ", N_("URIs of all selected, no quotes"),
+ "UuQ", N_("URIs of all selected, unselect, no quotes"),
+ "ud", N_("URI of first selected (destination pane)"),
+ "Ic:\"label\"=\"choice1\",...", N_("Input combo box"),
+ "Im:\"label\"=\"text1:choice1\",...", N_("Input using menu"),
+ "Is:\"label\"=\"default\"", N_("Input string"),
+ "Ix:\"label\"", N_("Input check button (gives TRUE or FALSE)"),
+ "It:\"label\"", N_("Add label to input window"),
+ "It:\"-\"", N_("Add a separator bar to input window"),
+ N_("$NAME"), N_("Value of $NAME (environment)"),
+ "#", N_("gentoo's PID"),
+ N_("~NAME"), N_("Home directory for user NAME"),
+ NULL };
+ GtkTreeIter iter;
+ guint i;
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ for(i = 0; code[i] != NULL; i+= 2)
+ {
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, code[i], 1, code[i + 1], -1);
+ }
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_BROWSE);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(code)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(description)", cr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+ gtk_widget_set_size_request(view, 448, 320);
+ gtk_container_add(GTK_CONTAINER(scwin), view);
+
+ dlg = dlg_dialog_sync_new(scwin, _("Pick Code"), NULL);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), NULL, &iter))
+ {
+ gchar *code = NULL, buf[1024];
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &code, -1);
+ if(code != NULL)
+ {
+ gint pos;
+ gsize len;
+
+ if(*code == '\\')
+ len = g_snprintf(buf, sizeof buf, "%s", code);
+ else
+ len = g_snprintf(buf, sizeof buf, " {%s}", code);
+ pos = gtk_entry_get_text_length(GTK_ENTRY(page->ddef));
+ gtk_editable_insert_text(GTK_EDITABLE(page->ddef), buf, len, &pos);
+ g_free(code);
+ }
+ }
+ }
+ dlg_dialog_sync_destroy(dlg);
+}
+
+/* 1998-09-27 - The details (formerly "...") button has been clicked; pop up a quick-selection
+** window where the user can select something s?he's too lazy to type.
+*/
+static void evt_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdRow *row;
+
+ if((row = cmdrow_get_selected(page, NULL)) == NULL)
+ return;
+
+ if(row->type == CRTP_BUILTIN)
+ pick_builtin(page);
+ else if(row->type == CRTP_EXTERNAL)
+ pick_external(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Add a new command sequence to the happy bunch. */
+static void evt_add_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *ns;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ if((ns = csq_cmdseq_new(csq_cmdseq_unique_name(page->cmdseq), 0UL)) == NULL)
+ return;
+ csq_cmdseq_hash(&page->cmdseq, ns);
+ gtk_list_store_insert_with_values(page->store, &iter, -1,
+ CMDSEQ_COLUMN_NAME, ns->name,
+ CMDSEQ_COLUMN_CMDSEQ, ns,
+ -1);
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), &iter);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->store), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->view), path, NULL, TRUE, 0.5f, 0.0f);
+ gtk_tree_path_free(path);
+
+ gtk_editable_select_region(GTK_EDITABLE(page->name), 0, -1);
+ gtk_widget_grab_focus(page->name);
+}
+
+/* 1998-09-27 - Delete the currently selected command sequence. */
+static void evt_del_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdSeq *cs;
+ GtkTreeIter iter;
+
+ if((cs = cmdseq_get_selected(page, &iter)) != NULL)
+ {
+ g_hash_table_remove(page->cmdseq, cs->name);
+ csq_cmdseq_destroy(cs);
+ gtk_list_store_remove(page->store, &iter);
+ reset_widgets(page);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Build the (currently very pointless) extra controls for builtin rows. */
+static void build_px_builtin(P_CmdSeq *page, PX_Builtin *pxb)
+{
+ pxb->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ pxb->label = gtk_label_new(_("(No Options Available)"));
+ gtk_box_pack_start(GTK_BOX(pxb->vbox), pxb->label, TRUE, TRUE, 0);
+}
+
+/* 1998-09-27 - One of the general flag check buttons was clicked. */
+static void evt_gf_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ guint32 flags = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "user"));
+ CmdSeq *cs;
+ CmdRow *row;
+
+ if(!get_selections(page, &cs, &row))
+ return;
+
+ if(row->type == CRTP_EXTERNAL)
+ {
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ row->extra.external.gflags |= flags;
+ else
+ row->extra.external.gflags &= ~flags;
+ gtk_widget_set_sensitive(page->px_external.gflags.killprev, row->extra.external.gflags & CGF_RUNINBG);
+ gtk_widget_set_sensitive(page->px_external.gflags.survive, row->extra.external.gflags & CGF_RUNINBG);
+ set_repeat(page);
+ page->modified = TRUE;
+ }
+}
+
+/* 1998-09-26 - Build the page for external commands that deals with general flags. */
+static void build_pxe_general(P_CmdSeq *page, PXE_General *pxg)
+{
+ GtkWidget *hbox;
+
+ pxg->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ pxg->runbg = gtk_check_button_new_with_label(_("Run in Background?"));
+ g_object_set_data(G_OBJECT(pxg->runbg), "user", GINT_TO_POINTER(CGF_RUNINBG));
+ g_signal_connect(G_OBJECT(pxg->runbg), "clicked", G_CALLBACK(evt_gf_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pxg->runbg, FALSE, FALSE, 0);
+ pxg->killprev = gtk_check_button_new_with_label(_("Kill Previous Instance?"));
+ g_object_set_data(G_OBJECT(pxg->killprev), "user", GINT_TO_POINTER(CGF_KILLPREV));
+ g_signal_connect(G_OBJECT(pxg->killprev), "clicked", G_CALLBACK(evt_gf_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pxg->killprev, FALSE, FALSE, 0);
+ pxg->survive = gtk_check_button_new_with_label(_("Survive Quit?"));
+ g_object_set_data(G_OBJECT(pxg->survive), "user", GINT_TO_POINTER(CGF_SURVIVE));
+ g_signal_connect(G_OBJECT(pxg->survive), "clicked", G_CALLBACK(evt_gf_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pxg->survive, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(pxg->vbox), hbox, FALSE, FALSE, 0);
+
+ pxg->graboutput = gtk_check_button_new_with_label(_("Capture Output?"));
+ g_object_set_data(G_OBJECT(pxg->graboutput), "user", GINT_TO_POINTER(CGF_GRABOUTPUT));
+ g_signal_connect(G_OBJECT(pxg->graboutput), "clicked", G_CALLBACK(evt_gf_clicked), page);
+ gtk_box_pack_start(GTK_BOX(pxg->vbox), pxg->graboutput, FALSE, FALSE, 0);
+}
+
+/* 2005-01-31 - Handle clicks on source & destination selection requirement toggle buttons, and change flags. */
+static void evt_baf_reqsel_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ guint32 mask;
+ CmdRow *row;
+
+ if(!get_selections(page, NULL, &row))
+ return;
+
+ mask = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "user"));
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ row->extra.external.baflags[0] |= mask;
+ else
+ row->extra.external.baflags[0] &= ~mask;
+}
+
+/* 1999-03-09 - One of the CD check buttons was clicked. Do the pseudo-radio logic, and alter the
+** flag setting of the current command row. Note that this is kind'a sneakily written
+** (some would say ugly (uglily?)), since it actually relies on being called twice for
+** a single click in some cases (since it modifies the "other" widget, thus causing an
+** event).
+*/
+static void evt_baf_cd_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdRow *row;
+ GtkWidget *other;
+ guint32 mask;
+
+ if(!get_selections(page, NULL, &row))
+ return;
+
+ /* Figure out if we're in source or dest (same handler). */
+ if(g_object_get_data(G_OBJECT(wid), "destination"))
+ {
+ other = page->px_external.bf.cdsrc;
+ mask = CBAF_CD_DEST;
+ }
+ else
+ {
+ other = page->px_external.bf.cddst;
+ mask = CBAF_CD_SOURCE;
+ }
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(other), FALSE);
+ row->extra.external.baflags[0] |= mask;
+ }
+ else
+ row->extra.external.baflags[0] &= ~mask;
+}
+
+/* 1999-03-09 - Handle click on one of the rescanning check buttons. */
+static void evt_baf_rescan_clicked(GtkWidget *wid, gpointer user)
+{
+ P_CmdSeq *page = user;
+ CmdRow *row;
+ guint32 mask = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+
+ if(!get_selections(page, NULL, &row))
+ return;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ row->extra.external.baflags[1] |= mask;
+ else
+ row->extra.external.baflags[1] &= ~mask;
+}
+
+/* 1999-03-09 - Build new simplified widgetry for editing before and after flags. Note that the actual
+** flags have not changed, they're still muy redundant-capable. It's just the GUI that's
+** become a bit simpler to look at. At least less vertically tall.
+*/
+static void build_px_bf(P_CmdSeq *page, PXE_BF *pxbf)
+{
+ GtkWidget *grid;
+
+ pxbf->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ grid = gtk_grid_new();
+ gtk_grid_set_row_homogeneous(GTK_GRID(grid), TRUE);
+ gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
+ pxbf->reqsel_src = gtk_check_button_new_with_label(_("Require Source Selection?"));
+ g_object_set_data(G_OBJECT(pxbf->reqsel_src), "user", GINT_TO_POINTER(CBAF_REQSEL_SOURCE));
+ g_signal_connect(G_OBJECT(pxbf->reqsel_src), "clicked", G_CALLBACK(evt_baf_reqsel_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), pxbf->reqsel_src, 0, 0, 1, 1);
+ pxbf->reqsel_dst = gtk_check_button_new_with_label(_("Require Destination Selection?"));
+ g_object_set_data(G_OBJECT(pxbf->reqsel_dst), "user", GINT_TO_POINTER(CBAF_REQSEL_DEST));
+ g_signal_connect(G_OBJECT(pxbf->reqsel_dst), "clicked", G_CALLBACK(evt_baf_reqsel_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), pxbf->reqsel_dst, 1, 0, 1, 1);
+
+ pxbf->cdsrc = gtk_check_button_new_with_label(_("CD Source?"));
+ g_signal_connect(G_OBJECT(pxbf->cdsrc), "clicked", G_CALLBACK(evt_baf_cd_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), pxbf->cdsrc, 0, 1, 1, 1);
+ pxbf->cddst = gtk_check_button_new_with_label(_("CD Destination?"));
+ g_object_set_data(G_OBJECT(pxbf->cddst), "destination", GINT_TO_POINTER(1)); /* Just a silly flag. */
+ g_signal_connect(G_OBJECT(pxbf->cddst), "clicked", G_CALLBACK(evt_baf_cd_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), pxbf->cddst, 1, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(pxbf->vbox), grid, TRUE, TRUE, 0);
+}
+
+static void build_px_af(P_CmdSeq *page, PXE_AF *pxaf)
+{
+ GtkWidget *hbox;
+
+ pxaf->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ pxaf->rssrc = gtk_check_button_new_with_label(_("Rescan Source?"));
+ g_object_set_data(G_OBJECT(pxaf->rssrc), "user", GINT_TO_POINTER(CBAF_RESCAN_SOURCE));
+ g_signal_connect(G_OBJECT(pxaf->rssrc), "clicked", G_CALLBACK(evt_baf_rescan_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pxaf->rssrc, TRUE, TRUE, 0);
+ pxaf->rsdst = gtk_check_button_new_with_label(_("Rescan Destination?"));
+ g_object_set_data(G_OBJECT(pxaf->rsdst), "user", GINT_TO_POINTER(CBAF_RESCAN_DEST));
+ g_signal_connect(G_OBJECT(pxaf->rsdst), "clicked", G_CALLBACK(evt_baf_rescan_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pxaf->rsdst, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(pxaf->vbox), hbox, FALSE, FALSE, 0);
+}
+
+/* 1998-09-26 - Build the extra configuration widgetry for external commands. Plenty of stuff. */
+static void build_px_external(P_CmdSeq *page, PX_External *pxe)
+{
+ pxe->nbook = gtk_notebook_new();
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pxe->nbook), GTK_POS_LEFT);
+ build_pxe_general(page, &pxe->gflags);
+ gtk_notebook_append_page(GTK_NOTEBOOK(pxe->nbook), pxe->gflags.vbox, gtk_label_new(_("General")));
+
+ build_px_bf(page, &pxe->bf);
+ gtk_notebook_append_page(GTK_NOTEBOOK(pxe->nbook), pxe->bf.vbox, gtk_label_new(_("Before")));
+ build_px_af(page, &pxe->af);
+ gtk_notebook_append_page(GTK_NOTEBOOK(pxe->nbook), pxe->af.vbox, gtk_label_new(_("After")));
+}
+
+static GtkWidget * ccs_init(MainInfo *min, gchar **name)
+{
+ const gchar *tlab[] = { N_("Built-In"), N_("External"), NULL },
+ *dblab[] = { N_("Add Row"), N_("Duplicate"), N_("Delete Row") };
+ GCallback dbfunc[] = { G_CALLBACK(evt_addrow_clicked), G_CALLBACK(evt_duprow_clicked), G_CALLBACK(evt_delrow_clicked) };
+ guint i;
+ GtkWidget *scwin, *label, *vbox, *hbox, *vbox2, *sep, *paned;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ P_CmdSeq *page = &the_page;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ paned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ page->store = gtk_list_store_new(CMDSEQ_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_POINTER);
+ /* Make sure the cmdseq list is sorted on name. This is rather easy, nowadays. */
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(page->store), CMDSEQ_COLUMN_NAME, GTK_SORT_ASCENDING);
+ page->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(page->store));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(name)", cr, "text", CMDSEQ_COLUMN_NAME, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->view), FALSE);
+ g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view))), "changed", G_CALLBACK(evt_cmdseq_selection_changed), page);
+ gtk_container_add(GTK_CONTAINER(scwin), page->view);
+ gtk_widget_set_size_request(scwin, -1, 100);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+
+ page->nhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Name"));
+ gtk_box_pack_start(GTK_BOX(page->nhbox), label, FALSE, FALSE, 0);
+ page->name = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(page->name), CSQ_NAME_SIZE - 1);
+ g_signal_connect(G_OBJECT(page->name), "changed", G_CALLBACK(evt_name_changed), page);
+ gtk_box_pack_start(GTK_BOX(page->nhbox), page->name, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), page->nhbox, FALSE, FALSE, 0);
+ gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE);
+
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->dframe = gtk_frame_new(_("Definition"));
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < sizeof page->dbtn / sizeof page->dbtn[0]; i++)
+ {
+ page->dbtn[i] = gtk_button_new_with_label(_(dblab[i]));
+ g_signal_connect(G_OBJECT(page->dbtn[i]), "clicked", G_CALLBACK(dbfunc[i]), page);
+ gtk_box_pack_start(GTK_BOX(vbox2), page->dbtn[i], FALSE, FALSE, 0);
+ }
+ gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0);
+
+ vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->dstore = gtk_list_store_new(DEF_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ page->sig_delete = g_signal_connect(G_OBJECT(page->dstore), "row_deleted", G_CALLBACK(evt_row_deleted), page);
+ page->dview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(page->dstore));
+ vc = gtk_tree_view_column_new_with_attributes("(type)", cr, "text", DEF_COLUMN_TYPE, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->dview), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(type)", cr, "text", DEF_COLUMN_DEF, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->dview), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->dview), FALSE);
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->dview), TRUE);
+ g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dview))), "changed", G_CALLBACK(evt_cmdrow_selection_changed), page);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), page->dview);
+ gtk_widget_set_size_request(scwin, -1, 100);
+ gtk_box_pack_start(GTK_BOX(vbox2), scwin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
+
+ page->dhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->dtype = gui_build_combo_box(tlab, G_CALLBACK(evt_type_selected), page);
+ gtk_box_pack_start(GTK_BOX(page->dhbox), page->dtype, FALSE, FALSE, 0);
+ page->ddef = gtk_entry_new();
+ g_signal_connect(G_OBJECT(page->ddef), "changed", G_CALLBACK(evt_def_changed), page);
+ gtk_box_pack_start(GTK_BOX(page->dhbox), page->ddef, TRUE, TRUE, 0);
+ page->dpick = gui_details_button_new();
+ g_signal_connect(G_OBJECT(page->dpick), "clicked", G_CALLBACK(evt_pick_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->dhbox), page->dpick, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), page->dhbox, FALSE, FALSE, 0);
+
+ page->dextra = gtk_notebook_new();
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(page->dextra), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(page->dextra), FALSE);
+
+ build_px_builtin(page, &page->px_builtin);
+ gtk_notebook_append_page(GTK_NOTEBOOK(page->dextra), page->px_builtin.vbox, NULL);
+
+ build_px_external(page, &page->px_external);
+ gtk_notebook_append_page(GTK_NOTEBOOK(page->dextra), page->px_external.nbook, NULL);
+ gtk_box_pack_start(GTK_BOX(vbox), page->dextra, FALSE, FALSE, 0);
+
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5);
+ page->drepeat = gtk_check_button_new_with_label(_("Repeat Sequence Until No Source Selection?"));
+ g_signal_connect(G_OBJECT(page->drepeat), "clicked", G_CALLBACK(evt_repeat_clicked), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->drepeat, FALSE, FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(page->dframe), vbox);
+ gtk_paned_pack2(GTK_PANED(paned), page->dframe, TRUE, TRUE);
+ gtk_box_pack_start(GTK_BOX(page->vbox), paned, TRUE, TRUE, 0);
+
+ page->bhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->badd = gtk_button_new_with_label(_("Add"));
+ g_signal_connect(G_OBJECT(page->badd), "clicked", G_CALLBACK(evt_add_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->badd, TRUE, TRUE, 5);
+ page->bdel = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(page->bdel), "clicked", G_CALLBACK(evt_del_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->bdel, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->bhbox, FALSE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+
+ cfg_tree_level_begin(_("Commands"));
+ cfg_tree_level_append(_("Definitions"), page->vbox); /* Rely on cfg_cmdcfg.c to close level. */
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Update command sequence page. */
+static void ccs_update(MainInfo *min)
+{
+ the_page.min = min;
+
+ populate_list(min, &the_page);
+ reset_widgets(&the_page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Just a simple g_hash_table_foreach() callback. */
+static void destroy_cmdseq(gpointer key, gpointer data, gpointer user)
+{
+ csq_cmdseq_destroy((CmdSeq *) data);
+}
+
+/* 1998-09-27 - Accept any changes, and put them in the "real" config. */
+static void ccs_accept(MainInfo *min)
+{
+ P_CmdSeq *page = &the_page;
+
+ if(page->modified)
+ {
+ if(min->cfg.commands.cmdseq != NULL)
+ {
+ g_hash_table_foreach(min->cfg.commands.cmdseq, destroy_cmdseq, NULL);
+ g_hash_table_destroy(min->cfg.commands.cmdseq);
+ }
+ min->cfg.commands.cmdseq = page->cmdseq;
+ page->cmdseq = NULL;
+ page->modified = FALSE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void save_external(CX_Ext *cext, FILE *out)
+{
+ xml_put_node_open(out, "CX_External");
+ xml_put_integer(out, "gflags", cext->gflags);
+ xml_put_integer(out, "bflags", cext->baflags[0]);
+ xml_put_integer(out, "aflags", cext->baflags[1]);
+ xml_put_node_close(out, "CX_External");
+}
+
+/* 1998-09-27 - Save a command row. */
+static void save_cmdrow(CmdRow *row, FILE *out)
+{
+ xml_put_node_open(out, "CmdRow");
+ xml_put_text(out, "type", csq_cmdrow_type_to_string(row->type));
+ xml_put_text(out, "def", row->def->str);
+ xml_put_integer(out, "flags", row->flags);
+ switch(row->type)
+ {
+ case CRTP_BUILTIN:
+ break;
+ case CRTP_EXTERNAL:
+ save_external(&row->extra.external, out);
+ break;
+ default:
+ break;
+ }
+ xml_put_node_close(out, "CmdRow");
+}
+
+/* 1998-09-27 - Save out a single command sequence. */
+static void save_cmdseq(gpointer key, gpointer data, gpointer user)
+{
+ CmdSeq *cs = data;
+ FILE *out = user;
+ GList *iter;
+
+ xml_put_node_open(out, "CmdSeq");
+ xml_put_text(out, "name", cs->name);
+ xml_put_integer(out, "flags", cs->flags);
+ if(cs->rows != NULL) /* Any rows in this sequence? */
+ {
+ xml_put_node_open(out, "CmdRows");
+ for(iter = cs->rows; iter != NULL; iter = g_list_next(iter))
+ save_cmdrow(iter->data, out);
+ xml_put_node_close(out, "CmdRows");
+ }
+ xml_put_node_close(out, "CmdSeq");
+}
+
+/* 1998-09-28 - Save the command sequence config data right out of min->cfg. */
+static gint ccs_save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, NODE);
+ if(min->cfg.commands.cmdseq != NULL)
+ g_hash_table_foreach(min->cfg.commands.cmdseq, save_cmdseq, out);
+ xml_put_node_close(out, NODE);
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Load extra data for external command. */
+static void load_external(CX_Ext *cext, const XmlNode *node)
+{
+ xml_get_integer(node, "gflags", (gint *) &cext->gflags);
+ xml_get_integer(node, "bflags", (gint *) &cext->baflags[0]);
+ xml_get_integer(node, "aflags", (gint *) &cext->baflags[1]);
+}
+
+/* 1998-09-27 - Load a single command sequence row. */
+static void load_cmdrow(const XmlNode *node, gpointer user)
+{
+ CmdSeq *cs = user;
+ CmdRow *row;
+ const XmlNode *data;
+ CRType type = CRTP_BUILTIN;
+ const gchar *def = NULL, *tname = NULL;
+ guint32 flags = 0UL;
+
+ if(xml_get_text(node, "type", &tname))
+ type = csq_cmdrow_string_to_type(tname);
+ xml_get_text(node, "def", &def);
+ xml_get_integer(node, "flags", (gint *) &flags);
+
+ if((row = csq_cmdrow_new(type, def, flags)) != NULL)
+ {
+ if((row->type == CRTP_EXTERNAL) && (data = xml_tree_search(node, "CX_External")) != NULL)
+ load_external(&row->extra.external, data);
+ csq_cmdseq_row_append(cs, row);
+ }
+}
+
+/* 1998-09-27 - Trampoline. */
+static void load_cmdseq_rows(const XmlNode *node, CmdSeq *cs)
+{
+ xml_node_visit_children(node, load_cmdrow, cs);
+}
+
+/* 1998-09-27 - Load a command sequence. */
+static void load_cmdseq(const XmlNode *node, gpointer user)
+{
+ MainInfo *min = user;
+ const gchar *name = "Unknown";
+ guint32 flags = 0UL;
+ CmdSeq *cs;
+ const XmlNode *data;
+
+ xml_get_text(node, "name", &name);
+ xml_get_integer(node, "flags", (gint *) &flags);
+ if((cs = csq_cmdseq_new(name, flags)) != NULL)
+ {
+ if((data = xml_tree_search(node, "CmdRows")) != NULL)
+ load_cmdseq_rows(data, cs);
+ csq_cmdseq_hash(&min->cfg.commands.cmdseq, cs);
+ }
+}
+
+/* 1998-09-27 - Load a tree full of command sequence data. */
+static void ccs_load(MainInfo *min, const XmlNode *node)
+{
+ /* First destroy any existing commands. */
+ if(min->cfg.commands.cmdseq != NULL)
+ {
+ g_hash_table_foreach(min->cfg.commands.cmdseq, destroy_cmdseq, NULL);
+ g_hash_table_destroy(min->cfg.commands.cmdseq);
+ }
+ min->cfg.commands.cmdseq = NULL;
+ xml_node_visit_children(node, load_cmdseq, min);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * ccs_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, ccs_init, ccs_update, ccs_accept, ccs_save, ccs_load, NULL };
+
+ return &desc;
+}
+
+/* 1998-09-28 - This returns a pointer to the current set of command sequnces hash. Completely
+** lethal if used in the wrong way, but very useful when selecting cmdseqs in
+** the config.
+*/
+GHashTable * ccs_get_current(void)
+{
+ return the_page.cmdseq;
+}
+
+/* 2014-12-26 - Goto the named command sequence in the main list. Used by Style configuration editor. */
+gboolean ccs_goto_cmdseq(const char *name)
+{
+ GtkTreeIter iter;
+
+ if(!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(the_page.store), &iter))
+ return FALSE;
+ while(TRUE)
+ {
+ gchar *name_here;
+ gtk_tree_model_get(GTK_TREE_MODEL(the_page.store), &iter, CMDSEQ_COLUMN_NAME, &name_here, -1);
+ if(strcmp(name_here, name) == 0)
+ {
+ GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(the_page.store), &iter);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(the_page.view), path, NULL, FALSE);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(the_page.view), path, NULL, FALSE, 0, 0);
+ gtk_tree_path_free(path);
+ return TRUE;
+ }
+ if(!gtk_tree_model_iter_next(GTK_TREE_MODEL(the_page.store), &iter))
+ break;
+ }
+ return FALSE;
+}
diff --git a/src/cfg_cmdseq.h b/src/cfg_cmdseq.h
new file mode 100644
index 0000000..a115750
--- /dev/null
+++ b/src/cfg_cmdseq.h
@@ -0,0 +1,9 @@
+/*
+** 1998-09-26 - Another one of those pretty silly header file... This time for the
+** command sequence config page.
+*/
+
+const CfgModule * ccs_describe(MainInfo *);
+GHashTable * ccs_get_current(void);
+
+gboolean ccs_goto_cmdseq(const char *name);
diff --git a/src/cfg_controls.c b/src/cfg_controls.c
new file mode 100644
index 0000000..3091b39
--- /dev/null
+++ b/src/cfg_controls.c
@@ -0,0 +1,931 @@
+/*
+** 1999-03-16 - Configure controls. Initially, this will only have global keyboard shortcuts
+** to deal with, but it may get more in the future. This module relies heavily
+** on the services provided by the 'controls' module, of course.
+*/
+
+#include "gentoo.h"
+
+#include "cmdseq_dialog.h"
+
+#include "cmdseq.h"
+#include "controls.h"
+#include "dialog.h"
+#include "guiutil.h"
+#include "strutil.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "cfg_cmdseq.h" /* For ccs_current(). */
+#include "cfg_controls.h"
+
+#define NODE "Controls"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#include "graphics/icon_mouse1.xpm"
+#include "graphics/icon_mouse2.xpm"
+#include "graphics/icon_mouse3.xpm"
+#include "graphics/icon_mouse4.xpm"
+#include "graphics/icon_mouse5.xpm"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox; /* Root page container. Very standard. */
+
+ GtkWidget *kframe; /* Keyboard frame. */
+ GtkListStore *kstore; /* Stores keyboard shortcuts. */
+ GtkWidget *kview; /* A tree view for the keyboard shortcuts. */
+ GtkWidget *kdtable; /* Key definition table. */
+ GtkWidget *kdkey; /* Definition key name (entry). */
+ GtkWidget *kdcmd; /* Definition cmdsequence (entry). */
+ GtkWidget *kdcmdpick; /* Definition command pick button. */
+ GtkWidget *kadd; /* Keyboard add button. */
+ GtkWidget *kdel; /* Keyboard delete button. */
+
+ GtkWidget *mframe; /* Dirpane mouse button config frame. */
+ GtkListStore *mstore; /* Stores mouse button configs. */
+ GtkWidget *mview; /* A tree view for mouse button settings. */
+ GtkWidget *mscwin; /* Scrolling window (obsolete). */
+ GtkWidget *mdtable; /* Definition table. */
+ GtkWidget *mdcombo; /* Combobox showing mouse button for mapping. */
+ GtkWidget *mdcmd;
+ GtkWidget *mdcmdpick;
+ GtkWidget *mhbox;
+ GtkWidget *madd, *mdel;
+
+ GdkPixbuf *mpbuf[5]; /* Mouse icon pixbufs. */
+
+ GtkWidget *cmccmd; /* Entry widget for Click-M-Click command. */
+ GtkWidget *cmcdelay; /* HScale widget for cmc delay. */
+
+ GtkWidget *nonumlock; /* Ignore numlock check button. */
+
+ MainInfo *min; /* This is handy sometimes. */
+ CtrlInfo *ctrlinfo; /* The control info we're editing. */
+
+ gboolean modified; /* Indicates that a change has been made. */
+} P_Controls;
+
+enum {
+ KEY_COLUMN_KEYNAME = 0,
+ KEY_COLUMN_CMDSEQ,
+ KEY_COLUMN_KEY,
+
+ KEY_COLUMN_COUNT
+};
+
+enum {
+ MOUSE_COLUMN_ICON = 0,
+ MOUSE_COLUMN_BUTTON,
+ MOUSE_COLUMN_STATE,
+ MOUSE_COLUMN_CMDSEQ,
+ MOUSE_COLUMN_MOUSE,
+
+ MOUSE_COLUMN_COUNT
+};
+
+static P_Controls the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Reset the key definition widgets to their idle state. */
+static void reset_key_widgets(P_Controls *page)
+{
+ gtk_entry_set_text(GTK_ENTRY(page->kdkey), "");
+ gtk_entry_set_text(GTK_ENTRY(page->kdcmd), "");
+ gtk_widget_set_sensitive(page->kdtable, FALSE);
+ gtk_widget_set_sensitive(page->kadd, TRUE);
+ gtk_widget_set_sensitive(page->kdel, FALSE);
+}
+
+/* 1999-06-13 - Reset mouse editing widgets. */
+static void reset_mouse_widgets(P_Controls *page)
+{
+ gtk_combo_box_set_active(GTK_COMBO_BOX(page->mdcombo), -1);
+ gtk_entry_set_text(GTK_ENTRY(page->mdcmd), "");
+ gtk_widget_set_sensitive(page->mdtable, FALSE);
+ gtk_widget_set_sensitive(page->madd, TRUE);
+ gtk_widget_set_sensitive(page->mdel, FALSE);
+}
+
+/* 1999-03-16 - Reset all widgets on page to their most idle state. */
+static void reset_widgets(P_Controls *page)
+{
+ const gchar *cmd;
+
+ reset_key_widgets(page);
+ reset_mouse_widgets(page);
+ cmd = ctrl_clickmclick_get_cmdseq(page->ctrlinfo);
+ gtk_entry_set_text(GTK_ENTRY(page->cmccmd), cmd ? cmd : "");
+ gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(page->cmcdelay)), ctrl_clickmclick_get_delay(page->ctrlinfo));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->nonumlock), ctrl_numlock_ignore_get(page->ctrlinfo));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void list_store_append_key(P_Controls *page, const CtrlKey *key, GtkTreeIter *iter)
+{
+ GtkTreeIter myiter;
+
+ /* If caller didn't provide an iter to use, use our local. */
+ if(iter == NULL)
+ iter = &myiter;
+ gtk_list_store_insert_with_values(page->kstore, iter, -1,
+ KEY_COLUMN_KEYNAME, ctrl_key_get_keyname(key),
+ KEY_COLUMN_CMDSEQ, ctrl_key_get_cmdseq(key),
+ KEY_COLUMN_KEY, key,
+ -1);
+}
+
+/* 1999-03-16 - Populate keyboard clist. */
+static void populate_key_list(P_Controls *page)
+{
+ const GSList *iter;
+
+ gtk_list_store_clear(page->kstore);
+ for(iter = ctrl_keys_get_list(page->ctrlinfo); iter != NULL; iter = g_slist_next(iter))
+ list_store_append_key(page, iter->data, NULL);
+}
+
+static void list_store_append_mouse(P_Controls *page, const CtrlMouse *mouse, GtkTreeIter *iter)
+{
+ gchar *bname[] = { N_("Left"), N_("Middle"), N_("Right"), N_("Wheel Up"), N_("Wheel Down") };
+ guint btn;
+ GtkTreeIter myiter;
+
+ /* If caller didn't provide an iter to use, use our local. */
+ if(iter == NULL)
+ iter = &myiter;
+ btn = ctrl_mouse_get_button(mouse) - 1;
+ gtk_list_store_insert_with_values(page->mstore, iter, -1,
+ MOUSE_COLUMN_ICON, page->mpbuf[btn],
+ MOUSE_COLUMN_BUTTON, _(bname[btn]),
+ MOUSE_COLUMN_STATE, gtk_accelerator_name(0U, ctrl_mouse_get_state(mouse)),
+ MOUSE_COLUMN_CMDSEQ, ctrl_mouse_get_cmdseq(mouse),
+ MOUSE_COLUMN_MOUSE, mouse,
+ -1);
+}
+
+/* 1999-06-13 - Populate the mouse command mapping list. */
+static void populate_mouse_list(P_Controls *page)
+{
+ const GSList *iter;
+
+ gtk_list_store_clear(page->mstore);
+ for(iter = ctrl_mouse_get_list(page->ctrlinfo); iter != NULL; iter = g_slist_next(iter))
+ list_store_append_mouse(page, iter->data, NULL);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-14 - Keyboard list selection changed. Updated widgetry for editing. */
+static void evt_kselection_changed(GtkTreeSelection *ts, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlKey *key = NULL;
+
+ if(gtk_tree_selection_get_selected(ts, &model, &iter))
+ gtk_tree_model_get(model, &iter, KEY_COLUMN_KEY, &key, -1);
+ gtk_entry_set_text(GTK_ENTRY(page->kdkey), key != NULL ? ctrl_key_get_keyname(key) : "");
+ gtk_entry_set_text(GTK_ENTRY(page->kdcmd), key != NULL ? ctrl_key_get_cmdseq(key) : "");
+ gtk_widget_set_sensitive(page->kdtable, key != NULL);
+ gtk_widget_set_sensitive(page->kdel, key != NULL);
+}
+
+/* 1999-03-16 - User pressed something in the key definition entry. Convert to name and set it.
+** 2009-03-14 - Adapted for new GTK+ 2.0 list selection management. 10 years is a good interval. :)
+ */
+static gint evt_kkey_press(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlKey *key = NULL;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->kview)), &model, &iter))
+ {
+ gchar *keyname = gtk_accelerator_name(evt->keyval, evt->state);
+
+ gtk_tree_model_get(model, &iter, 2, &key, -1);
+ ctrl_key_set_keyname(page->ctrlinfo, key, keyname);
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, keyname, -1);
+ gtk_entry_set_text(GTK_ENTRY(page->kdkey), keyname);
+ g_signal_stop_emission_by_name(G_OBJECT(wid), "key_press_event");
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* 1999-03-16 - User edited the command sequence, so store the new one. */
+static gint evt_kcmd_changed(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlKey *key = NULL;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->kview)), &model, &iter))
+ {
+ const gchar *cmdseq = gtk_entry_get_text(GTK_ENTRY(wid));
+
+ gtk_tree_model_get(model, &iter, 2, &key, -1);
+ if(!ctrl_key_has_cmdseq(page->ctrlinfo, key, cmdseq))
+ {
+ ctrl_key_set_cmdseq(page->ctrlinfo, key, cmdseq);
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 1, cmdseq, -1);
+ page->modified = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - User clicked the "pick" button for key command sequence.
+** 1999-03-29 - Rewritten for new, simpler, csq_dialog() semantics.
+*/
+static gint evt_kcmdpick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ const gchar *cmd;
+
+ if((cmd = csq_dialog_sync_new_wait(page->min, ccs_get_current())) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->kdcmd), cmd);
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - User just hit the "Add" key button so, er, add a key. */
+static gint evt_kadd_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ CtrlKey *key;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ key = ctrl_key_add_unique(page->ctrlinfo);
+ ctrl_key_set_cmdseq(page->ctrlinfo, key, "");
+ gtk_list_store_insert_with_values(page->kstore, &iter, -1,
+ 0, ctrl_key_get_keyname(key),
+ 1, ctrl_key_get_cmdseq(key),
+ 2, key,
+ -1);
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->kview)), &iter);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->kstore), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->kview), path, NULL, TRUE, 0.5f, 0.0f);
+ gtk_tree_path_free(path);
+ gtk_widget_grab_focus(page->kdkey);
+ page->modified = TRUE;
+
+ return TRUE;
+}
+
+/* 1999-03-16 - User hit the "Delete" button for keys. */
+static gint evt_kdel_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlKey *key = NULL;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->kview)), &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 2, &key, -1);
+ ctrl_key_remove(page->ctrlinfo, key);
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-14 - The selection in the mouse binding list has changed. Deal with it. */
+static void evt_mselection_changed(GtkTreeSelection *ts, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlMouse *mouse = NULL;
+
+ if(gtk_tree_selection_get_selected(ts, &model, &iter))
+ gtk_tree_model_get(model, &iter, MOUSE_COLUMN_MOUSE, &mouse, -1);
+ gtk_entry_set_text(GTK_ENTRY(page->mdcmd), mouse != NULL ? ctrl_mouse_get_cmdseq(mouse) : "");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(page->mdcombo), ctrl_mouse_get_button(mouse) - 1);
+ gtk_widget_set_sensitive(page->mdtable, mouse != NULL);
+ gtk_widget_set_sensitive(page->mdel, mouse != NULL);
+}
+
+static void evt_mbutton_changed(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeSelection *ts;
+ GtkTreeIter ti, biter;
+ CtrlMouse *mouse;
+ guint btn;
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview));
+ if(ts == NULL || !gtk_tree_selection_get_selected(ts, NULL, &ti))
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(page->mstore), &ti, MOUSE_COLUMN_MOUSE, &mouse, -1);
+ btn = gtk_combo_box_get_active(GTK_COMBO_BOX(page->mdcombo));
+ ctrl_mouse_set_button(mouse, btn + 1);
+
+ /* Almost-too-clever: grab the translated mouse button label from the GtkComboBox's model. */
+ if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(page->mdcombo), &biter))
+ {
+ gchar *button;
+
+ gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(page->mdcombo)), &biter, 1, &button, -1);
+
+ gtk_list_store_set(GTK_LIST_STORE(page->mstore), &ti,
+ MOUSE_COLUMN_ICON, page->mpbuf[btn],
+ MOUSE_COLUMN_BUTTON, button,
+ -1);
+ g_free(button);
+ }
+}
+
+/* 1999-06-13 - User just hit the "Edit Modifiers..." button. Bring up a little dialog. */
+static void evt_mstate_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeSelection *ts;
+ GtkTreeIter ti;
+ CtrlMouse *mouse;
+ Dialog *dlg;
+ guint i, x, y,
+ mask[] = { GDK_SHIFT_MASK, GDK_CONTROL_MASK, GDK_MOD1_MASK, GDK_MOD2_MASK,
+ GDK_MOD3_MASK, GDK_MOD4_MASK, GDK_MOD5_MASK };
+ GtkWidget *grid, *label, *check[sizeof mask / sizeof mask[0]];
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview));
+ if(ts == NULL || !gtk_tree_selection_get_selected(ts, NULL, &ti))
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(page->mstore), &ti, MOUSE_COLUMN_MOUSE, &mouse, -1);
+
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("The following modifier key(s) must\n"
+ "be held down when the mouse button\n"
+ "is clicked to trigger the command"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
+ for(i = 0, x = 0, y = 1; i < sizeof mask / sizeof mask[0]; i++, y++)
+ {
+ check[i] = gtk_check_button_new_with_label(gtk_accelerator_name(0, mask[i]));
+ if(ctrl_mouse_get_state(mouse) & mask[i])
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check[i]), TRUE);
+ gtk_grid_attach(GTK_GRID(grid), check[i], x, y, 1, 1);
+ if(i == (sizeof mask / sizeof *mask) / 2)
+ x++, y = 0;
+ }
+ dlg = dlg_dialog_sync_new(grid, _("Edit Modifiers"), NULL);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ guint ns = 0U;
+
+ for(i = 0; i < sizeof mask / sizeof mask[0]; i++)
+ {
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check[i])))
+ ns |= mask[i];
+ }
+ ctrl_mouse_set_state(mouse, ns);
+ gtk_list_store_set(GTK_LIST_STORE(page->mstore), &ti, MOUSE_COLUMN_STATE, gtk_accelerator_name(0, ns), -1);
+ page->modified = TRUE;
+ }
+ dlg_dialog_sync_destroy(dlg);
+}
+
+/* 1999-06-13 - User is editing the command name. Update mapping. */
+static void evt_mcmd_changed(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeSelection *ts;
+ GtkTreeIter ti;
+ CtrlMouse *mouse;
+ const gchar *cmdseq;
+
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview));
+ if(ts == NULL || !gtk_tree_selection_get_selected(ts, NULL, &ti))
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(page->mstore), &ti, MOUSE_COLUMN_MOUSE, &mouse, -1);
+ if((cmdseq = gtk_entry_get_text(GTK_ENTRY(page->mdcmd))) != NULL)
+ {
+ ctrl_mouse_set_cmdseq(mouse, cmdseq);
+ gtk_list_store_set(page->mstore, &ti, MOUSE_COLUMN_CMDSEQ, cmdseq, -1);
+ page->modified = TRUE;
+ }
+}
+
+/* 1999-06-13 - User clicked details button for mouse mapping command. Pop up dialog. */
+static void evt_mcmdpick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ const gchar *cmd;
+
+ if((cmd = csq_dialog_sync_new_wait(page->min, ccs_get_current())) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->mdcmd), cmd);
+}
+
+/* 1999-06-20 - User clicked the "Add" button for mouse bindings, so add one. */
+static void evt_madd_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ CtrlMouse *mouse;
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ mouse = ctrl_mouse_add(page->ctrlinfo, 1U, 0U, "");
+ if(mouse != NULL)
+ {
+ list_store_append_mouse(page, mouse, &iter);
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview)), &iter);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->mstore), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->mview), path, NULL, TRUE, 0.5f, 0.0f);
+ gtk_tree_path_free(path);
+ page->modified = TRUE;
+ }
+}
+
+/* 1999-06-21 - The Delete-button has been clicked, remove current mouse command mapping. */
+static void evt_mdel_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CtrlMouse *mouse;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview)), &model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, MOUSE_COLUMN_MOUSE, &mouse, -1);
+ ctrl_mouse_remove(page->ctrlinfo, mouse);
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ page->modified = TRUE;
+ }
+}
+
+/* 2003-10-09 - User set a new Click-M-Click command. */
+static void evt_clickmclick_changed(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+
+ if(page)
+ {
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(wid));
+
+ ctrl_clickmclick_set_cmdseq(page->ctrlinfo, text);
+ gtk_widget_set_sensitive(page->cmcdelay, *text);
+ page->modified = TRUE;
+ }
+}
+
+/* 2003-10-09 - User wants help in picking a command for Click-M-Click. */
+static void evt_clickmclick_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+
+ if(page)
+ {
+ const gchar *cmd = csq_dialog_sync_new_wait(page->min, ccs_get_current());
+ if(cmd)
+ gtk_entry_set_text(GTK_ENTRY(page->cmccmd), cmd);
+ }
+}
+
+/* 2003-10-09 - Maximum allowed delay for Click-M-Click recognition changed. */
+static void evt_clickmclick_delay_changed(GtkAdjustment *adj, gpointer user)
+{
+ P_Controls *page = user;
+
+ if(page)
+ ctrl_clickmclick_set_delay(page->ctrlinfo, gtk_adjustment_get_value(adj));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-02-18 - User hit the "Ignore Num Lock?" toggle. Update editing state. */
+static void evt_nonumlock_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Controls *page = user;
+
+ if(page != NULL)
+ {
+ ctrl_numlock_ignore_set(page->ctrlinfo, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)));
+ page->modified = TRUE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void build_mouse_menu(P_Controls *page)
+{
+ gchar **gfx[] = { icon_mouse1_xpm, icon_mouse2_xpm, icon_mouse3_xpm, icon_mouse4_xpm, icon_mouse5_xpm },
+ *label[] = { N_("Left"), N_("Middle"), N_("Right"), N_("Wheel Up"), N_("Wheel Down") };
+ guint i;
+ GtkListStore *mmodel;
+ GtkCellRenderer *cr;
+
+ for(i = 0; i < sizeof gfx / sizeof *gfx; i++)
+ page->mpbuf[i] = gdk_pixbuf_new_from_xpm_data((const gchar **) gfx[i]);
+
+ /* Now build a full TreeModel for the GtkOptionMenu replacement. Pfew!
+ ** NOTE: Unlike key and mouse true models, we don't store the button index
+ ** in the model; instead we just use get/set active() on the GtkComboBox.
+ */
+ mmodel = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
+ for(i = 0; i < sizeof gfx / sizeof *gfx; ++i)
+ {
+ GtkTreeIter iter;
+ gtk_list_store_insert_with_values(mmodel, &iter, -1, 0, page->mpbuf[i], 1, _(label[i]), -1);
+ }
+ page->mdcombo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(mmodel));
+ cr = gtk_cell_renderer_pixbuf_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->mdcombo), cr, FALSE);
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->mdcombo), cr,
+ "pixbuf", 0,
+ NULL);
+
+ cr = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->mdcombo), cr, TRUE);
+ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(page->mdcombo), cr,
+ "text", 1,
+ NULL);
+
+ g_signal_connect(G_OBJECT(page->mdcombo), "changed", G_CALLBACK(evt_mbutton_changed), page);
+ gtk_grid_attach(GTK_GRID(page->mdtable), page->mdcombo, 1, 0, 1, 1);
+}
+
+static GtkWidget * cct_init(MainInfo *min, gchar **name)
+{
+ P_Controls *page = &the_page;
+ GtkWidget *vbox, *frame, *label, *wid, *hbox, *scwin;
+ GtkAdjustment *adj;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreeSelection *ts;
+
+ if(name == NULL)
+ return NULL;
+ *name = _("Controls");
+
+ page->min = min;
+ page->modified = FALSE;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ page->kframe = gtk_frame_new(_("Global Keyboard Shortcuts"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->kstore = gtk_list_store_new(KEY_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ page->kview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(page->kstore));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(Key)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->kview), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(Command)", cr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->kview), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->kview), FALSE);
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->kview));
+ gtk_tree_selection_set_mode(ts, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(ts), "changed", G_CALLBACK(evt_kselection_changed), page);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), page->kview);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+
+ page->kdtable = gtk_grid_new();
+ label = gtk_label_new(_("Key"));
+ gtk_grid_attach(GTK_GRID(page->kdtable), label, 0, 0, 1, 1);
+ page->kdkey = gtk_entry_new();
+ g_signal_connect(G_OBJECT(page->kdkey), "key_press_event", G_CALLBACK(evt_kkey_press), page);
+ gtk_editable_set_editable(GTK_EDITABLE(page->kdkey), FALSE);
+ gtk_grid_attach(GTK_GRID(page->kdtable), page->kdkey, 1, 0, 3, 1);
+ label = gtk_label_new(_("Command"));
+ gtk_grid_attach(GTK_GRID(page->kdtable), label, 0, 1, 1, 1);
+ page->kdcmd = gtk_entry_new();
+ gtk_widget_set_hexpand(page->kdcmd, TRUE);
+ gtk_widget_set_halign(page->kdcmd, GTK_ALIGN_FILL);
+ g_signal_connect(G_OBJECT(page->kdcmd), "changed", G_CALLBACK(evt_kcmd_changed), page);
+ gtk_grid_attach(GTK_GRID(page->kdtable), page->kdcmd, 1, 1, 1, 1);
+ page->kdcmdpick = gui_details_button_new();
+ g_signal_connect(G_OBJECT(page->kdcmdpick), "clicked", G_CALLBACK(evt_kcmdpick_clicked), page);
+ gtk_grid_attach(GTK_GRID(page->kdtable), page->kdcmdpick, 2, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(vbox), page->kdtable, FALSE, FALSE, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->kadd = gtk_button_new_with_label(_("Add"));
+ g_signal_connect(G_OBJECT(page->kadd), "clicked", G_CALLBACK(evt_kadd_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->kadd, TRUE, TRUE, 5);
+ page->kdel = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(page->kdel), "clicked", G_CALLBACK(evt_kdel_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->kdel, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(page->kframe), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->kframe, TRUE, TRUE, 0);
+
+ page->mframe = gtk_frame_new(_("Dirpane Mouse Buttons"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ page->mstore = gtk_list_store_new(MOUSE_COLUMN_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ page->mview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(page->mstore));
+ cr = gtk_cell_renderer_pixbuf_new();
+ vc = gtk_tree_view_column_new_with_attributes("(BIcon)", cr, "pixbuf", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->mview), vc);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(Button)", cr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->mview), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(Modifier)", cr, "text", 2, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->mview), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(Command)", cr, "text", 3, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->mview), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->mview), FALSE);
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->mview));
+ gtk_tree_selection_set_mode(ts, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(ts), "changed", G_CALLBACK(evt_mselection_changed), page);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), page->mview);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+
+ page->mdtable = gtk_grid_new();
+ label = gtk_label_new(_("Button"));
+ gtk_grid_attach(GTK_GRID(page->mdtable), label, 0, 0, 1, 1);
+ build_mouse_menu(page);
+ wid = gtk_button_new_with_label(_("Edit Modifiers..."));
+ g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(evt_mstate_clicked), page);
+ gtk_grid_attach(GTK_GRID(page->mdtable), wid, 2, 0, 2, 1);
+ label = gtk_label_new(_("Command"));
+ gtk_grid_attach(GTK_GRID(page->mdtable), label, 0, 1, 1, 1);
+ page->mdcmd = gtk_entry_new();
+ gtk_widget_set_hexpand(page->mdcmd, TRUE);
+ gtk_widget_set_halign(page->mdcmd, GTK_ALIGN_FILL);
+ g_signal_connect(G_OBJECT(page->mdcmd), "changed", G_CALLBACK(evt_mcmd_changed), page);
+ gtk_grid_attach(GTK_GRID(page->mdtable), page->mdcmd, 1, 1, 2, 1);
+ page->mdcmdpick = gui_details_button_new();
+ g_signal_connect(G_OBJECT(page->mdcmdpick), "clicked", G_CALLBACK(evt_mcmdpick_clicked), page);
+ gtk_grid_attach(GTK_GRID(page->mdtable), page->mdcmdpick, 3, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(vbox), page->mdtable, FALSE, FALSE, 0);
+ page->mhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->madd = gtk_button_new_with_label(_("Add"));
+ g_signal_connect(G_OBJECT(page->madd), "clicked", G_CALLBACK(evt_madd_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->mhbox), page->madd, TRUE, TRUE, 5);
+ page->mdel = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(page->mdel), "clicked", G_CALLBACK(evt_mdel_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->mhbox), page->mdel, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), page->mhbox, FALSE, FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(page->mframe), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->mframe, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new(_("Click-M-Click Gesture"));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Command"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ page->cmccmd = gtk_entry_new();
+ g_signal_connect(G_OBJECT(page->cmccmd), "changed", G_CALLBACK(evt_clickmclick_changed), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->cmccmd, TRUE, TRUE, 0);
+ wid = gui_details_button_new();
+ g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(evt_clickmclick_pick_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), wid, FALSE, FALSE, 0);
+ label = gtk_label_new(_("Time Limit"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ adj = gtk_adjustment_new(0.400f, 0.100f, 1.5f, 0.1f, 0.1f, 0.0f);
+ g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(evt_clickmclick_delay_changed), page);
+ page->cmcdelay = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT(adj));
+ gtk_scale_set_value_pos(GTK_SCALE(page->cmcdelay), GTK_POS_RIGHT);
+ gtk_scale_set_digits(GTK_SCALE(page->cmcdelay), 3);
+ gtk_box_pack_start(GTK_BOX(hbox), page->cmcdelay, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), frame, FALSE, FALSE, 0);
+
+ page->nonumlock = gtk_check_button_new_with_label(_("Ignore Num Lock For All Bindings?"));
+ g_signal_connect(G_OBJECT(page->nonumlock), "clicked", G_CALLBACK(evt_nonumlock_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->nonumlock, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(page->vbox);
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Update the controls config page by grabbing current settings. */
+static void cct_update(MainInfo *min)
+{
+ the_page.ctrlinfo = ctrl_copy(min->cfg.ctrlinfo);
+ populate_key_list(&the_page);
+ populate_mouse_list(&the_page);
+ reset_widgets(&the_page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-17 - The user just accepted the settings, so make them current. */
+static void cct_accept(MainInfo *min)
+{
+ P_Controls *page = &the_page;
+
+ if(page->modified)
+ {
+ if(ctrl_mouse_ambiguity_exists(page->ctrlinfo))
+ {
+ dlg_dialog_async_new_simple(_("Note: The mouse button control settings\n"
+ "are ambiguous: the same button+modifier\n"
+ "is used for more than one function. This\n"
+ "might make their behaviour pretty weird..."),
+ _("Warning"), _("_OK"), NULL, NULL);
+ }
+ ctrl_destroy(min->cfg.ctrlinfo);
+ min->cfg.ctrlinfo = page->ctrlinfo;
+ page->ctrlinfo = NULL;
+ cfg_set_flags(CFLG_RESET_KEYBOARD);
+ page->modified = FALSE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void keys_save(CtrlInfo *ctrl, FILE *out)
+{
+ GSList *keys, *iter;
+
+ xml_put_node_open(out, "Keys");
+ if((keys = ctrl_keys_get_list(ctrl)) != NULL)
+ {
+ for(iter = keys; iter != NULL; iter = g_slist_next(iter))
+ {
+ const gchar *key, *cmd;
+
+ if((key = ctrl_key_get_keyname(iter->data)) && (cmd = ctrl_key_get_cmdseq(iter->data)))
+ {
+ xml_put_node_open(out, "Key");
+ xml_put_text(out, "keyname", key);
+ xml_put_text(out, "cmdseq", cmd);
+ xml_put_node_close(out, "Key");
+ }
+ }
+ g_slist_free(keys);
+ }
+ xml_put_node_close(out, "Keys");
+}
+
+/* 1999-06-20 - Save out all mouse command bindings. */
+static void mouse_save(CtrlInfo *ctrl, FILE *out)
+{
+ GSList *mouse, *iter;
+
+ xml_put_node_open(out, "MouseButtons");
+ if((mouse = ctrl_mouse_get_list(ctrl)) != NULL)
+ {
+ for(iter = mouse; iter != NULL; iter = g_slist_next(iter))
+ {
+ xml_put_node_open(out, "MouseButton");
+ xml_put_uinteger(out, "button", ctrl_mouse_get_button(iter->data));
+ xml_put_uinteger(out, "state", ctrl_mouse_get_state(iter->data));
+ xml_put_text(out, "cmdseq", ctrl_mouse_get_cmdseq(iter->data));
+ xml_put_node_close(out, "MouseButton");
+ }
+ g_slist_free(mouse);
+ }
+ xml_put_node_close(out, "MouseButtons");
+}
+
+static void clickmclick_save(const CtrlInfo *ctrl, FILE *out)
+{
+ xml_put_node_open(out, "ClickMClick");
+ xml_put_text(out, "cmdseq", ctrl_clickmclick_get_cmdseq(ctrl));
+ xml_put_real(out, "delay", ctrl_clickmclick_get_delay(ctrl));
+ xml_put_node_close(out, "ClickMClick");
+}
+
+/* 2004-04-25 - Save general bindings. */
+static void general_save(const CtrlInfo *ctrl, FILE *out)
+{
+ GSList *list;
+
+ if((list = ctrl_general_get_contexts(ctrl)) != NULL) /* Only emit toplevel if there are bindings. */
+ {
+ const GSList *iter;
+
+ xml_put_node_open(out, "Generals");
+ for(iter = list; iter != NULL; iter = g_slist_next(iter))
+ {
+ xml_put_node_open(out, "General");
+ xml_put_text(out, "context", (const gchar *) iter->data);
+ xml_put_text(out, "cmdseq", ctrl_general_get_cmdseq(ctrl, (const gchar *) iter->data));
+ xml_put_node_close(out, "General");
+ }
+ g_slist_free(list);
+ xml_put_node_close(out, "Generals");
+ }
+}
+
+/* 1999-03-17 - Save the current control settings right out in given <file>. */
+static gint cct_save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, "Controls");
+ keys_save(min->cfg.ctrlinfo, out);
+ mouse_save(min->cfg.ctrlinfo, out);
+ clickmclick_save(min->cfg.ctrlinfo, out);
+ general_save(min->cfg.ctrlinfo, out);
+ xml_put_boolean(out, "ignore_numlock", ctrl_numlock_ignore_get(min->cfg.ctrlinfo));
+ xml_put_node_close(out, "Controls");
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-17 - Load in and install a single key mapping. */
+static void key_load(const XmlNode *node, gpointer user)
+{
+ const gchar *name, *cmd;
+
+ if(xml_get_text(node, "keyname", &name) && xml_get_text(node, "cmdseq", &cmd))
+ ctrl_key_add(((MainInfo *) user)->cfg.ctrlinfo, name, csq_cmdseq_map_name(cmd, "keyboard shortcut"));
+}
+
+/* 1999-03-17 - Load in all key mappings. */
+static void keys_load(MainInfo *min, const XmlNode *node)
+{
+ xml_node_visit_children(node, key_load, min);
+}
+
+/* 1999-06-20 - Load and install a single mouse command mapping. */
+static void mousebutton_load(const XmlNode *node, gpointer user)
+{
+ const gchar *cmd;
+ guint button, state;
+
+ if(xml_get_uinteger(node, "button", &button) && xml_get_uinteger(node, "state", &state) && xml_get_text(node, "cmdseq", &cmd))
+ ctrl_mouse_add(((MainInfo *) user)->cfg.ctrlinfo, button, state, csq_cmdseq_map_name(cmd, "dirpane mouse button"));
+}
+
+/* 1999-06-20 - Load in the mouse command bindings. */
+static void mousebuttons_load(MainInfo *min, const XmlNode *node)
+{
+ xml_node_visit_children(node, mousebutton_load, min);
+}
+
+/* 2004-04-26 - Load a general command binding. */
+static void general_load(const XmlNode *node, gpointer user)
+{
+ const gchar *ctx, *cmd;
+
+ if(xml_get_text(node, "context", &ctx) && xml_get_text(node, "cmdseq", &cmd))
+ ctrl_general_set_cmdseq(((MainInfo *) user)->cfg.ctrlinfo, ctx, cmd);
+}
+
+/* 2004-04-26 - Load a bunch of general command bindings. */
+static void generals_load(MainInfo *min, const XmlNode *node)
+{
+ xml_node_visit_children(node, general_load, min);
+}
+
+/* 1999-03-17 - Load in the control config information. Replaces current. */
+static void cct_load(MainInfo *min, const XmlNode *node)
+{
+ const XmlNode *data;
+
+ if((node = xml_tree_search(node, "Controls")) != NULL)
+ {
+ gboolean tmp;
+
+ if((data = xml_tree_search(node, "Keys")) != NULL)
+ {
+ ctrl_keys_uninstall_all(min->cfg.ctrlinfo);
+ ctrl_key_remove_all(min->cfg.ctrlinfo);
+ keys_load(min, data);
+ }
+ if((data = xml_tree_search(node, "MouseButtons")) != NULL)
+ {
+ ctrl_mouse_remove_all(min->cfg.ctrlinfo);
+ mousebuttons_load(min, data);
+ }
+ if((data = xml_tree_search(node, "ClickMClick")) != NULL)
+ {
+ const gchar *cmd;
+ gfloat delay;
+ if(xml_get_text(data, "cmdseq", &cmd) && xml_get_real(data, "delay", &delay))
+ {
+ ctrl_clickmclick_set_cmdseq(min->cfg.ctrlinfo, cmd);
+ ctrl_clickmclick_set_delay(min->cfg.ctrlinfo, delay);
+ }
+ }
+ if((data = xml_tree_search(node, "Generals")) != NULL)
+ {
+ ctrl_general_clear(min->cfg.ctrlinfo);
+ generals_load(min, data);
+ }
+ if(xml_get_boolean(node, "ignore_numlock", &tmp))
+ ctrl_numlock_ignore_set(min->cfg.ctrlinfo, tmp);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cct_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cct_init, cct_update, cct_accept, cct_save, cct_load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_controls.h b/src/cfg_controls.h
new file mode 100644
index 0000000..d1147f3
--- /dev/null
+++ b/src/cfg_controls.h
@@ -0,0 +1,6 @@
+/*
+** 1999-03-16 - Header for the configuration module dealing with controls. Real short.
+*/
+
+extern const CfgModule * cct_describe(MainInfo *min);
+
diff --git a/src/cfg_dialogs.c b/src/cfg_dialogs.c
new file mode 100644
index 0000000..b922f13
--- /dev/null
+++ b/src/cfg_dialogs.c
@@ -0,0 +1,64 @@
+/*
+** 2002-08-25 - Configuration for dialogs. This is very stealthy; the actual GUI is not here,
+** it's so small I put it on the Windows page instead; it makes sense too. But
+** I can't save from there; the loader won't find it due to the XML structure in
+** use. So, we create a little "fake" config page, only for the file I/O.
+*/
+
+#include "gentoo.h"
+
+#include "cfg_module.h"
+#include "cfg_dialogs.h"
+
+#define NODE "Dialogs"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, "Dialogs");
+ switch(min->cfg.dialogs.pos)
+ {
+ case GTK_WIN_POS_NONE:
+ xml_put_text(out, "pos", "none");
+ break;
+ case GTK_WIN_POS_MOUSE:
+ xml_put_text(out, "pos", "mouse");
+ break;
+ case GTK_WIN_POS_CENTER:
+ xml_put_text(out, "pos", "center");
+ break;
+ default:
+ ;
+ }
+ xml_put_node_close(out, "Dialogs");
+
+ return TRUE;
+}
+
+static void load(MainInfo *min, const XmlNode *node)
+{
+ const gchar *pos = NULL;
+
+ min->cfg.dialogs.pos = GTK_WIN_POS_NONE;
+ if(xml_get_text(node, "pos", &pos))
+ {
+ if(strcmp(pos, "none") == 0)
+ min->cfg.dialogs.pos = GTK_WIN_POS_NONE;
+ else if(strcmp(pos, "mouse") == 0)
+ min->cfg.dialogs.pos = GTK_WIN_POS_MOUSE;
+ else if(strcmp(pos, "center") == 0)
+ min->cfg.dialogs.pos = GTK_WIN_POS_CENTER;
+ else
+ fprintf(stderr, "**DIALOGS: Unknown positioning mode \"%s\"\n", pos);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cdl_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, NULL, NULL, NULL, save, load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_dialogs.h b/src/cfg_dialogs.h
new file mode 100644
index 0000000..feae89c
--- /dev/null
+++ b/src/cfg_dialogs.h
@@ -0,0 +1,5 @@
+/*
+** 2002-08-25 - Header for the very stealthy dialog config module.
+*/
+
+extern const CfgModule * cdl_describe(MainInfo *min);
diff --git a/src/cfg_dirpane.c b/src/cfg_dirpane.c
new file mode 100644
index 0000000..1e559a8
--- /dev/null
+++ b/src/cfg_dirpane.c
@@ -0,0 +1,1816 @@
+/*
+** 1998-06-22 - Redesigned the configuration. Now each page gets its own module, and this module also
+** contains the necessary data to add the page to the config-notebook. Much cleaner and
+** easier to extend, IMO.
+** 1998-06-24 - Implemented the rest of the GUI. This module is now the single biggest in the project!
+** GUI code has a way to grow unbounded, and I don't think gtk is any different from other
+** toolkits/APIs I've seen in, that respect. The results are, though.
+** 1998-06-25 - Um... I forgot about sorting, and it also occured to me that having a default path would
+** be useful. So I added those.
+** 1998-06-30 - Added a check button for selecting how sorting should treat case
+** 1998-08-10 - Finally added some numeric feedback for the column width config.
+** 1998-08-13 - Replaced button click signal with row selection for the 'sclist', made things a lot simpler.
+** Now changes sensitivity of edit/remove/up/down buttons, too.
+** 1999-03-05 - Added the control mode setting, for the new selection design.
+** 1999-05-15 - Rewrote large parts of this file in order to make the two panes have separate GUIs (notebook
+** pages), and make room for some color config. Also moved code out into the dpformat module.
+** 2000-07-02 - Initialized translation, by marking up translatable strings using _() and N().
+** 2009-04-25 - Rewritten to no longer use GtkCList, since we're playing with the GTK+ 2.0 crowd now.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "configure.h"
+#include "dirpane.h"
+#include "guiutil.h"
+#include "xmlutil.h"
+#include "cmdseq.h"
+#include "nag_dialog.h"
+#include "strutil.h"
+#include "dpformat.h"
+#include "color_dialog.h"
+#include "odmultibutton.h"
+#include "window.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+
+#include "cfg_dirpane.h"
+
+#define NODE "DirPanes"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct P_DirPane P_DirPane;
+
+typedef struct { /* Pane definition widgets. */
+ GtkWidget *vbox;
+ GtkListStore *astore; /* Available column types. */
+ GtkWidget *aview; /* Tree view showing available content types. */
+
+ GtkListStore *sstore; /* Selected column types. */
+ GtkWidget *sview; /* Tree view for selected content types. */
+ GtkWidget *sbutton[4]; /* The fun buttons themselves. */
+
+ GtkWidget *scmenu; /* Content option menu. */
+ GtkWidget *smmenu; /* Sorting mode (directory mixing) option menu. */
+ GtkWidget *sinvert; /* Check button for inverse sorting. */
+ GtkWidget *snocase; /* Check button for case ignorance. */
+
+ GtkWidget *dentry; /* An entry for the default directory. */
+
+ GtkWidget *fabove; /* Check button to put path above pane. */
+ GtkWidget *fhide; /* Check button to allow hiding. */
+ GtkWidget *fscroll; /* Check button for scrollbar always. */
+ GtkWidget *fhparent; /* Check button for huge parent button. */
+ GtkWidget *ffont; /* Check button for font overriding. */
+ GtkWidget *fontbutton; /* Font button for picking font. */
+ GtkWidget *frband; /* Check button for rubber banding. */
+ GtkWidget *fruled; /* Check button for GTK+ ruling of tree view. */
+
+ GSList *splist;
+ GtkWidget *spos[3]; /* Radio buttons for scrollbar position. */
+
+ GSList *mclist;
+ /* visible ("clear" is kinda pointless, but there for completeness). */
+ P_DirPane *page;
+ DPFormat edit;
+ guint index;
+ gint srow; /* Last clicked row in selected content list. */
+ MainInfo *min; /* Handy to have around. */
+} PDef;
+
+enum {
+ CONTENT_COLUMN_TITLE,
+ CONTENT_COLUMN_DESCRIPTION,
+ CONTENT_COLUMN_CONTENT,
+
+ CONTENT_COLUMN_COUNT
+};
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *orientation[2];
+ GtkWidget *mode[4];
+ GtkWidget *value; /* Pointer to current value-holding widget. */
+ DPPaning edit;
+} PPaning;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *select;
+ GtkWidget *save;
+ DPHistory edit;
+} PHistory;
+
+typedef struct {
+ GtkWidget *show_type; /* A checkbox. */
+ GtkWidget *show_linkname; /* Another checkbox. */
+} EE_Name;
+
+typedef struct {
+ GtkWidget *options;
+ SzUnit unit;
+ GtkWidget *ticks;
+ GtkWidget *tick;
+ GtkWidget *digits;
+ GtkWidget *dir_show_fs_size; /* A checkbox. */
+ GtkWidget *format; /* KILL ME! */
+} EE_Size;
+
+typedef struct {
+ GtkWidget *format; /* An entry. */
+} EE_Format;
+
+typedef struct {
+ GtkWidget *format; /* An entry. */
+} EE_Date;
+
+typedef enum { ET_NONE = 0, ET_NAME, ET_SIZE, ET_FORMAT, ET_DATE } ExtraType;
+
+typedef struct { /* Holds data used when editing a column format. */
+ PDef *def;
+ DPContent content; /* Type of content we're editing. */
+ GtkWidget *title; /* Entry widget holding the wanted title. */
+ GtkWidget *just; /* Justification option menu. */
+ guint curr_just; /* Current justification (0=left, 1=right, 2=center). */
+ GtkAdjustment *wadj; /* An adjustment for the width. */
+ GtkWidget *width; /* A spin button for the width. */
+ union {
+ EE_Name name;
+ EE_Size size; /* Size has its own formatting. */
+ EE_Format format; /* General integer format, used by protection, IDs, etc. */
+ EE_Date date;
+ } extra;
+ ExtraType extype;
+} P_Edit;
+
+struct P_DirPane { /* Information this module likes to have around. */
+ /* No vbox here. */
+ GtkWidget *high_hbox; /* Upper hbox, holds mostly buttons. */
+
+ GtkWidget *notebook; /* A notebook holding left, right and color pages. */
+
+ PDef pane[2];
+ PPaning paning;
+ PHistory history;
+
+ MainInfo *min;
+};
+
+static P_DirPane the_page; /* There can be only one. */
+
+static const gchar *config_name[] = { "DirPaneLeft", "DirPaneRight" },
+ *mode_name[] = { "dirs_first", "dirs_last", "dirs_mixed" },
+ *sbarpos_name[] = { "system", "left", "right" },
+ *pane_orient_name[] = { "horizontal", "vertical" },
+ *pane_splitmode_name[] = { "free", "ratio", "absleft", "absright" };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_sort_set_content(GtkWidget *wid, gpointer user);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - Set the state of the various widgets of <def> according to its 'edit' field. */
+static void set_pane_widgets(PDef *def)
+{
+ guint i;
+ GtkTreeIter iter;
+
+ gtk_list_store_clear(def->sstore);
+ for(i = 0; i < def->edit.num_columns; i++)
+ {
+ gtk_list_store_insert_with_values(def->sstore, &iter, -1,
+ CONTENT_COLUMN_TITLE, def->edit.format[i].title,
+ CONTENT_COLUMN_DESCRIPTION, dpf_get_content_name(def->edit.format[i].content),
+ CONTENT_COLUMN_CONTENT, def->edit.format[i].content,
+ -1);
+ }
+ for(i = 0; i < sizeof def->sbutton / sizeof def->sbutton[0]; i++)
+ gtk_widget_set_sensitive(def->sbutton[i], FALSE);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(def->scmenu), def->edit.sort.content);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(def->smmenu), (guint) def->edit.sort.mode);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->sinvert), def->edit.sort.invert);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->snocase), def->edit.sort.nocase);
+
+ gtk_entry_set_text(GTK_ENTRY(def->dentry), def->edit.def_path);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->fabove), def->edit.path_above);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->fhide), def->edit.hide_allowed);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->fscroll), def->edit.scrollbar_always);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->fhparent), def->edit.huge_parent);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->ffont), def->edit.set_font);
+ if(def->edit.font_name[0] != '\0')
+ gtk_font_button_set_font_name(GTK_FONT_BUTTON(def->fontbutton), def->edit.font_name);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->frband), def->edit.rubber_banding);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(def->spos[(guint) def->edit.sbar_pos]), TRUE);
+
+ def->srow = -1;
+}
+
+static void set_paning_widgets(PPaning *p)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->orientation[p->edit.orientation]), TRUE);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->mode[p->edit.mode]), TRUE);
+ switch(p->edit.mode)
+ {
+ case DPSPLIT_FREE:
+ break;
+ case DPSPLIT_RATIO:
+ gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(p->value)), p->edit.value);
+ break;
+ case DPSPLIT_ABS_LEFT:
+ case DPSPLIT_ABS_RIGHT:
+ {
+ gchar buf[32];
+
+ g_snprintf(buf, sizeof buf, "%d", (gint) p->edit.value);
+ gtk_entry_set_text(GTK_ENTRY(p->value), buf);
+ }
+ break;
+ }
+}
+
+static void set_history_widgets(PHistory *p)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->select), p->edit.select);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->save), p->edit.save);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-04-24 - An available-content row was activated, i.e. double-clicked. Add it to the selected list. */
+static void evt_aview_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user)
+{
+ PDef *def = user;
+ GtkTreeIter iter;
+
+ if(def->edit.num_columns >= DP_MAX_COLUMNS)
+ return;
+
+ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(def->astore), &iter, path))
+ {
+ gint content;
+ GtkTreePath *sp;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(def->astore), &iter, CONTENT_COLUMN_CONTENT, &content, -1);
+ dpf_set_default_format(&def->edit.format[def->edit.num_columns], (DPContent) content);
+ gtk_list_store_insert_with_values(def->sstore, &iter, -1,
+ CONTENT_COLUMN_TITLE, def->edit.format[def->edit.num_columns].title,
+ CONTENT_COLUMN_DESCRIPTION, dpf_get_content_name((DPContent) content),
+ CONTENT_COLUMN_CONTENT, content,
+ -1);
+ def->edit.num_columns++;
+ /* Select and scroll-to. */
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), &iter);
+ sp = gtk_tree_model_get_path(GTK_TREE_MODEL(def->sstore), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(def->sview), sp, NULL, TRUE, 0.5f, 0.0f);
+ gtk_tree_path_free(sp);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-24 - Build the widgets needed to get a content format string. This consists of
+** a table with a label showing <ltext> and an entry widget containing
+** <dtext> initially. The created entry widget is stored at <wid>, and the
+** entire shabang is packed into the <vbox> given.
+*/
+static void build_content_format(GtkWidget *vbox, GtkWidget **wid, const gchar *ltext, const gchar *dtext)
+{
+ GtkWidget *grid, *label;
+
+ grid = gtk_grid_new();
+ label = gtk_label_new(ltext);
+ *wid = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(*wid), DP_DATEFMT_SIZE - 1);
+ gtk_entry_set_text(GTK_ENTRY(*wid), dtext);
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), *wid, 1, 0, 1, 1);
+ gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+}
+
+static void evt_size_type_toggled(GtkWidget *wid, gpointer user)
+{
+ P_Edit *edit = user;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ const SzUnit unit = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "type"));
+
+ gtk_widget_set_sensitive(edit->extra.size.options, unit != SZE_NONE);
+ edit->extra.size.unit = unit;
+ }
+}
+
+static void evt_size_ticks_toggled(GtkWidget *wid, gpointer user)
+{
+ P_Edit *edit = user;
+
+ gtk_widget_set_sensitive(edit->extra.size.tick, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)));
+}
+
+/* 1998-06-23 - Add widgetry to dialog being defined, if any is needed. */
+static GtkWidget * add_content_widgets(P_Edit *edit)
+{
+ gchar *tmp = "", tickstr[2] = "?";
+ DpCFmt *fmt = &edit->def->edit.format[edit->def->srow];
+ GtkAdjustment *adj;
+ GtkWidget *vbox, *frame, *grid, *label, *rb, *trb[SZE_NUM_UNITS], *sep;
+ ExtraType type = ET_NONE;
+ GSList *group;
+ guint i, ti = 0;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ switch(edit->content)
+ {
+ case DPC_NAME:
+ edit->extra.name.show_type = gtk_check_button_new_with_label(_("Append Type Character?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(edit->extra.name.show_type), fmt->extra.name.show_type);
+ gtk_box_pack_start(GTK_BOX(vbox), edit->extra.name.show_type, TRUE, TRUE, 0);
+ edit->extra.name.show_linkname = gtk_check_button_new_with_label(_("Append \"\xe2\x86\x92 destination\" on Links?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(edit->extra.name.show_linkname), fmt->extra.name.show_linkname);
+ gtk_box_pack_start(GTK_BOX(vbox), edit->extra.name.show_linkname, TRUE, TRUE, 0);
+ type = ET_NAME;
+ break;
+ case DPC_SIZE:
+ grid = gtk_grid_new();
+ for(i = 0, group = NULL; i < SZE_NUM_UNITS; i++)
+ {
+ const SzUnit unit = (SzUnit) i;
+
+ trb[i] = rb = gtk_radio_button_new_with_label(group, _(sze_get_unit_label(unit)));
+ g_object_set_data(G_OBJECT(rb), "type", GINT_TO_POINTER(unit));
+ g_signal_connect(G_OBJECT(rb), "toggled", G_CALLBACK(evt_size_type_toggled), edit);
+ gtk_grid_attach(GTK_GRID(grid), rb, 0, i, 2, 1);
+ if(fmt->extra.size.unit == unit)
+ ti = i;
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(rb));
+ }
+ gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+
+ edit->extra.size.options = gtk_grid_new();
+ edit->extra.size.ticks = gtk_check_button_new_with_label(_("Place Tick Every 3 Digits?"));
+ gtk_grid_attach(GTK_GRID(edit->extra.size.options), edit->extra.size.ticks, 0, 0, 1, 1);
+ edit->extra.size.tick = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(edit->extra.size.tick), 1);
+ gtk_entry_set_width_chars(GTK_ENTRY(edit->extra.size.tick), 1);
+ tickstr[0] = fmt->extra.size.tick;
+ gtk_entry_set_text(GTK_ENTRY(edit->extra.size.tick), tickstr);
+ gtk_grid_attach(GTK_GRID(edit->extra.size.options), edit->extra.size.tick, 1, 0, 1, 1);
+ g_signal_connect(G_OBJECT(edit->extra.size.ticks), "toggled", G_CALLBACK(evt_size_ticks_toggled), edit);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(edit->extra.size.ticks), fmt->extra.size.ticks);
+
+ label = gtk_label_new(_("Digits of Precision"));
+ gtk_grid_attach(GTK_GRID(edit->extra.size.options), label, 0, 1, 1, 1);
+ adj = gtk_adjustment_new(0.0, 0.0, 6.0, 1.0, 1.0, 0.0);
+ edit->extra.size.digits = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(edit->extra.size.digits), fmt->extra.size.digits);
+ gtk_grid_attach(GTK_GRID(edit->extra.size.options), edit->extra.size.digits, 1, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(vbox), edit->extra.size.options, TRUE, TRUE, 0);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(trb[ti]), TRUE);
+ gtk_widget_set_sensitive(edit->extra.size.options, ti != 0);
+
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
+ edit->extra.size.dir_show_fs_size = gtk_check_button_new_with_label(_("Show Dir's File System Size?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(edit->extra.size.dir_show_fs_size), fmt->extra.size.dir_show_fs_size);
+ gtk_box_pack_start(GTK_BOX(vbox), edit->extra.size.dir_show_fs_size, FALSE, FALSE, 0);
+ type = ET_SIZE;
+ break;
+ case DPC_BLOCKS:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.blocks.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_BLOCKSIZE:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.blocksize.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_MODENUM:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.mode.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_NLINK:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.nlink.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_UIDNUM:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.uidnum.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_GIDNUM:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.gidnum.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_DEVICE:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.device.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_DEVMAJ:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.devmaj.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_DEVMIN:
+ build_content_format(vbox, &edit->extra.format.format, _("Format"), fmt->extra.devmin.format);
+ type = ET_FORMAT;
+ break;
+ case DPC_ATIME:
+ case DPC_MTIME:
+ case DPC_CHTIME:
+ case DPC_CRTIME:
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("Format"));
+ edit->extra.date.format = gtk_entry_new();
+ gtk_widget_set_hexpand(edit->extra.date.format, TRUE);
+ gtk_widget_set_halign(edit->extra.date.format, GTK_ALIGN_FILL);
+ gtk_entry_set_max_length(GTK_ENTRY(edit->extra.date.format), DP_DATEFMT_SIZE - 1);
+ if(edit->content == DPC_ATIME)
+ tmp = fmt->extra.a_time.format;
+ else if(edit->content == DPC_MTIME)
+ tmp = fmt->extra.m_time.format;
+ else if(edit->content == DPC_CHTIME)
+ tmp = fmt->extra.ch_time.format;
+ else if(edit->content == DPC_CRTIME)
+ tmp = fmt->extra.cr_time.format;
+ gtk_entry_set_text(GTK_ENTRY(edit->extra.date.format), tmp);
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(grid), edit->extra.date.format, 1, 0, 1, 1);
+ gtk_box_pack_start(GTK_BOX(vbox), grid, TRUE, TRUE, 0);
+ type = ET_DATE;
+ case DPC_TYPE:
+ break;
+ default:
+ ;
+ }
+ edit->extype = type;
+ if(type != ET_NONE)
+ {
+ gchar text[64];
+
+ g_snprintf(text, sizeof text, _("%s Settings"), dpf_get_content_name(edit->content));
+ frame = gtk_frame_new(text);
+ gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_widget_show_all(vbox);
+ return frame;
+ }
+ gtk_widget_destroy(vbox);
+ return NULL;
+}
+
+/* 1998-06-24 - This gets called when the user selects a new justification for the
+** column being edited. We better remember exactly which mode that is.
+*/
+static gint evt_edit_justification(GtkWidget *wid, guint index, gpointer user)
+{
+ P_Edit *edit = user;
+
+ edit->curr_just = index;
+
+ return TRUE;
+}
+
+/* 2002-07-18 - This used to be a button event handler. Now remade to just store accepted values. */
+static void accept_format(P_Edit *edit)
+{
+ const gchar *nfmt = "";
+ DpCFmt *fmt = &edit->def->edit.format[edit->def->srow];
+ GtkTreeIter iter;
+
+ strcpy(fmt->title, gtk_entry_get_text(GTK_ENTRY(edit->title)));
+ fmt->just = edit->curr_just;
+ fmt->width = (gint) gtk_adjustment_get_value(edit->wadj);
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(edit->def->sview)), NULL, &iter))
+ gtk_list_store_set(edit->def->sstore, &iter, CONTENT_COLUMN_TITLE, fmt->title, -1);
+
+ /* If the content uses the general numerical formatting entry, get its text. */
+ if(edit->extype == ET_FORMAT)
+ nfmt = gtk_entry_get_text(GTK_ENTRY(edit->extra.format.format));
+
+ switch(edit->content)
+ {
+ case DPC_NAME:
+ fmt->extra.name.show_type = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(edit->extra.name.show_type));
+ fmt->extra.name.show_linkname = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(edit->extra.name.show_linkname));
+ break;
+ case DPC_SIZE:
+ fmt->extra.size.unit = edit->extra.size.unit;
+ fmt->extra.size.digits = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(edit->extra.size.digits));
+ g_snprintf(fmt->extra.size.dformat, sizeof fmt->extra.size.dformat, "%%#.%uf", fmt->extra.size.digits);
+ fmt->extra.size.ticks = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(edit->extra.size.ticks));
+ fmt->extra.size.tick = gtk_entry_get_text(GTK_ENTRY(edit->extra.size.tick))[0];
+ if(fmt->extra.size.tick == '\0')
+ fmt->extra.size.tick = ',';
+ fmt->extra.size.dir_show_fs_size = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(edit->extra.size.dir_show_fs_size));
+ break;
+ case DPC_BLOCKS:
+ strcpy(fmt->extra.blocks.format, nfmt);
+ break;
+ case DPC_BLOCKSIZE:
+ strcpy(fmt->extra.blocksize.format, nfmt);
+ break;
+ case DPC_MODENUM:
+ strcpy(fmt->extra.mode.format, nfmt);
+ break;
+ case DPC_NLINK:
+ strcpy(fmt->extra.nlink.format, nfmt);
+ break;
+ case DPC_UIDNUM:
+ strcpy(fmt->extra.uidnum.format, nfmt);
+ break;
+ case DPC_GIDNUM:
+ strcpy(fmt->extra.gidnum.format, nfmt);
+ break;
+ case DPC_DEVICE:
+ strcpy(fmt->extra.device.format, nfmt);
+ break;
+ case DPC_DEVMIN:
+ strcpy(fmt->extra.devmin.format, nfmt);
+ break;
+ case DPC_DEVMAJ:
+ strcpy(fmt->extra.devmaj.format, nfmt);
+ break;
+ case DPC_ATIME:
+ strcpy(fmt->extra.a_time.format, gtk_entry_get_text(GTK_ENTRY(edit->extra.date.format)));
+ break;
+ case DPC_MTIME:
+ strcpy(fmt->extra.m_time.format, gtk_entry_get_text(GTK_ENTRY(edit->extra.date.format)));
+ break;
+ case DPC_CRTIME:
+ strcpy(fmt->extra.cr_time.format, gtk_entry_get_text(GTK_ENTRY(edit->extra.date.format)));
+ break;
+ case DPC_CHTIME:
+ strcpy(fmt->extra.ch_time.format, gtk_entry_get_text(GTK_ENTRY(edit->extra.date.format)));
+ break;
+ case DPC_TYPE:
+ break;
+ default:
+ ;
+ }
+}
+
+/* 1998-06-23 - Do the complex thing, and let the user edit the details of the selected
+** selected (!) row.
+** 1998-06-24 - Redesigned the gimp way, i.e. without checking for success of GTK calls.
+** I really don't like it, but it saves a bunch of indents. I will not ever
+** take this as a hint that I should reduce my indent size... :^)
+** The dialog created by this function has a very simple structure: the top
+** area (the vbox) contains two frames. The top frame holds settings that
+** are available for all content types (type, name, width, justification).
+** The bottom frame (which may be missing) contains content-specific settings.
+*/
+static gint evt_sview_edit_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ DpCFmt *fmt = &def->edit.format[def->srow];
+ GtkWidget *vbox, *frame1, *frame2, *grid, *label;
+ const gchar *lab[] = { N_("Content"), N_("Title"), N_("Justification"), N_("Width") },
+ *jtext[] = { N_("Left"), N_("Right"), N_("Center"), NULL };
+ static P_Edit edit;
+ Dialog *dlg;
+ gint i;
+
+ edit.def = def;
+ edit.content = fmt->content;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ frame1 = gtk_frame_new(_("Basic Settings"));
+
+ grid = gtk_grid_new();
+ for(i = 0; i < sizeof lab / sizeof lab[0]; i++)
+ {
+ label = gtk_label_new(_(lab[i]));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
+ }
+ label = gtk_label_new(dpf_get_content_name(edit.content));
+ gtk_widget_set_hexpand(label, TRUE);
+ gtk_widget_set_halign(label, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), label, 1, 0, 1, 1);
+
+ edit.title = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(edit.title), DP_TITLE_SIZE - 1);
+ gtk_entry_set_text(GTK_ENTRY(edit.title), fmt->title);
+ gtk_grid_attach(GTK_GRID(grid), edit.title, 1, 1, 1, 1);
+
+ edit.just = gui_build_combo_box(jtext, G_CALLBACK(evt_edit_justification), &edit);
+ switch(fmt->just)
+ {
+ case GTK_JUSTIFY_LEFT:
+ case GTK_JUSTIFY_FILL:
+ edit.curr_just = 0;
+ break;
+ case GTK_JUSTIFY_RIGHT:
+ edit.curr_just = 1;
+ break;
+ case GTK_JUSTIFY_CENTER:
+ edit.curr_just = 2;
+ break;
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(edit.just), edit.curr_just);
+ gtk_grid_attach(GTK_GRID(grid), edit.just, 1, 2, 1, 1);
+
+ edit.wadj = gtk_adjustment_new(fmt->width, 10.0, 800.0, 1.0f, 50.0, 0.0);
+ edit.width = gtk_spin_button_new(GTK_ADJUSTMENT(edit.wadj), 0, 0);
+ gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(edit.width), FALSE);
+ gtk_grid_attach(GTK_GRID(grid), edit.width, 1, 3, 1, 1);
+
+ gtk_container_set_border_width(GTK_CONTAINER(frame1), 5);
+ gtk_container_add(GTK_CONTAINER(frame1), grid);
+
+ gtk_box_pack_start(GTK_BOX(vbox), frame1, TRUE, TRUE, 0);
+
+ if((frame2 = add_content_widgets(&edit)) != NULL)
+ gtk_box_pack_start(GTK_BOX(vbox), frame2, TRUE, TRUE, 0);
+ dlg = dlg_dialog_sync_new(vbox, _("Edit Column Content"), NULL);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ accept_format(&edit);
+ dlg_dialog_sync_destroy(dlg);
+
+ return TRUE;
+}
+
+/* 2010-10-02 - The list of selected content types had a row double-clicked. */
+static void evt_sview_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user)
+{
+ /* Just pretend like there was a click on the Edit button, instead. */
+ evt_sview_edit_clicked(wid, user);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-04-24 - Selected content selection changed, update the editing buttons. This is a bit irky. */
+static void evt_sview_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ PDef *def = user;
+ GtkTreeIter iter;
+
+ if(gtk_tree_selection_get_selected(sel, NULL, &iter))
+ {
+ GtkTreePath *path;
+
+ gtk_widget_set_sensitive(def->sbutton[0], TRUE);
+ gtk_widget_set_sensitive(def->sbutton[1], TRUE);
+ /* We need to dynamically create the GtkTreePath, to get a row index. */
+ if((path = gtk_tree_model_get_path(GTK_TREE_MODEL(def->sstore), &iter)) != NULL)
+ {
+ const gint *idx = gtk_tree_path_get_indices(path);
+
+ def->srow = *idx;
+ gtk_widget_set_sensitive(def->sbutton[2], def->srow > 0);
+ gtk_widget_set_sensitive(def->sbutton[3], def->srow < def->edit.num_columns - 1);
+ gtk_tree_path_free(path);
+ }
+ }
+ else
+ {
+ gtk_widget_set_sensitive(def->sbutton[0], FALSE);
+ gtk_widget_set_sensitive(def->sbutton[1], FALSE);
+ gtk_widget_set_sensitive(def->sbutton[2], FALSE);
+ gtk_widget_set_sensitive(def->sbutton[3], FALSE);
+ }
+}
+
+#if 0
+/* 2000-02-29 - Weird leap day! :) Reorder selected content by direct dragging. */
+static void evt_sclist_move_row(GtkWidget *wid, gint arg1, gint arg2, gpointer user)
+{
+ PDef *def = user;
+ DpCFmt tmp;
+ guint i;
+
+ /* GTK+ seems not to report this case, but because the code below wouldn't
+ ** handle it, it seems nice to really make sure. Call me a coward.
+ */
+ if(arg1 == arg2)
+ return;
+
+ tmp = def->edit.format[arg1];
+
+ if(arg1 > arg2) /* Drag upwards? */
+ {
+ for(i = arg1; i > arg2; i--)
+ def->edit.format[i] = def->edit.format[i - 1];
+ }
+ else
+ {
+ for(i = arg1; i < arg2; i++)
+ def->edit.format[i] = def->edit.format[i + 1];
+ }
+ def->edit.format[arg2] = tmp;
+}
+#endif
+
+/* 1999-05-15 - User clicked the "Remove" button below selected column list, so kill a column. */
+static void evt_sview_remove_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ GtkTreeIter iter;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), NULL, &iter))
+ {
+ guint i;
+
+ for(i = def->srow; i < def->edit.num_columns - 1; i++)
+ def->edit.format[i] = def->edit.format[i + 1];
+ def->edit.num_columns--;
+ gtk_list_store_remove(def->sstore, &iter);
+ }
+}
+
+/* 1999-05-15 - The "up" arrow has been hit. Move the currently selected column.
+** 2009-04-24 - Pretty much all rewritten, porting to GtkTreeView and friends.
+*/
+static void evt_sview_up_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ gint row = def->srow;
+ GtkTreeIter iter, prev;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), NULL, &iter))
+ {
+ gchar pstr[8];
+
+ g_snprintf(pstr, sizeof pstr, "%d", row - 1);
+ if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(def->sstore), &prev, pstr))
+ {
+ DpCFmt tmp;
+
+ gtk_list_store_swap(def->sstore, &iter, &prev);
+ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), &iter);
+ /* We need to update the real model, too ... Sigh. */
+ tmp = def->edit.format[row - 1];
+ def->edit.format[row - 1] = def->edit.format[row];
+ def->edit.format[row] = tmp;
+ }
+ }
+}
+
+/* 1999-05-15 - The "down" arrow has been hit. Move the currently selected column.
+** 2009-04-24 - Pretty much all rewritten, porting to GtkTreeView and friends.
+*/
+static void evt_sview_down_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ gint row = def->srow;
+ GtkTreeIter iter, next;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), NULL, &iter))
+ {
+ gchar pstr[8];
+
+ g_snprintf(pstr, sizeof pstr, "%d", row + 1);
+ if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(def->sstore), &next, pstr))
+ {
+ DpCFmt tmp;
+
+ gtk_list_store_swap(def->sstore, &iter, &next);
+ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview)), &iter);
+ /* We need to update the real model, too ... Sigh. */
+ tmp = def->edit.format[row + 1];
+ def->edit.format[row + 1] = def->edit.format[row];
+ def->edit.format[row] = tmp;
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - Set new sorting column, from option menu selection. */
+static void evt_sort_set_content(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.sort.content = (DPContent) gtk_combo_box_get_active(GTK_COMBO_BOX(wid));
+}
+
+/* 1999-05-15 - Set new sorting mode, from option menu selection. */
+static void evt_sort_set_mode(GtkWidget *wid, guint index, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.sort.mode = (SortMode) index;
+}
+
+/* 1999-05-15 - User hit "Inverse Sort?" toggle button, so update. */
+static void evt_sort_invert_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.sort.invert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* 1999-05-15 - User hit the case-insensitivity toggle. */
+static void evt_sort_nocase_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.sort.nocase = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - User is editing the default path, so update in editing copy. */
+static void evt_default_path_changed(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ g_strlcpy(def->edit.def_path, gtk_entry_get_text(GTK_ENTRY(wid)), sizeof def->edit.def_path);
+}
+
+/* 2012-05-27 - Set default path to "current directory". */
+static void evt_default_path_current(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ gtk_entry_set_text(GTK_ENTRY(def->dentry), "@cwd");
+}
+
+/* 1999-05-15 - User just hit the "Grab Current" button for the default path. Do it. */
+static void evt_default_path_grab(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ P_DirPane *page;
+
+ page = def->page;
+
+ gtk_entry_set_text(GTK_ENTRY(def->dentry), page->min->gui->pane[def->index].dir.path);
+}
+
+/* 2004-02-25 - Set default path to "take from history". Not totally beatiful, but still. */
+static void evt_default_path_history(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ gtk_entry_set_text(GTK_ENTRY(def->dentry), "@history[0]");
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - Set state of "path above" flag. */
+static void evt_flag_above_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.path_above = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* 1999-05-15 - Set state of "hide allowed" flag. */
+static void evt_flag_hide_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.hide_allowed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* 1999-05-15 - Set state of "scrollbar always" flag. */
+static void evt_flag_scrollbar_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.scrollbar_always = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* 2000-02-03 - User toggled "huge parent" flag. */
+static void evt_flag_hugeparent_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.huge_parent = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* 2010-10-24 - The "set font" flag was toggled. */
+static void evt_flag_setfont_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.set_font = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ gtk_widget_set_sensitive(def->fontbutton, def->edit.set_font);
+}
+
+/* 2010-10-24 - The font button had its font changed, so let's remember that. */
+static void evt_font_set(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ g_snprintf(def->edit.font_name, sizeof def->edit.font_name, "%s", gtk_font_button_get_font_name(GTK_FONT_BUTTON(def->fontbutton)));
+}
+
+static void evt_flag_rubberbanding_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit.rubber_banding = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - User clicked on one of the "scrollbar position" widgets. Update. */
+static void evt_scrollbarpos_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ def->edit.sbar_pos = (SBarPos) GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(wid), "user"));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-16 - Copy this pane's definition to the other one. */
+static void evt_copyto_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->page->pane[1 - def->index].edit = def->edit;
+ set_pane_widgets(&def->page->pane[1 - def->index]);
+}
+
+/* 1999-05-16 - Copy the other pane's definition to this pane. */
+static void evt_copyfrom_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+
+ def->edit = def->page->pane[1 - def->index].edit;
+ set_pane_widgets(def);
+}
+
+/* 1999-05-16 - Swap the two pane definitions. */
+static void evt_swap_clicked(GtkWidget *wid, gpointer user)
+{
+ PDef *def = user;
+ DPFormat tmp;
+
+ tmp = def->edit;
+ def->edit = def->page->pane[1 - def->index].edit;
+ def->page->pane[1 - def->index].edit = tmp;
+ set_pane_widgets(def);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-04-24 - Create a list store suitable for dirpane content columns. */
+static GtkListStore * init_content_list_store(gboolean populate)
+{
+ GtkListStore *store;
+
+ store = gtk_list_store_new(CONTENT_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
+ if(store != NULL && populate)
+ {
+ GtkTreeIter iter;
+ guint i;
+
+ for(i = 0; i < DPC_NUM_TYPES; i++)
+ {
+ if(i == DPC_BLOCKS || i == DPC_BLOCKSIZE)
+ continue;
+ gtk_list_store_insert_with_values(store, &iter, -1,
+ CONTENT_COLUMN_TITLE, dpf_get_content_title((DPContent) i),
+ CONTENT_COLUMN_DESCRIPTION, dpf_get_content_name((DPContent) i),
+ CONTENT_COLUMN_CONTENT, i,
+ -1);
+ }
+ }
+ return store;
+}
+
+/* 2009-04-24 - Create a GtkTreeView suitable for displaying a bunch of column content rows. */
+static GtkWidget * init_content_list_view(GtkListStore *store, gboolean available)
+{
+ gchar *atitle[] = { N_("Default Title"), N_("Content") },
+ *stitle[] = { N_("Title"), N_("Content") }, **title;
+ GtkWidget *wid;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ wid = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(wid)), GTK_SELECTION_BROWSE);
+ cr = gtk_cell_renderer_text_new();
+ title = available ? atitle : stitle;
+ vc = gtk_tree_view_column_new_with_attributes(_(title[0]), cr, "text", CONTENT_COLUMN_TITLE, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(wid), vc);
+ vc = gtk_tree_view_column_new_with_attributes(_(title[1]), cr, "text", CONTENT_COLUMN_DESCRIPTION, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(wid), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wid), TRUE);
+
+ return wid;
+}
+
+/* 1999-05-15 - Initialize widgets for configuring a pane. This function is horribly long,
+** but conceptually very simple: it just builds widgets.
+*/
+static void init_pane_page(P_DirPane *page, guint index, const gchar *other)
+{
+ PDef *def;
+ GtkWidget *label, *scwin, *vbox, *frame, *hbox, *grid, *button, *sep, *fhbox;
+ const gchar *smitem[] = { N_("Directories First"), N_("Directories Last"), N_("Directories Mixed"), NULL },
+ *spos[] = { N_("System Default"), N_("Left of List"), N_("Right of List") },
+ *tfmt[] = { N_("Copy To %s"), N_("Copy From %s"), N_("Swap With %s") };
+ gchar buf[64];
+ guint i;
+ const GCallback scfunc[] = { G_CALLBACK(evt_sview_edit_clicked),
+ G_CALLBACK(evt_sview_remove_clicked),
+ G_CALLBACK(evt_sview_up_clicked),
+ G_CALLBACK(evt_sview_down_clicked) };
+ const GCallback tool[] = { G_CALLBACK(evt_copyto_clicked), G_CALLBACK(evt_copyfrom_clicked),
+ G_CALLBACK(evt_swap_clicked) };
+
+ def = &page->pane[index];
+ def->page = page;
+ def->index = index;
+
+ def->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ /* Columns part. */
+ frame = gtk_frame_new(_("Columns"));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ /* Available content types. */
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Available Content Types"));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ def->astore = init_content_list_store(TRUE);
+ def->aview = init_content_list_view(def->astore, TRUE);
+ g_signal_connect(G_OBJECT(def->aview), "row_activated", G_CALLBACK(evt_aview_row_activated), def);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), def->aview);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+
+ /* Separation between available & selected content types. */
+ sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+ gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 5);
+
+ /* Selected content types. */
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Selected Content Types"));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ def->sstore = init_content_list_store(FALSE);
+ def->sview = init_content_list_view(def->sstore, FALSE);
+ gtk_tree_selection_set_mode(GTK_TREE_SELECTION(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview))), GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(def->sview))), "changed", G_CALLBACK(evt_sview_selection_changed), def);
+ g_signal_connect(G_OBJECT(def->sview), "row_activated", G_CALLBACK(evt_sview_row_activated), def);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), def->sview);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+ grid = gtk_grid_new();
+ def->sbutton[0] = gtk_button_new_with_label(_("Edit..."));
+ def->sbutton[1] = gtk_button_new_with_label(_("Remove"));
+ def->sbutton[2] = gtk_button_new_from_icon_name("go-up", GTK_ICON_SIZE_MENU);
+ def->sbutton[3] = gtk_button_new_from_icon_name("go-down", GTK_ICON_SIZE_MENU);
+ for(i = 0; i < sizeof def->sbutton / sizeof def->sbutton[0]; i++)
+ {
+ g_signal_connect(G_OBJECT(def->sbutton[i]), "clicked", G_CALLBACK(scfunc[i]), def);
+ gtk_grid_attach(GTK_GRID(grid), def->sbutton[i], i, 0, 1, 1);
+ }
+ gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+ gtk_box_pack_start(GTK_BOX(def->vbox), frame, TRUE, TRUE, 0);
+
+ /* Sorting. */
+ frame = gtk_frame_new(_("Sorting"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Sort On"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ def->scmenu = dpf_get_content_combo_box(G_CALLBACK(evt_sort_set_content), def);
+ gtk_box_pack_start(GTK_BOX(hbox), def->scmenu, TRUE, TRUE, 0);
+ label = gtk_label_new(_("Mode"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ def->smmenu = gui_build_combo_box(smitem, G_CALLBACK(evt_sort_set_mode), def);
+ gtk_box_pack_start(GTK_BOX(hbox), def->smmenu, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ def->sinvert = gtk_check_button_new_with_label(_("Inverse Sorting?"));
+ g_signal_connect(G_OBJECT(def->sinvert), "clicked", G_CALLBACK(evt_sort_invert_clicked), def);
+ gtk_box_pack_start(GTK_BOX(hbox), def->sinvert, TRUE, FALSE, 0);
+ def->snocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ g_signal_connect(G_OBJECT(def->snocase), "clicked", G_CALLBACK(evt_sort_nocase_clicked), def);
+ gtk_box_pack_start(GTK_BOX(hbox), def->snocase, TRUE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(def->vbox), frame, FALSE, FALSE, 0);
+
+ /* Default directory. */
+ frame = gtk_frame_new(_("Default Directory"));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ def->dentry = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(def->dentry), PATH_MAX - 1);
+ g_signal_connect(G_OBJECT(def->dentry), "changed", G_CALLBACK(evt_default_path_changed), def);
+ gtk_box_pack_start(GTK_BOX(hbox), def->dentry, TRUE, TRUE, 0);
+ button = gtk_button_new_with_label(_("Starting Directory"));
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(evt_default_path_current), def);
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ button = gtk_button_new_with_label(_("Grab Current"));
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(evt_default_path_grab), def);
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ button = gtk_button_new_with_label(_("From History"));
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(evt_default_path_history), def);
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+ gtk_box_pack_start(GTK_BOX(def->vbox), frame, FALSE, FALSE, 0);
+
+ /* General section below default directory (flags, scrollbar, and 'ctrl' modification. */
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ /* Flags. */
+ frame = gtk_frame_new(_("Flags"));
+ grid = gtk_grid_new();
+
+ def->fabove = gtk_check_button_new_with_label(_("Path Above?"));
+ g_signal_connect(G_OBJECT(def->fabove), "clicked", G_CALLBACK(evt_flag_above_clicked), def);
+ gtk_grid_attach(GTK_GRID(grid), def->fabove, 0, 0, 1, 1);
+
+ def->fhide = gtk_check_button_new_with_label(_("Hide Allowed?"));
+ g_signal_connect(G_OBJECT(def->fhide), "clicked", G_CALLBACK(evt_flag_hide_clicked), def);
+ gtk_grid_attach(GTK_GRID(grid), def->fhide, 0, 1, 1, 1);
+
+ def->fscroll = gtk_check_button_new_with_label(_("Scrollbar Always?"));
+ g_signal_connect(G_OBJECT(def->fscroll), "clicked", G_CALLBACK(evt_flag_scrollbar_clicked), def);
+ gtk_grid_attach(GTK_GRID(grid), def->fscroll, 1, 0, 1, 1);
+
+ def->fhparent = gtk_check_button_new_with_label(_("Huge Parent Button?"));
+ g_signal_connect(G_OBJECT(def->fhparent), "clicked", G_CALLBACK(evt_flag_hugeparent_clicked), def);
+ gtk_grid_attach(GTK_GRID(grid), def->fhparent, 1, 1, 1, 1);
+
+ fhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ def->ffont = gtk_check_button_new_with_label(_("Set Custom Font?"));
+ g_signal_connect(G_OBJECT(def->ffont), "clicked", G_CALLBACK(evt_flag_setfont_clicked), def);
+ gtk_box_pack_start(GTK_BOX(fhbox), def->ffont, FALSE, FALSE, 0);
+ def->fontbutton = gtk_font_button_new();
+ g_signal_connect(G_OBJECT(def->fontbutton), "font_set", G_CALLBACK(evt_font_set), def);
+ gtk_widget_set_sensitive(def->fontbutton, FALSE);
+ gtk_box_pack_start(GTK_BOX(fhbox), def->fontbutton, TRUE, TRUE, 0);
+ gtk_grid_attach(GTK_GRID(grid), fhbox, 0, 2, 1, 1);
+
+ def->frband = gtk_check_button_new_with_label(_("Rubber banding Selection?"));
+ g_signal_connect(G_OBJECT(def->frband), "clicked", G_CALLBACK(evt_flag_rubberbanding_clicked), def);
+ gtk_grid_attach(GTK_GRID(grid), def->frband, 0, 3, 1, 1);
+
+ gtk_container_add(GTK_CONTAINER(frame), grid);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+
+ /* Scrollbar position (new). */
+ frame = gtk_frame_new(_("Scrollbar Position"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ def->splist = gui_radio_group_new(sizeof def->spos / sizeof def->spos[0], spos, def->spos);
+ for(i = 0; i < sizeof def->spos / sizeof def->spos[0]; i++)
+ {
+ g_signal_connect(G_OBJECT(def->spos[i]), "clicked", G_CALLBACK(evt_scrollbarpos_clicked), def);
+ gtk_box_pack_start(GTK_BOX(vbox), def->spos[i], FALSE, FALSE, 0);
+ }
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+
+ gtk_box_pack_start(GTK_BOX(def->vbox), hbox, FALSE, FALSE, 0);
+
+ /* Pane "tools" (i.e., copy/swap) buttons (formerly on top). */
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < sizeof tfmt / sizeof tfmt[0]; i++)
+ {
+ g_snprintf(buf, sizeof buf, _(tfmt[i]), other);
+ button = gtk_button_new_with_label(buf);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(tool[i]), def);
+ gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5);
+ }
+ gtk_box_pack_start(GTK_BOX(def->vbox), hbox, FALSE, FALSE, 5);
+ gtk_widget_show_all(def->vbox);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_pane_orientation_toggled(GtkWidget *wid, gpointer user)
+{
+ P_DirPane *page = user;
+
+ page->paning.edit.orientation = (g_object_get_data(G_OBJECT(wid), "horiz") != NULL) ? DPORIENT_HORIZ : DPORIENT_VERT;
+}
+
+static void evt_pane_mode_toggled(GtkWidget *wid, gpointer user)
+{
+ P_DirPane *page = user;
+ GtkWidget *row;
+
+ if((row = g_object_get_data(G_OBJECT(wid), "row")) != NULL)
+ gtk_widget_set_sensitive(row, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)));
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ page->paning.edit.mode = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "index"));
+ page->paning.value = g_object_get_data(G_OBJECT(wid), "value");
+ }
+}
+
+static void init_paning_page(P_DirPane *page)
+{
+ PPaning *p = &page->paning;
+ GtkWidget *grid, *rb, *lrb, *row, *value = NULL, *frame, *vbox;
+ const gchar *orientname[] = { N_("Horizontal"), N_("Vertical") },
+ *modename[] = { N_("Don't Track"), N_("Ratio"), N_("Size, Left Pane"), N_("Size, Right Pane") };
+ guint i;
+
+ p->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ frame = gtk_frame_new(_("Pane Orientation"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < 2; i++)
+ {
+ p->orientation[i] = gtk_radio_button_new_with_label(i == 1 ?
+ gtk_radio_button_get_group(GTK_RADIO_BUTTON(p->orientation[0])) :
+ NULL, _(orientname[i]));
+ if(i == 0)
+ g_object_set_data(G_OBJECT(p->orientation[i]), "horiz", GINT_TO_POINTER(1));
+ g_signal_connect(G_OBJECT(p->orientation[i]), "toggled", G_CALLBACK(evt_pane_orientation_toggled), page);
+ gtk_box_pack_start(GTK_BOX(vbox), p->orientation[i], FALSE, FALSE, 0);
+ }
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(p->vbox), frame, FALSE, FALSE, 0);
+ frame = gtk_frame_new(_("Split Tracking"));
+ grid = gtk_grid_new();
+ for(i = 0, lrb = NULL; i < sizeof modename / sizeof modename[0]; i++, lrb = rb)
+ {
+ p->mode[i] = rb = gtk_radio_button_new_with_label_from_widget(lrb ? GTK_RADIO_BUTTON(lrb) : NULL, _(modename[i]));
+ g_object_set_data(G_OBJECT(rb), "index", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(rb), "toggled", G_CALLBACK(evt_pane_mode_toggled), page);
+ gtk_grid_attach(GTK_GRID(grid), rb, 0, i, 1, 1);
+ row = NULL;
+ if(i == 1)
+ {
+ GtkAdjustment *adj;
+
+ adj = gtk_adjustment_new(0.5, 0.0, 1.0, 0.0125, 0.125, 0);
+ row = value = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT(adj));
+ gtk_scale_set_digits(GTK_SCALE(value), 4);
+ gtk_scale_set_value_pos(GTK_SCALE(value), GTK_POS_RIGHT);
+ }
+ else if(i == 2 || i == 3)
+ {
+ GtkWidget *label;
+
+ row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ value = gtk_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(value), "256"); /* Better than being empty. */
+ gtk_box_pack_start(GTK_BOX(row), value, TRUE, TRUE, 0);
+ label = gtk_label_new(_("pixels"));
+ gtk_box_pack_start(GTK_BOX(row), label, FALSE, FALSE, 5);
+ }
+ if(row != NULL)
+ {
+ gtk_widget_set_hexpand(row, TRUE);
+ gtk_widget_set_halign(row, GTK_ALIGN_FILL);
+ g_object_set_data(G_OBJECT(rb), "row", row);
+ g_object_set_data(G_OBJECT(rb), "value", value);
+ gtk_widget_set_sensitive(row, FALSE);
+ gtk_grid_attach(GTK_GRID(grid), row, 1, i, 1, 1);
+ }
+ }
+ gtk_container_add(GTK_CONTAINER(frame), grid);
+ gtk_box_pack_start(GTK_BOX(p->vbox), frame, FALSE, FALSE, 0);
+}
+
+/* 2004-04-25 - Store boolean when toggle button toggles. Re-usable. */
+static void evt_history_toggled(GtkWidget *wid, gpointer user)
+{
+ *(gboolean *) user = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+}
+
+static void init_history_page(P_DirPane *page)
+{
+ page->history.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ page->history.select = gtk_check_button_new_with_label(_("Remember Selected Rows?"));
+ g_signal_connect(G_OBJECT(page->history.select), "toggled", G_CALLBACK(evt_history_toggled), &page->history.edit.select);
+ gtk_box_pack_start(GTK_BOX(page->history.vbox), page->history.select, FALSE, FALSE, 0);
+ page->history.save = gtk_check_button_new_with_label(_("Save History Lists?"));
+ g_signal_connect(G_OBJECT(page->history.save), "toggled", G_CALLBACK(evt_history_toggled), &page->history.edit.save);
+ gtk_box_pack_start(GTK_BOX(page->history.vbox), page->history.save, FALSE, FALSE, 0);
+}
+
+/* 1998-06-22 - Called by the main configuration code as it opens up. Asks this module
+** to initialize itself, and return a pointer to the root of its widgetry.
+** This module should also set the <name> pointer to its name ("DirPane").
+** 1998-06-25 - Gimpified this function, too. Terrible.
+*/
+static GtkWidget * cdp_init(MainInfo *min, gchar **name)
+{
+ P_DirPane *page = &the_page;
+
+ if(name == NULL)
+ return NULL;
+
+ *name = _("Dir Panes");
+
+ page->min = min;
+
+ init_pane_page(page, 0, _("Right"));
+ init_pane_page(page, 1, _("Left"));
+ init_paning_page(page);
+ init_history_page(page);
+
+ cfg_tree_level_begin(_("Dir Panes"));
+ cfg_tree_level_append(_("Left"), page->pane[0].vbox);
+ cfg_tree_level_append(_("Right"), page->pane[1].vbox);
+ cfg_tree_level_append(_("Pane Split"), page->paning.vbox);
+ cfg_tree_level_append(_("History"), page->history.vbox);
+ cfg_tree_level_end();
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-26 - This gets called when the config UI opens up, and has already been up.
+** It gives this module a chance to update it's page.
+*/
+static void cdp_update(MainInfo *min)
+{
+ guint i;
+
+ for(i = 0; i < sizeof the_page.pane / sizeof the_page.pane[0]; i++)
+ the_page.pane[i].edit = min->cfg.dp_format[i];
+ the_page.paning.edit = min->cfg.dp_paning;
+ the_page.history.edit = min->cfg.dp_history;
+
+ set_pane_widgets(&the_page.pane[0]);
+ set_pane_widgets(&the_page.pane[1]);
+ set_paning_widgets(&the_page.paning);
+ set_history_widgets(&the_page.history);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-15 - Check if any pane was modified, and if so update the "real" options.
+** 1999-05-16 - Added check on colors, too.
+*/
+static void cdp_accept(MainInfo *min)
+{
+ guint i;
+
+ for(i = 0; i < sizeof the_page.pane / sizeof the_page.pane[0]; i++)
+ {
+ if(memcmp(&the_page.pane[i].edit, &min->cfg.dp_format[i], sizeof the_page.pane[i].edit) != 0)
+ {
+ min->cfg.dp_format[i] = the_page.pane[i].edit;
+ cfg_set_flags(CFLG_REBUILD_MIDDLE | CFLG_RESCAN_LEFT | CFLG_RESCAN_RIGHT);
+ }
+ }
+
+ switch(the_page.paning.edit.mode)
+ {
+ case DPSPLIT_FREE:
+ break;
+ case DPSPLIT_RATIO:
+ the_page.paning.edit.value = gtk_range_get_value(GTK_RANGE(the_page.paning.value));
+ break;
+ case DPSPLIT_ABS_LEFT:
+ case DPSPLIT_ABS_RIGHT:
+ the_page.paning.edit.value = strtol(gtk_entry_get_text(GTK_ENTRY(the_page.paning.value)), NULL, 10);
+ break;
+ }
+ if(memcmp(&the_page.paning.edit, &min->cfg.dp_paning, sizeof the_page.paning.edit) != 0)
+ {
+ min->cfg.dp_paning = the_page.paning.edit;
+ cfg_set_flags(CFLG_REBUILD_MIDDLE);
+ }
+ if(memcmp(&the_page.history.edit, &min->cfg.dp_history, sizeof the_page.history.edit) != 0)
+ min->cfg.dp_history = the_page.history.edit;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void save_extra(FILE *out, DPContent content, DpCExtra *extra)
+{
+ gchar tstr[2] = "?";
+
+ xml_put_node_open(out, "DPExtra");
+ switch(content)
+ {
+ case DPC_NAME:
+ xml_put_boolean(out, "show_type", extra->name.show_type);
+ xml_put_boolean(out, "show_linkname", extra->name.show_linkname);
+ break;
+ case DPC_SIZE:
+ xml_put_text(out, "unit", sze_get_unit_config_name(extra->size.unit));
+ xml_put_boolean(out, "ticks", extra->size.ticks);
+ tstr[0] = extra->size.tick;
+ xml_put_text(out, "tick", tstr);
+ xml_put_integer(out, "digits", extra->size.digits);
+ xml_put_boolean(out, "dir_fs", extra->size.dir_show_fs_size);
+ break;
+ case DPC_BLOCKS: /* Fall-through. */
+ case DPC_BLOCKSIZE:
+ case DPC_MODENUM:
+ case DPC_NLINK:
+ case DPC_UIDNUM:
+ case DPC_GIDNUM:
+ case DPC_DEVICE:
+ case DPC_DEVMAJ:
+ case DPC_DEVMIN:
+ xml_put_text(out, "numformat", extra->blocks.format);
+ break;
+ case DPC_ATIME:
+ xml_put_text(out, "dateformat", extra->a_time.format);
+ break;
+ case DPC_MTIME:
+ xml_put_text(out, "dateformat", extra->m_time.format);
+ break;
+ case DPC_CRTIME:
+ xml_put_text(out, "dateformat", extra->cr_time.format);
+ break;
+ case DPC_CHTIME:
+ xml_put_text(out, "dateformat", extra->ch_time.format);
+ break;
+ case DPC_TYPE:
+ break;
+ default:
+ ;
+ }
+ xml_put_node_close(out, "DPExtra");
+}
+
+static void save_column(FILE *out, DpCFmt *column, guint index)
+{
+ xml_put_node_open(out, "DPColumn");
+ xml_put_integer(out, "index", index);
+ xml_put_text(out, "title", column->title);
+ xml_put_text(out, "content", dpf_get_content_mnemonic(column->content));
+ save_extra(out, column->content, &column->extra);
+ xml_put_integer(out, "justification", column->just);
+ xml_put_integer(out, "width", column->width);
+ xml_put_node_close(out, "DPColumn");
+}
+
+/* 1998-07-27 - Rewritten to use the new xml_put_XXXX() funtions. Loads cleaner. */
+static void save_sort(FILE *out, DPSort *sort)
+{
+ xml_put_node_open(out, "DPSort");
+ xml_put_text(out, "content", dpf_get_content_mnemonic(sort->content));
+ xml_put_text(out, "mode", mode_name[sort->mode]);
+ xml_put_boolean(out, "invert", sort->invert);
+ xml_put_boolean(out, "nocase", sort->nocase);
+ xml_put_node_close(out, "DPSort");
+}
+
+static void save_pane(FILE *out, DPFormat *fmt, const gchar *node_name)
+{
+ guint i;
+
+ xml_put_node_open(out, node_name);
+ xml_put_integer(out, "columns", fmt->num_columns);
+ for(i = 0; i < fmt->num_columns; i++)
+ save_column(out, &fmt->format[i], i);
+ save_sort(out, &fmt->sort);
+ xml_put_text(out, "defpath", fmt->def_path);
+ xml_put_boolean(out, "path_above", fmt->path_above);
+ xml_put_boolean(out, "hide_allowed", fmt->hide_allowed);
+ xml_put_boolean(out, "scrollbar_always", fmt->scrollbar_always);
+ xml_put_boolean(out, "huge_parent", fmt->huge_parent);
+ xml_put_boolean(out, "set_font", fmt->set_font);
+ xml_put_text(out, "font_name", fmt->font_name);
+ xml_put_boolean(out, "rubber_banding", fmt->rubber_banding);
+ xml_put_text(out, "sbar_pos", sbarpos_name[fmt->sbar_pos]);
+ xml_put_node_close(out, node_name);
+}
+
+static void save_paning(FILE *out, DPPaning *p)
+{
+ xml_put_node_open(out, "DirPanePaning");
+ xml_put_text(out, "orientation", pane_orient_name[p->orientation]);
+ xml_put_text(out, "mode", pane_splitmode_name[p->mode]);
+ xml_put_real(out, "value", p->value);
+ xml_put_node_close(out, "DirPanePaning");
+}
+
+static void save_history(FILE *out, DPHistory *p)
+{
+ xml_put_node_open(out, "DirPaneHistory");
+ xml_put_boolean(out, "select", p->select);
+ xml_put_boolean(out, "save", p->save);
+ xml_put_node_close(out, "DirPaneHistory");
+}
+
+/* 1998-07-25 - Save out the dirpane configuration information, in XML format. Might tend
+** to be kind of huge.
+*/
+static gint cdp_save(MainInfo *min, FILE *out)
+{
+ guint i, num = sizeof min->cfg.dp_format / sizeof min->cfg.dp_format[0];
+
+ xml_put_node_open(out, NODE);
+ xml_put_integer(out, "count", num);
+ for(i = 0; i < num; i++)
+ save_pane(out, &min->cfg.dp_format[i], config_name[i]);
+ save_paning(out, &min->cfg.dp_paning);
+ save_history(out, &min->cfg.dp_history);
+ xml_put_node_close(out, NODE);
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Load any "extraneous" information a column might have. Note that these
+** really rely on the fact (?) that fields of a union all have the same
+** offset from it (namely 0).
+*/
+static void load_extra(const XmlNode *node, DPContent content, DpCExtra *extra)
+{
+ gint tmp;
+
+ switch(content)
+ {
+ case DPC_NAME:
+ if(xml_get_boolean(node, "show_type", &tmp))
+ extra->name.show_type = tmp;
+ else
+ extra->name.show_type = FALSE;
+ if(xml_get_boolean(node, "show_linkname", &tmp))
+ extra->name.show_linkname = tmp;
+ else
+ extra->name.show_linkname = FALSE;
+ break;
+ case DPC_SIZE:
+ {
+ const gchar *str;
+
+ if(xml_get_text(node, "unit", &str) || xml_get_text(node, "type", &str))
+ extra->size.unit = sze_parse_unit_config_name(str);
+ else
+ extra->size.unit = SZE_BYTES;
+ if(xml_get_boolean(node, "ticks", &tmp))
+ extra->size.ticks = tmp;
+ if(xml_get_text(node, "tick", &str))
+ extra->size.tick = str[0];
+ if(xml_get_integer(node, "digits", &tmp))
+ extra->size.digits = tmp;
+ if(extra->size.digits < 0 || extra->size.digits > 6)
+ extra->size.digits = 0;
+ g_snprintf(extra->size.dformat, sizeof extra->size.dformat, "%%#.%uf", extra->size.digits);
+
+ tmp = TRUE;
+ xml_get_boolean(node, "dir_fs", &tmp);
+ extra->size.dir_show_fs_size = tmp; /* If load fails, use default in tmp. */
+ }
+ break;
+ case DPC_BLOCKS:
+ case DPC_BLOCKSIZE:
+ case DPC_MODENUM:
+ case DPC_NLINK:
+ case DPC_UIDNUM:
+ case DPC_GIDNUM:
+ case DPC_DEVICE:
+ case DPC_DEVMAJ:
+ case DPC_DEVMIN:
+ xml_get_text_copy(node, "numformat", extra->blocks.format, sizeof extra->blocks.format);
+ break;
+ case DPC_ATIME:
+ case DPC_MTIME:
+ case DPC_CRTIME:
+ case DPC_CHTIME:
+ xml_get_text_copy(node, "dateformat", extra->a_time.format, sizeof extra->a_time.format);
+ break;
+ case DPC_TYPE:
+ break;
+ default:
+ ;
+ }
+}
+
+/* 1998-07-26 - Load sorting configuration. */
+static void load_sort(const XmlNode *node, DPSort *sort)
+{
+ const gchar *content, *mode;
+ gint tmp;
+
+ if(xml_get_text(node, "content", &content))
+ {
+ if((sort->content = dpf_get_content_from_mnemonic(content)) >= DPC_NUM_TYPES &&
+ (sort->content = dpf_get_content_from_name(content)) >= DPC_NUM_TYPES)
+ {
+ sort->content = DPC_NAME;
+ }
+ }
+ if(xml_get_text(node, "mode", &mode))
+ {
+ gboolean found = FALSE;
+ guint i;
+
+ for(i = 0; i < sizeof mode_name / sizeof mode_name[0]; i++)
+ {
+ if(strcmp(mode, mode_name[i]) == 0)
+ {
+ sort->mode = (SortMode) i;
+ found = TRUE;
+ break;
+ }
+ }
+ if(!found)
+ g_warning("**DPCFG: Unknown sort mode %s\n", mode);
+ }
+ if(xml_get_boolean(node, "invert", &tmp))
+ sort->invert = tmp;
+ if(xml_get_boolean(node, "nocase", &tmp))
+ sort->nocase = tmp;
+}
+
+/* 1998-07-26 - Load a column configuration. Since this is called as a callback from the
+** xml_node_visit_children() function, we must make sure that the given node
+** really is for a column.
+*/
+static void load_column(const XmlNode *node, gpointer user)
+{
+ DPFormat *fmt = user;
+ DpCFmt *colfmt;
+ const XmlNode *data;
+ const gchar *cn;
+ gint index;
+ DPContent cid;
+
+ union {
+ GtkJustification justification;
+ gint integer;
+ } jtmp;
+
+ if(!xml_node_has_name(node, "DPColumn")) /* Not actually a column? */
+ return;
+
+ if(xml_get_integer(node, "index", &index))
+ {
+ colfmt = &fmt->format[index];
+ xml_get_text_copy(node, "title", colfmt->title, sizeof colfmt->title);
+ if(xml_get_text(node, "content", &cn))
+ {
+ if(((cid = dpf_get_content_from_mnemonic(cn)) < DPC_NUM_TYPES) ||
+ (cid = dpf_get_content_from_name(cn)) < DPC_NUM_TYPES)
+ {
+ colfmt->content = cid;
+ }
+ else
+ {
+ g_warning("Unknown content type \"%s\" detected--set to \"Size\"", cn);
+ colfmt->content = DPC_SIZE;
+ }
+ }
+ if((data = xml_tree_search(node, "DPExtra")) != NULL)
+ load_extra(data, colfmt->content, &colfmt->extra);
+ xml_get_integer(node, "justification", &jtmp.integer);
+ colfmt->just = jtmp.justification;
+ xml_get_integer(node, "width", &colfmt->width);
+ }
+ else
+ g_warning("**DPCFG: Config node missing 'index' leaf");
+}
+
+static void load_pane(const XmlNode *node, DPFormat *fmt)
+{
+ const XmlNode *data;
+ const gchar *fontname, *sbarpos;
+ gint tmp;
+
+ if(xml_get_integer(node, "columns", (gint *) &fmt->num_columns))
+ {
+ xml_node_visit_children(node, load_column, fmt);
+
+ if((data = xml_tree_search(node, "DPSort")) != NULL)
+ load_sort(data, &fmt->sort);
+ xml_get_text_copy(node, "defpath", fmt->def_path, sizeof fmt->def_path);
+ if(xml_get_boolean(node, "path_above", &tmp))
+ fmt->path_above = tmp;
+ if(xml_get_boolean(node, "hide_allowed", &tmp))
+ fmt->hide_allowed = tmp;
+ if(xml_get_boolean(node, "scrollbar_always", &tmp))
+ fmt->scrollbar_always = tmp;
+ if(xml_get_boolean(node, "huge_parent", &tmp))
+ fmt->huge_parent = tmp;
+ if(xml_get_boolean(node, "set_font", &tmp))
+ fmt->set_font = tmp;
+ if(xml_get_text(node, "font_name", &fontname))
+ g_snprintf(fmt->font_name, sizeof fmt->font_name, "%s", fontname);
+ if(xml_get_boolean(node, "rubber_banding", &tmp))
+ fmt->rubber_banding = tmp;
+ if(xml_get_text(node, "sbar_pos", &sbarpos))
+ {
+ gboolean found = FALSE;
+ guint i;
+
+ for(i = 0; i < sizeof sbarpos_name / sizeof sbarpos_name[0]; i++)
+ {
+ if(strcmp(sbarpos, sbarpos_name[i]) == 0)
+ {
+ fmt->sbar_pos = (SBarPos) i;
+ found = TRUE;
+ break;
+ }
+ }
+ if(!found)
+ g_warning("**DPCFG: Unknown scrollbar position '%s'", sbarpos);
+ }
+ }
+}
+
+static void load_paning(const XmlNode *node, DPPaning *paning)
+{
+ const gchar *str;
+ gfloat tmp;
+
+ if(xml_get_text(node, "orientation", &str))
+ paning->orientation = stu_strcmp_vector(str, pane_orient_name, sizeof pane_orient_name / sizeof *pane_orient_name, DPORIENT_HORIZ);
+ if(xml_get_text(node, "mode", &str))
+ paning->mode = stu_strcmp_vector(str, pane_splitmode_name, sizeof pane_splitmode_name / sizeof *pane_splitmode_name, DPSPLIT_FREE);
+ if(xml_get_real(node, "value", &tmp))
+ paning->value = tmp;
+}
+
+static void load_history(const XmlNode *node, DPHistory *history)
+{
+ gboolean tmp;
+
+ if(xml_get_boolean(node, "select", &tmp))
+ history->select = tmp;
+ if(xml_get_boolean(node, "save", &tmp))
+ history->save = tmp;
+}
+
+/* 2010-02-07 - Check if the deprecated "blocks" and "blocksize" content type was used. If it was, remove it and nag. */
+static void remove_deprecated_content(MainInfo *min, int index)
+{
+ int i, tail;
+ gboolean keep;
+ DPFormat *fmt = &min->cfg.dp_format[index];
+
+ for(i = 0; i < fmt->num_columns; /* No increase here! */)
+ {
+ keep = FALSE;
+
+ if (fmt->format[i].content == DPC_BLOCKS)
+ {
+ ndl_dialog_sync_new_wait(min, "blocks-deprecated", _("'Blocks' Content Deprecated"),
+ _("The 'Blocks' column content type is no longer supported,\n"
+ "but your configuration is still making use of it. It will be\n"
+ "automatically removed."));
+ }
+ else if(fmt->format[i].content == DPC_BLOCKSIZE)
+ {
+ ndl_dialog_sync_new_wait(min, "blocksize-deprecated", _("'Block Size' Content Deprecated"),
+ _("The 'Block Size' column content type is no longer supported,\n"
+ "but your configuration is still making use of it. It will be\n"
+ "automatically removed."));
+ }
+ else
+ keep = TRUE;
+
+ /* Check what the resolution was, do we keep the column or not? */
+ if(!keep)
+ {
+ /* Just move the trailing elements down, and reduce count. */
+ tail = min->cfg.dp_format[index].num_columns - i - 1;
+ memmove(&fmt->format[i], &fmt->format[i + 1], tail * sizeof fmt->format[i]);
+ fmt->num_columns--;
+ cfg_modified_set(min);
+ }
+ else
+ i++;
+ }
+}
+
+/* 1998-07-26 - Load (e.g. parse) the DirPane data found in the XML tree <node>. */
+static void cdp_load(MainInfo *min, const XmlNode *node)
+{
+ const XmlNode *pane, *sub;
+ gint num, i;
+
+ if(xml_get_integer(node, "count", &num))
+ {
+ for(i = 0; i < num; i++)
+ {
+ if((pane = xml_tree_search(node, config_name[i])) != NULL)
+ {
+ load_pane(pane, &min->cfg.dp_format[i]);
+ remove_deprecated_content(min, i);
+ }
+ else
+ g_warning("**DPCFG: Couldn't find '%s' in config file!\n", config_name[i]);
+ }
+ }
+ if((sub = xml_tree_search(node, "DirPanePaning")) != NULL)
+ load_paning(sub, &min->cfg.dp_paning);
+ if((sub = xml_tree_search(node, "DirPaneHistory")) != NULL)
+ load_history(sub, &min->cfg.dp_history);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-26 - Return a description of this module. */
+const CfgModule * cdp_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cdp_init, cdp_update, cdp_accept, cdp_save, cdp_load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_dirpane.h b/src/cfg_dirpane.h
new file mode 100644
index 0000000..4ddaa05
--- /dev/null
+++ b/src/cfg_dirpane.h
@@ -0,0 +1,5 @@
+/*
+** 1998-06-22 - This is short.
+*/
+
+extern const CfgModule * cdp_describe(MainInfo *min);
diff --git a/src/cfg_errors.c b/src/cfg_errors.c
new file mode 100644
index 0000000..9fda657
--- /dev/null
+++ b/src/cfg_errors.c
@@ -0,0 +1,158 @@
+/*
+** 2001-08-18 - Configuration handling for the error reporting stuff. Small.
+*/
+
+#include "gentoo.h"
+
+#include "cfg_module.h"
+#include "configure.h"
+
+#include "cfg_errors.h"
+
+#define NODE "Errors"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *standard, *main_title, *dialog;
+ GtkWidget *beep;
+
+ MainInfo *min;
+ ErrInfo edit;
+ gboolean modified;
+} P_Errors;
+
+static P_Errors the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_dialog_toggled(GtkWidget *wid, gpointer user)
+{
+ ((P_Errors *) user)->modified = TRUE;
+}
+
+static void evt_beep_toggled(GtkWidget *wid, gpointer user)
+{
+ ((P_Errors *) user)->modified = TRUE;
+}
+
+static GtkWidget * cer_init(MainInfo *min, gchar **name)
+{
+ P_Errors *page = &the_page;
+ GtkWidget *vbox, *frame;
+
+ if(name == NULL)
+ return NULL;
+
+ *name = _("Errors");
+
+ page->min = min;
+ page->modified = FALSE;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ frame = gtk_frame_new(_("Error and Status Message Display"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->standard = gtk_radio_button_new_with_label(NULL, _("Status Bar, Above Panes"));
+ g_signal_connect(G_OBJECT(page->standard), "toggled", G_CALLBACK(evt_dialog_toggled), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->standard, FALSE, FALSE, 0);
+ page->main_title = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(page->standard)), _("Main Window's Title Bar"));
+ g_signal_connect(G_OBJECT(page->main_title), "toggled", G_CALLBACK(evt_dialog_toggled), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->main_title, FALSE, FALSE, 0);
+ page->dialog = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(page->standard)), _("Separate Dialog"));
+ g_signal_connect(G_OBJECT(page->dialog), "toggled", G_CALLBACK(evt_dialog_toggled), page);
+ gtk_box_pack_start(GTK_BOX(vbox), page->dialog, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), frame, FALSE, FALSE, 0);
+
+ page->beep = gtk_check_button_new_with_label(_("Cause Console Beep on Error?"));
+ g_signal_connect(G_OBJECT(page->beep), "toggled", G_CALLBACK(evt_beep_toggled), page);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->beep, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(page->vbox);
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cer_update(MainInfo *min)
+{
+ P_Errors *page = &the_page;
+
+ page->edit = min->cfg.errors;
+ if(page->edit.display == ERR_DISPLAY_STATUSBAR)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->standard), TRUE);
+ else if(page->edit.display == ERR_DISPLAY_TITLEBAR)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->main_title), TRUE);
+ else
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dialog), TRUE);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->beep), page->edit.beep);
+ page->modified = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cer_accept(MainInfo *min)
+{
+ P_Errors *page = &the_page;
+
+ if(!page->modified)
+ return;
+ /* We have very little widget state, so just grab it right here. */
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->standard)))
+ page->edit.display = ERR_DISPLAY_STATUSBAR;
+ else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->main_title)))
+ page->edit.display = ERR_DISPLAY_TITLEBAR;
+ else
+ page->edit.display = ERR_DISPLAY_DIALOG;
+ page->edit.beep = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->beep));
+ if(min->cfg.errors.display != page->edit.display)
+ cfg_set_flags(CFLG_REBUILD_TOP);
+ min->cfg.errors = page->edit;
+ page->modified = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint cer_save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, NODE);
+ xml_put_integer(out, "display", min->cfg.errors.display);
+ xml_put_boolean(out, "beep", min->cfg.errors.beep);
+ xml_put_node_close(out, NODE);
+
+ return TRUE;
+}
+
+static void cer_load(MainInfo *min, const XmlNode *node)
+{
+ const XmlNode *root;
+
+ if((root = xml_tree_search(node, NODE)) != NULL)
+ {
+ gboolean tmp;
+ gint itmp;
+
+ if(xml_get_integer(root, "display", &itmp))
+ min->cfg.errors.display = itmp;
+ else if(xml_get_boolean(root, "dialog", &tmp)) /* Legacy "dialog" boolean support. */
+ {
+ if(tmp)
+ min->cfg.errors.display = ERR_DISPLAY_DIALOG;
+ else
+ min->cfg.errors.display = ERR_DISPLAY_STATUSBAR;
+ }
+ if(xml_get_boolean(root, "beep", &tmp))
+ min->cfg.errors.beep = tmp;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cer_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cer_init, cer_update, cer_accept, cer_save, cer_load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_errors.h b/src/cfg_errors.h
new file mode 100644
index 0000000..dc65708
--- /dev/null
+++ b/src/cfg_errors.h
@@ -0,0 +1,5 @@
+/*
+** 2001-08-18 - Interface for the error reporting config module.
+*/
+
+extern const CfgModule * cer_describe(MainInfo *min);
diff --git a/src/cfg_menus.c b/src/cfg_menus.c
new file mode 100644
index 0000000..1c0b322
--- /dev/null
+++ b/src/cfg_menus.c
@@ -0,0 +1,86 @@
+/*
+** A module for creating user-defined custom menus. The two immediate uses
+** for this is 1) allow configuring the old dir pane menu, and 2) allow
+** creation of menus to be bound to command buttons, finally leveraging
+** the full power of the special widget used for those.
+**
+** A full-blown menu editor is a rather big thing, so the goal here is
+** for it to grow. We'll see about that.
+*/
+
+#include "gentoo.h"
+
+#include "cfg_module.h"
+
+#include "cfg_menus.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define NODE "Menus"
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *scwin;
+ GtkWidget *mcmd[2]; /* Add and delete. */
+
+ MainInfo *min; /* Dead handy. */
+ gboolean modified;
+ MenuInfo *menus;
+ Menu *menu; /* Currently selected menu. */
+} P_Menus;
+
+static P_Menus the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static GtkWidget * init(MainInfo *min, gchar **name)
+{
+ const gchar *mlab[] = { "Add Menu", "Delete Menu" };
+ P_Menus *page = &the_page;
+ GtkWidget *hbox;
+ guint i;
+
+ if(name != NULL)
+ *name = _("Menus");
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->min = min;
+ page->menu = NULL;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < sizeof page->mcmd / sizeof page->mcmd[0]; i++)
+ {
+ page->mcmd[i] = gtk_button_new_with_label(_(mlab[i]));
+ gtk_box_pack_start(GTK_BOX(hbox), page->mcmd[i], TRUE, TRUE, 5);
+ }
+ gtk_box_pack_start(GTK_BOX(page->vbox), hbox, FALSE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void update(MainInfo *min)
+{
+ P_Menus *page = &the_page;
+
+ page->min = min;
+ page->modified = FALSE;
+ page->menus = mnu_menuinfo_copy(min->cfg.menus);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cmu_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, init, update, NULL, NULL, NULL, NULL };
+
+ return &desc;
+}
+
+/* 2001-01-01 - Return editing version of menu info. Dead handy. */
+MenuInfo * cmu_get_menuinfo(void)
+{
+ return the_page.menus;
+}
diff --git a/src/cfg_menus.h b/src/cfg_menus.h
new file mode 100644
index 0000000..1c3c72a
--- /dev/null
+++ b/src/cfg_menus.h
@@ -0,0 +1,6 @@
+/*
+** Header for the menus config module.
+*/
+
+extern const CfgModule * cmu_describe(MainInfo *min);
+extern MenuInfo * cmu_get_menuinfo(void);
diff --git a/src/cfg_module.h b/src/cfg_module.h
new file mode 100644
index 0000000..e71ad37
--- /dev/null
+++ b/src/cfg_module.h
@@ -0,0 +1,63 @@
+/*
+** 1998-06-22 - A generic header file to be included by all the modules that
+** implement gdtool's GUI config system. Loads of code.
+*/
+
+#if !defined CFG_MODULE_H
+#define CFG_MODULE_H
+
+#include "xmlutil.h"
+
+/* This gets called when the main config system wants this page to create
+** itself. Should return a "root" widget for the page (some GTK+ container).
+*/
+typedef GtkWidget * (*CMInitFunc)(MainInfo *min, gchar **name);
+
+/* Kindly update yourself, since we are about to redisplay the config GUI. */
+typedef void (*CMUpdateFunc)(MainInfo *min);
+
+/* This gets called as the user clicks the OK button in the config GUI. It
+** should make the necessary changes to stuff in min->cfg. Optimally, the
+** only thing done is a memcpy() or so... Dream on.
+*/
+typedef void (*CMAcceptFunc)(MainInfo *min);
+
+/* This gives the page a chance to save itself out on the (open) stream
+** <out>. It gets called as the user clicks the Save button in the GUI,
+** _before_ any calls to cfg_accept() and cfg_hide().
+*/
+typedef gint (*CMSaveFunc)(MainInfo *min, FILE *out);
+
+/* Make the page parse its data from the XML tree node <node>, which has
+** been identified as belonging to this page by a string match between
+** the node's name and the page's node identifier.
+*/
+typedef void (*CMLoadFunc)(MainInfo *min, const XmlNode *node);
+
+/* This gets called as the config window "closes". Modules should NOT use
+** this opportunity to destroy their GUI, since that should not be
+** necessary. It can, however, be useful to get a chance to free any
+** extraneous data used by the module during config editing.
+*/
+typedef void (*CMHideFunc)(MainInfo *min);
+
+/* A collection of function pointers that define the interface to a
+** configuration page.
+*/
+typedef struct {
+ const gchar *node; /* Name of this module's root config node. */
+ CMInitFunc init;
+ CMUpdateFunc update;
+ CMAcceptFunc accept;
+ CMSaveFunc save;
+ CMLoadFunc load;
+ CMHideFunc hide;
+} CfgModule;
+
+/* This gets called by the main config GUI code every time it opens. The
+** module should just return a pointer to an instance of the above struct,
+** whose fields the main cfg can then access at will.
+*/
+typedef const CfgModule * (*CMDescribeFunc)(MainInfo *min);
+
+#endif /* CFG_MODULE_H */
diff --git a/src/cfg_nag.c b/src/cfg_nag.c
new file mode 100644
index 0000000..23aa268
--- /dev/null
+++ b/src/cfg_nag.c
@@ -0,0 +1,184 @@
+/*
+** 2009-12-28 - Implementation of the nagging configuration. This mainly gives the user an option to forget
+** which dialogs have been suppressed, and hooks into the save/load of configure data.
+*/
+
+#include "gentoo.h"
+
+#include "configure.h"
+#include "xmlutil.h"
+
+#include "cfg_nag.h"
+
+#define NODE "Nagging"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *reset;
+ gboolean do_reset;
+
+ MainInfo *min;
+ gboolean modified;
+} P_Nag;
+
+static P_Nag the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+void cng_initialize(NagInfo *ni)
+{
+ ni->ignored = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+}
+
+gsize cng_num_ignored(const NagInfo *ni)
+{
+ return ni != NULL ? g_hash_table_size(ni->ignored) : 0u;
+}
+
+gboolean cng_is_ignored(const NagInfo *ni, const gchar *tag)
+{
+ if(ni == NULL || tag == NULL)
+ return FALSE;
+ if(g_hash_table_lookup_extended(ni->ignored, tag, NULL, NULL))
+ return TRUE;
+ return FALSE;
+}
+
+/* 2009-12-29 - Adds the given tag to the set of ignored tags. The tag is copied. */
+void cng_ignore(NagInfo *ni, const gchar *tag)
+{
+ gpointer key;
+
+ if(ni == NULL || tag == NULL)
+ return;
+ /* Protect against multiple insertions, since that would leak memory. */
+ if(g_hash_table_lookup_extended(ni->ignored, (gpointer) tag, NULL, NULL))
+ return;
+ if((key = g_strdup(tag)) != NULL)
+ {
+ g_hash_table_insert(ni->ignored, key, NULL);
+ }
+}
+
+void cng_reset(NagInfo *ni)
+{
+ if(ni != NULL)
+ g_hash_table_remove_all(ni->ignored);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void set_label(GtkWidget *label, gsize num)
+{
+ gchar buf[256];
+
+ g_snprintf(buf, sizeof buf, _("Click the button below to reset the %zu stored 'Don't show this dialog again' responses."), num);
+ gtk_label_set_markup(GTK_LABEL(label), buf);
+}
+
+static void evt_reset_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Nag *page = user;
+
+ page->do_reset = TRUE;
+ page->modified = TRUE;
+ set_label(page->label, 0);
+ gtk_widget_set_sensitive(page->reset, FALSE);
+}
+
+static GtkWidget * cng_init(MainInfo *min, gchar **name)
+{
+ P_Nag *page = &the_page;
+ gsize num;
+
+ if(name == NULL)
+ return NULL;
+
+ *name = _("Nagging");
+
+ page->min = min;
+ page->modified = FALSE;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->label = gtk_label_new(NULL);
+ num = cng_num_ignored(&min->cfg.nag);
+ set_label(page->label, num);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->label, FALSE, FALSE, 5);
+ page->reset = gtk_button_new_with_label(_("Reset All"));
+ gtk_widget_set_sensitive(page->reset, num > 0);
+ g_signal_connect(G_OBJECT(page->reset), "clicked", G_CALLBACK(evt_reset_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->reset, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(page->vbox);
+
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cng_update(MainInfo *min)
+{
+ P_Nag *page = &the_page;
+
+ page->do_reset = FALSE;
+ page->modified = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cng_accept(MainInfo *min)
+{
+ P_Nag *page = &the_page;
+
+ if(!page->modified)
+ return;
+ if(page->do_reset)
+ cng_reset(&min->cfg.nag);
+ page->modified = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint cng_save(MainInfo *min, FILE *out)
+{
+ GHashTableIter iter;
+ gpointer key;
+
+ xml_put_node_open(out, NODE);
+ g_hash_table_iter_init(&iter, min->cfg.nag.ignored);
+ while(g_hash_table_iter_next(&iter, &key, NULL))
+ {
+ xml_put_text(out, "ignore", key);
+ }
+ xml_put_node_close(out, NODE);
+
+ return TRUE;
+}
+
+static void visit_ignore(const XmlNode *child, gpointer user)
+{
+ const gchar *text;
+
+ if(xml_get_text(child, "ignore", &text))
+ cng_ignore(&((MainInfo *) user)->cfg.nag, text);
+}
+
+static void cng_load(MainInfo *min, const XmlNode *node)
+{
+ const XmlNode *root;
+
+ if((root = xml_tree_search(node, NODE)) != NULL)
+ xml_node_visit_children(root, visit_ignore, min);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cng_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cng_init, cng_update, cng_accept, cng_save, cng_load, NULL };
+
+ return &desc;
+}
diff --git a/src/cfg_nag.h b/src/cfg_nag.h
new file mode 100644
index 0000000..986e7fb
--- /dev/null
+++ b/src/cfg_nag.h
@@ -0,0 +1,15 @@
+/*
+** 2009-12-28 - The nagging is configurable. What a dream! This module, for simplicity's sake, also implements the
+** "API" used by the nag dialog to query and set ignore-flags.
+*/
+
+#include "cfg_module.h"
+
+extern void cng_initialize(NagInfo *ni);
+
+extern gsize cng_num_ignored(const NagInfo *ni);
+extern gboolean cng_is_ignored(const NagInfo *ni, const gchar *tag);
+extern void cng_ignore(NagInfo *ni, const gchar *tag);
+extern void cng_reset(NagInfo *ni);
+
+extern const CfgModule * cng_describe(MainInfo *min);
diff --git a/src/cfg_paths.c b/src/cfg_paths.c
new file mode 100644
index 0000000..874b24d
--- /dev/null
+++ b/src/cfg_paths.c
@@ -0,0 +1,434 @@
+/*
+** 1998-08-24 - Configure search paths, i.e. lists of directories gentoo might search for
+** different kinds of files. Currently there's only one path; the one used
+** for icons. This might change in the future, though (sounds, helper apps...).
+** 1998-12-25 - Finally changed the config file format for paths. Much better now.
+*/
+
+#include "gentoo.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "strutil.h"
+#include "xmlutil.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "list_dialog.h"
+
+#include "cfg_paths.h"
+
+#define NODE "Paths"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *path;
+} Path;
+
+typedef struct {
+ GtkWidget *frame;
+ GSList *hgroup;
+ GtkWidget *hmode[3];
+ GtkWidget *hre;
+ GtkWidget *hicase; /* Check button. */
+} HFrame;
+
+typedef struct {
+ MainInfo *main;
+ GtkWidget *vbox;
+ GtkWidget *pframe; /* Frame for path widgets. */
+ Path path[PTID_NUM_PATHS]; /* Widgets for editing the paths. */
+
+ HFrame hide;
+
+ HideInfo hideinfo;
+ gint open;
+ gboolean modified;
+} P_Paths;
+
+static P_Paths the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - User modified a path by editing it. Remember that. */
+static gint evt_path_changed(GtkWidget *wid, gpointer user)
+{
+ P_Paths *page = user;
+
+ if(page->open)
+ page->modified = TRUE;
+
+ return TRUE;
+}
+
+/* 2011-09-27 - Path editor for the list dialog, makes it easy to edit each single path by providing a standard file chooser dialog. */
+static gboolean path_editor(GString *value, gpointer user)
+{
+ P_Paths *page = user;
+ GtkWidget *fc;
+ gint ret;
+ gboolean success = FALSE;
+
+ fc = gtk_file_chooser_dialog_new(_("Edit path"), GTK_WINDOW(page->main->gui->window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_Open"), GTK_RESPONSE_OK, _("_Cancel"), GTK_RESPONSE_CANCEL, NULL);
+ /* For this usage, I really think it makes sense to call this, despite the recommendation not to. */
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fc), value->str);
+ ret = gtk_dialog_run(GTK_DIALOG(fc));
+ if(ret == GTK_RESPONSE_OK)
+ {
+ gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fc));
+
+ if(filename != NULL && *filename != '\0')
+ {
+ g_string_assign(value, filename);
+ success = TRUE;
+ }
+ g_free(filename);
+ }
+ gtk_widget_destroy(fc);
+
+ return success;
+}
+
+/* 2010-07-28 - The "pick" button next to a path was clicked; pop up a list dialog. */
+static void evt_path_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Paths *page = user;
+ const gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "index"));
+ GtkWidget *entry = page->path[index].path;
+ const gchar *text;
+
+ if((text = gtk_entry_get_text(GTK_ENTRY(entry))) != NULL)
+ {
+ gchar tmp[1024];
+
+ g_snprintf(tmp, sizeof tmp, "%s", text);
+ ldl_dialog_sync_new_full_wait(tmp, sizeof tmp, ':', _("Edit path"), path_editor, page);
+ if(strcmp(tmp, text) != 0)
+ gtk_entry_set_text(GTK_ENTRY(entry), tmp);
+ }
+}
+
+/* 1998-10-30 - User just changed the hiding mode. */
+static gint evt_hmode_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Paths *page = user;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ page->hideinfo.mode = (HMode) g_object_get_data(G_OBJECT(wid), "mode");
+ gtk_widget_set_sensitive(page->hide.hre, page->hideinfo.mode == HIDE_REGEXP);
+ gtk_widget_set_sensitive(page->hide.hicase, page->hideinfo.mode == HIDE_REGEXP);
+
+ page->modified = TRUE;
+ }
+
+ return TRUE;
+}
+
+/* 1998-10-30 - User edited the hide RE. Register change, and grab the string. */
+static gint evt_hre_changed(GtkWidget *wid, gpointer user)
+{
+ P_Paths *page = user;
+
+ g_strlcpy(page->hideinfo.hide_re_src, gtk_entry_get_text(GTK_ENTRY(wid)), sizeof page->hideinfo.hide_re_src);
+ page->modified = TRUE;
+ return TRUE;
+}
+
+/* 1998-10-26 - The "Ignore Case?" check button for hide RE has been hit. */
+static gint evt_hicase_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Paths *page = user;
+
+ page->hideinfo.no_case = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ page->modified = TRUE;
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Populate the paths. Not very complicated.
+** 1998-10-26 - Now also initializes the hide widgetry.
+*/
+static void populate_paths(CfgInfo *cfg, P_Paths *page)
+{
+ gint i;
+
+ for(i = 0; i < PTID_NUM_PATHS; i++)
+ gtk_entry_set_text(GTK_ENTRY(page->path[i].path), cfg->path.path[i]->str);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->hide.hmode[cfg->path.hideinfo.mode]), TRUE);
+ gtk_entry_set_text(GTK_ENTRY(page->hide.hre), cfg->path.hideinfo.hide_re_src);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->hide.hicase), cfg->path.hideinfo.no_case);
+ gtk_widget_set_sensitive(page->hide.hre, page->hideinfo.mode == HIDE_REGEXP);
+ gtk_widget_set_sensitive(page->hide.hicase, page->hideinfo.mode == HIDE_REGEXP);
+}
+
+/* 1998-08-24 - Open up the paths config page. Very simple at this time, since there's only
+** one path to configure.
+*/
+static GtkWidget * cpt_init(MainInfo *min, gchar **name)
+{
+ P_Paths *page = &the_page;
+ GtkWidget *grid, *label, *vbox;
+ const struct {
+ const gchar *label;
+ gboolean with_button;
+ } pinfo[] = {
+ { N_("Icons"), TRUE },
+ { N_("GTK+ RC"), TRUE },
+ { N_("fstab"), FALSE },
+ { N_("mtab"), FALSE }
+ };
+ const gchar *hlab[] = { N_("None"), N_("Beginning With Dot (.)"), N_("Matching RE") };
+ guint i;
+
+ if(name == NULL)
+ return NULL;
+
+ *name = _("Paths & Hide");
+
+ page->main = min;
+ page->open = FALSE;
+ page->modified = FALSE;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->pframe = gtk_frame_new(_("Paths"));
+
+ grid = gtk_grid_new();
+ if(sizeof pinfo / sizeof *pinfo == PTID_NUM_PATHS)
+ {
+ for(i = 0; i < PTID_NUM_PATHS; i++)
+ {
+ gint width;
+
+ label = gtk_label_new(_(pinfo[i].label));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
+ page->path[i].path = gtk_entry_new();
+ gtk_widget_set_hexpand(page->path[i].path, TRUE);
+ gtk_widget_set_halign(page->path[i].path, GTK_ALIGN_FILL);
+ g_signal_connect(G_OBJECT(page->path[i].path), "changed", G_CALLBACK(evt_path_changed), page);
+ width = pinfo[i].with_button ? 1 : 2;
+ gtk_grid_attach(GTK_GRID(grid), page->path[i].path, 1, i, width, 1);
+ if(pinfo[i].with_button)
+ {
+ GtkWidget *pick;
+
+ pick = gui_details_button_new();
+ g_object_set_data(G_OBJECT(pick), "index", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(pick), "clicked", G_CALLBACK(evt_path_pick_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), pick, 2, i, 1, 1);
+ }
+#if defined __OpenBSD__ || defined __FreeBSD__ || defined __NetBSD__
+ /* Mountlist and mounted fs files are non-configurable on BSD systems. */
+ if(i == 2 || i == 3)
+ gtk_widget_set_sensitive(page->path[i].path, FALSE);
+#endif
+ }
+ }
+ else
+ g_warning("**CFGPATHS: Missing labels!");
+
+ gtk_container_add(GTK_CONTAINER(page->pframe), grid);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->pframe, FALSE, FALSE, 5);
+
+ page->hide.frame = gtk_frame_new(_("Hide Entries"));
+ page->hide.hgroup = gui_radio_group_new(3, hlab, page->hide.hmode);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < sizeof page->hide.hmode / sizeof page->hide.hmode[0]; i++)
+ {
+ g_object_set_data(G_OBJECT(page->hide.hmode[i]), "mode", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(page->hide.hmode[i]), "clicked", G_CALLBACK(evt_hmode_clicked), page);
+ if(i < 2)
+ gtk_box_pack_start(GTK_BOX(vbox), page->hide.hmode[i], FALSE, FALSE, 0);
+ else
+ {
+ GtkWidget *hbox;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), page->hide.hmode[i], FALSE, FALSE, 0);
+ page->hide.hre = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(page->hide.hre), sizeof min->cfg.path.hideinfo.hide_re_src - 1);
+ g_signal_connect(G_OBJECT(page->hide.hre), "changed", G_CALLBACK(evt_hre_changed), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->hide.hre, TRUE, TRUE, 0);
+ page->hide.hicase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ g_signal_connect(G_OBJECT(page->hide.hicase), "clicked", G_CALLBACK(evt_hicase_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->hide.hicase, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ }
+ }
+ gtk_container_add(GTK_CONTAINER(page->hide.frame), vbox);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->hide.frame, FALSE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Update path widgets. Tough. */
+static void cpt_update(MainInfo *min)
+{
+ P_Paths *page = &the_page;
+
+ page->hideinfo = min->cfg.path.hideinfo;
+ populate_paths(&min->cfg, page);
+ page->open = TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Accept changes to paths (if any).
+** 1998-08-30 - Now detects changes, and only alters the main current setting if there really
+** has been changes made. Also added a switch() allowing different actions to be
+** carried out when a path has changed. Initial use: rescan when icon path changes.
+*/
+static void cpt_accept(MainInfo *min)
+{
+ P_Paths *page = &the_page;
+ const gchar *text;
+ gint i;
+
+ if(page->open && page->modified)
+ {
+ for(i = 0; i < PTID_NUM_PATHS; i++)
+ {
+ text = gtk_entry_get_text(GTK_ENTRY(page->path[i].path));
+ if(strcmp(text, min->cfg.path.path[i]->str))
+ {
+ g_string_assign(min->cfg.path.path[i], text);
+ switch((PathID) i)
+ {
+ case PTID_ICON:
+ cfg_set_flags(CFLG_FLUSH_ICONS);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ min->cfg.path.hideinfo = page->hideinfo;
+ fut_check_hide(&min->gui->pane[0], NULL); /* Frees any precompiled RE. */
+ cfg_set_flags(CFLG_RESCAN_BOTH);
+ page->modified = FALSE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Save out the paths. Not very complex.
+** 1998-10-26 - Added the hide info, too.
+*/
+static gint cpt_save(MainInfo *min, FILE *out)
+{
+ gint i;
+
+ xml_put_node_open(out, NODE);
+
+ xml_put_node_open(out, "PathList");
+ for(i = 0; i < PTID_NUM_PATHS; i++)
+ {
+ xml_put_node_open(out, "Path");
+ xml_put_integer(out, "index", i);
+ xml_put_text(out, "path", min->cfg.path.path[i]->str);
+ xml_put_node_close(out, "Path");
+ }
+ xml_put_node_close(out, "PathList");
+
+ xml_put_node_open(out, "HideInfo");
+ xml_put_integer(out, "mode", min->cfg.path.hideinfo.mode);
+ xml_put_text(out, "re", min->cfg.path.hideinfo.hide_re_src);
+ xml_put_boolean(out, "re_nocase", min->cfg.path.hideinfo.no_case);
+ xml_put_node_close(out, "HideInfo");
+
+ xml_put_node_close(out, NODE);
+
+ return TRUE;
+}
+
+static void load_path(const XmlNode *data, gpointer user)
+{
+ CfgInfo *cfg = user;
+ gint index;
+
+ if(xml_get_integer(data, "index", &index))
+ {
+ if((index >= 0) && (index < PTID_NUM_PATHS))
+ {
+ const gchar *path;
+
+ if(xml_get_text(data, "path", &path))
+ g_string_assign(cfg->path.path[index], path);
+ }
+ else
+ g_warning("**CFGPATHS: Path index %d is illegal", index);
+ }
+}
+
+static void load_hideinfo(MainInfo *min, const XmlNode *node)
+{
+ gint tmp;
+ union {
+ HMode hmode;
+ gint integer;
+ } htmp;
+
+ xml_get_integer(node, "mode", &htmp.integer);
+ min->cfg.path.hideinfo.mode = htmp.hmode;
+ xml_get_text_copy(node, "re", min->cfg.path.hideinfo.hide_re_src, sizeof min->cfg.path.hideinfo.hide_re_src);
+ if(xml_get_boolean(node, "re_nocase", &tmp))
+ min->cfg.path.hideinfo.no_case = tmp;
+}
+
+/* 1998-08-24 - Load paths from config tree. Ugly. */
+static void cpt_load(MainInfo *min, const XmlNode *node)
+{
+ const XmlNode *data;
+
+ if((data = xml_tree_search(node, "PathList")) != NULL)
+ xml_node_visit_children(data, load_path, &min->cfg);
+ if((data = xml_tree_search(node, "HideInfo")) != NULL)
+ load_hideinfo(min, data);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Hide the paths page. Not very much to do. */
+static void cpt_hide(MainInfo *min)
+{
+ the_page.open = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-24 - Describe the paths config page. */
+const CfgModule * cpt_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cpt_init, cpt_update, cpt_accept, cpt_save, cpt_load, cpt_hide };
+
+ return &desc;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-25 - Return pointer to current setting for path <id>. */
+const gchar * cpt_get_path(PathID id)
+{
+ GtkEntry *ent = NULL;
+
+ switch(id)
+ {
+ case PTID_ICON:
+ ent = GTK_ENTRY(the_page.path[id].path);
+ break;
+ default:
+ g_warning("cpt_get_path(): Unknown path %d requested", id);
+ }
+ if(ent != NULL)
+ return gtk_entry_get_text(ent);
+
+ return NULL;
+}
+
diff --git a/src/cfg_paths.h b/src/cfg_paths.h
new file mode 100644
index 0000000..227bc97
--- /dev/null
+++ b/src/cfg_paths.h
@@ -0,0 +1,6 @@
+/*
+** 1998-08-24 - Header for the paths config module.
+*/
+
+extern const CfgModule * cpt_describe(MainInfo *min);
+extern const gchar * cpt_get_path(PathID id);
diff --git a/src/cfg_styles.c b/src/cfg_styles.c
new file mode 100644
index 0000000..c04253b
--- /dev/null
+++ b/src/cfg_styles.c
@@ -0,0 +1,1000 @@
+/*
+** 1998-08-14 - Configure styles, e.g. things such as back- & foreground colors, icons, and
+** actions. This might become involved.
+** 1998-08-23 - Did lots of work. Now you can actually add and delete styles. Got involved.
+** 1998-08-24 - Completed a first version, fixed plenty of bugs too...
+** 1998-08-26 - Added fun "Copy" button group for visual properties. Also added a deselect
+** signal handler for root style. Oops.
+** 1998-08-30 - Now uses the ico_get_all() function to retrieve a list of all icon file names.
+** Added three (!) forgotten modified-sets. Damn.
+** 1998-09-02 - Added action property configuration, and cleaned up their save/load handling.
+** 1998-09-16 - Made some optimizations, mainly in set_preview() (one more signal blocker).
+** 1998-09-27 - Now uses the brand new cmdseq_dialog for choosing actions. Works fine.
+** 1999-03-05 - Due to new selection handling, we no longer have control over how selected items
+** look. That got rid of some code.
+** 1999-03-13 - Rewrote the dialog module (from scratch), which lead to some changes here too.
+** 1999-05-07 - Now uses the (new) color dialog module. Got rid of lots of crufty code.
+** 2000-07-02 - Took a step closer to the rest of the world, by marking strings for translation.
+*/
+
+#include <ctype.h>
+
+#include "gentoo.h"
+
+#include "styles.h"
+#include "types.h"
+#include "dirpane.h"
+#include "dialog.h"
+#include "dpformat.h"
+#include "iconutil.h"
+#include "strutil.h"
+#include "fileutil.h"
+#include "miscutil.h"
+#include "xmlutil.h"
+#include "guiutil.h"
+#include "style_dialog.h"
+#include "cmdseq_dialog.h"
+#include "color_dialog.h"
+#include "icon_dialog.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "cfg_paths.h" /* For cpt_get_path(). */
+#include "cfg_types.h" /* For ctp_get_types(). */
+#include "cfg_cmdseq.h" /* For ccs_get_current(). */
+
+#include "cfg_styles.h"
+
+#define NODE "FileStyles"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* For GtkTreeModel access. */
+enum {
+ COLUMN_ICON,
+ COLUMN_NAME
+};
+
+typedef struct { /* Visual properties notebook page. */
+ GtkWidget *vbox;
+ GtkWidget *preview; /* CList showing preview of style (old-school!). */
+ GtkTreeViewColumn *pre_icon; /* Icon preview. */
+ GtkCellRenderer *pre_icon_r;
+ GtkTreeViewColumn *pre_name; /* Name (text) preview. */
+ GtkCellRenderer *pre_name_r;
+ GtkWidget *override[3]; /* Override check buttons for back- & foreground colors, plus icon. */
+ GtkWidget *edit[3]; /* The "edit" (or "pick") command buttons. */
+} PVisual;
+
+typedef struct { /* Action properties notebook page. */
+ GtkWidget *vbox;
+ GtkListStore *store;
+ GtkWidget *view;
+ GtkWidget *editcmd; /* Shortcut to go to the Command editing configuration page. */
+ GtkWidget *adel; /* Delete (or override) command button. */
+} PAction;
+
+enum {
+ ACTION_COLUMN_NAME,
+ ACTION_COLUMN_CMDSEQ,
+ ACTION_COLUMN_ACTION,
+ ACTION_COLUMN_WEIGHT,
+
+ ACTION_COLUMN_COUNT
+};
+
+typedef struct {
+ GtkWidget *vbox;
+ GuiHandlerGroup *handlers; /* Collects editing widgets, for signal blocking. */
+ GtkWidget *scwin;
+ GtkWidget *tree; /* Main style tree widget. */
+ gulong sig_expand; /* Signal handler for tree item expansion. */
+ gulong sig_collapse; /* Signal handler for tree item collapse. */
+ GtkTreeStore *store;
+
+ GtkWidget *dvbox; /* Vbox holding definition widgets. */
+ GtkWidget *dname; /* Name of selected style. */
+ GtkWidget *dparent; /* Parent of selected style. */
+ GtkWidget *dreparent; /* Button for reparenting dialog. */
+
+ GtkWidget *dpnbook; /* Property notebook. */
+ PVisual dpvisual;
+ PAction dpaction;
+
+ GtkWidget *del; /* The style "Delete" button. */
+
+ MainInfo *min;
+ StyleInfo *si;
+ const gchar *curr_prop; /* Current property, when editing one. */
+ gint curr_arow; /* Action property clist row. */
+ gboolean modified;
+} P_Styles;
+
+static P_Styles the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-24 - Set the preview widget(s). */
+static void set_widgets_preview(P_Styles *page, Style *stl)
+{
+ GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->dpvisual.preview)));
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
+ {
+ const gchar *iname;
+
+ if((iname = stl_style_property_get_icon(stl, SPN_ICON_UNSEL)) != NULL)
+ {
+ GdkPixbuf *pbuf;
+
+ if((pbuf = ico_icon_get_pixbuf(page->min, iname)) != NULL)
+ gtk_list_store_set(store, &iter, COLUMN_ICON, pbuf, -1);
+ }
+ }
+ dpf_cell_set_style_colors(page->dpvisual.pre_icon_r, stl, FALSE, FALSE);
+ dpf_cell_set_style_colors(page->dpvisual.pre_name_r, stl, TRUE, TRUE);
+}
+
+/* 1999-05-24 - Set action list. */
+static void set_widgets_action(P_Styles *page, Style *stl)
+{
+ GList *alist;
+
+ gtk_list_store_clear(page->dpaction.store);
+ if((alist = stl_style_property_get_actions(stl)) != NULL)
+ {
+ const GList *iter;
+ GtkTreeIter titer;
+
+ for(iter = alist; iter != NULL; iter = g_list_next(iter))
+ {
+ const gboolean ovr = stl_style_property_get_override(stl, iter->data);
+ gtk_list_store_insert_with_values(page->dpaction.store, &titer, -1,
+ ACTION_COLUMN_NAME, iter->data,
+ ACTION_COLUMN_CMDSEQ, stl_style_property_get_action(stl, iter->data),
+ ACTION_COLUMN_ACTION, iter->data,
+ ACTION_COLUMN_WEIGHT, ovr ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
+ -1);
+ }
+ g_list_free(alist);
+ }
+}
+
+/* 1999-05-24 - Set various editing widgets to display <stl>'s details. */
+static void set_widgets(P_Styles *page, Style *stl)
+{
+ const gchar *pname, *vpname[] = { SPN_COL_UNSEL_BG, SPN_COL_UNSEL_FG, SPN_ICON_UNSEL };
+ gboolean or;
+ guint i;
+
+ if((page == NULL) || (stl == NULL))
+ return;
+
+ gui_handler_group_block(page->handlers);
+
+ gtk_entry_set_text(GTK_ENTRY(page->dname), stl_style_get_name(stl));
+ if((pname = stl_style_get_name(stl_styleinfo_style_get_parent(page->si, stl))) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(page->dparent), pname);
+ else
+ gtk_entry_set_text(GTK_ENTRY(page->dparent), _("(None)"));
+ gtk_widget_set_sensitive(page->dreparent, pname != NULL);
+
+ set_widgets_preview(page, stl);
+ for(i = 0; i < 3; i++)
+ {
+ or = stl_style_property_get_override(stl, vpname[i]);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dpvisual.override[i]), or);
+ gtk_widget_set_sensitive(page->dpvisual.override[i], (i < 1) || (pname != NULL));
+ gtk_widget_set_sensitive(page->dpvisual.edit[i], or);
+ }
+ set_widgets_action(page, stl);
+ gtk_widget_set_sensitive(page->dvbox, TRUE);
+ gtk_widget_set_sensitive(page->del, stl_styleinfo_style_root(page->si) != stl);
+
+ gui_handler_group_unblock(page->handlers);
+}
+
+/* 1999-05-25 - Reset action editing widgets. */
+static void reset_widgets_action(P_Styles *page)
+{
+ gtk_widget_set_sensitive(page->dpaction.editcmd, FALSE);
+ gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(page->dpaction.adel))), _("Delete Action"));
+ gtk_widget_set_sensitive(page->dpaction.adel, FALSE);
+}
+
+/* 1999-05-24 - Reset widgets. Handy when there is no longer a selection. */
+static void reset_widgets(P_Styles *page)
+{
+ page->curr_prop = NULL;
+ page->curr_arow = -1;
+ gtk_entry_set_text(GTK_ENTRY(page->dname), "");
+ gtk_entry_set_text(GTK_ENTRY(page->dparent), "");
+ reset_widgets_action(page);
+ gtk_widget_set_sensitive(page->dvbox, FALSE);
+ gtk_widget_set_sensitive(page->del, FALSE);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static Style * style_get_selected(const P_Styles *page, GtkTreeIter *iter)
+{
+ GtkTreeIter myiter;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->tree)), NULL, &myiter))
+ {
+ if(iter != NULL)
+ *iter = myiter;
+ return stl_styleinfo_get_style_iter(page->si, page->store, &myiter);
+ }
+ return NULL;
+}
+
+/* 2009-03-24 - New-style selection tracking. */
+static void evt_style_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+
+ if((style = style_get_selected(page, NULL)) != NULL)
+ {
+ set_widgets(page, style);
+ reset_widgets_action(page);
+ }
+ else
+ reset_widgets(page);
+}
+
+/* 2009-02-06 - A row was expanded, update the underlying Style object. */
+static void evt_style_row_expanded(GtkTreeView *view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
+{
+ GtkTreeModel *m;
+ Style *stl;
+
+ m = gtk_tree_view_get_model(view);
+ gtk_tree_model_get(m, iter, 1, &stl, -1);
+ stl_style_set_expand(stl, TRUE);
+}
+
+/* 2009-02-06 - A row was collapsed, update the underlying Style object. */
+static void evt_style_row_collapsed(GtkTreeView *view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
+{
+ GtkTreeModel *m;
+ Style *stl;
+
+ m = gtk_tree_view_get_model(view);
+ gtk_tree_model_get(m, iter, 1, &stl, -1);
+ stl_style_set_expand(stl, FALSE);
+}
+
+/* 2009-02-06 - This is a gtk_tree_model_foreach() callback, that simply applies the collapsed/
+** expanded status to a tree row showing a style. This is a property of the view,
+** so it cannot be done from inside the styles module.
+*/
+static gboolean set_expand(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user)
+{
+ Style *stl;
+
+ gtk_tree_model_get(model, iter, 1, &stl, -1);
+ if(stl_style_get_expand(stl))
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(user), path, FALSE);
+ else
+ gtk_tree_view_collapse_row(GTK_TREE_VIEW(user), path);
+ return FALSE;
+}
+
+/* 1999-05-24 - Repopulate the tree. */
+static void populate_tree(P_Styles *page)
+{
+ if(page->si != NULL)
+ {
+ page->store = stl_styleinfo_build_partial(page->si, NULL);
+ /* Block expand/collapse signals. */
+ g_signal_handler_block(page->tree, page->sig_collapse);
+ g_signal_handler_block(page->tree, page->sig_expand);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(page->tree), GTK_TREE_MODEL(page->store));
+ gtk_tree_model_foreach(GTK_TREE_MODEL(page->store), set_expand, page->tree);
+ g_signal_handler_unblock(page->tree, page->sig_expand);
+ g_signal_handler_unblock(page->tree, page->sig_collapse);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-24 - Set a new name for the current style. */
+static void evt_style_name_changed(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ const gchar *name;
+ Style *style;
+ GtkTreeIter iter;
+
+ if((style = style_get_selected(page, &iter)) != NULL)
+ {
+ if((name = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ {
+ ctp_replace_style(stl_style_get_name(style), style);
+ stl_styleinfo_set_name_iter(page->si, page->store, &iter, name);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 1999-05-24 - User clicked the details (magnifying glass) button to set new parent for current style. */
+static void evt_style_parent_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ Style *np;
+
+ if((style = style_get_selected(page, NULL)) != NULL)
+ {
+ if((np = sdl_dialog_sync_new_wait(page->si, style)) != NULL)
+ {
+ stl_styleinfo_style_set_parent(page->si, style, np);
+ populate_tree(page);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-24 - User toggled one of the visual property override checkbuttons. Update
+** the current style accordingly.
+*/
+static void evt_vprop_override_toggled(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ const gchar *pname;
+ gboolean or;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ pname = g_object_get_data(G_OBJECT(wid), "user");
+ or = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ if(or)
+ {
+ if(strcmp(pname, SPN_ICON_UNSEL) == 0)
+ stl_style_property_set_icon(style, pname, stl_style_property_get_icon(style, pname));
+ else /* If not an icon, it's a color. */
+ {
+ const GdkColor *def;
+
+ /* FIXME: This assumes only background can be non-overridden in root. */
+ if((def = stl_style_property_get_color(style, pname)) != NULL)
+ stl_style_property_set_color(style, pname, def);
+ }
+ }
+ else
+ stl_style_property_remove(style, pname);
+ set_widgets(page, style);
+ page->modified = TRUE;
+}
+
+/* 1999-05-24 - A color property has changed. Update previews and stuff. */
+static void evt_vprop_color_changed(const GdkRGBA *color, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ GdkColor color_old;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ gui_color_from_rgba(&color_old, color);
+ stl_style_property_set_color(style, page->curr_prop, &color_old);
+ set_widgets(page, style);
+}
+
+/* 1999-05-24 - User hit the "Edit..." (or, for the icon, "Pick...") button below override toggle. */
+static void evt_vprop_edit_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ page->curr_prop = g_object_get_data(G_OBJECT(wid), "user");
+
+ if(strcmp(page->curr_prop, SPN_ICON_UNSEL) == 0)
+ {
+ const gchar *icon;
+
+ if((icon = idl_dialog_sync_new_wait(page->min, cpt_get_path(PTID_ICON), NULL,
+ stl_style_property_get_icon(style, page->curr_prop),
+ TRUE)) != NULL)
+ {
+ stl_style_property_set_icon(style, page->curr_prop, icon);
+ page->modified = TRUE;
+ set_widgets(page, style);
+ }
+ }
+ else
+ {
+ const GdkColor *col;
+ GdkColor col_old;
+ GdkRGBA initial, *ip = NULL;
+
+ if((col = stl_style_property_get_color(style, page->curr_prop)) != NULL)
+ {
+ col_old = *col;
+ gui_rgba_from_color(&initial, col);
+ ip = &initial;
+ }
+ if(cdl_dialog_sync_new_wait(_("Edit Color"), evt_vprop_color_changed, ip, page) != DLG_POSITIVE)
+ {
+ if(col != NULL)
+ stl_style_property_set_color(style, page->curr_prop, &col_old);
+ }
+ else
+ page->modified = TRUE;
+ set_widgets(page, style);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2014-12-25 - Set sensitivity of the shortcut button for command-editing. User-defined commands only. */
+static void set_aprop_editcmd_button(const P_Styles *page, Style *style)
+{
+ const gchar *action = stl_style_property_get_action(style, page->curr_prop);
+
+ if(action != NULL && *action != '\0' && g_hash_table_contains(ccs_get_current(), action))
+ {
+ gtk_widget_set_sensitive(page->dpaction.editcmd, islower((unsigned char) action[0]));
+ }
+}
+
+/* 2009-04-22 - Set the proper label for the Delete Action button. Depends on override. */
+static gboolean set_aprop_delete_button(P_Styles *page, Style *style)
+{
+ gboolean unique, ovr;
+
+ unique = stl_style_property_is_unique(style, page->curr_prop);
+ gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(page->dpaction.adel))),
+ unique ? _("Delete Action") : _("Revert to Inherited Command"));
+ ovr = stl_style_property_get_override(style, page->curr_prop);
+ gtk_widget_set_sensitive(page->dpaction.adel, ovr);
+
+ return ovr;
+}
+
+/* 2009-04-22 - Update widgets when action property selection changes. */
+static void evt_aprop_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ GtkTreeIter myiter;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ {
+ gtk_widget_set_sensitive(page->dpaction.editcmd, FALSE);
+ return;
+ }
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dpaction.view)), NULL, &myiter))
+ {
+ gboolean ovr;
+ GtkTreeViewColumn *col;
+ GList *cellrenderers;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(page->dpaction.store), &myiter, ACTION_COLUMN_ACTION, &page->curr_prop, -1);
+ set_aprop_editcmd_button(page, style);
+ ovr = set_aprop_delete_button(page, style);
+ /* Set the name column's editable mode, depending on override. */
+ col = gtk_tree_view_get_column(GTK_TREE_VIEW(page->dpaction.view), 0);
+ cellrenderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(col));
+ if(cellrenderers != NULL)
+ {
+ g_object_set(G_OBJECT(cellrenderers->data), "editable", ovr, NULL);
+ g_list_free(cellrenderers);
+ }
+ /* Make name column bold/normal depending on override. */
+ gtk_list_store_set(page->dpaction.store, &myiter, ACTION_COLUMN_WEIGHT, ovr ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, -1);
+ }
+}
+
+/* 2009-04-22 - An action property name was edited. If the name changed, to the rename by calling the Styles module. */
+static void evt_aprop_name_edited(GtkCellRendererText *cr, gchar *spath, gchar *new_name, gpointer user)
+{
+ P_Styles *page = user;
+ Style *stl;
+ GtkTreePath *path;
+ gchar *name;
+
+ if((stl = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ if((path = gtk_tree_path_new_from_string(spath)) != NULL)
+ {
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(page->dpaction.store), &iter, path))
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(page->dpaction.store), &iter,
+ ACTION_COLUMN_NAME, &name,
+ -1);
+ /* Only do the change if the new_name really is new. */
+ if(strcmp(name, new_name) != 0)
+ {
+ if(stl_style_property_rename(stl, name, new_name))
+ set_widgets_action(page, stl);
+ }
+ g_free(name);
+ }
+ gtk_tree_path_free(path);
+ }
+}
+
+/* 2009-04-22 - User wants to select a command from a dialog, for the current action property's action. */
+static void evt_aprop_cmdseq_pick_activated(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ const gchar *cmd;
+
+ if((cmd = csq_dialog_sync_new_wait(page->min, ccs_get_current())) != NULL)
+ {
+ Style *style;
+ GtkTreeIter myiter;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->dpaction.view)), NULL, &myiter))
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(page->dpaction.store), &myiter, ACTION_COLUMN_ACTION, &page->curr_prop, -1);
+ stl_style_property_set_action(style, page->curr_prop, cmd);
+ gtk_list_store_set(page->dpaction.store, &myiter, ACTION_COLUMN_CMDSEQ, cmd, -1);
+ page->modified = TRUE;
+ }
+ }
+}
+
+/* 2009-04-22 - Populate the action name editing entry's popup menu. This gives us a chance to add a menuitem that
+** brings up the good old "Select Command" dialog. This used to be done by a magnifying-glass button
+** to the right of the entry, but now the entry is *in* the GtkTreeView.
+*/
+static void evt_aprop_cmdseq_populate_popup(GtkEntry *entry, GtkMenu *menu, gpointer user)
+{
+ GtkWidget *wid;
+
+ wid = gtk_menu_item_new_with_label(_("Select Command ...")); /* FIXME: Add back (deprecated) icon?! */
+ g_signal_connect(G_OBJECT(wid), "activate", G_CALLBACK(evt_aprop_cmdseq_pick_activated), user);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), wid);
+ gtk_widget_show_all(wid);
+}
+
+/* 2009-04-22 - This gets called when an action property name editing is started. This is the time to attach a
+** popup-population handler, which gets called if the user right-clicks the entry.
+*/
+static void evt_aprop_cmdseq_edit_started(GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *spath, gpointer user)
+{
+ /* Magically know that the editable is a GtkEntry, and attach a menu signal handler. */
+ g_signal_connect(G_OBJECT(editable), "populate_popup", G_CALLBACK(evt_aprop_cmdseq_populate_popup), user);
+}
+
+static void evt_aprop_cmdseq_edited(GtkCellRendererText *cr, gchar *spath, gchar *new_cmdseq, gpointer user)
+{
+ P_Styles *page = user;
+ Style *stl;
+ GtkTreePath *path;
+ const gchar *cmdseq;
+
+ if(page->curr_prop == NULL)
+ return;
+ if((stl = style_get_selected(page, NULL)) == NULL)
+ return;
+ if((path = gtk_tree_path_new_from_string(spath)) == NULL)
+ return;
+ /* Only do the change if the new_cmdseq really is new. */
+ cmdseq = stl_style_property_get_action(stl, page->curr_prop);
+ if(strcmp(cmdseq, new_cmdseq) != 0)
+ {
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(page->dpaction.store), &iter, path))
+ {
+ stl_style_property_set_action(stl, page->curr_prop, new_cmdseq);
+ gtk_list_store_set(page->dpaction.store, &iter, ACTION_COLUMN_CMDSEQ, new_cmdseq, -1);
+ gtk_list_store_set(page->dpaction.store, &iter, ACTION_COLUMN_WEIGHT, PANGO_WEIGHT_BOLD, -1);
+ set_aprop_delete_button(page, stl);
+ page->modified = TRUE;
+ }
+ }
+ gtk_tree_path_free(path);
+}
+
+/* 1999-05-25 - Add a new action property. Pops up a dialog asking for the name. */
+static void evt_aprop_add_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ Dialog *dlg;
+ GtkWidget *hbox, *label, *entry;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Name"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ entry = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(entry), STL_PROPERTY_NAME_SIZE - 1);
+ gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+ dlg = dlg_dialog_sync_new(hbox, _("New Action Property"), NULL);
+ gtk_widget_grab_focus(entry);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ const gchar *name;
+
+ if(((name = gtk_entry_get_text(GTK_ENTRY(entry))) != NULL) && *name != '\0')
+ {
+ stl_style_property_set_action(style, name, _("something"));
+ set_widgets_action(page, style);
+ reset_widgets_action(page);
+ page->modified = TRUE;
+ }
+ }
+ dlg_dialog_sync_destroy(dlg);
+}
+
+/* 2014-12-26 - Go to the command editor for the currently chosen command. Convenient? */
+static void evt_editcmd_clicked(GtkWidget *wid, gpointer user)
+{
+ const P_Styles *page = user;
+ const Style *style;
+ const gchar *cmdseq;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+ cmdseq = stl_style_property_get_action(style, page->curr_prop);
+ if(ccs_goto_cmdseq(cmdseq))
+ {
+ cfg_goto_page("Definitions"); /* This won't win any prices for low coupling. */
+ }
+}
+
+/* 1999-05-25 - User clicked the "Delete" (or "Revert...") button. Do it. */
+static void evt_aprop_delete_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ if((page->curr_prop != NULL))
+ {
+ stl_style_property_remove(style, page->curr_prop);
+ set_widgets_action(page, style);
+ reset_widgets_action(page);
+ page->modified = TRUE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-26 - Add a new style. Use the currently selected style, if one exists, as parent.
+** If there is no selection, add style with Root as parent.
+*/
+static void evt_style_add_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+
+ if(page != NULL)
+ {
+ Style *stl, *parent;
+ GtkTreeIter iter;
+
+ stl = stl_style_new_unique_name(page->si);
+ /* Parent is either current selection, or root. */
+ if((parent = style_get_selected(page, &iter)) == NULL)
+ parent = stl_styleinfo_style_root(page->si);
+ stl_styleinfo_style_add(page->si, parent, stl);
+ stl_style_set_expand(parent, TRUE);
+ populate_tree(page);
+ if(stl_styleinfo_tree_find_style(page->si, page->store, stl, &iter))
+ {
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->tree)), &iter);
+ gtk_editable_select_region(GTK_EDITABLE(page->dname), 0, -1);
+ gtk_widget_grab_focus(page->dname);
+ }
+ }
+}
+
+/* 1999-05-27 - Delete the currently selected style. If the style has children, the user must
+** confirm the operation, since all children will be deleted, too.
+*/
+static void evt_style_del_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Styles *page = user;
+ Style *style;
+ gint ok = DLG_POSITIVE;
+
+ if((style = style_get_selected(page, NULL)) == NULL)
+ return;
+
+ if(stl_styleinfo_style_has_children(page->si, style))
+ ok = dlg_dialog_sync_new_simple_wait(_("Deleting this style will also delete\n"
+ "all its children. Are you sure?"), _("Confirm Delete"), _("_Delete|_Cancel"));
+ if(ok == DLG_POSITIVE)
+ {
+ GList *chlist, *iter;
+ Style *stl;
+
+ stl = stl_styleinfo_style_root(page->si);
+ chlist = stl_styleinfo_style_get_children(page->si, style, TRUE);
+ for(iter = chlist; iter != NULL; iter = g_list_next(iter))
+ ctp_replace_style(stl_style_get_name(iter->data), stl);
+ g_list_free(chlist);
+ stl_styleinfo_style_remove(page->si, style);
+ populate_tree(page);
+ reset_widgets(page);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-22 - Build the visual property editing widgets. */
+static void build_pvisual(P_Styles *page)
+{
+ PVisual *pv = &page->dpvisual;
+ const gchar *vplab[] = { N_("Background Color"), N_("Foreground Color"), N_("Icon") },
+ *vpname[] = { SPN_COL_UNSEL_BG, SPN_COL_UNSEL_FG, SPN_ICON_UNSEL };
+ gchar ptxt[] = N_("(Row Style Preview Text)");
+ GtkListStore *store;
+ GtkTreeIter iter;
+ GtkWidget *hbox, *frame, *vbox, *label;
+ guint i;
+
+ pv->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Preview"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ store = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
+ gtk_list_store_insert_with_values(store, &iter, -1, COLUMN_NAME, _(ptxt), -1);
+ pv->preview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ pv->pre_icon_r = gtk_cell_renderer_pixbuf_new();
+ pv->pre_icon = gtk_tree_view_column_new_with_attributes("(title)", pv->pre_icon_r, "pixbuf", COLUMN_ICON, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(pv->preview), pv->pre_icon);
+ pv->pre_name_r = gtk_cell_renderer_text_new();
+ pv->pre_name = gtk_tree_view_column_new_with_attributes("(title)", pv->pre_name_r, "text", COLUMN_NAME, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(pv->preview), pv->pre_name);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pv->preview), FALSE);
+ gtk_widget_set_name(pv->preview, "cstPreview");
+ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(pv->preview)), GTK_SELECTION_SINGLE); /* Or none, like before? */
+ gtk_box_pack_start(GTK_BOX(hbox), pv->preview, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(pv->vbox), hbox, FALSE, FALSE, 2);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < 3; i++)
+ {
+ frame = gtk_frame_new(_(vplab[i]));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+ pv->override[i] = gtk_check_button_new_with_label(_("Override Parent's?"));
+ g_object_set_data(G_OBJECT(pv->override[i]), "user", (gpointer) vpname[i]);
+ g_signal_connect(G_OBJECT(pv->override[i]), "toggled", G_CALLBACK(evt_vprop_override_toggled), page);
+ gtk_box_pack_start(GTK_BOX(vbox), pv->override[i], FALSE, FALSE, 0);
+ pv->edit[i] = gtk_button_new_with_label(i < 2 ? _("Edit...") : _("Pick..."));
+ g_object_set_data(G_OBJECT(pv->edit[i]), "user", (gpointer) vpname[i]);
+ g_signal_connect(G_OBJECT(pv->edit[i]), "clicked", G_CALLBACK(evt_vprop_edit_clicked), page);
+ gtk_box_pack_start(GTK_BOX(vbox), pv->edit[i], FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 5);
+ }
+ gtk_box_pack_start(GTK_BOX(pv->vbox), hbox, FALSE, FALSE, 0);
+}
+
+/* 1999-05-22 - Build action property editing widgetry. */
+static void build_paction(P_Styles *page)
+{
+ PAction *pa = &page->dpaction;
+ GtkWidget *hbox, *btn, *scwin;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ pa->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ pa->store = gtk_list_store_new(ACTION_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT);
+ pa->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pa->store));
+ cr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cr), "editable", TRUE, NULL);
+ g_signal_connect(G_OBJECT(cr), "edited", G_CALLBACK(evt_aprop_name_edited), page);
+ vc = gtk_tree_view_column_new_with_attributes("(Name)", cr, "text", ACTION_COLUMN_NAME, "weight", ACTION_COLUMN_WEIGHT, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(pa->view), vc);
+ cr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cr), "editable", TRUE, NULL);
+ g_signal_connect(G_OBJECT(cr), "editing_started", G_CALLBACK(evt_aprop_cmdseq_edit_started), page);
+ g_signal_connect(G_OBJECT(cr), "edited", G_CALLBACK(evt_aprop_cmdseq_edited), page);
+ vc = gtk_tree_view_column_new_with_attributes("(CmdSeq)", cr, "text", ACTION_COLUMN_CMDSEQ, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(pa->view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pa->view), FALSE);
+ g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(pa->view))), "changed", G_CALLBACK(evt_aprop_selection_changed), page);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_size_request(scwin, -1, 100);
+ gtk_container_add(GTK_CONTAINER(scwin), pa->view);
+ gtk_box_pack_start(GTK_BOX(pa->vbox), scwin, TRUE, TRUE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
+ btn = gtk_button_new_with_label(_("Add Action..."));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_aprop_add_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), btn, TRUE, TRUE, 5);
+ pa->editcmd = gtk_button_new_with_label(_("Edit Command"));
+ g_signal_connect(G_OBJECT(pa->editcmd), "clicked", G_CALLBACK(evt_editcmd_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pa->editcmd, TRUE, TRUE, 5);
+ pa->adel = gtk_button_new_with_label(_("Delete Action"));
+ g_signal_connect(G_OBJECT(pa->adel), "clicked", G_CALLBACK(evt_aprop_delete_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), pa->adel, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(pa->vbox), hbox, FALSE, FALSE, 5);
+}
+
+/* 1999-05-22 - Build style configuration GUI page. */
+static GtkWidget * cst_init(MainInfo *min, gchar **name)
+{
+ P_Styles *page = &the_page;
+ GtkWidget *grid, *label, *frame, *hbox, *btn;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ page->min = min;
+ page->si = NULL;
+ page->modified = FALSE;
+ page->store = NULL;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->handlers = gui_handler_group_new();
+
+ page->scwin = gtk_scrolled_window_new(FALSE, FALSE);
+ page->tree = gtk_tree_view_new();
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(Styles)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->tree), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->tree), FALSE);
+ g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->tree))), "changed", G_CALLBACK(evt_style_selection_changed), page);
+ page->sig_expand = g_signal_connect(G_OBJECT(page->tree), "row_expanded", G_CALLBACK(evt_style_row_expanded), page);
+ page->sig_collapse = g_signal_connect(G_OBJECT(page->tree), "row_collapsed", G_CALLBACK(evt_style_row_collapsed), page);
+ gtk_container_add(GTK_CONTAINER(page->scwin), page->tree);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(page->scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->scwin, TRUE, TRUE, 0);
+
+ page->dvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("Name"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ page->dname = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(page->dname), STL_STYLE_NAME_SIZE - 1);
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->dname), "changed", G_CALLBACK(evt_style_name_changed), page);
+ gtk_grid_attach(GTK_GRID(grid), page->dname, 1, 0, 2, 1);
+ label = gtk_label_new(_("Parent"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ page->dparent = gtk_entry_new();
+ gtk_widget_set_hexpand(page->dparent, TRUE);
+ gtk_widget_set_halign(page->dparent, GTK_ALIGN_FILL);
+ gtk_entry_set_max_length(GTK_ENTRY(page->dparent), STL_STYLE_NAME_SIZE - 1);
+ gtk_editable_set_editable(GTK_EDITABLE(page->dparent), FALSE);
+ gtk_grid_attach(GTK_GRID(grid), page->dparent, 1, 1, 1, 1);
+ page->dreparent = gui_details_button_new();
+ g_signal_connect(G_OBJECT(page->dreparent), "clicked", G_CALLBACK(evt_style_parent_clicked), page);
+ gtk_grid_attach(GTK_GRID(grid), page->dreparent, 2, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(page->dvbox), grid, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new(_("Inherited Properties"));
+ page->dpnbook = gtk_notebook_new();
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(page->dpnbook), GTK_POS_LEFT);
+ build_pvisual(page);
+ gtk_notebook_append_page(GTK_NOTEBOOK(page->dpnbook), page->dpvisual.vbox, gtk_label_new(_("Visual")));
+ build_paction(page);
+ gtk_notebook_append_page(GTK_NOTEBOOK(page->dpnbook), page->dpaction.vbox, gtk_label_new(_("Actions")));
+ gtk_container_add(GTK_CONTAINER(frame), page->dpnbook);
+
+ gtk_box_pack_start(GTK_BOX(page->dvbox), frame, FALSE, FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->dvbox, FALSE, FALSE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ btn = gtk_button_new_with_label(_("Add"));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_style_add_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), btn, TRUE, TRUE, 5);
+ page->del = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(page->del), "clicked", G_CALLBACK(evt_style_del_clicked), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->del, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(page->vbox), hbox, FALSE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+
+ cfg_tree_level_begin(_("File Recognition"));
+ cfg_tree_level_append(_("Styles"), page->vbox);
+
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-12 - Update style display. */
+static void cst_update(MainInfo *min)
+{
+ P_Styles *page = &the_page;
+
+ page->si = stl_styleinfo_copy(min->cfg.style);
+ populate_tree(page);
+ reset_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Accept changes, if any. Causes a call to the relink function in types config.
+** 1999-06-13 - Fixed a rather sneaky problem: if the style for a _type_ changed, it would point
+** into the editing copies here. If the editing copies went away because of the
+** 'modified' flag being FALSE, those types were left with dangling style pointers.
+** The fix was simple.
+*/
+static void cst_accept(MainInfo *min)
+{
+ P_Styles *page = &the_page;
+
+ if(page->modified)
+ {
+ ctp_relink_styles(min->cfg.style, page->si);
+ stl_styleinfo_destroy(min->cfg.style);
+ min->cfg.style = page->si;
+ page->si = NULL;
+ page->modified = FALSE;
+ cfg_set_flags(CFLG_RESCAN_LEFT | CFLG_RESCAN_RIGHT);
+ }
+ else /* Make sure the types link to the existing styles. */
+ ctp_relink_styles(page->si, min->cfg.style);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Save the current style configuration. Thanks to the styles module, this
+** is really not complicated. :)
+*/
+static gint cst_save(MainInfo *min, FILE *out)
+{
+ stl_styleinfo_save(min, min->cfg.style, out, NODE);
+
+ return TRUE;
+}
+
+/* 1998-08-24 - Load style configuration info from given XML tree. */
+static void cst_load(MainInfo *min, const XmlNode *node)
+{
+ /* Free the built-in first. */
+ stl_styleinfo_destroy(min->cfg.style);
+ min->cfg.style = stl_styleinfo_load(node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - When the config window closes, free the editing copies since they're bulky. */
+static void cst_hide(MainInfo *min)
+{
+ P_Styles *page = &the_page;
+
+ stl_styleinfo_destroy(page->si);
+ page->si = NULL;
+ populate_tree(page); /* This will destroy the tree widget and *not* create a new one, since there's no si. */
+ reset_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cst_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cst_init, cst_update, cst_accept, cst_save, cst_load, cst_hide };
+
+ return &desc;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Get the most current style info, namely the editing version. */
+StyleInfo * cst_get_styleinfo(void)
+{
+ return the_page.si;
+}
diff --git a/src/cfg_styles.h b/src/cfg_styles.h
new file mode 100644
index 0000000..424799f
--- /dev/null
+++ b/src/cfg_styles.h
@@ -0,0 +1,8 @@
+/*
+** 1998-08-14 - Another one of those never-ending one-liner header files. The price you get
+** to pay for putting everything in a module of its own, I guess...
+*/
+
+extern const CfgModule * cst_describe(MainInfo *min);
+extern StyleInfo * cst_get_styleinfo(void);
+
diff --git a/src/cfg_types.c b/src/cfg_types.c
new file mode 100644
index 0000000..a18659c
--- /dev/null
+++ b/src/cfg_types.c
@@ -0,0 +1,1026 @@
+/*
+** 1998-08-12 - The file typing systems seems to work OK; better give it a GUI too.
+** 1999-05-27 - Changed linkage between this module and cfg_styles. Somewhat cleaner now.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "types.h"
+#include "styles.h"
+#include "style_dialog.h"
+#include "strutil.h"
+#include "guiutil.h"
+#include "xmlutil.h"
+#include "dirpane.h"
+#include "iconutil.h"
+
+#include "configure.h"
+#include "cfg_module.h"
+#include "cfg_styles.h"
+
+#include "cfg_types.h"
+
+#define NODE "FileTypes"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Just a little helper structure for the identification. */
+ GtkWidget *check;
+ GtkWidget *entry;
+ GtkWidget *glob; /* For the name and file RE, this gives glob->RE translation. */
+ GtkWidget *nocase; /* Do case-insensitive RE matching? */
+} CEntry;
+
+typedef struct {
+ GtkWidget *vbox; /* The usual mandatory root vbox. */
+ GuiHandlerGroup *handlers; /* Collects editing widgets, for signal blocking. */
+ GtkListStore *store; /* Tree model holding existing types. */
+ GtkWidget *view; /* Tree view. */
+
+ GtkWidget *ngrid; /* Grid holding the type name widgetry. */
+ GtkWidget *name; /* Entry widget for type name. */
+
+ GtkWidget *iframe; /* Identification frame. */
+ GtkWidget *igrid; /* This holds all the identification widgets. */
+ GtkWidget *ithbox; /* Hbox for the 'type' id row. */
+ GtkWidget *itype[7]; /* Radio buttons for the type selection. Boring. */
+ GSList *itlist; /* Radio button grouping list. */
+ mode_t *itmode; /* The actual mode values (e.g. S_IFREG etc) for types. */
+ GtkWidget *irperm; /* Require permissions match? */
+ GtkWidget *iphbox; /* Hbox for all the toggle buttons. */
+ GtkWidget *iperm[6]; /* Toggle buttons for permissions (set uid, gid, sticky, read, write, execute). */
+ CEntry ident[3]; /* The suffix, name and 'file' id widgets. */
+
+ GtkWidget *sframe; /* Style frame. */
+ GtkWidget *shbox; /* Just something to hold the style stuff. */
+ GtkWidget *sbtn; /* Button to change style (also displays current). */
+ GtkWidget *sbhbox; /* Hbox containing _button_ contents. */
+ GtkWidget *sicon; /* A pixmap displayed inside the "sbtn" button. */
+ GtkWidget *slabel; /* A "loose" label displayed inside the "sbtn" button. */
+
+ GtkWidget *bhbox; /* A box for the "Add", "Up", "Down" & "Delete" buttons. */
+ GtkWidget *add, *up, /* And here are the buttons themselves. */
+ *down, *del;
+
+ MainInfo *min;
+ GList *type; /* List of editing types. */
+ FType *curr_type; /* Currently selected type. */
+ gboolean modified; /* Did user change anything? */
+} P_Types;
+
+enum {
+ COLUMN_NAME,
+ COLUMN_TYPE,
+ COLUMN_COUNT
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static P_Types the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-15 - Helper routine, aiming to remove the 'curr_type' field in the page since it
+** feels a bit smelly. This just queries the tree view for the selected row,
+** and extracts the type column which is returned. The iter to the selection is
+** returned too, if non-NULL. If no selection exists, NULL is returned.
+*/
+static FType * get_current_type(P_Types *page, GtkTreeIter *iter)
+{
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), NULL, iter))
+ {
+ FType *type = NULL;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(page->store), iter, COLUMN_TYPE, &type, -1);
+ return type;
+ }
+ return NULL;
+}
+
+static void set_movement_widgets(P_Types *page, GtkTreeIter *iter)
+{
+ gchar *istr;
+
+ /* Set Up/Down arrow states depending on index of current selection.
+ ** Ask GTK+ for the numeric "address" of the current selection, then figure it out.
+ */
+ if((istr = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(page->store), iter)) != NULL)
+ {
+ gint n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(page->store), NULL), m;
+
+ m = strtol(istr, NULL, 10);
+ gtk_widget_set_sensitive(page->up, m > 0 && m < n - 1);
+ gtk_widget_set_sensitive(page->down, m < n - 2);
+ g_free(istr);
+ }
+}
+
+/* 1998-08-13 - Set the widgets so they reflect the settings for the given file type. */
+static void set_widgets(P_Types *page, FType *tpe, GtkTreeIter *iter)
+{
+ gchar *itext[3];
+ gint iflags[] = { FTFL_REQSUFFIX, FTFL_NAMEMATCH, FTFL_FILEMATCH },
+ pflags[] = { FTPM_SETUID, FTPM_SETGID, FTPM_STICKY, FTPM_READ, FTPM_WRITE, FTPM_EXECUTE },
+ igflags[] = { 0, FTFL_NAMEGLOB, FTFL_FILEGLOB },
+ incflags[] = { 0, FTFL_NAMENOCASE, FTFL_FILENOCASE }, i;
+
+ if(tpe == NULL)
+ return;
+
+ /* Block all signal handlers, to ignore the changed-events. */
+ gui_handler_group_block(page->handlers);
+
+ itext[0] = tpe->suffix;
+ itext[1] = tpe->name_re_src;
+ itext[2] = tpe->file_re_src;
+
+ gtk_entry_set_text(GTK_ENTRY(page->name), tpe->name);
+ gtk_widget_set_sensitive(page->ngrid, TRUE);
+
+ for(i = 0; i < 7; i++)
+ {
+ if(page->itmode[GPOINTER_TO_INT(g_object_get_data(G_OBJECT(page->itype[i]), "user"))] == tpe->mode)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->itype[i]), TRUE);
+ break;
+ }
+ }
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->irperm), tpe->flags & FTFL_REQPERM);
+ for(i = 0; i < 6; i++)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->iperm[i]), tpe->perm & pflags[i]);
+ gtk_widget_set_sensitive(page->iphbox, tpe->flags & FTFL_REQPERM);
+
+ for(i = 0; i < 3; i++)
+ {
+ gtk_entry_set_text(GTK_ENTRY(page->ident[i].entry), itext[i]);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].check), tpe->flags & iflags[i]);
+ gtk_widget_set_sensitive(page->ident[i].entry, tpe->flags & iflags[i]);
+ if(i >= 1)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].glob), tpe->flags & igflags[i]);
+ gtk_widget_set_sensitive(page->ident[i].glob, tpe->flags & iflags[i]);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].nocase), tpe->flags & incflags[i]);
+ gtk_widget_set_sensitive(page->ident[i].nocase, tpe->flags & iflags[i]);
+ }
+ }
+ gtk_widget_set_sensitive(page->iframe, tpe->mode != 0);
+
+ if(tpe->style != NULL)
+ {
+ GdkPixbuf *pbuf;
+ gchar buf[128];
+ const gchar *iname;
+
+ if((iname = stl_style_property_get_icon(tpe->style, SPN_ICON_UNSEL)) != NULL)
+ {
+ if((pbuf = ico_icon_get_pixbuf(page->min, iname)) != NULL)
+ {
+ if(page->sicon == NULL)
+ {
+ page->sicon = gtk_image_new_from_pixbuf(pbuf);
+ gtk_box_pack_start(GTK_BOX(page->sbhbox), page->sicon, FALSE, FALSE, 10);
+ gtk_box_reorder_child(GTK_BOX(page->sbhbox), page->sicon, 0);
+ gtk_widget_show(page->sicon);
+ }
+ else
+ gtk_image_set_from_pixbuf(GTK_IMAGE(page->sicon), pbuf);
+ }
+ }
+ g_snprintf(buf, sizeof buf, _("%s - Click to Change..."), stl_style_get_name(tpe->style));
+ gtk_label_set_text(GTK_LABEL(page->slabel), buf);
+ }
+ gtk_widget_set_sensitive(page->sframe, TRUE);
+ gtk_widget_set_sensitive(page->del, tpe->mode != 0);
+ set_movement_widgets(page, iter);
+ gui_handler_group_unblock(page->handlers);
+}
+
+/* 1998-08-13 - Reset the state of all the type-editing widgets. */
+static void reset_widgets(P_Types *page)
+{
+ gint i;
+
+ page->curr_type = NULL;
+ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)));
+ gtk_entry_set_text(GTK_ENTRY(page->name), "");
+ gtk_widget_set_sensitive(page->ngrid, FALSE);
+
+ gtk_widget_set_sensitive(page->iphbox, FALSE);
+ for(i = 0; i < 6; i++)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->iperm[i]), FALSE);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->itype[0]), TRUE);
+ for(i = 0; i < 3; i++)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].check), FALSE);
+ gtk_entry_set_text(GTK_ENTRY(page->ident[i].entry), "");
+ if(i >= 1)
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].glob), FALSE);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->ident[i].nocase), FALSE);
+ }
+ }
+ gtk_widget_set_sensitive(page->iframe, FALSE);
+
+ if(page->sicon != NULL)
+ {
+ gtk_widget_destroy(page->sicon);
+ page->sicon = NULL;
+ }
+ gtk_label_set_text(GTK_LABEL(page->slabel), _("(None)"));
+ gtk_widget_set_sensitive(page->sframe, FALSE);
+
+ gtk_widget_set_sensitive(page->up, FALSE);
+ gtk_widget_set_sensitive(page->down, FALSE);
+ gtk_widget_set_sensitive(page->del, FALSE);
+}
+
+/* 1998-12-13 - Broke out the actual list updating code, since it's now needed more. */
+static void update_list(P_Types *page)
+{
+ const GList *iter;
+
+ gtk_list_store_clear(page->store);
+ for(iter = page->type; iter != NULL; iter = g_list_next(iter))
+ {
+ GtkTreeIter ti;
+ gtk_list_store_insert_with_values(page->store, &ti, -1, COLUMN_NAME, ((FType *) iter->data)->name, COLUMN_TYPE, iter->data, -1);
+ }
+}
+
+/* 2009-03-15 - Old code refactored a bit. Just copy an FType and insert in page's editing list. */
+static void copy_type(gpointer data, gpointer user)
+{
+ P_Types *page = user;
+ FType *tpe = data, *nt;
+
+ if(tpe == NULL)
+ return;
+
+ if((nt = typ_type_copy(tpe)) != NULL)
+ page->type = typ_type_insert(page->type, NULL, nt);
+}
+
+/* 1998-08-13 - Copy the current type definitions and display the copies in the main list. */
+static void populate_list(MainInfo *min, P_Types *page)
+{
+ reset_widgets(page);
+
+ g_list_foreach(min->cfg.type, copy_type, page);
+ update_list(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-15 - Selection changed in main type list, so update editing widgetry. */
+static void evt_selection_changed(GtkTreeSelection *ts, gpointer user)
+{
+ P_Types *page = user;
+ GtkTreeIter iter;
+ FType *type = NULL;
+
+ if((type = get_current_type(page, &iter)) != NULL)
+ {
+ set_widgets(page, type, &iter);
+ page->curr_type = type;
+ }
+ else
+ reset_widgets(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-13 - User is editing the name. Copy it as soon as it changes. Note that there is
+** no unique-ness requirement for type names. That simplifies things.
+*/
+static gint evt_name_changed(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ const gchar *text;
+ GtkTreeIter iter;
+ FType *type = NULL;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), NULL, &iter))
+ gtk_tree_model_get(GTK_TREE_MODEL(page->store), &iter, COLUMN_TYPE, &type, -1);
+ if(type != NULL)
+ {
+ text = gtk_entry_get_text(GTK_ENTRY(wid));
+ page->type = typ_type_set_name(page->type, type, text);
+ gtk_list_store_set(page->store, &iter, COLUMN_NAME, text, -1);
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* 1998-08-13 - This is the callback for (all seven) mode check buttons. */
+static gint evt_mode_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+
+ page->curr_type->mode = page->itmode[index];
+
+ return TRUE;
+}
+
+/* 1998-09-07 - User hit the "require permissions" check button. */
+static gint evt_id_reqperm_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint state;
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+ state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+
+ gtk_widget_set_sensitive(page->iphbox, state);
+ if(state)
+ page->curr_type->flags |= FTFL_REQPERM;
+ else
+ page->curr_type->flags &= ~FTFL_REQPERM;
+
+ return TRUE;
+}
+
+/* 1998-09-07 - User clicked one of the permission toggle buttons. Remember. */
+static gint evt_id_perm_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint flag;
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+ flag = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ page->curr_type->perm |= flag;
+ else
+ page->curr_type->perm &= ~flag;
+
+ return TRUE;
+}
+
+/* 1998-08-13 - User clicked on of the check buttons for identification (suffix, name RE, 'file' RE). Act. */
+static gint evt_id_check_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+ gint iflags[] = { FTFL_REQSUFFIX, FTFL_NAMEMATCH, FTFL_FILEMATCH };
+ gint state;
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+
+ state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+
+ gtk_widget_set_sensitive(page->ident[index].entry, state);
+ if(state)
+ {
+ page->curr_type->flags |= iflags[index];
+ gtk_widget_grab_focus(page->ident[index].entry);
+ }
+ else
+ page->curr_type->flags &= ~iflags[index];
+ if(index >= 1)
+ {
+ gtk_widget_set_sensitive(page->ident[index].glob, state);
+ gtk_widget_set_sensitive(page->ident[index].nocase, state);
+ }
+ return TRUE;
+}
+
+static gint evt_id_entry_changed(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ const gchar *text;
+ gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+
+ text = gtk_entry_get_text(GTK_ENTRY(wid));
+
+ /* This is soo crude... I guess the FStyle organization really sucks. :( */
+ switch(index)
+ {
+ case 0:
+ g_strlcpy(page->curr_type->suffix, text, sizeof page->curr_type->suffix);
+ break;
+ case 1:
+ g_strlcpy(page->curr_type->name_re_src, text, sizeof page->curr_type->name_re_src);
+ break;
+ case 2:
+ g_strlcpy(page->curr_type->file_re_src, text, sizeof page->curr_type->file_re_src);
+ break;
+ }
+ return TRUE;
+}
+
+/* 1998-08-30 - User just clicked the glob translation check button. Do the things. */
+static gint evt_id_glob_changed(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+ gint flag[] = { 0, FTFL_NAMEGLOB, FTFL_FILEGLOB };
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ page->curr_type->flags |= flag[index];
+ else
+ page->curr_type->flags &= ~flag[index];
+
+ return TRUE;
+}
+
+/* 1998-09-15 - User just clicked the nocase toggle button. React! */
+static gint evt_id_nocase_changed(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ gint index = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user"));
+ gint flag[] = { 0, FTFL_NAMENOCASE, FTFL_FILENOCASE };
+
+ if(page->curr_type == NULL)
+ return TRUE;
+
+ page->modified = TRUE;
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ page->curr_type->flags |= flag[index];
+ else
+ page->curr_type->flags &= ~flag[index];
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Select style for current type. Rewritten, to work with new style config module. */
+static gint evt_style_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ GtkTreeIter iter;
+ FType *type;
+
+ if((type = get_current_type(page, &iter)) != NULL)
+ {
+ Style *stl;
+
+ if((stl = sdl_dialog_sync_new_wait(cst_get_styleinfo(), NULL)) != NULL)
+ {
+ type->style = stl;
+ set_widgets(page, type, &iter);
+ page->modified = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - User just clicked the 'Add' button. Let's add a new type to play with!
+** 1998-12-14 - Rewritten to work better with the new priority-less type editing system.
+*/
+static gint evt_add_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ CfgInfo *cfg = g_object_get_data(G_OBJECT(wid), "user");
+ FType *tpe, *otpe;
+
+ if((tpe = typ_type_new(cfg, _("(New Type)"), S_IFREG, 0, NULL, NULL, NULL)) != NULL)
+ {
+ GtkTreeIter oiter, iter; /* Current and new. */
+ GtkTreePath *path;
+
+ /* Do some fairly advanced hackery-pokery to avoid having to rebuild the
+ ** entire ListStore. Instead add in the proper place in both Type list and
+ ** the ListStore.
+ */
+ if((otpe = get_current_type(page, &oiter)) != NULL)
+ {
+ /* Current selection exists; add after it. */
+ page->type = typ_type_insert(page->type, otpe, tpe);
+ gtk_list_store_insert_after(page->store, &iter, &oiter);
+ }
+ else
+ {
+ /* No current selection; insert right before the UNKNOWN at the end. */
+ GtkTreeIter unknown;
+ gint len;
+
+ /* Figure out how many types there are. */
+ len = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(page->store), NULL);
+ /* Get an iter to the last one, which is "Unknown". This is (I guess) O(n),
+ ** but that 'n' will be quite short so this is easily quick enough.
+ */
+ gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(page->store), &unknown, NULL, len - 1);
+ page->type = typ_type_insert(page->type, NULL, tpe);
+ gtk_list_store_insert_before(page->store, &iter, &unknown);
+ }
+ /* Set the proper values in the ListStore. */
+ gtk_list_store_set(page->store, &iter, COLUMN_NAME, tpe->name, COLUMN_TYPE, tpe, -1);
+
+ /* Select the new type. */
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), &iter);
+ /* Scroll list to new type. */
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->store), &iter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->view), path, NULL, TRUE, 0.5f, 0.0f);
+ gtk_tree_path_free(path);
+
+ typ_type_set_style(page->type, tpe, cst_get_styleinfo(), NULL);
+ gtk_list_store_set(page->store, &iter, COLUMN_NAME, tpe->name, COLUMN_TYPE, tpe, -1);
+
+ /* Put focus in the Name field, highly likely a rename is in order. */
+ gtk_widget_grab_focus(page->name);
+
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* 1998-08-14 - Delete button was hit, so kill the currently selected type. Tragic.
+** 1998-12-14 - Rewritten. Didn't use the types-module, and lost selection.
+*/
+static gint evt_del_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ GtkTreeIter iter;
+
+ /* Don't rebuild ListStore; surgically remove just the proper row. */
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view)), NULL, &iter))
+ {
+ FType *type;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(page->store), &iter, COLUMN_TYPE, &type, -1);
+ page->type = typ_type_remove(page->type, type);
+ gtk_list_store_remove(page->store, &iter);
+ page->modified = TRUE;
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-16 - Rewritten to be a bit more efficient, while using the new GTK+ 2 tree stuff, too. */
+static gint evt_up_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ GtkTreeIter iter, piter;
+ FType *type;
+
+ if((type = get_current_type(page, &iter)) != NULL)
+ {
+ GtkTreePath *path;
+
+ /* Moving up in the list requires a path, for the prev() stepping. */
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->store), &iter);
+ if(gtk_tree_path_prev(path))
+ {
+ /* Do the move. */
+ page->type = typ_type_move(page->type, page->curr_type, -1);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(page->store), &piter, path);
+ gtk_list_store_move_before(page->store, &iter, &piter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->view), path, NULL, TRUE, 0.5f, 0.0f);
+ page->modified = TRUE;
+ set_movement_widgets(page, &iter);
+ }
+ gtk_tree_path_free(path);
+ }
+ return TRUE;
+}
+
+/* 2009-03-16 - Rewritten to be a bit more efficient, while using the new GTK+ 2 tree stuff, too. */
+static gint evt_down_clicked(GtkWidget *wid, gpointer user)
+{
+ P_Types *page = user;
+ GtkTreeIter iter, niter;
+ FType *type;
+
+ if((type = get_current_type(page, &iter)) != NULL)
+ {
+ GtkTreePath *path;
+
+ /* Scrolling requires a path, so let's do it that way. */
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(page->store), &iter);
+ gtk_tree_path_next(path);
+ /* Then do the move. */
+ page->type = typ_type_move(page->type, page->curr_type, 1);
+ if(gtk_tree_model_get_iter(GTK_TREE_MODEL(page->store), &niter, path))
+ {
+ gtk_list_store_move_after(page->store, &iter, &niter);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(page->view), path, NULL, TRUE, 0.5f, 0.0f);
+ page->modified = TRUE;
+ set_movement_widgets(page, &iter);
+ }
+ gtk_tree_path_free(path);
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static GtkWidget * ctp_init(MainInfo *min, gchar **name)
+{
+ P_Types *page = &the_page;
+ GtkWidget *scwin, *label, *vbox, *sep;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreeSelection *ts;
+ const gchar *tlab[] = { N_("File"), N_("Dir"), N_("Link"), N_("B-Dev"), N_("C-Dev"), N_("FIFO"), N_("Socket") },
+ *iplab[] = { N_("SetUID"), N_("SetGID"), N_("Sticky"), N_("Readable"),
+ N_("Writable"), N_("Executable") },
+ *idlab[] = { N_("Require Suffix"), N_("Match Name (RE)"), N_("Match 'file' (RE)") };
+ gint idmax[] = { FT_SUFFIX_SIZE, FT_NAMERE_SIZE, FT_FILERE_SIZE },
+ ifperm[] = { FTPM_SETUID, FTPM_SETGID, FTPM_STICKY, FTPM_READ, FTPM_WRITE, FTPM_EXECUTE }, i, y;
+ static mode_t type[] = { S_IFREG, S_IFDIR, S_IFLNK, S_IFBLK, S_IFCHR, S_IFIFO, S_IFSOCK };
+
+ page->min = min;
+
+ page->type = NULL;
+ page->curr_type = NULL;
+ page->modified = FALSE;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ page->handlers = gui_handler_group_new();
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ page->store = gtk_list_store_new(COLUMN_COUNT, G_TYPE_STRING, G_TYPE_POINTER);
+ page->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(page->store));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(name)", cr, "text", COLUMN_NAME, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(page->view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(page->view), FALSE);
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->view));
+ g_signal_connect(G_OBJECT(ts), "changed", G_CALLBACK(evt_selection_changed), page);
+ gtk_container_add(GTK_CONTAINER(scwin), page->view);
+ gtk_box_pack_start(GTK_BOX(page->vbox), scwin, TRUE, TRUE, 0);
+
+ page->ngrid = gtk_grid_new();
+ label = gtk_label_new(_("Name"));
+ gtk_grid_attach(GTK_GRID(page->ngrid), label, 0, 0, 1, 1);
+ page->name = gtk_entry_new();
+ gtk_widget_set_hexpand(page->name, TRUE);
+ gtk_widget_set_halign(page->name, GTK_ALIGN_FILL);
+ gtk_entry_set_max_length(GTK_ENTRY(page->name), STL_STYLE_NAME_SIZE - 1);
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->name), "changed", G_CALLBACK(evt_name_changed), page);
+ gtk_grid_attach(GTK_GRID(page->ngrid), page->name, 1, 0, 1, 1);
+
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->ngrid, FALSE, FALSE, 0);
+
+ page->iframe = gtk_frame_new(_("Identification"));
+ page->igrid = gtk_grid_new();
+ label = gtk_label_new(_("Require Type"));
+ gtk_grid_attach(GTK_GRID(page->igrid), label, 0, 0, 1, 1);
+ page->ithbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ page->itlist = gui_radio_group_new(7, tlab, page->itype);
+ page->itmode = type;
+ for(i = 0; i < 7; i++)
+ {
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->itype[i]), "clicked", G_CALLBACK(evt_mode_clicked), page);
+ g_object_set_data(G_OBJECT(page->itype[i]), "user", GINT_TO_POINTER(i));
+ gtk_box_pack_start(GTK_BOX(page->ithbox), page->itype[i], TRUE, TRUE, 0);
+ }
+ gtk_grid_attach(GTK_GRID(page->igrid), page->ithbox, 1, 0, 2, 1);
+
+ page->irperm = gtk_check_button_new_with_label(_("Require Protection"));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->irperm), "clicked", G_CALLBACK(evt_id_reqperm_clicked), page);
+ gtk_grid_attach(GTK_GRID(page->igrid), page->irperm, 0, 1, 1, 1);
+ page->iphbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < 6; i++)
+ {
+ page->iperm[i] = gtk_toggle_button_new_with_label(_(iplab[i]));
+ g_object_set_data(G_OBJECT(page->iperm[i]), "user", GINT_TO_POINTER(ifperm[i]));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->iperm[i]), "clicked", G_CALLBACK(evt_id_perm_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->iphbox), page->iperm[i], TRUE, TRUE, 0);
+ }
+ gtk_widget_set_hexpand(page->iphbox, TRUE);
+ gtk_widget_set_halign(page->iphbox, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(page->igrid), page->iphbox, 1, 1, 2, 1);
+
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_grid_attach(GTK_GRID(page->igrid), sep, 0, 4, 3, 1);
+
+ for(i = 0; i < 3; i++)
+ {
+ y = (i == 2) ? i + 3 : i + 2;
+
+ page->ident[i].check = gtk_check_button_new_with_label(_(idlab[i]));
+ g_object_set_data(G_OBJECT(page->ident[i].check), "user", GINT_TO_POINTER(i));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->ident[i].check), "clicked", G_CALLBACK(evt_id_check_clicked), page);
+ gtk_grid_attach(GTK_GRID(page->igrid), page->ident[i].check, 0, y, 1, 1);
+
+ page->ident[i].entry = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(page->ident[i].entry), idmax[i] - 1);
+ g_object_set_data(G_OBJECT(page->ident[i].entry), "user", GINT_TO_POINTER(i));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->ident[i].entry), "changed", G_CALLBACK(evt_id_entry_changed), page);
+ gtk_grid_attach(GTK_GRID(page->igrid), page->ident[i].entry, 1, y, (i == 0) ? 2 : 1, 1);
+
+ if(i >= 1)
+ {
+ GtkWidget *hbox;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->ident[i].glob = gtk_check_button_new_with_label(_("Glob?"));
+ g_object_set_data(G_OBJECT(page->ident[i].glob), "user", GINT_TO_POINTER(i));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->ident[i].glob), "clicked", G_CALLBACK(evt_id_glob_changed), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->ident[i].glob, FALSE, FALSE, 0);
+
+ page->ident[i].nocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ g_object_set_data(G_OBJECT(page->ident[i].nocase), "user", GINT_TO_POINTER(i));
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->ident[i].nocase), "clicked", G_CALLBACK(evt_id_nocase_changed), page);
+ gtk_box_pack_start(GTK_BOX(hbox), page->ident[i].nocase, FALSE, FALSE, 0);
+
+ gtk_grid_attach(GTK_GRID(page->igrid), hbox, 2, y, 1, 1);
+ }
+ }
+ gtk_container_add(GTK_CONTAINER(page->iframe), page->igrid);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->iframe, FALSE, FALSE, 5);
+
+ page->sframe = gtk_frame_new(_("Type's Style"));
+ page->shbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Style"));
+ gtk_box_pack_start(GTK_BOX(page->shbox), label, FALSE, FALSE, 5);
+ page->sbtn = gtk_button_new();
+ gui_handler_group_connect(page->handlers, G_OBJECT(page->sbtn), "clicked", G_CALLBACK(evt_style_clicked), page);
+
+ page->sbhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->sicon = NULL;
+ page->slabel = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(page->sbhbox), page->slabel, TRUE, TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(page->sbtn), page->sbhbox);
+
+ gtk_box_pack_start(GTK_BOX(page->shbox), page->sbtn, TRUE, TRUE, 5);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), page->shbox, FALSE, FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(page->sframe), vbox);
+
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->sframe, FALSE, FALSE, 5);
+
+ page->bhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ page->add = gtk_button_new_with_label(_("Add"));
+ g_object_set_data(G_OBJECT(page->add), "user", &min->cfg);
+ g_signal_connect(G_OBJECT(page->add), "clicked", G_CALLBACK(evt_add_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->add, TRUE, TRUE, 5);
+
+ page->up = gtk_button_new_from_icon_name("go-up", GTK_ICON_SIZE_MENU);
+ g_signal_connect(G_OBJECT(page->up), "clicked", G_CALLBACK(evt_up_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->up, FALSE, FALSE, 0);
+
+ page->down = gtk_button_new_from_icon_name("go-down", GTK_ICON_SIZE_MENU);
+ g_signal_connect(G_OBJECT(page->down), "clicked", G_CALLBACK(evt_down_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->down, FALSE, FALSE, 0);
+
+ page->del = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(page->del), "clicked", G_CALLBACK(evt_del_clicked), page);
+ gtk_box_pack_start(GTK_BOX(page->bhbox), page->del, TRUE, TRUE, 5);
+
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->bhbox, FALSE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+
+ cfg_tree_level_append(_("Types"), page->vbox);
+ cfg_tree_level_end();
+
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - Redisplay imminent, update looks. Simplistic. */
+static void ctp_update(MainInfo *min)
+{
+ populate_list(min, &the_page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - Accept the changes. Replace the cfg->type list with our the_page.list, and
+** also free the one being replaced.
+*/
+static void ctp_accept(MainInfo *min)
+{
+ P_Types *page = &the_page;
+
+ if(page->modified)
+ {
+ const GList *iter;
+
+ for(iter = min->cfg.type; iter != NULL; iter = g_list_next(iter))
+ typ_type_destroy(iter->data);
+ g_list_free(min->cfg.type);
+ min->cfg.type = page->type;
+ page->type = NULL; /* Make sure list gets rebuilt next time. */
+ page->modified = FALSE;
+ cfg_set_flags(CFLG_RESCAN_LEFT | CFLG_RESCAN_RIGHT);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - Save out a single file type. */
+static void save_type(gpointer data, gpointer user)
+{
+ FType *tpe = data;
+ FILE *out = user;
+
+ if(tpe == NULL)
+ return;
+
+ xml_put_node_open(out, "FileType");
+ xml_put_text(out, "name", tpe->name);
+ xml_put_integer(out, "mode", tpe->mode);
+
+ if(tpe->flags & FTFL_REQPERM)
+ xml_put_integer(out, "perm", tpe->perm);
+ if(tpe->flags & FTFL_REQSUFFIX)
+ xml_put_text(out, "suffix", tpe->suffix);
+ if(tpe->flags & FTFL_NAMEMATCH)
+ {
+ xml_put_text(out, "name_re", tpe->name_re_src);
+ xml_put_boolean(out, "name_glob", tpe->flags & FTFL_NAMEGLOB);
+ xml_put_boolean(out, "name_nocase", tpe->flags & FTFL_NAMENOCASE);
+ }
+ if(tpe->flags & FTFL_FILEMATCH)
+ {
+ xml_put_text(out, "file_re", tpe->file_re_src);
+ xml_put_boolean(out, "file_glob", tpe->flags & FTFL_FILEGLOB);
+ xml_put_boolean(out, "file_nocase", tpe->flags & FTFL_FILENOCASE);
+ }
+ if(tpe->style != NULL)
+ xml_put_text(out, "style", stl_style_get_name(tpe->style));
+ else
+ fprintf(stderr, "**CFGTYPES: Type '%s' has NULL style!\n", tpe->name);
+ xml_put_node_close(out, "FileType");
+}
+
+/* 1998-08-14 - Save out all the filetype information. */
+static gint ctp_save(MainInfo *min, FILE *out)
+{
+ xml_put_node_open(out, NODE);
+ g_list_foreach(min->cfg.type, save_type, out);
+ xml_put_node_close(out, NODE);
+
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - Load a single type and put it into the list.
+** 1999-03-07 - Fixed huge bug, where a pointer to mode_t was cast to int *.
+** Not good, since mode_t is just 16 bit...
+*/
+static void load_type(const XmlNode *node, gpointer user)
+{
+ CfgInfo *cfg = user;
+ const gchar *name = NULL, *suffix = NULL, *name_re = NULL, *file_re = NULL, *style = NULL;
+ gint perm = 0, tmp, mode;
+ FType *tpe;
+
+ xml_get_text(node, "name", &name);
+ xml_get_integer(node, "mode", &mode);
+ xml_get_integer(node, "perm", &perm);
+ xml_get_text(node, "suffix", &suffix);
+ xml_get_text(node, "name_re", &name_re);
+ xml_get_text(node, "file_re", &file_re);
+ xml_get_text(node, "style", &style);
+
+ if((tpe = typ_type_new(cfg, name, mode, perm, suffix, name_re, file_re)) != NULL)
+ {
+ if(xml_get_boolean(node, "name_glob", &tmp) && tmp)
+ tpe->flags |= FTFL_NAMEGLOB;
+ if(xml_get_boolean(node, "name_nocase", &tmp) && tmp)
+ tpe->flags |= FTFL_NAMENOCASE;
+ if(xml_get_boolean(node, "file_glob", &tmp) && tmp)
+ tpe->flags |= FTFL_FILEGLOB;
+ if(xml_get_boolean(node, "file_nocase", &tmp) && tmp)
+ tpe->flags |= FTFL_FILENOCASE;
+ cfg->type = typ_type_insert(cfg->type, NULL, tpe);
+ cfg->type = typ_type_set_style(cfg->type, tpe, cfg->style, style);
+ }
+}
+
+/* 1998-08-14 - Load in the filetypes hanging off of <node>. */
+static void ctp_load(MainInfo *min, const XmlNode *node)
+{
+ GList *old, *next;
+
+ /* First destroy any previously defined types (e.g. the built-in ones). */
+ for(old = min->cfg.type; old != NULL; old = next)
+ {
+ next = g_list_next(old);
+ if(old->data == NULL)
+ continue;
+ typ_type_destroy(old->data);
+ min->cfg.type = g_list_remove(min->cfg.type, old->data);
+ }
+ xml_node_visit_children(node, load_type, &min->cfg);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-14 - When the GUI hides (i.e. is removed from screen by a reason different than
+** the user hitting the "OK" button), we free our editing copies.
+*/
+static void ctp_hide(MainInfo *min)
+{
+ P_Types *page = &the_page;
+ GList *old, *next;
+
+ for(old = page->type; old != NULL; old = next)
+ {
+ next = g_list_next(old);
+ if(old->data == NULL)
+ continue;
+ typ_type_destroy(old->data);
+ page->type = g_list_remove(page->type, old->data);
+ }
+ g_list_free(page->type);
+ page->type = NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * ctp_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, ctp_init, ctp_update, ctp_accept, ctp_save, ctp_load, ctp_hide };
+
+ return &desc;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-25 - Returns the list of current editing types. Handy when styles have changed.
+** This function is part of the rather nasty relationship between styles and
+** types; if you change enough on the styles page, the types will also think
+** they've been modified (thanks to the flag setting below). This is all due
+** to the fact that types link to their styles using direct pointer links.
+*/
+GList * ctp_get_types(void)
+{
+ the_page.modified = TRUE;
+
+ return the_page.type;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Go through current types, and if any type contains a link to a style named <from>,
+** replace that with a link to the given style. Called by the styles config module,
+** when a style is renamed or deleted (in the latter case, <to> will be "Root").
+*/
+void ctp_replace_style(const gchar *from, Style *to)
+{
+ GList *iter;
+ FType *type;
+
+ for(iter = the_page.type; iter != NULL; iter = g_list_next(iter))
+ {
+ type = iter->data;
+
+ if(strcmp(stl_style_get_name(type->style), from) == 0)
+ {
+ type->style = to;
+ the_page.modified = TRUE;
+ }
+ }
+}
+
+/* 1999-05-27 - Change all type's style pointers to point at styles in <to>, rather than <from>.
+** This gets called by the cfg_styles module, just before it destroys the <from>
+** styles.
+*/
+void ctp_relink_styles(const StyleInfo *from, const StyleInfo *to)
+{
+ const GList *iter;
+
+ for(iter = the_page.type; iter != NULL; iter = g_list_next(iter))
+ {
+ FType *type = iter->data;
+ Style *ns = stl_styleinfo_style_find(to, stl_style_get_name(type->style));
+
+ if(type->style != ns)
+ {
+ type->style = ns;
+ the_page.modified = TRUE;
+ }
+ }
+}
diff --git a/src/cfg_types.h b/src/cfg_types.h
new file mode 100644
index 0000000..6c25bda
--- /dev/null
+++ b/src/cfg_types.h
@@ -0,0 +1,8 @@
+/*
+** 1998-08-12 - These config modules really have ridiculous header files, but...
+*/
+
+extern const CfgModule * ctp_describe(MainInfo *min);
+extern GList * ctp_get_types(void);
+extern void ctp_replace_style(const gchar *from, Style *to);
+extern void ctp_relink_styles(const StyleInfo *from, const StyleInfo *to);
diff --git a/src/cfg_windows.c b/src/cfg_windows.c
new file mode 100644
index 0000000..8deb109
--- /dev/null
+++ b/src/cfg_windows.c
@@ -0,0 +1,211 @@
+/*
+** 1998-10-15 - Config page for main window position and size. Neat.
+** 2000-02-26 - This file has been pretty much entierly rewritten, and renamed. It now
+** supports configuring position and size of not only the main window, but
+** also the config and textview windows. Pretty neat.
+*/
+
+#include "gentoo.h"
+
+#include "dialog.h"
+#include "guiutil.h"
+#include "strutil.h"
+
+#include "cfg_module.h"
+#include "cfg_windows.h"
+
+#define NODE "Windows"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox; /* Config page structures always begin like this. */
+ GtkWidget *content; /* Content built for us by the window module. */
+ GtkWidget *border[2]; /* Window border spin buttons. */
+ GtkWidget *dpos[3]; /* Dialog position mode radio buttons. */
+
+ MainInfo *min;
+ gboolean modified;
+ WinInfo *edit; /* Window info being edited. */
+ GtkWindowPosition dialog_pos;
+} P_Windows;
+
+static P_Windows the_page;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void populate_page(P_Windows *page)
+{
+ gint border[2], i;
+
+ if(page->content)
+ gtk_widget_destroy(page->content);
+ page->content = win_wininfo_build(page->edit, &page->modified);
+ gtk_box_pack_start(GTK_BOX(page->vbox), page->content, FALSE, FALSE, 0);
+ gtk_widget_show_all(page->content);
+
+ win_borders_get(page->edit, &border[0], &border[1]);
+ for(i = 0; i < sizeof border / sizeof *border; i++)
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(page->border[i]), border[i]);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_border_changed(GtkWidget *wid, gpointer user)
+{
+ P_Windows *page = user;
+ gint w, h;
+
+ w = gtk_spin_button_get_value(GTK_SPIN_BUTTON(page->border[0]));
+ h = gtk_spin_button_get_value(GTK_SPIN_BUTTON(page->border[1]));
+ win_borders_set(page->edit, w, h);
+ page->modified = TRUE;
+}
+
+static void evt_dialog_position_toggled(GtkWidget *wid, gpointer user)
+{
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ P_Windows *page = user;
+ gint pos;
+
+ pos = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "pos"));
+ if(pos != page->dialog_pos)
+ {
+ page->dialog_pos = pos;
+ page->modified = TRUE;
+ }
+ }
+}
+
+static GtkWidget * cwn_init(MainInfo *min, gchar **name)
+{
+ P_Windows *page = &the_page;
+ GtkWidget *hbox, *frame, *grid, *vbox;
+ const gchar *blab[] = { N_("Horizontal"), N_("Vertical") };
+ const gchar *dlab[] = { N_("Dialog Windows Positioned by Window Manager"), N_("Dialog Windows Follow Mouse"), N_("Dialog Windows Center On Screen") };
+ GtkWindowPosition dpos[] = { GTK_WIN_POS_NONE, GTK_WIN_POS_MOUSE, GTK_WIN_POS_CENTER };
+ guint i;
+ GSList *group = NULL;
+
+ if(name == NULL)
+ return NULL;
+
+ *name = _("Windows");
+
+ page->edit = NULL;
+
+ page->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ page->content = NULL;
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ frame = gtk_frame_new(_("Window Borders"));
+ grid = gtk_grid_new();
+ for(i= 0; i < sizeof blab / sizeof *blab; i++)
+ {
+ GtkWidget *label;
+
+ label = gtk_label_new(_(blab[i]));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
+ page->border[i] = gtk_spin_button_new_with_range(-32768, 32768, 1);
+ gtk_widget_set_hexpand(page->border[i], TRUE);
+ gtk_widget_set_halign(page->border[i], GTK_ALIGN_FILL);
+ gtk_spin_button_set_digits(GTK_SPIN_BUTTON(page->border[i]), 0);
+ g_signal_connect(G_OBJECT(page->border[i]), "value_changed", G_CALLBACK(evt_border_changed), page);
+ gtk_grid_attach(GTK_GRID(grid), page->border[i], 1, i, 1, 1);
+ }
+ gtk_container_add(GTK_CONTAINER(frame), grid);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new(_("Dialog Positioning"));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < sizeof dlab / sizeof *dlab; i++)
+ {
+ page->dpos[i] = gtk_radio_button_new_with_label(group, _(dlab[i]));
+ g_object_set_data(G_OBJECT(page->dpos[i]), "pos", GINT_TO_POINTER(dpos[i]));
+ g_signal_connect(G_OBJECT(page->dpos[i]), "toggled", G_CALLBACK(evt_dialog_position_toggled), page);
+ if(dpos[i] == min->cfg.dialogs.pos)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(page->dpos[i]), TRUE);
+ group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(page->dpos[i]));
+ gtk_box_pack_start(GTK_BOX(vbox), page->dpos[i], FALSE, FALSE, 0);
+ }
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+ gtk_box_pack_end(GTK_BOX(page->vbox), hbox, TRUE, FALSE, 5);
+
+ gtk_widget_show_all(page->vbox);
+ return page->vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-01-30 - Update possize display. */
+static void cwn_update(MainInfo *min)
+{
+ P_Windows *page = &the_page;
+
+ page->min = min;
+ page->modified = FALSE;
+
+ if(page->edit != NULL)
+ win_wininfo_destroy(page->edit);
+ page->edit = win_wininfo_copy(min->cfg.wininfo);
+ page->dialog_pos = min->cfg.dialogs.pos;
+ populate_page(page);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cwn_accept(MainInfo *min)
+{
+ P_Windows *page = &the_page;
+
+ if(page->modified)
+ {
+ win_wininfo_destroy(min->cfg.wininfo);
+ min->cfg.wininfo = page->edit;
+ min->cfg.dialogs.pos = page->dialog_pos;
+ dlg_position_set(min->cfg.dialogs.pos);
+ page->edit = NULL;
+ page->modified = FALSE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean cwn_save(MainInfo *min, FILE *out)
+{
+ win_wininfo_save(min->cfg.wininfo, out);
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cwn_load(MainInfo *min, const XmlNode *node)
+{
+ win_wininfo_load(min->cfg.wininfo, node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-02-26 - When the config window hides, we can free our editing copy if we (still) have one. */
+static void cwn_hide(MainInfo *min)
+{
+ P_Windows *page = &the_page;
+
+ if(page->edit != NULL)
+ {
+ win_wininfo_destroy(page->edit);
+ page->edit = NULL;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+const CfgModule * cwn_describe(MainInfo *min)
+{
+ static const CfgModule desc = { NODE, cwn_init, cwn_update, cwn_accept, cwn_save, cwn_load, cwn_hide };
+
+ return &desc;
+}
diff --git a/src/cfg_windows.h b/src/cfg_windows.h
new file mode 100644
index 0000000..4befe3b
--- /dev/null
+++ b/src/cfg_windows.h
@@ -0,0 +1,5 @@
+/*
+** 1998-10-15 - Header for the size & position config module.
+*/
+
+extern const CfgModule * cwn_describe(MainInfo *min);
diff --git a/src/children.c b/src/children.c
new file mode 100644
index 0000000..d989561
--- /dev/null
+++ b/src/children.c
@@ -0,0 +1,235 @@
+/*
+** 1998-09-25 - This module deals with child processes. Cut out from the old commands module,
+** which really was kind of bloated.
+** 1998-12-15 - Rewritten. Now uses the POSIX sigaction() API, which perhaps is more portable.
+** I've been noticing some odd problems on Solaris, with "infinite signals" etc.
+** I found my (virtual) copy of the Linux Programmer's Guide, and it makes me
+** believe that POSIX signals are reliable by default (i.e. the handler need not
+** be reinstalled). New problem: possible interruption of system calls. :(
+** 1999-03-31 - Made this module a lot more self-contained.
+** 1999-04-08 - Now waitpid()s for the child after chd_kill_child(), which really is better.
+*/
+
+#include "gentoo.h"
+
+#if !defined _POSIX_SOURCE
+ #define _POSIX_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "dialog.h"
+#include "strutil.h"
+#include "queue.h"
+#include "children.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Information about a single child process. */
+ GPid pid;
+ guint watch; /* Glib source associated with this child. */
+ gchar prog[MAXNAMLEN]; /* Name of program running as this child (argv[0]). */
+ guint32 gflags; /* The general flags for the command. */
+ guint32 aflags; /* After-flags to associate with this child. */
+} Child;
+
+typedef struct { /* Holds data about child processes we have spawned. */
+ MainInfo *min; /* Very handy to have around. Keep first! */
+ GSList *child_list; /* List of running processes. */
+ GPid lock_pid; /* Pid of a command that we want to wait for. */
+ CmdSeq *running; /* If non-null, we're currently running this sequence. */
+ guint index; /* When 'running' is set, this is the next position to run. */
+} ChildInfo;
+
+static ChildInfo the_chi = { NULL };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean chd_unregister(const gchar *name);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-08 - Rewritten, now simply initializes our private ChildInfo. */
+gboolean chd_initialize(MainInfo *min)
+{
+ if(the_chi.min == NULL)
+ {
+ the_chi.min = min;
+ the_chi.child_list = NULL;
+ the_chi.lock_pid = -1;
+ the_chi.running = NULL;
+ the_chi.index = 0;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-03-08 - A child process has tragically died, and needs to be reaped. */
+static void cb_watch_child(GPid pid, gint status, gpointer user)
+{
+ ChildInfo *chi = &the_chi;
+ Child *ch = user;
+
+ /* Unlink from rest of GTK+, as soon as possible, to be safe. */
+ chi->child_list = g_slist_remove(chi->child_list, ch);
+ g_source_remove(ch->watch);
+
+ /* Now handle exit status. */
+ if(WIFEXITED(status) && WEXITSTATUS(status) == CHD_EXIT_FAILURE)
+ {
+ gchar buf[1024];
+
+ g_snprintf(buf, sizeof buf, _("Execution of \"%s\" Failed"), ch->prog);
+ dlg_dialog_sync_new_simple_wait(buf, _("Error"), _("_OK"));
+ }
+ if(chi->lock_pid == ch->pid) /* Running in foreground? */
+ que_enqueue(chi->min, QEVT_CONTINUE_CMD);
+ que_enqueue(chi->min, QEVT_END_CMD, ch->aflags);
+
+ g_free(ch);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-09 - Register a child process started by a user command. Keeps not only
+** the <pid>. This information is used to kill previous instance(s).
+** 1998-09-10 - Now takes an additional parameter, <lock>. If set, the GUI is locked.
+** 1998-09-18 - This routine is now exported for use by other code (the new "file" module).
+*/
+void chd_register(const gchar *prog, GPid pid, guint32 gflags, guint32 aflags)
+{
+ ChildInfo *chi = &the_chi;
+ Child *ch;
+
+ ch = g_malloc(sizeof *ch);
+ g_strlcpy(ch->prog, prog, sizeof ch->prog);
+ ch->pid = pid;
+ ch->gflags = gflags;
+ ch->aflags = aflags;
+ chi->child_list = g_slist_append(chi->child_list, ch);
+ if(!(gflags & CGF_RUNINBG))
+ {
+ chi->lock_pid = pid;
+ gtk_widget_set_sensitive(the_chi.min->gui->window, FALSE);
+ }
+ ch->watch = g_child_watch_add(ch->pid, cb_watch_child, ch);
+}
+
+/* 1999-04-08 - Unregister the child named <name>. This is not meant for public consumption,
+** hence it's static. Returns TRUE if a child was found, else FALSE.
+** NOTE NOTE This function doesn't kill any processes or otherwise affect the system's
+** process table: it just removes the internal data.
+*/
+static gboolean chd_unregister(const gchar *name)
+{
+ GSList *iter;
+ Child *ch;
+ ChildInfo *chi = &the_chi;
+
+ for(iter = chi->child_list; iter != NULL; iter = g_slist_next(iter))
+ {
+ ch = iter->data;
+ if(strcmp(ch->prog, name) == 0)
+ {
+ chi->child_list = g_slist_remove_link(chi->child_list, iter);
+ g_slist_free_1(iter);
+ g_source_remove(ch->watch);
+ g_free(ch);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* 1999-03-31 - Set the continuation information. */
+void chd_set_running(CmdSeq *cs, guint index)
+{
+ the_chi.running = cs;
+ the_chi.index = index;
+}
+
+/* 1999-03-31 - Get the currently running command sequence. If non-NULL, <index> will
+** receive the index of the next row to run.
+*/
+CmdSeq * chd_get_running(guint *index)
+{
+ if(index != NULL)
+ *index = the_chi.index;
+ return the_chi.running;
+}
+
+/* 1999-03-31 - Clear continuation info (since the sequence has finished). */
+void chd_clear_running(void)
+{
+ the_chi.running = NULL;
+ the_chi.index = 0;
+}
+
+/* 1999-03-31 - Just clear the locking child PID (since it just died, typically). */
+void chd_clear_lock(void)
+{
+ the_chi.lock_pid = -1;
+}
+
+/* 1998-09-28 - Kill (all) running instances of command named <name>. */
+void chd_kill_child(const gchar *name)
+{
+ GSList *iter, *next;
+ Child *ch;
+ guint rcount = 0U;
+ pid_t pid;
+
+ for(iter = the_chi.child_list; iter != NULL; iter = next)
+ {
+ next = g_slist_next(iter);
+ ch = iter->data;
+ if(strcmp(ch->prog, name) == 0)
+ {
+ pid = ch->pid; /* Buffer in case sighandler g_free()s it. */
+ if(kill(pid, SIGTERM) == 0)
+ {
+ int ret;
+
+ if((ret = waitpid(pid, NULL, 0)) == pid)
+ rcount++;
+ }
+ else
+ perror("CHILDREN: kill() failed");
+ }
+ }
+ while(rcount && chd_unregister(name))
+ rcount--;
+}
+
+/* 1998-05-26 - Kill any child processes (left over from running asynchronous commands).
+** 1998-09-09 - Rewritten due a more advanced child data format.
+** 1998-10-11 - Moved into the children module, where it belongs.
+*/
+void chd_kill_children(void)
+{
+ GSList *iter, *next;
+ Child *ch;
+
+ for(iter = the_chi.child_list; iter != NULL; iter = next)
+ {
+ next = g_slist_next(iter);
+ ch = iter->data;
+ if(ch->gflags & CGF_SURVIVE)
+ continue;
+ g_source_remove(ch->watch);
+ if(kill(ch->pid, SIGTERM) != 0)
+ g_warning(_("Couldn't terminate child \"%s\" (pid=%d)--zombie alert"), ch->prog, (gint) ch->pid);
+ else
+ {
+ waitpid(ch->pid, NULL, 0);
+ the_chi.child_list = g_slist_remove(the_chi.child_list, ch);
+ g_free(ch);
+ }
+ }
+}
diff --git a/src/children.h b/src/children.h
new file mode 100644
index 0000000..4854b11
--- /dev/null
+++ b/src/children.h
@@ -0,0 +1,26 @@
+/*
+** 1998-09-25 - Child process handling module's header file.
+*/
+
+#if !defined CHILDREN_H
+#define CHILDREN_H
+
+/* This is the return status (set by _exit()) to use to signal failure to
+** execvp() a child process. It's picked up and noticed by our SIGCHD signal
+** handler, and triggers a dialog. This feels dirty, but...
+*/
+#define CHD_EXIT_FAILURE 117
+
+extern gboolean chd_initialize(MainInfo *min);
+
+extern void chd_register(const gchar *prog, GPid pid, guint32 gflags, guint32 aflags);
+
+extern void chd_set_running(CmdSeq *cs, guint index);
+extern CmdSeq * chd_get_running(guint *index);
+extern void chd_clear_running(void);
+extern void chd_clear_lock(void);
+
+extern void chd_kill_child(const gchar *name);
+extern void chd_kill_children(void);
+
+#endif /* CHILDREN_H */
diff --git a/src/cmd_about.c b/src/cmd_about.c
new file mode 100644
index 0000000..38436fc
--- /dev/null
+++ b/src/cmd_about.c
@@ -0,0 +1,175 @@
+/*
+** 1998-09-23 - No program is complete without an "About" command.
+** 1999-03-13 - Now uses a multi dialog, which allows setting a sensible title. :)
+** 1999-03-21 - Brought the copyright into 1999, and added fun page flipping. :)
+** 1999-06-20 - Adapted for the new dialog module, and made asynchronous for fun.
+** 2002-06-07 - Redid it with a notebook. Cleaner, and required anyway. Heh.
+*/
+
+#include "gentoo.h"
+#include "dialog.h"
+#include "gfam.h"
+
+#include "cmd_about.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#include "graphics/icon_gentoo.c"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct body {
+ GtkWidget *notebook;
+ GtkWidget *page[2];
+ guint index;
+ guint handle;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint timeout_trigger(gpointer user)
+{
+ struct body *body = user;
+
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(body->notebook), body->index ^= 1);
+ return TRUE;
+}
+
+/* 1999-06-19 - This gets called as the dialog finally closes. */
+static void timeout_remove(gint button, gpointer user)
+{
+ struct body *body = user;
+
+ g_source_remove(GPOINTER_TO_UINT(body->handle));
+ g_free(body);
+}
+
+/* 2008-03-16 - Returns a label describing the current CHARSET value (I think). */
+static GtkWidget * get_charset_label(void)
+{
+ const gchar *charset = NULL;
+ gchar buf[1024];
+
+ g_get_charset(&charset);
+ g_snprintf(buf, sizeof buf, _("Native CHARSET: \"%s\"."), charset);
+ return gtk_label_new(buf);
+}
+
+/* 2008-08-09 - Returns a label describing the current filename encoding. */
+static GtkWidget * get_filename_label(void)
+{
+ const gchar **enc = NULL;
+
+ g_get_filename_charsets(&enc);
+ if(enc != NULL && enc[0] != NULL)
+ {
+ gchar buf[1024];
+
+ g_snprintf(buf, sizeof buf, _("Filename encoding: \"%s\"."), enc[0]);
+ return gtk_label_new(buf);
+ }
+ return NULL;
+}
+
+#if defined CAIRO_HAS_PNG_FUNCTIONS
+
+struct image_reader_state {
+ const unsigned char *data;
+ size_t to_go;
+ size_t pos;
+};
+
+/* 2012-05-13 - A stream reader for (compiled-in) PNG graphics data. */
+static cairo_status_t image_reader(void *closure, unsigned char *data, unsigned int length)
+{
+ struct image_reader_state *state = closure;
+
+ if(length <= state->to_go)
+ {
+ memcpy(data, state->data + state->pos, length);
+ state->pos += length;
+ state->to_go -= length;
+ return CAIRO_STATUS_SUCCESS;
+ }
+ return CAIRO_STATUS_READ_ERROR;
+}
+
+static GtkWidget * load_logo(void)
+{
+ cairo_surface_t *surf;
+ struct image_reader_state reader_state = { icon_gentoo_png, sizeof icon_gentoo_png, 0 };
+ GtkWidget *img = NULL;
+
+ if((surf = cairo_image_surface_create_from_png_stream(image_reader, &reader_state)) != NULL)
+ {
+ GdkPixbuf *pb = gdk_pixbuf_get_from_surface(surf, 0, 0, cairo_image_surface_get_width(surf), cairo_image_surface_get_height(surf));
+
+ img = gtk_image_new_from_pixbuf(pb);
+ g_object_unref(G_OBJECT(pb));
+ }
+ return img;
+}
+
+#endif
+
+gint cmd_about(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gchar buf[64], page2[768];
+ GtkWidget *w;
+ struct body *body;
+
+ body = g_malloc(sizeof *body);
+ body->index = 0U;
+
+ body->notebook = gtk_notebook_new();
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(body->notebook), FALSE);
+ body->page[0] = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+#if defined CAIRO_HAS_PNG_FUNCTIONS
+ if((w = load_logo()) != NULL)
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 20);
+#endif
+
+ g_snprintf(buf, sizeof buf, _("Version %s (GTK+ version %d.%d.%d)."), VERSION, gtk_major_version, gtk_minor_version, gtk_micro_version);
+ w = gtk_label_new(buf);
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+ w = gtk_label_new(_("(c) 1998-2016 by Emil Brink, Obsession Development.\n"));
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+ w = gtk_label_new(_("This is free software, and there is ABSOLUTELY NO\n"
+ "WARRANTY. Read the file COPYING for more details.\n"));
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+
+ /* Inform user which interface strings are being used. */
+#if defined ENABLE_NLS
+ w = gtk_label_new(_("NLS: Supported, using built-in English strings."));
+#else
+ w = gtk_label_new("NLS: Not supported, using built-in English strings.");
+#endif
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+
+ w = get_charset_label();
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+ w = get_filename_label();
+ if(w != NULL)
+ gtk_box_pack_start(GTK_BOX(body->page[0]), w, FALSE, FALSE, 0);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(body->notebook), body->page[0], NULL);
+ g_snprintf(page2, sizeof page2, _("The author of gentoo can be reached via Internet\n"
+ "e-mail at <a href=\"mailto:%s\">%s</a>; feel free to let\n"
+ "me know what you think of this software, give\n"
+ "suggestions/bug reports, and so on.\n\n"
+
+ "The latest release of gentoo can always be down-\n"
+ "loaded from the official gentoo project homepage at\n"
+ "<a href=\"%s\">%s</a>."),
+ PACKAGE_BUGREPORT, PACKAGE_BUGREPORT,
+ PACKAGE_URL, PACKAGE_URL);
+ body->page[1] = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(body->page[1]), page2);
+ gtk_notebook_append_page(GTK_NOTEBOOK(body->notebook), body->page[1], NULL);
+
+ body->handle = g_timeout_add(10000, timeout_trigger, body);
+ dlg_dialog_async_new(body->notebook, _("About gentoo"), _("_OK (Wait for More)"), timeout_remove, body);
+
+ return 1;
+}
diff --git a/src/cmd_about.h b/src/cmd_about.h
new file mode 100644
index 0000000..5e83bb1
--- /dev/null
+++ b/src/cmd_about.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-23 - Header for the About command module. Smallish.
+*/
+
+extern gint cmd_about(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_activate.c b/src/cmd_activate.c
new file mode 100644
index 0000000..749f8ad
--- /dev/null
+++ b/src/cmd_activate.c
@@ -0,0 +1,65 @@
+/*
+** 1998-05-25 - Another basic GUI command, the native SWAP command handles changing of
+** the current dir pane. Very handy for that Opus-like feeling!
+** 1998-07-01 - Expanded, generalized, and renamed this one. The commands implemented
+** here are now called ActivateOther (which does the same thing the old
+** SWAP command did), ActivateLeft, and ActivateRight.
+** 1999-01-30 - Added the stack support, which is sometimes handy to have.
+*/
+
+#include "gentoo.h"
+#include "dirpane.h"
+#include "cmd_activate.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define DP_STACK_SIZE (8)
+
+typedef struct {
+ guint stack_ptr; /* Points at next free item in stack. */
+ guint8 stack[DP_STACK_SIZE]; /* Stack of previously active pane indices. */
+} AcStack;
+
+static AcStack the_stack = { 0 }; /* Makes sure stack pointer is initially 0 (<=> stack empty). */
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-01 - Activate the pane which is currently not active, i.e. the "other" one. */
+gint cmd_activateother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_activate(dst);
+ return 1;
+}
+
+/* 1998-07-01 - Make sure the active pane is the left one. */
+gint cmd_activateleft(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_activate(&min->gui->pane[0]);
+ return 1;
+}
+
+/* 1998-07-01 - Make sure the active pane is the right one. */
+gint cmd_activateright(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_activate(&min->gui->pane[1]);
+ return 1;
+}
+
+/* 1999-01-30 - Push currently active pane onto stack. Handy if you want to
+** reactivate it later. Stack is finite and won't wrap; any attempt
+** to push more than it can hold will be (silently) ignored.
+*/
+gint cmd_activatepush(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ if(the_stack.stack_ptr < (sizeof the_stack.stack / sizeof the_stack.stack[0]))
+ the_stack.stack[the_stack.stack_ptr++] = src->index;
+ return 1;
+}
+
+/* 1999-01-30 - Activate the entry from the top of the stack. */
+gint cmd_activatepop(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ if(the_stack.stack_ptr > 0)
+ dp_activate(&min->gui->pane[the_stack.stack[--the_stack.stack_ptr]]);
+ return 1;
+}
diff --git a/src/cmd_activate.h b/src/cmd_activate.h
new file mode 100644
index 0000000..31ea6df
--- /dev/null
+++ b/src/cmd_activate.h
@@ -0,0 +1,10 @@
+/*
+** 1998-05-25 - Header for the internal SWAP command.
+*/
+
+extern gint cmd_activateother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_activateleft(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_activateright(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gint cmd_activatepush(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_activatepop(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_chmod.c b/src/cmd_chmod.c
new file mode 100644
index 0000000..66bcd7a
--- /dev/null
+++ b/src/cmd_chmod.c
@@ -0,0 +1,275 @@
+/*
+** 1998-05-29 - A command to change the access flags of a file or directory.
+** Made significantly simpler by the new cmd_generic module.
+** 1999-03-06 - Adapted for new selection/generic handling.
+** 2010-03-02 - GIO porting more or less complete.
+*/
+
+#include "gentoo.h"
+#include "errors.h"
+#include "dirpane.h"
+#include "strutil.h"
+#include "window.h"
+
+#include "cmd_generic.h"
+#include "cmd_chmod.h"
+
+#define CMD_ID "chmod"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *check[3];
+ gulong signal[3];
+} PFrame;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *fbox;
+ PFrame frame[4];
+ GtkWidget *entry_text;
+ GtkWidget *entry_octal;
+ GtkWidget *bbox;
+ GtkWidget *all, *none, *toggle, *revert;
+ mode_t last_mode;
+ GtkWidget *recurse;
+ gboolean last_recurse;
+ GtkWidget *nodirs;
+ gboolean last_nodirs;
+} ChmInfo;
+
+static const mode_t mask[] = { S_ISUID, S_ISGID, S_ISVTX,
+ S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static mode_t get_checks(const ChmInfo *chm)
+{
+ mode_t mode = 0U;
+ guint i, j, k;
+
+ for(i = k = 0; i < sizeof chm->frame / sizeof *chm->frame; i++)
+ {
+ for(j = 0; j < sizeof chm->frame[i].check / sizeof *chm->frame[i].check; j++, k++)
+ {
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chm->frame[i].check[j])))
+ mode |= mask[k];
+ }
+ }
+ return mode;
+}
+
+/* 2009-03-25 - Update the textual representations. These are currently read-only. */
+static void set_texts(ChmInfo *chm, mode_t mode)
+{
+ gchar buf[32];
+
+ stu_mode_to_text(buf, sizeof buf, mode);
+ gtk_entry_set_text(GTK_ENTRY(chm->entry_text), buf + 1); /* Skip the directory indicator. */
+ g_snprintf(buf, sizeof buf, "%o", mode);
+ gtk_entry_set_text(GTK_ENTRY(chm->entry_octal), buf);
+}
+
+static void set_checks(ChmInfo *chm, mode_t mode)
+{
+ guint i, j, k;
+
+ for(i = k = 0; i < sizeof chm->frame / sizeof *chm->frame; i++)
+ {
+ for(j = 0; j < sizeof chm->frame[i].check / sizeof *chm->frame[i].check; j++, k++)
+ {
+ g_signal_handler_block(G_OBJECT(chm->frame[i].check[j]), chm->frame[i].signal[j]);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chm->frame[i].check[j]), mode & mask[k]);
+ g_signal_handler_unblock(G_OBJECT(chm->frame[i].check[j]), chm->frame[i].signal[j]);
+ }
+ }
+ set_texts(chm, mode);
+}
+
+static void chm_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ ChmInfo *chm = user;
+ gchar temp[2 * FILENAME_MAX + 128];
+ mode_t mode = dp_row_get_mode(dp_get_tree_model(src), row);
+
+ g_snprintf(temp, sizeof temp, _("Set protection bits for \"%s\":"), dp_row_get_name_display(dp_get_tree_model(src), row));
+ gtk_label_set_text(GTK_LABEL(chm->label), temp);
+ set_checks(chm, chm->last_mode = (mode & 07777));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean chmod_gfile(MainInfo *min, DirPane *src, const GFile *file, mode_t mode, gboolean recurse, gboolean nodirs, GError **err)
+{
+ GFileInfo *fi;
+ gboolean ok = FALSE;
+
+ if((fi = g_file_query_info((GFile *) file, G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_UNIX_MODE, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ const gboolean isdir = (g_file_info_get_file_type(fi) == G_FILE_TYPE_DIRECTORY);
+
+ /* Don't try to change the file's type. */
+ g_file_info_remove_attribute(fi, G_FILE_ATTRIBUTE_STANDARD_TYPE);
+
+ /* If non-directory or we're attacking dirs, set the mode first. */
+ if(!isdir || !nodirs)
+ {
+ g_file_info_set_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_MODE, mode);
+ ok = g_file_set_attributes_from_info((GFile *) file, fi, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err);
+ }
+ else
+ ok = TRUE;
+ /* Drop the info, we're done. */
+ g_object_unref(fi);
+
+ /* If successful so far, consider recursing. */
+ if(ok && isdir && recurse)
+ {
+ GFileEnumerator *fe;
+
+ if((fe = g_file_enumerate_children((GFile *) file, "standard::name,unix::mode", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ GFileInfo *cfi;
+ GFile *child;
+
+ while(ok && (cfi = g_file_enumerator_next_file(fe, NULL, err)) != NULL)
+ {
+ if((child = g_file_get_child((GFile *) file, g_file_info_get_name(cfi))) != NULL)
+ {
+ ok = chmod_gfile(min, src, child, mode, recurse, nodirs, err);
+ g_object_unref(child);
+ }
+ else
+ ok = FALSE;
+ g_object_unref(cfi);
+ }
+ g_object_unref(fe);
+ }
+ else
+ ok = FALSE;
+ }
+ }
+ return ok;
+}
+
+static gint chm_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **err, gpointer user)
+{
+ ChmInfo *chm = user;
+ const mode_t mode = get_checks(chm);
+ GFile *dfile;
+ gboolean ok;
+
+ chm->last_recurse = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chm->recurse));
+ chm->last_nodirs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chm->nodirs));
+ dfile = dp_get_file_from_row(src, row);
+ ok = chmod_gfile(min, src, dfile, mode, chm->last_recurse, chm->last_nodirs, err);
+ if(ok)
+ dp_unselect(src, row);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_clicked(GtkWidget *wid, gpointer user)
+{
+ ChmInfo *chm = user;
+
+ if(wid == chm->all)
+ set_checks(chm, S_ISUID | S_ISGID | S_ISVTX | S_IRUSR | S_IWUSR | S_IXUSR |
+ S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);
+ else if(wid == chm->none)
+ set_checks(chm, 0);
+ else if(wid == chm->toggle)
+ set_checks(chm, (~get_checks(chm)) & 07777);
+ else if(wid == chm->revert)
+ set_checks(chm, chm->last_mode);
+ else
+ set_texts(chm, get_checks(chm));
+}
+
+/* 1998-05-29 - Build a protection frame, with three checkboxes. If type is 0, we build a
+** special one (with setuid/setgid/sticky), otherwise a standard (read/write/exec).
+*/
+static void build_frame(ChmInfo *ci, gint pos, gint type)
+{
+ gchar *label[] = { N_("Special"), N_("Owner"), N_("Group"), N_("Others") };
+ gchar *check[] = { N_("Set UID"), N_("Set GID"), N_("Sticky"), N_("Read"), N_("Write"), N_("Execute") };
+ PFrame *fr = &ci->frame[pos];
+ gint i;
+
+ fr->frame = gtk_frame_new(_(label[pos]));
+ fr->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ for(i = 0; i < 3; i++)
+ {
+ fr->check[i] = gtk_check_button_new_with_label(_(check[type * 3 + i]));
+ fr->signal[i] = g_signal_connect(G_OBJECT(fr->check[i]), "toggled", G_CALLBACK(evt_clicked), ci);
+ gtk_box_pack_start(GTK_BOX(fr->vbox), fr->check[i], TRUE, TRUE, 0);
+ }
+ gtk_container_add(GTK_CONTAINER(fr->frame), fr->vbox);
+}
+
+gint cmd_chmod(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static ChmInfo ci;
+ guint i;
+ GtkWidget *hbox, *w;
+
+ ci.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ ci.label = gtk_label_new(_("Protection Bits"));
+ ci.fbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ for(i = 0; i < sizeof ci.frame / sizeof ci.frame[0]; i++)
+ {
+ build_frame(&ci, i, (i == 0) ? 0 : 1);
+ gtk_box_pack_start(GTK_BOX(ci.fbox), ci.frame[i].frame, TRUE, TRUE, 5);
+ }
+ gtk_box_pack_start(GTK_BOX(ci.vbox), ci.label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(ci.vbox), ci.fbox, TRUE, TRUE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ w = gtk_label_new(_("Textual"));
+ gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0);
+ ci.entry_text = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(ci.entry_text), 10);
+ gtk_entry_set_width_chars(GTK_ENTRY(ci.entry_text), 10);
+ gtk_editable_set_editable(GTK_EDITABLE(ci.entry_text), FALSE);
+ gtk_box_pack_start(GTK_BOX(hbox), ci.entry_text, FALSE, FALSE, 0);
+
+ ci.entry_octal = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(ci.entry_octal), 4);
+ gtk_entry_set_width_chars(GTK_ENTRY(ci.entry_octal), 4);
+ gtk_editable_set_editable(GTK_EDITABLE(ci.entry_octal), FALSE);
+ gtk_box_pack_end(GTK_BOX(hbox), ci.entry_octal, FALSE, FALSE, 0);
+ w = gtk_label_new(_("Octal"));
+ gtk_box_pack_end(GTK_BOX(hbox), w, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(ci.vbox), hbox, FALSE, FALSE, 0);
+
+ ci.bbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ ci.all = gtk_button_new_with_label(_("All"));
+ ci.none = gtk_button_new_with_label(_("None"));
+ ci.toggle = gtk_button_new_with_label(_("Toggle"));
+ ci.revert = gtk_button_new_with_label(_("Revert"));
+
+ g_signal_connect(G_OBJECT(ci.all), "clicked", G_CALLBACK(evt_clicked), &ci);
+ g_signal_connect(G_OBJECT(ci.none), "clicked", G_CALLBACK(evt_clicked), &ci);
+ g_signal_connect(G_OBJECT(ci.toggle), "clicked", G_CALLBACK(evt_clicked), &ci);
+ g_signal_connect(G_OBJECT(ci.revert), "clicked", G_CALLBACK(evt_clicked), &ci);
+ gtk_box_pack_start(GTK_BOX(ci.bbox), ci.all, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(ci.bbox), ci.none, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(ci.bbox), ci.toggle, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(ci.bbox), ci.revert, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(ci.vbox), ci.bbox, TRUE, TRUE, 0);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ ci.recurse = gtk_check_button_new_with_label(_("Recurse Directories?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ci.recurse), ci.last_recurse);
+ gtk_box_pack_start(GTK_BOX(hbox), ci.recurse, TRUE, TRUE, 0);
+ ci.nodirs = gtk_check_button_new_with_label(_("Don't Touch Directories?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ci.nodirs), ci.last_nodirs);
+ gtk_box_pack_start(GTK_BOX(hbox), ci.nodirs, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(ci.vbox), hbox, FALSE, FALSE, 0);
+
+ return cmd_generic(min, _("Change Mode"), CGF_SRC, chm_body, chm_action, NULL, &ci);
+}
diff --git a/src/cmd_chmod.h b/src/cmd_chmod.h
new file mode 100644
index 0000000..907153d
--- /dev/null
+++ b/src/cmd_chmod.h
@@ -0,0 +1,5 @@
+/*
+** 1998-05-29 - Another oneliner. This is for the CHMOD internal command.
+*/
+
+extern gint cmd_chmod(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_chown.c b/src/cmd_chown.c
new file mode 100644
index 0000000..01198e6
--- /dev/null
+++ b/src/cmd_chown.c
@@ -0,0 +1,205 @@
+/*
+** 1998-06-07 - A command to set the owner and group information on a file
+** (or set of files). Might get GUI-ish.
+** 1998-06-08 - Fixed the userinfo module, which allowed this one to take another
+** step towards completetion; now it preselects the current user/group
+** names from the option menus. I still miss some form of higher-level
+** control widgetry, though. Later...
+** 1998-10-16 - The defaults now work (even if you don't operate the menus).
+** 1999-03-06 - Adapted for new selection/generic/dirrow representations.
+** 2000-03-23 - Now uses combo boxes rather than menus to display user and group
+** lists. Also allows user to type in either number or name of the
+** desired user and/or group directly. All in all, a lot smoother.
+** 2001-04-24 - Added recursion option.
+** 2010-03-02 - Rewritten using GIO.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "userinfo.h"
+
+#include "cmd_generic.h"
+#include "cmd_chown.h"
+
+#define CMD_ID "chown"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *combo;
+ gint history; /* The weirdly named thing (see gtk_option_menu widget). */
+} URow;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *rowgrid;
+ URow row[2];
+ guint user, group; /* The currently selected IDs. */
+ gint user_index, group_index; /* Indices to default to. */
+ GtkWidget *recurse;
+ gboolean last_recurse;
+} ChoInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cho_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar label[2 * MAXNAMLEN + 64];
+ ChoInfo *cho = user;
+
+ g_snprintf(label, sizeof label, _("Set Ownership for '%s':"), dp_row_get_name_display(dp_get_tree_model(src), row));
+ gtk_label_set_text(GTK_LABEL(cho->label), label);
+ gtk_widget_grab_focus(cho->row[0].combo);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean parse_or_lookup(const gchar *str, long lookup(const gchar *name), long *tmp)
+{
+ while(isspace((guchar) *str))
+ str++;
+ if(isdigit((guchar) *str))
+ {
+ gchar *eptr;
+
+ *tmp = strtol(str, &eptr, 10);
+ if(eptr == str)
+ return FALSE;
+ }
+ else
+ *tmp = lookup(str);
+ return TRUE;
+}
+
+static gboolean get_own(ChoInfo *cho, uid_t *owner, gid_t *group)
+{
+ const gchar *text;
+ long tmp;
+ gboolean ok = FALSE;
+
+ if((text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(cho->row[0].combo))) == NULL)
+ return FALSE;
+ if(parse_or_lookup(text, usr_lookup_uid, &tmp))
+ {
+ *owner = tmp;
+ if((text = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(cho->row[1].combo))) != NULL)
+ {
+ if(parse_or_lookup(text, usr_lookup_gid, &tmp))
+ {
+ *group = tmp;
+ ok = TRUE;
+ }
+ }
+ }
+ return ok;
+}
+
+static gboolean chown_gfile(MainInfo *min, GFile *file, uid_t owner, gid_t group, gboolean recurse, GError **err)
+{
+ gboolean ok = FALSE;
+ GFileInfo *info;
+ GFileType type;
+
+ if(file != NULL && (info = g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_UNIX_UID "," G_FILE_ATTRIBUTE_UNIX_GID,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ type = g_file_info_get_file_type(info);
+ /* Don't try to change the file's type; now that we've buffered it we can remove it. */
+ g_file_info_remove_attribute(info, G_FILE_ATTRIBUTE_STANDARD_TYPE);
+ g_file_info_set_attribute_uint32(info, G_FILE_ATTRIBUTE_UNIX_UID, owner);
+ g_file_info_set_attribute_uint32(info, G_FILE_ATTRIBUTE_UNIX_GID, group);
+ ok = g_file_set_attributes_from_info(file, info, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err);
+ g_object_unref(info); /* Drop this early, no point in holding recursively. */
+ if(ok)
+ {
+ if(type == G_FILE_TYPE_DIRECTORY && recurse)
+ {
+ GFileEnumerator *fen;
+
+ ok = FALSE;
+ if((fen = g_file_enumerate_children(file, G_FILE_ATTRIBUTE_STANDARD_NAME, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ GFileInfo *chi;
+
+ ok = TRUE;
+ while(ok && (chi = g_file_enumerator_next_file(fen, NULL, err)) != NULL)
+ {
+ GFile *child = g_file_get_child(file, g_file_info_get_name(chi));
+
+ ok = chown_gfile(min, child, owner, group, recurse, err);
+ g_object_unref(child);
+ }
+ g_object_unref(fen);
+ }
+ }
+ }
+ }
+ return ok;
+}
+
+static gint cho_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **err, gpointer user)
+{
+ ChoInfo *cho = user;
+ uid_t owner = 0;
+ gid_t group = 0;
+ GFile *file;
+ gboolean ok = FALSE;
+
+ if(!get_own(cho, &owner, &group))
+ return FALSE;
+ cho->last_recurse = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cho->recurse));
+ if((file = dp_get_file_from_row(src, row)) != NULL)
+ {
+ ok = chown_gfile(min, file, owner, group, cho->last_recurse, err);
+ g_object_unref(file);
+ }
+ if(ok)
+ dp_unselect(src, row);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+gint cmd_chown(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ UsrCategory cat[] = { UIC_USER, UIC_GROUP };
+ gchar *labtext[] = { N_("User"), N_("Group") };
+ gint i, index;
+ GtkWidget *label;
+ GList *list, *iter;
+ static ChoInfo cho;
+
+ cho.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ cho.label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(cho.vbox), cho.label, FALSE, FALSE, 0);
+ cho.rowgrid = gtk_grid_new();
+ for(i = 0; i < 2; i++)
+ {
+ label = gtk_label_new(_(labtext[i]));
+ gtk_grid_attach(GTK_GRID(cho.rowgrid), label, 0, i, 1, 1);
+ cho.row[i].combo = gtk_combo_box_text_new_with_entry();
+ list = usr_string_list_create(cat[i], cat[i] == UIC_USER ? geteuid() : getgid(), &index);
+ for(iter = list; iter != NULL; iter = g_list_next(iter))
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cho.row[i].combo), iter->data);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(cho.row[i].combo), index);
+ usr_string_list_destroy(list);
+ gtk_widget_set_hexpand(cho.row[i].combo, TRUE);
+ gtk_widget_set_halign(cho.row[i].combo, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(cho.rowgrid), cho.row[i].combo, 1, i, 1, 1);
+ }
+ gtk_box_pack_start(GTK_BOX(cho.vbox), cho.rowgrid, FALSE, FALSE, 5);
+ cho.recurse = gtk_check_button_new_with_label(_("Recurse Directories?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cho.recurse), cho.last_recurse);
+ gtk_box_pack_start(GTK_BOX(cho.vbox), cho.recurse, FALSE, FALSE, 0);
+ gtk_widget_show_all(cho.vbox);
+
+ return cmd_generic(min, _("Change Ownership"), CGF_SRC | CGF_NODST, cho_body, cho_action, NULL, &cho);
+}
diff --git a/src/cmd_chown.h b/src/cmd_chown.h
new file mode 100644
index 0000000..9dc32e6
--- /dev/null
+++ b/src/cmd_chown.h
@@ -0,0 +1,6 @@
+/*
+** 1998-06-07 - Another typical command header, this time for the CHWON native
+** command.
+*/
+
+extern gint cmd_chown(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_configure.c b/src/cmd_configure.c
new file mode 100644
index 0000000..e3ffaf6
--- /dev/null
+++ b/src/cmd_configure.c
@@ -0,0 +1,53 @@
+/*
+** 1998-12-14 - A new module to pretty up the configuration-invocation, and also
+** to implement a ConfigSave command.
+*/
+
+#include "gentoo.h"
+#include "cmdseq_config.h"
+#include "configure.h"
+#include "cmd_configure.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Options used by the "Configure" command. */
+ gboolean modified;
+ gboolean auto_save; /* Automatic save, suppresses the dialog on quit. */
+} OptConfigure;
+
+static OptConfigure configure_options;
+static CmdCfg *configure_cmc = NULL;
+
+/* 1998-12-14 - This is the classic "Configure" command, just given a standard prototype. */
+gint cmd_configure(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ cfg_configure(min);
+
+ return TRUE;
+}
+
+/* 1998-12-14 - This command causes the configuration to be saved. */
+gint cmd_configuresave(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ cfg_save_all(min);
+
+ return TRUE;
+}
+
+gboolean cmd_configure_autosave(void)
+{
+ return configure_options.auto_save;
+}
+
+void cfg_configurecmd(MainInfo *min)
+{
+ if(configure_cmc == NULL)
+ {
+ configure_options.auto_save = FALSE;
+
+ configure_cmc = cmc_config_new("Configure", &configure_options);
+ cmc_field_add_boolean(configure_cmc, "modified", NULL, offsetof(OptConfigure, modified));
+ cmc_field_add_boolean(configure_cmc, "auto_save", _("Automatically Save Changed Configuration on Exit?"), offsetof(OptConfigure, auto_save));
+ cmc_config_register(configure_cmc);
+ }
+}
diff --git a/src/cmd_configure.h b/src/cmd_configure.h
new file mode 100644
index 0000000..c74d7fd
--- /dev/null
+++ b/src/cmd_configure.h
@@ -0,0 +1,10 @@
+/*
+** 1998-12-14 - Header for the configuration commands.
+*/
+
+extern gint cmd_configure(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_configuresave(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gboolean cmd_configure_autosave(void);
+
+extern void cfg_configurecmd(MainInfo *min);
diff --git a/src/cmd_copy.c b/src/cmd_copy.c
new file mode 100644
index 0000000..af87873
--- /dev/null
+++ b/src/cmd_copy.c
@@ -0,0 +1,273 @@
+/*
+** 1998-05-21 - This module implements the built-in command "Copy". Very handy stuff!
+** 1998-05-23 - Added some error handling/reporting. Very far from bullet-proof, though. :(
+** 1998-05-31 - Added capability to copy device files (recreates them at destination using
+** mknod(), of course). Nice.
+** 1998-06-04 - Copied directories now try to have the same protection flags, rather than
+** trying to turn on as many bits as possible (as the old code did!).
+** 1998-06-07 - Added support for copying soft links. Originally wrote the code in cmd_move,
+** then moved it here and made the cmd_move code call it here.
+** 1998-09-12 - Changed all destination arguments to be full (with path and filename). This
+** makes the implementation of cmd_copys SO much easier.
+** 1998-09-19 - Now uses the new overwrite protection/confirmation module. Kinda cool.
+** 1998-12-23 - Now supports copying the source's access and modification dates, too.
+** 1999-01-03 - After complaints, I altered the copying command slightly; it no longer attempts
+** to avoid doing a new stat() call on the file being copied. This assures that
+** the size used for the copy is the most recent one known to the file system (if
+** you pretend there's no other programs running, that is).
+** 1999-03-05 - Moved over to new selection method, and it's semi-abstracted view of dir rows.
+** 1999-04-06 - Modified to use the new command configuration system.
+** 2000-07-02 - Initialized translation by marking up strings.
+*/
+
+#include "gentoo.h"
+
+#include <fcntl.h>
+#include <utime.h>
+
+#include "cmd_delete.h"
+#include "cmdseq_config.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "overwrite.h"
+#include "progress.h"
+#include "strutil.h"
+
+#include "cmd_copy.h"
+
+#define CMD_ID "copy"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Options used by the "Copy" command (and relatives). */
+ gboolean modified;
+ gboolean copy_dates; /* Copy access and modification dates? */
+ gboolean ignore_attrib_err; /* Allow attribute-copying to fail silently. */
+ gboolean leave_fullsize; /* If destination has same size as source, leave it even if error occured. */
+ gsize buf_size; /* Buffer size. */
+} OptCopy;
+
+static OptCopy copy_options;
+static CmdCfg *copy_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-10-04 - Return the buffer size for copying, so others can use it too. */
+gsize cpy_get_buf_size(void)
+{
+ return copy_options.buf_size;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cb_progress(goffset pos, goffset total, gpointer user)
+{
+ pgs_progress_item_update(user, pos);
+}
+
+static gboolean copy_gfile_regular(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err)
+{
+ /* Yeah, time for some seriously heavy lifting. Luckily, not by me. :) */
+ return g_file_copy(from, to, G_FILE_COPY_NONE, pgs_progress_get_cancellable(), cb_progress, min, err);
+}
+
+static gboolean copy_gfile_symlink(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err)
+{
+ /* This is just a copy, so it might be merged with copy_gfile_regular(), above. */
+ return g_file_copy(from, to, G_FILE_COPY_NOFOLLOW_SYMLINKS, pgs_progress_get_cancellable(), cb_progress, min, err);
+}
+
+static gboolean copy_gfile_special(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err)
+{
+ GFileInfo *fi;
+ gchar *path;
+ gboolean ok = FALSE;
+
+ if((fi = g_file_query_info(from, "standard::*,unix::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) == NULL)
+ return FALSE;
+ /* It seems current versions of GIO can't ever set the G_FILE_ATTRIBUTE_UNIX_RDEV attribute
+ * so we can't just use that. Might be because of the below code required to do this.
+ */
+ if((path = g_file_get_path(to)) != NULL)
+ {
+ const guint32 mode = g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_MODE);
+ const guint32 rdev = g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_RDEV);
+
+ /* Manual page for mknod() says never to use it to create FIFOs, so let's not. */
+ if(mode & S_IFIFO)
+ ok = mkfifo(path, mode) == 0;
+ else
+ ok = mknod(path, mode, rdev) == 0;
+
+ if(!ok)
+ {
+ const gchar *fmt = (mode & S_IFIFO) ? _("Error copying FIFO: %s") : _("Error copying special file: %s");
+ g_set_error(err, g_io_error_quark(), g_io_error_from_errno(errno), fmt, strerror(errno));
+ }
+ g_free(path);
+ }
+ else
+ g_set_error(err, g_io_error_quark(), G_IO_ERROR_FAILED, _("Error copying special file: no local path"));
+
+ g_object_unref(fi);
+
+ return ok;
+}
+
+static gboolean copy_gfile_directory(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err)
+{
+ GFileEnumerator *fe;
+ GFileInfo *fi;
+ gboolean ok = TRUE;
+
+ /* First create the destination directory. It must be possible without overwriting
+ * anything, gentoo's copy semantics do not allow merge on copy.
+ */
+ if(!g_file_make_directory(to, NULL, err))
+ return FALSE;
+
+ /* Now iterate over the children of the source, and copy each file contained therein. */
+ if((fe = g_file_enumerate_children(from, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) == NULL)
+ return FALSE;
+ while(ok && (fi = g_file_enumerator_next_file(fe, NULL, err)) != NULL)
+ {
+ GFile *sfile, *dfile;
+
+ ok = FALSE;
+ if((sfile = g_file_get_child(from, g_file_info_get_name(fi))) != NULL)
+ {
+ if((dfile = g_file_get_child(to, g_file_info_get_name(fi))) != NULL)
+ {
+ ok = copy_gfile(min, src, dst, sfile, dfile, err);
+ g_object_unref(dfile);
+ }
+ g_object_unref(sfile);
+ }
+ g_object_unref(fi);
+ }
+ g_object_unref(fe);
+
+ return ok;
+}
+
+/* 2009-09-09 - Copies a file, using GIO. Neither file is freed. The file could be a directory. */
+gboolean copy_gfile(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err)
+{
+ GFileInfo *fi;
+ gboolean ok;
+
+ if(min == NULL || from == NULL || to == NULL)
+ return FALSE;
+
+ switch(ovw_overwrite_unary_file(dst, to))
+ {
+ case OVW_SKIP:
+ return TRUE;
+ case OVW_CANCEL:
+ return FALSE;
+ case OVW_PROCEED:
+ break;
+ case OVW_PROCEED_FILE:
+ case OVW_PROCEED_DIR:
+ if(!del_delete_gfile(min, to, FALSE, err))
+ return FALSE;
+ }
+ if((fi = g_file_query_info(from, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) == NULL)
+ return FALSE;
+ switch(g_file_info_get_file_type(fi))
+ {
+ case G_FILE_TYPE_REGULAR:
+ pgs_progress_item_begin(min, g_file_info_get_display_name(fi), g_file_info_get_size(fi));
+ ok = copy_gfile_regular(min, src, dst, from, to, err);
+ pgs_progress_item_end(min);
+ break;
+ case G_FILE_TYPE_DIRECTORY:
+ pgs_progress_item_begin(min, g_file_info_get_display_name(fi), g_file_info_get_size(fi));
+ ok = copy_gfile_directory(min, src, dst, from, to, err);
+ pgs_progress_item_end(min);
+ break;
+ case G_FILE_TYPE_SYMBOLIC_LINK:
+ pgs_progress_item_begin(min, g_file_info_get_display_name(fi), g_file_info_get_size(fi));
+ ok = copy_gfile_symlink(min, src, dst, from, to, err);
+ pgs_progress_item_end(min);
+ break;
+ case G_FILE_TYPE_SPECIAL:
+ pgs_progress_item_begin(min, g_file_info_get_display_name(fi), 0);
+ ok = copy_gfile_special(min, src, dst, from, to, err);
+ pgs_progress_item_end(min);
+ break;
+ default:
+ g_error("Not copying '%s', type is %d which is unsupported", g_file_info_get_name(fi), g_file_info_get_file_type(fi));
+ ok = FALSE;
+ }
+ g_object_unref(fi);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-24 - Copy selected files and/or directories to destination pane's directory. */
+gint cmd_copy(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist, *iter;
+ guint num = 0;
+ gboolean ok = TRUE;
+ GError *err = NULL;
+
+ if((src == NULL) || (dst == NULL))
+ return 1;
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Proceed With Copy?"), 0UL);
+ pgs_progress_begin(min, _("Copying..."), PFLG_COUNT_RECURSIVE | PFLG_ITEM_VISIBLE | PFLG_BYTE_VISIBLE);
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ GFile *sf, *df;
+
+ sf = dp_get_file_from_row(src, iter->data);
+ df = dp_get_file_from_name(dst, dp_row_get_name(dp_get_tree_model(src), iter->data));
+ if((ok = copy_gfile(min, src, dst, sf, df, &err)))
+ {
+ dp_unselect(src, iter->data);
+ num++;
+ }
+ else
+ err_set_gerror(min, &err, CMD_ID, sf);
+ g_object_unref(df);
+ g_object_unref(sf);
+ }
+ if(num > 0)
+ dp_rescan_post_cmd(dst);
+ pgs_progress_end(min);
+ ovw_overwrite_end(min);
+ dp_free_selection(slist);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-06 - Configuration initialization. */
+void cfg_copy(MainInfo *min)
+{
+ if(copy_cmc == NULL)
+ {
+ /* Set the default values for module's options. */
+ copy_options.modified = FALSE;
+ copy_options.copy_dates = TRUE;
+ copy_options.leave_fullsize = TRUE;
+ copy_options.buf_size = (1 << 18);
+
+ copy_cmc = cmc_config_new("Copy", &copy_options);
+ cmc_field_add_boolean(copy_cmc, "modified", NULL, offsetof(OptCopy, modified));
+ cmc_field_add_boolean(copy_cmc, "copy_dates", _("Preserve Dates During Copy?"), offsetof(OptCopy, copy_dates));
+ cmc_field_add_boolean(copy_cmc, "ignore_attrib_err", _("Ignore Failure to Copy Attributes (Date, Owner, Mode)?"), offsetof(OptCopy, ignore_attrib_err));
+ cmc_field_add_boolean(copy_cmc, "leave_fullsize", _("Leave Failed Destination if Full Size?"), offsetof(OptCopy, leave_fullsize));
+ cmc_field_add_size(copy_cmc, "buf_size", _("Buffer Size"), offsetof(OptCopy, buf_size), 1024, (1<<24), 1024);
+ cmc_config_register(copy_cmc);
+ }
+}
diff --git a/src/cmd_copy.h b/src/cmd_copy.h
new file mode 100644
index 0000000..c5ed11e
--- /dev/null
+++ b/src/cmd_copy.h
@@ -0,0 +1,22 @@
+/*
+** 1998-05-23 - Header file for the native COPY command implementation. Shortish.
+*/
+
+/* Core file copying routines, might need a bit more thought on use. */
+extern gboolean copy_regular(MainInfo *min, const gchar *from, const gchar *to, const struct stat *sstat);
+extern gboolean copy_device(MainInfo *min, const gchar *from, const gchar *to, const struct stat *sstat);
+extern gboolean copy_link(MainInfo *min, const gchar *from, const gchar *to, const struct stat *sstat);
+extern gboolean copy_fifo(MainInfo *min, const gchar *from, const gchar *full_to, const struct stat *sstat);
+extern gboolean copy_socket(MainInfo *min, const gchar *from, const gchar *to, const struct stat *sstat);
+
+/* Top-level copying functions, for external use. */
+extern gboolean copy_dir(MainInfo *min, const gchar *from, const gchar *to);
+extern gboolean copy_file(MainInfo *min, const gchar *from, const gchar *to, const struct stat *sstat);
+
+extern gboolean copy_gfile(MainInfo *min, DirPane *src, DirPane *dst, GFile *from, GFile *to, GError **err);
+
+extern gint cmd_copy(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gsize cpy_get_buf_size(void);
+
+extern void cfg_copy(MainInfo *min);
diff --git a/src/cmd_copyas.c b/src/cmd_copyas.c
new file mode 100644
index 0000000..e0f63d0
--- /dev/null
+++ b/src/cmd_copyas.c
@@ -0,0 +1,238 @@
+/*
+** 1998-09-12 - We must have a Copy As command, since it's quite useful. Reuses all
+** copy_XXX() functions defined in the cmd_copy module, of course. Since
+** it so easy, I just had to let this module implement a Clone command, too!
+** 1999-01-03 - No longer passes the stat-structure from the dir listing to the copy module,
+** thus forcing it to do a re-read, which assures that the info (size) is fresh.
+** 1999-03-06 - Adapted for new selection/generic command handling.
+** 1999-05-30 - Added SymLinkAs and SymLinkClone commands. Nice.
+*/
+
+#include "gentoo.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "progress.h"
+#include "strutil.h"
+#include "cmd_copy.h"
+#include "cmd_delete.h"
+#include "cmd_generic.h"
+
+#include "cmd_copyas.h"
+
+#define CMD_ID "copy as"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef enum { CPA_COPYAS, CPA_CLONE, CPA_SYMLINKAS, CPA_SYMLINKCLONE } CpaAction;
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *entry;
+ CpaAction action;
+ MainInfo *min;
+ gint ovw_open;
+} CpaInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-12 - Update body of copy as GUI. */
+static void cpa_copy_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar buf[FILENAME_MAX + 32];
+ const gchar *text;
+ CpaInfo *cpa = user;
+
+ text = dp_row_get_name_display(dp_get_tree_model(src), row);
+ if(cpa->action == CPA_COPYAS)
+ g_snprintf(buf, sizeof buf, _("Enter Name for Copy of \"%s\""), text);
+ else
+ g_snprintf(buf, sizeof buf, _("Enter Name for Clone of \"%s\""), text);
+ gtk_label_set_text(GTK_LABEL(cpa->label), buf);
+ gtk_entry_set_text(GTK_ENTRY(cpa->entry), text);
+ gtk_editable_select_region(GTK_EDITABLE(cpa->entry), 0, -1);
+ gtk_widget_grab_focus(cpa->entry);
+
+ cmd_generic_track_entry(gen, cpa->entry);
+
+ if(cpa->ovw_open == FALSE)
+ {
+ if(cpa->action == CPA_COPYAS)
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Proceed With Copy?"), 0U);
+ else
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Continue With Clone?"), 0U);
+ pgs_progress_begin(min, cpa->action == CPA_COPYAS ? _("Copying As...") : _("Cloning..."), PFLG_COUNT_RECURSIVE | PFLG_ITEM_VISIBLE | PFLG_BYTE_VISIBLE);
+ cpa->ovw_open = TRUE;
+ }
+}
+
+/* 1999-05-30 - Update body for symlink operation. */
+static void cpa_link_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar buf[FILENAME_MAX + 32];
+ const gchar *text;
+ CpaInfo *cpa = user;
+
+ text = dp_row_get_name_display(dp_get_tree_model(src), row);
+ if(cpa->action == CPA_SYMLINKAS)
+ g_snprintf(buf, sizeof buf, _("Enter Name to Link \"%s\" As"), text);
+ else if(cpa->action == CPA_SYMLINKCLONE)
+ g_snprintf(buf, sizeof buf, _("Enter Name for Link Clone of \"%s\""), text);
+ gtk_label_set_text(GTK_LABEL(cpa->label), buf);
+ gtk_entry_set_text(GTK_ENTRY(cpa->entry), text);
+ gtk_editable_select_region(GTK_EDITABLE(cpa->entry), 0, -1);
+ gtk_widget_grab_focus(cpa->entry);
+
+ cmd_generic_track_entry(gen, cpa->entry);
+
+ if(cpa->ovw_open == FALSE)
+ {
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Proceed With Symlink?"), OVWF_NO_RECURSE_TEST);
+ pgs_progress_begin(min, "Linking...", -1);
+ cpa->ovw_open = TRUE;
+ }
+}
+
+/* 2009-09-14 - Creates a symbolic link at <dfile>, whose contents is the basename of <sfile>. */
+static gboolean symlink_gfile(MainInfo *min, DirPane *src, DirPane *dst, const GFile *gfile, const GFile *dfile, GError **error)
+{
+ gchar *bn;
+ gboolean ret = FALSE;
+
+ if(gfile == NULL || dfile == NULL)
+ return FALSE;
+ if((bn = g_file_get_basename((GFile *) gfile)) != NULL)
+ {
+ ret = g_file_make_symbolic_link((GFile *) dfile, bn, NULL, error);
+ g_free(bn);
+ }
+ return ret;
+}
+
+/* 1998-09-12 - Perform action for copy as/clone command. */
+static gint cpa_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user)
+{
+ const gchar *text;
+ CpaInfo *cpa = user;
+ OvwRes ores;
+ GFile *sfile = NULL, *dfile = NULL;
+ gint ret;
+
+ text = gtk_entry_get_text(GTK_ENTRY(cpa->entry));
+ if(text == NULL || *text == '\0')
+ return 0;
+
+ /* Enforce difference between clone and copy: clone name is without path. */
+ switch(cpa->action)
+ {
+ case CPA_COPYAS:
+ case CPA_SYMLINKAS:
+ if(g_utf8_strchr(text, -1, G_DIR_SEPARATOR) == NULL)
+ dfile = dp_get_file_from_name(dst, text);
+ else
+ dfile = g_file_parse_name(text);
+ break;
+ case CPA_CLONE:
+ case CPA_SYMLINKCLONE:
+ if(g_utf8_strchr(text, -1, G_DIR_SEPARATOR) != NULL)
+ return 0;
+ dfile = dp_get_file_from_name(src, text);
+ break;
+ }
+ if(dfile == NULL)
+ return 0;
+
+ ores = ovw_overwrite_unary_file(dst, dfile);
+ if(ores == OVW_SKIP)
+ ret = 1;
+ else if(ores == OVW_CANCEL)
+ ret = 0;
+ else
+ {
+ ret = 1;
+ if(ores == OVW_PROCEED_FILE || ores == OVW_PROCEED_DIR)
+ ret = del_delete_gfile(min, dfile, FALSE, error);
+ if(ret)
+ {
+ if((sfile = dp_get_file_from_row(src, row)) != NULL)
+ {
+ if((cpa->action == CPA_COPYAS) || (cpa->action == CPA_CLONE)) /* Copy? */
+ ret = copy_gfile(min, src, dst, sfile, dfile, error);
+ else
+ ret = symlink_gfile(min, src, dst, sfile, dfile, error);
+ g_object_unref(sfile);
+ }
+ else
+ ret = 0;
+ }
+ }
+ g_object_unref(dfile);
+ if(ret)
+ dp_unselect(src, row);
+
+ return ret;
+}
+
+static void cpa_free(gpointer user)
+{
+ CpaInfo *cpa = user;
+
+ if(cpa->ovw_open)
+ {
+ ovw_overwrite_end(cpa->min);
+ pgs_progress_end(cpa->min);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-12 - Fire up either a COPYAS, CLONE, or SYMLINK command, depending on the <action> arg. */
+static gint copyas_or_clone(MainInfo *min, DirPane *src, DirPane *dst, CpaAction action)
+{
+ static CpaInfo cpa;
+
+ cpa.action = action;
+ cpa.min = min;
+ cpa.ovw_open = FALSE;
+
+ cpa.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ cpa.label = gtk_label_new(_("Copy As"));
+ cpa.entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(cpa.entry), FILENAME_MAX - 1);
+ gtk_box_pack_start(GTK_BOX(cpa.vbox), cpa.label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(cpa.vbox), cpa.entry, FALSE, FALSE, 0);
+
+ if(cpa.action == CPA_COPYAS)
+ return cmd_generic(min, _("Copy As"), CGF_NOALL, cpa_copy_body, cpa_action, cpa_free, &cpa);
+ else if(cpa.action == CPA_CLONE)
+ return cmd_generic(min, _("Clone"), CGF_NOALL | CGF_NODST, cpa_copy_body, cpa_action, cpa_free, &cpa);
+ else if(cpa.action == CPA_SYMLINKAS)
+ return cmd_generic(min, _("Symbolic Link As"), CGF_NOALL, cpa_link_body, cpa_action, cpa_free, &cpa);
+ else if(cpa.action == CPA_SYMLINKCLONE)
+ return cmd_generic(min, _("Symbolic Link Clone"), CGF_NOALL | CGF_NODST, cpa_link_body, cpa_action, cpa_free, &cpa);
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+gint cmd_copyas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ return copyas_or_clone(min, src, dst, CPA_COPYAS);
+}
+
+gint cmd_clone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ return copyas_or_clone(min, src, dst, CPA_CLONE);
+}
+
+gint cmd_symlinkas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ return copyas_or_clone(min, src, dst, CPA_SYMLINKAS);
+}
+
+gint cmd_symlinkclone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ return copyas_or_clone(min, src, dst, CPA_SYMLINKCLONE);
+}
diff --git a/src/cmd_copyas.h b/src/cmd_copyas.h
new file mode 100644
index 0000000..6cfb478
--- /dev/null
+++ b/src/cmd_copyas.h
@@ -0,0 +1,9 @@
+/*
+** 1998-09-12 - Header file for the CopyAs and Clone commands.
+** 1999-05-30 - Added SymLinkAs command, too.
+*/
+
+extern gint cmd_copyas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_clone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_symlinkas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_symlinkclone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_delete.c b/src/cmd_delete.c
new file mode 100644
index 0000000..8437f61
--- /dev/null
+++ b/src/cmd_delete.c
@@ -0,0 +1,283 @@
+/*
+** 1998-05-21 - Everybody's favourite, the native delete command. Dangerous stuff if you don't
+** quite know what you're doing!
+** 1998-05-29 - Converted to use the new cmd_generic module, looks a lot better and actually IS
+** better, too. Gives user more control.
+** 1998-07-28 - Turned on the NODST flag in the cmd_generic call. Really should have done that
+** earlier! Hm. I guess I need more beta testing.
+** 1998-09-18 - Rewrote large parts of this one. Now uses the standard overwrite protection/
+** confirmation module, rather than rolling its own. No longer uses the generic
+** command interface.
+** 1998-12-15 - Commented out the progress reporting, since it didn't work well.
+** 1999-03-06 - Adjusted for the new selection/dirrow access methods.
+** 1999-05-29 - Restructured. Now exports two utility functions handy to use from elsewhere.
+*/
+
+#include "gentoo.h"
+#include "cmdseq_config.h"
+#include "configure.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "gfam.h"
+#include "overwrite.h"
+#include "progress.h"
+
+#include "cmd_delete.h"
+
+#define CMD_ID "delete"
+
+/* ----------------------------------------------------------------------------------------- */
+
+enum { MODE_ASK = 0, MODE_SET, MODE_DONT_SET };
+
+typedef struct { /* Options used by the "Delete" command. */
+ gboolean modified;
+ gint set_mode;
+} OptDelete;
+
+static OptDelete delete_options;
+static CmdCfg *delete_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+#if 0
+static gboolean get_set_mode(MainInfo *min, const gchar *filename)
+{
+ if(delete_options.set_mode == MODE_ASK)
+ {
+ gchar buf[PATH_MAX + 256];
+ GtkWidget *vbox, *label, *check;
+ Dialog *dlg;
+ gint ans;
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ g_snprintf(buf, sizeof buf, _("%s\ncould not be deleted due to access restrictions.\nAttempt to change protection and retry?"), filename);
+ label = gtk_label_new(buf);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ check = gtk_check_button_new_with_label(_("Remember the answer (alters config)"));
+ gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
+ dlg = dlg_dialog_sync_new(vbox, _("Access Problem"), _("Change|Leave Alone"));
+ ans = dlg_dialog_sync_wait(dlg);
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)))
+ {
+ gint arm;
+ if(ans == DLG_POSITIVE)
+ arm = MODE_SET;
+ else
+ arm = MODE_DONT_SET;
+ if(delete_options.set_mode != arm)
+ {
+ delete_options.set_mode = arm;
+ delete_options.modified = TRUE;
+ cfg_modified_set(min);
+ }
+ }
+ dlg_dialog_sync_destroy(dlg);
+ return ans == DLG_POSITIVE;
+ }
+ return delete_options.set_mode == MODE_SET;
+}
+
+/* 2003-10-23 - Set modes of <filename> to something that really should help with deleting.
+** The file itself must be writable, and for a directory executable, and the
+** parent must be writable. Feels a bit dirty.
+*/
+static gboolean set_mode(MainInfo *min, const gchar *filename, gboolean dir)
+{
+ if(get_set_mode(min, filename))
+ {
+ /* First make actual target writable, and executable if directory. */
+ if(chmod(filename, S_IRUSR | S_IWUSR | (dir ? S_IXUSR : 0)) == 0)
+ {
+ gchar parent[PATH_MAX];
+
+ /* Now, compute parent filename, and see if it's a directory. */
+ if(fut_path_canonicalize(filename, parent, sizeof parent))
+ {
+ gchar *sep;
+
+ if((sep = strrchr(parent, G_DIR_SEPARATOR)) != NULL)
+ {
+ struct stat pstat;
+
+ *sep = '\0';
+ if(lstat(parent, &pstat) == 0)
+ {
+ if(S_ISDIR(pstat.st_mode))
+ return chmod(parent, pstat.st_mode | S_IWUSR) == 0;
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean delete_gfile_dir(MainInfo *min, GFile *dir, gboolean progress, GError **err)
+{
+ gboolean ret = TRUE;
+ GFileEnumerator *fe;
+
+ if((fe = g_file_enumerate_children(dir, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ GFileInfo *fi;
+
+ while(ret && (fi = g_file_enumerator_next_file(fe, NULL, err)) != NULL)
+ {
+ GFile *child;
+
+ child = g_file_get_child(dir, g_file_info_get_name(fi));
+ if(child != NULL)
+ {
+ switch(g_file_info_get_file_type(fi))
+ {
+ case G_FILE_TYPE_REGULAR:
+ case G_FILE_TYPE_SYMBOLIC_LINK:
+ case G_FILE_TYPE_SPECIAL:
+ case G_FILE_TYPE_SHORTCUT:
+ ret = g_file_delete(child, NULL, err);
+ break;
+ case G_FILE_TYPE_DIRECTORY:
+ ret = delete_gfile_dir(min, child, progress, err);
+ break;
+ default:
+ ret = FALSE;
+ }
+ g_object_unref(child);
+ }
+ else
+ g_warning("Couldn't get child file");
+ g_object_unref(fi);
+ }
+ g_object_unref(fe);
+ }
+ if(ret)
+ ret = g_file_delete(dir, NULL, err);
+ return ret;
+}
+
+/* 2009-09-07 - Delete a GFile. Takes no prisoners; if the indicated file is a directory,
+** recursively deletes all there is.
+**
+** The caller owns whatever ends up in <error>.
+*/
+gboolean del_delete_gfile(MainInfo *min, const GFile *file, gboolean progress, GError **error)
+{
+ GFileInfo *fi;
+ gboolean ret = FALSE;
+
+ if(min == NULL || file == NULL)
+ return FALSE;
+
+ if((fi = g_file_query_info((GFile *) file, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error)) != NULL)
+ {
+ switch(g_file_info_get_file_type(fi))
+ {
+ case G_FILE_TYPE_REGULAR:
+ case G_FILE_TYPE_SYMBOLIC_LINK:
+ case G_FILE_TYPE_SPECIAL:
+ case G_FILE_TYPE_SHORTCUT:
+ ret = g_file_delete((GFile *) file, NULL, error);
+ break;
+ case G_FILE_TYPE_DIRECTORY:
+ ret = delete_gfile_dir(min, (GFile *) file, progress, error);
+ break;
+ default:
+ ret = FALSE;
+ }
+ g_object_unref(fi);
+ }
+ return ret;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-18 - A new entrypoint for the delete command. Completely replaces the old one,
+** which has been removed.
+*/
+gint cmd_delete(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gboolean ok = TRUE;
+ guint num = 0;
+ GSList *slist, *iter;
+ GError *err = NULL;
+
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ err_clear(min);
+ ovw_overwrite_begin(min, _("Really Delete \"%s\"?"), 0UL);
+ pgs_progress_begin(min, _("Deleting..."), PFLG_BUSY_MODE);
+ fam_rescan_block();
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ DirRow2 *row = iter->data;
+ GFile *file;
+
+ if((file = dp_get_file_from_row(src, iter->data)) != NULL)
+ {
+ gchar *pn = g_file_get_parse_name(file);
+
+ pgs_progress_item_begin(min, pn, 0);
+ g_free(pn);
+ if(pgs_progress_item_update(min, 0) == PGS_PROCEED)
+ {
+ pgs_progress_item_end(min);
+ switch(ovw_overwrite_unary_file(src, file))
+ {
+ case OVW_SKIP:
+ break;
+ case OVW_CANCEL:
+ ok = FALSE;
+ break;
+ case OVW_PROCEED: /* Fall-throughs. */
+ case OVW_PROCEED_DIR:
+ case OVW_PROCEED_FILE:
+ ok = del_delete_gfile(min, file, TRUE, &err);
+ if(ok)
+ {
+ dp_unselect(src, row);
+ num++;
+ }
+ else
+ err_set_gerror(min, &err, CMD_ID, file);
+ break;
+ }
+ }
+ g_object_unref(file);
+ }
+ }
+ fam_rescan_unblock();
+ pgs_progress_end(min);
+ ovw_overwrite_end(min);
+ if(num)
+ dp_rescan_post_cmd(src);
+ dp_free_selection(slist);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-10-23 - Configuration initialization. Simple. */
+void cfg_delete(MainInfo *min)
+{
+ if(delete_cmc == NULL)
+ {
+ /* Set the default values for module's options. */
+ delete_options.modified = FALSE;
+ delete_options.set_mode = MODE_ASK;
+
+ delete_cmc = cmc_config_new("Delete", &delete_options);
+ cmc_field_add_boolean(delete_cmc, "modified", NULL, offsetof(OptDelete, modified));
+ cmc_field_add_enum (delete_cmc, "set_mode", _("On Access Failure"), offsetof(OptDelete, set_mode),
+ _("Ask User|Automatically Try Changing, and Retry|Fail"));
+ cmc_config_register(delete_cmc);
+ }
+}
diff --git a/src/cmd_delete.h b/src/cmd_delete.h
new file mode 100644
index 0000000..7d59f8f
--- /dev/null
+++ b/src/cmd_delete.h
@@ -0,0 +1,12 @@
+/*
+** 1998-05-24 - Header for the built-in Delete command. Can you say "simple"?
+*/
+
+extern gboolean del_delete_dir(MainInfo *min, const gchar *path, gboolean progress);
+extern gboolean del_delete_file(MainInfo *min, const gchar *path);
+
+extern gboolean del_delete_gfile(MainInfo *min, const GFile *file, gboolean progress, GError **error);
+
+extern gint cmd_delete(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern void cfg_delete(MainInfo *min);
diff --git a/src/cmd_direnter.c b/src/cmd_direnter.c
new file mode 100644
index 0000000..3adacfe
--- /dev/null
+++ b/src/cmd_direnter.c
@@ -0,0 +1,121 @@
+/*
+** 1998-09-02 - This command is a bit special, actually. It is designed to be used as the
+** double-click action for directories. If run by a double click, it will attempt
+** to enter the directory clicked. Otherwise, it will enter the first selected
+** directory, if any.
+** 1999-01-20 - Added calls to the automount module at the relevant points.
+** 1999-03-06 - Rewritten to comply with new selection architecture. Way shorter.
+** 1999-05-07 - Added support for command argument specifying wanted directory.
+** 1999-05-29 - Removed one character, magically bringing support for symlinks back online. :)
+** 1999-06-06 - Moved parts of dp_enter_dir() here, since its now customary to call DirEnter
+** rather than the dp code directly. Makes history handling easier, too. Implemented
+** a couple of new history commands (DirBackward & DirForward). Real neat.
+*/
+
+#include "gentoo.h"
+#include "errors.h"
+#include "dirhistory.h"
+#include "dirpane.h"
+#include "fileutil.h"
+#include "gfam.h"
+#include "guiutil.h"
+#include "strutil.h"
+#include "userinfo.h"
+
+#include "cmd_parent.h"
+#include "cmd_direnter.h"
+
+#define CMD_ID "direnter"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-07 - Get the name of the first selected row of <dp>. If that is not a directory,
+** report error to user and return NULL.
+** 2010-03-04 - Now returns the URI of the first selected directory, which is a bit more GIO.
+*/
+static gboolean get_selected_dir(DirPane *dp, gchar *buf, gsize buf_max)
+{
+ GSList *slist;
+ gboolean ok = FALSE;
+
+ /* FIXME: This is kind of wasteful. Maybe invent some dp_get_selection_first() function? */
+ if((slist = dp_get_selection(dp)) != NULL)
+ {
+ if(dp_row_get_file_type(dp_get_tree_model(dp), slist->data, TRUE) == G_FILE_TYPE_DIRECTORY)
+ {
+ GFile *file;
+
+ if((file = dp_get_file_from_row(dp, slist->data)) != NULL)
+ {
+ gchar *uri = g_file_get_uri(file);
+
+ if(uri != NULL)
+ {
+ ok = (g_strlcpy(buf, uri, buf_max) < buf_max);
+ if(ok)
+ dp_unselect(dp, slist->data);
+ g_free(uri);
+ }
+ g_object_unref(file);
+ }
+ }
+ dp_free_selection(slist);
+ }
+ return ok;
+}
+
+/* 1999-05-07 - Rewrote this, now supports a "dir" command argument.
+** 1999-06-06 - Now does all work through the dirhistory module.
+*/
+gint cmd_direnter(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *dir;
+ gchar uri[URI_MAX] = "";
+ guint index;
+ gboolean ok = FALSE;
+
+ if((dir = car_bareword_get(ca, 0)) == NULL)
+ dir = car_keyword_get_value(ca, "dir", NULL);
+ if(dir != NULL)
+ {
+ if(strcmp(dir, "@cwd") == 0) /* Actual current directory? */
+ {
+ dir = getcwd(uri, sizeof uri);
+ if(dir == NULL)
+ dir = usr_get_home();
+ }
+ else if(sscanf(dir, "@history[%u]", &index) == 1) /* Access history buffer? */
+ {
+ dir = dph_dirhistory_get_entry(src->hist, index);
+ if(dir == NULL)
+ dir = usr_get_home();
+ }
+ if(dir != NULL)
+ ok = g_strlcpy(uri, dir, sizeof uri) < sizeof uri;
+ }
+ if(!ok)
+ ok = get_selected_dir(src, uri, sizeof uri);
+ if(!ok)
+ {
+ g_warning("** cmd_direnter() exhausted known ways to get a directory--aborting");
+ return 0;
+ }
+
+ fut_interpolate(uri);
+ dph_state_save(src);
+ if(dp_enter_dir(src, uri))
+ {
+ /* Annoying hacky code to get GTK+ to resize the pane before we restore
+ ** the history state; if not resized, vpos setting will likely fail.
+ */
+ gtk_widget_queue_resize(GTK_WIDGET(src->view));
+ gui_events_flush();
+ dph_state_restore(src);
+ dp_show_stats(src);
+ fam_monitor(src);
+ return 1;
+ }
+ g_warning("** Pane #%d failed to enter '%s'", src->index, uri);
+
+ return 0;
+}
diff --git a/src/cmd_direnter.h b/src/cmd_direnter.h
new file mode 100644
index 0000000..fd0e656
--- /dev/null
+++ b/src/cmd_direnter.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-02 - Header for the (pretty cool) command DirEnter.
+*/
+
+extern gint cmd_direnter(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_dirrescan.c b/src/cmd_dirrescan.c
new file mode 100644
index 0000000..b3cc820
--- /dev/null
+++ b/src/cmd_dirrescan.c
@@ -0,0 +1,27 @@
+/*
+** 1998-06-04 - An encapsulation of the DirPane's rescan function as a native command.
+** Highly useful, especially in menus.
+*/
+
+#include "gentoo.h"
+
+#include "cmdseq.h"
+#include "dirpane.h"
+#include "dirhistory.h"
+#include "errors.h"
+
+#include "cmd_dirrescan.h"
+
+#define CMD_ID "dirrescan"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-07-19 - Rescan source directory.
+** 2010-03-04 - Removed all pretense that this does error detection or reporting.
+*/
+gint cmd_dirrescan(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_rescan(src); /* FIXME: There ought to be a way for this to report failure. */
+ dp_show_stats(src);
+ return 1;
+}
diff --git a/src/cmd_dirrescan.h b/src/cmd_dirrescan.h
new file mode 100644
index 0000000..08505a2
--- /dev/null
+++ b/src/cmd_dirrescan.h
@@ -0,0 +1,5 @@
+/*
+** 1998-06-04 - Another one-line header.
+*/
+
+extern gint cmd_dirrescan(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_dpfocus.c b/src/cmd_dpfocus.c
new file mode 100644
index 0000000..5afe452
--- /dev/null
+++ b/src/cmd_dpfocus.c
@@ -0,0 +1,27 @@
+/*
+** 1999-05-10 - A module to deal with the command group DpFocus, the purpose of which is
+** to (finally!) make keyboard navigation possible in gentoo. Should at least
+** give people something else to mail me about. :^)
+*/
+
+#include "gentoo.h"
+
+#include "dirpane.h"
+#include "cmdarg.h"
+#include "cmdseq_config.h"
+#include "nag_dialog.h"
+#include "cmd_dpfocus.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-10 - Do some focusing. */
+gint cmd_dpfocus(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ /* We no longer support this command, so nag to the user about its demise. */
+ ndl_dialog_sync_new_wait(min, "dpfocus-deprecated", _("DpFocus Command is Deprecated"),
+ _("The <tt>DpFocus</tt> command has been deprecated and is no longer "
+ "supported. Please remove any keyboard or mouse bindings that use it "
+ "and look into using the default GTK+ list view's cursor controls."));
+
+ return 1;
+}
diff --git a/src/cmd_dpfocus.h b/src/cmd_dpfocus.h
new file mode 100644
index 0000000..32a11ee
--- /dev/null
+++ b/src/cmd_dpfocus.h
@@ -0,0 +1,9 @@
+/*
+** 1999-05-10 - Header for the dirpane focus manipulation command DpFocus.
+*/
+
+extern gboolean dpf_get_fake_select(void);
+extern gboolean dpf_get_focus_select(void);
+
+extern gint cmd_dpfocus(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern void cfg_dpfocus(MainInfo *min);
diff --git a/src/cmd_dpfocusisrch.c b/src/cmd_dpfocusisrch.c
new file mode 100644
index 0000000..7123026
--- /dev/null
+++ b/src/cmd_dpfocusisrch.c
@@ -0,0 +1,177 @@
+/*
+** 2003-11-04 - Incremental search. Better late than never, right?
+*/
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "gentoo.h"
+#include "cmdseq.h"
+#include "dialog.h"
+#include "dirpane.h"
+
+#include "cmd_dpfocusisrch.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *hbox; /* Really should start with hbox. */
+ GtkWidget *label, *entry;
+} ISearchWidgetry;
+
+/* Various state, kept as a static global. Ugly, but simplifies things. */
+static struct {
+ DirPane *pane; /* Non-NULL during ISearch, NULL when not in use. */
+ guint page;
+ MainInfo *min;
+ char * (*search)(const char *haystack, const char *needle);
+ gboolean offset_use;
+ guint offset;
+ gboolean select;
+ ISearchWidgetry *wid;
+
+ gulong sig_activate, sig_focus_out, sig_key_press;
+} the_isearch_info = { NULL };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-08 - Close down incremental search. Hides widgetry. */
+static void isearch_close(void)
+{
+ MainInfo *min = the_isearch_info.min;
+ GtkWidget *entry = the_isearch_info.wid->entry;
+ DirPane *pane = the_isearch_info.pane;
+
+ /* Don't run if state seems invalid, close might already be in progress. */
+ if(pane != NULL)
+ {
+ g_signal_handler_disconnect(G_OBJECT(entry), the_isearch_info.sig_activate);
+ g_signal_handler_disconnect(G_OBJECT(entry), the_isearch_info.sig_key_press);
+ g_signal_handler_disconnect(G_OBJECT(entry), the_isearch_info.sig_focus_out);
+
+ the_isearch_info.pane = NULL; /* Protect againsts against nesting. */
+ dp_pathwidgetry_show(pane, 0U);
+
+ kbd_context_attach(min->gui->kbd_ctx, GTK_WINDOW(min->gui->window));
+ }
+}
+
+/* 2003-11-04 - Handle keypresses. Traps special keys for handy functionality. */
+static gint evt_isearch_keypress(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ if(evt->keyval == GDK_KEY_Escape || (evt->keyval == GDK_KEY_g && (evt->state & GDK_CONTROL_MASK) != 0))
+ {
+ isearch_close();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gint evt_isearch_activate(GtkWidget *wid, gpointer user)
+{
+ isearch_close();
+ return TRUE;
+}
+
+static gint evt_isearch_focus_out(GtkWidget *wid, GdkEventFocus *evt, gpointer user)
+{
+ isearch_close();
+ return FALSE;
+}
+
+/* 2010-03-19 - Callback for the TreeView's search. Gets a column number passed in, but ignores that and always uses name.
+** The return logic here is wack, which is why we're seemingly returning the inverse of what makes sense.
+** We're hardcoded to always check for the display name, regardless of the 'column' GTK+ hands us.
+*/
+static gboolean cb_search_compare(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer user)
+{
+ const gchar *dname = dp_row_get_name_display(model, (DirRow2*) iter);
+
+ if(dname != NULL)
+ {
+ if(the_isearch_info.offset_use)
+ {
+ const gsize len = g_utf8_strlen(dname, -1);
+ if(the_isearch_info.offset < len)
+ dname = g_utf8_offset_to_pointer(dname, the_isearch_info.offset);
+ else
+ return TRUE;
+ return !(strstr(dname, key) == dname);
+ }
+ return !(strstr(dname, key) != NULL);
+ }
+ return TRUE;
+}
+
+/* 2003-11-04 - Incremental search. Initial implementation, with a rather non-satisfying UI. */
+gint cmd_dpfocusisrch(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GtkWidget *entry;
+ const gchar *text, *start;
+
+ if(the_isearch_info.pane != NULL)
+ return FALSE;
+ kbd_context_detach(min->gui->kbd_ctx, GTK_WINDOW(min->gui->window));
+
+ the_isearch_info.pane = src;
+ the_isearch_info.min = min;
+ the_isearch_info.wid = (ISearchWidgetry *) dp_pathwidgetry_show(src, the_isearch_info.page);
+ entry = the_isearch_info.wid->entry;
+ gtk_widget_grab_focus(entry);
+
+ gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(src->view), cb_search_compare, src, NULL);
+ gtk_tree_view_set_search_column(GTK_TREE_VIEW(src->view), 0);
+ gtk_tree_view_set_search_entry(GTK_TREE_VIEW(src->view), GTK_ENTRY(entry));
+
+ the_isearch_info.sig_activate = g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(evt_isearch_activate), NULL);
+ the_isearch_info.sig_key_press = g_signal_connect(G_OBJECT(entry), "key_press_event", G_CALLBACK(evt_isearch_keypress), NULL);
+ the_isearch_info.sig_focus_out = g_signal_connect(G_OBJECT(entry), "focus_out_event", G_CALLBACK(evt_isearch_focus_out), NULL);
+
+ the_isearch_info.offset_use = FALSE;
+ the_isearch_info.offset = 0;
+ if((start = car_keyword_get_value(ca, "start", "0")) != NULL)
+ {
+ gchar *eptr;
+ guint o;
+
+ o = strtoul(start, &eptr, 0);
+ if(eptr > start)
+ {
+ the_isearch_info.offset_use = TRUE;
+ the_isearch_info.offset = (guint) o;
+ }
+ }
+ the_isearch_info.select = car_keyword_get_boolean(ca, "select", FALSE);
+
+ if((text = car_keyword_get_value(ca, "text", NULL)) != NULL)
+ gtk_entry_set_text(GTK_ENTRY(entry), text);
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-08 - Build dirpane path widgetry for incremental search. */
+static GtkWidget ** widgetry_builder(MainInfo *min)
+{
+ ISearchWidgetry *wid;
+
+ wid = g_malloc(sizeof *wid);
+ wid->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ wid->label = gtk_label_new(_("ISearch"));
+ gtk_box_pack_start(GTK_BOX(wid->hbox), wid->label, FALSE, FALSE, 5);
+ wid->entry = gtk_entry_new();
+ gtk_box_pack_start(GTK_BOX(wid->hbox), wid->entry, TRUE, TRUE, 0);
+
+ return (GtkWidget **) wid;
+}
+
+/* 2003-11-08 - Configure DpFocusISrch. Does not add user-settable options, just registers
+** a new pathwidgetry builder with the dirpane subsystem. Italian food.
+*/
+void cfg_dpfocusisrch(MainInfo *min)
+{
+ the_isearch_info.page = dp_pathwidgetry_add(widgetry_builder);
+}
diff --git a/src/cmd_dpfocusisrch.h b/src/cmd_dpfocusisrch.h
new file mode 100644
index 0000000..f4defcd
--- /dev/null
+++ b/src/cmd_dpfocusisrch.h
@@ -0,0 +1,6 @@
+/*
+** 2003-11-04 - Incremental search.
+*/
+
+extern gint cmd_dpfocusisrch(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern void cfg_dpfocusisrch(MainInfo *min);
diff --git a/src/cmd_dpmisc.c b/src/cmd_dpmisc.c
new file mode 100644
index 0000000..ad4eeb2
--- /dev/null
+++ b/src/cmd_dpmisc.c
@@ -0,0 +1,155 @@
+/*
+** 1998-12-19 - Toggle the hide allowed flag of the source pane, update the toggle button
+** accordingly, and do a rescan.
+** 1999-03-15 - Stuck the DpRecenter command in here, and renamed the entire module (was dphide).
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "cmdseq.h"
+#include "configure.h"
+#include "dirpane.h"
+#include "cmd_dpmisc.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+gint cmd_dphide(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ DPFormat *fmt;
+
+ fmt = &min->cfg.dp_format[src->index];
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(src->hide), !fmt->hide_allowed);
+ csq_execute(min, "DirRescan");
+
+ return 1;
+}
+
+/* 1999-03-15 - Recenter the horizontal pane betweeen the, er, panes. Very useful.
+** 1999-08-28 - Now handles centering the pane even if the main window has not yet been made visible.
+** 1999-12-23 - Updated to deal with the new window utility module.
+** 2009-07-04 - Refactored to nearly nothing, but a very clear nothing.
+*/
+gint cmd_dprecenter(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ min->cfg.dp_paning.value = 0.5;
+ dp_split_refresh(min);
+ return 1;
+}
+
+/* 2002-05-01 - A command to toggle the pane orientation. */
+gint cmd_dpreorient(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gint tmp;
+ DpOrient orient = min->cfg.dp_paning.orientation;
+
+ tmp = car_keyword_get_enum(ca, "orient", -1, "h", "horiz", "horizontal", "v", "vert", "vertical", NULL);
+ if(tmp == -1)
+ orient = min->cfg.dp_paning.orientation == DPORIENT_HORIZ ? DPORIENT_VERT : DPORIENT_HORIZ;
+ else if(tmp < 3)
+ orient = DPORIENT_HORIZ;
+ else if(tmp >= 3 && tmp < 6)
+ orient = DPORIENT_VERT;
+ if(orient != min->cfg.dp_paning.orientation)
+ {
+ if(!car_bareword_present(ca, "quiet"))
+ cfg_modified_set(min);
+
+ min->cfg.dp_paning.orientation = orient;
+ rebuild_middle(min);
+ rebuild_bottom(min);
+ /* Make sure the split is maintained at the configured size. */
+ dp_split_refresh(min);
+
+ csq_execute(min, "ActivateOther");
+ csq_execute(min, "DirRescan");
+ csq_execute(min, "ActivateOther");
+ csq_execute(min, "DirRescan");
+ }
+ return 1;
+}
+
+/* 2010-10-05 - Maximize the source pane, or the one indexed if an argument is given. */
+gint cmd_dpmaximize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gint index = car_keyword_get_integer(ca, "index", -1);
+
+ if(index < 0)
+ index = src->index;
+ if(index < 0 || index >= sizeof min->gui->pane / sizeof *min->gui->pane)
+ return 0;
+
+ min->cfg.dp_paning.value = (index == 0) ? 1.0 : 0.0f;
+ dp_split_refresh(min);
+
+ return 1;
+}
+
+/* 1999-09-14 - This command (or something similar) implemented after suggestion by
+** Jarle Thorsen <jthorsen@iname.com>. It allows you to scroll a pane's
+** contents so that the first row beginning with a specified letter becomes
+** visible.
+*/
+gint cmd_dpgotorow(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *value;
+ gint rowno;
+ GtkTreePath *path = NULL;
+ const gboolean focus = car_keyword_get_boolean(ca, "focus", FALSE);
+
+ if((value = car_keyword_get_value(ca, "re", NULL)) != NULL)
+ {
+ const guint nocase = car_keyword_get_boolean(ca, "nocase", FALSE);
+ GRegex *re;
+
+ if((re = g_regex_new(value, G_REGEX_EXTENDED | (nocase ? G_REGEX_CASELESS : 0), G_REGEX_MATCH_NOTEMPTY, NULL)) != NULL)
+ {
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(m, &iter))
+ {
+ do
+ {
+ if(g_regex_match(re, dp_row_get_name_display(m, &iter), G_REGEX_MATCH_NOTEMPTY, NULL))
+ {
+ path = gtk_tree_model_get_path(m, &iter);
+ break;
+ }
+ } while(gtk_tree_model_iter_next(m, &iter));
+ }
+ g_regex_unref(re);
+ }
+ }
+ else if((rowno = car_keyword_get_integer(ca, "row", -1)) > 0)
+ path = gtk_tree_path_new_from_indices(rowno, -1);
+
+ if(path != NULL)
+ {
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(src->view), path, NULL, FALSE, 0.f, 0.f);
+ if(focus)
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(src->view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+ }
+ return path != NULL;
+}
+
+/* 1999-11-21 - Move GTK+ input focus to the path text entry box. Very handy. */
+gint cmd_dpfocuspath(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ guint select, clear;
+
+ select = car_keyword_get_boolean(ca, "select", FALSE);
+ clear = car_keyword_get_boolean(ca, "clear", FALSE);
+
+ gtk_editable_set_position(GTK_EDITABLE(DP_ENTRY(src)), -1);
+
+ if(select)
+ gtk_editable_select_region(GTK_EDITABLE(DP_ENTRY(src)), 0, 3);
+ else if(clear)
+ dp_path_clear(src);
+ dp_path_focus(src);
+
+ return 1;
+}
diff --git a/src/cmd_dpmisc.h b/src/cmd_dpmisc.h
new file mode 100644
index 0000000..e09e61c
--- /dev/null
+++ b/src/cmd_dpmisc.h
@@ -0,0 +1,11 @@
+/*
+** 1998-12-19 - Header for the DpHide command implementation.
+** 1999-03-15 - Renamed when I added the recenter command.
+*/
+
+extern gint cmd_dphide(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_dprecenter(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_dpreorient(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_dpmaximize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_dpgotorow(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_dpfocuspath(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_file.c b/src/cmd_file.c
new file mode 100644
index 0000000..3fab06b
--- /dev/null
+++ b/src/cmd_file.c
@@ -0,0 +1,70 @@
+/*
+** 1998-09-02 - The VIEW command. Tries to view the double-clicked file, or all selected
+** ones. Is pretty cool, since it can envoke other commands if file styles
+** call for that (through a setting of the View action).
+** 1998-09-05 - Introducing two more closely related commands (EDIT and PRINT) made me
+** notice the lousy design of the old VIEW command. Redesigned, and renamed
+** the entire module - this is now the cmd_file module.
+** 1998-09-14 - Renamed the DOUBLECLICK command; it's now called FileDefault.
+** 1999-03-06 - Changes for the recently redesigned selection management.
+** 1999-05-20 - Big, sweping changes due to new style system. Removed old hard-coded
+** action commands (FileEdit, FileView, etc), replacing them with the new
+** general FileAction command.
+** 2000-09-05 - Added magic for single-selection case.
+*/
+
+#include "gentoo.h"
+#include "cmdseq.h"
+#include "dirpane.h"
+#include "styles.h"
+#include "cmdarg.h"
+
+#include "cmd_file.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - Run a command on the currently selected files. The <action> is the action property
+** name (e.g. stuff like "Default", "View", etc), not an actual command sequence.
+*/
+static gint file_command(MainInfo *min, DirPane *src, const gchar *action)
+{
+ GSList *slist;
+
+ if((slist = dp_get_selection(src)) != NULL)
+ {
+ const gchar *cmd;
+
+ /* If only one row is selected, that might come from the focus, and then
+ ** requires a somewhat special treatment.
+ */
+ if(g_slist_next(slist) == NULL)
+ {
+ if((cmd = stl_style_property_get_action(dp_row_get_ftype(dp_get_tree_model(src), slist->data)->style, action)) != NULL)
+ {
+ csq_execute(min, cmd);
+ }
+ }
+ else
+ {
+ const GSList *iter;
+
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ if((cmd = stl_style_property_get_action(dp_row_get_ftype(dp_get_tree_model(src), iter->data)->style, action)) != NULL)
+ csq_execute(min, cmd);
+ }
+ }
+ dp_free_selection(slist);
+ }
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - New entrypoint for general file action access. Very cool. */
+gint cmd_fileaction(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *action = car_keyword_get_value(ca, "action", "Default");
+
+ return file_command(min, src, action);
+}
diff --git a/src/cmd_file.h b/src/cmd_file.h
new file mode 100644
index 0000000..3d9e5fa
--- /dev/null
+++ b/src/cmd_file.h
@@ -0,0 +1,5 @@
+/*
+** 1999-05-20 - Header for the FileAction command.
+*/
+
+extern gint cmd_fileaction(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_generic.c b/src/cmd_generic.c
new file mode 100644
index 0000000..35bb92e
--- /dev/null
+++ b/src/cmd_generic.c
@@ -0,0 +1,213 @@
+/*
+** 1998-05-29 - I wisen up, and design a generic command dialog interface. Might come in handy. This will
+** support the Opus-like OK, All, Skip and Cancel buttons for all commands using it (i.e. delete,
+** rename, protect etc). Great.
+** 1998-06-04 - Added flags to the cmd_generic() call, allowing different commands to tailor the generic part
+** somewhat. Specifically, that means that some commands (rename) now can get rid of the "All" button.
+** 1998-07-09 - Added flag CGF_NODIRS, which avoids calling body() or action() on dirs. Required by the split
+** command.
+** 1998-07-10 - Added CGF_NOENTER/NOESC, which disable the new keyboard shortcuts.
+** 1998-07-27 - Renamed the CGF_NOENTER flag to CGF_NORETURN. Better.
+** 1998-09-12 - Implemented the CGF_SRC flag for source pane rescanning.
+** 2002-08-19 - Congrats, sis! :) Rewrote to use dialog module, shrinking it down nicely.
+*/
+
+#include "gentoo.h"
+
+#include <gdk/gdkkeysyms.h>
+
+#include "dialog.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "dirpane.h"
+
+#include "cmd_generic.h"
+
+struct gen_info {
+ guint32 flags;
+
+ MainInfo *min;
+ DirPane *src, *dst;
+ GSList *s_slist; /* Source pane selection. */
+ const GSList *s_iter; /* Source selection iterator. */
+
+ GenBodyFunc bf;
+ GenActionFunc af;
+ GenFreeFunc ff;
+ GError *error; /* For action function to report any error in. */
+ gpointer user; /* User's data, passed on in callbacks. */
+ gboolean open;
+ gboolean need_update; /* Set if user's action function has been called. */
+ gboolean ok; /* Tracks success/fail of last action. */
+
+ Dialog *dlg;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-29 - This is run when user clicks "Cancel", or when we run out of entries to
+** work on. It simply closes everything down.
+*/
+static void end_command(struct gen_info *gen)
+{
+ if(gen->s_slist != NULL)
+ {
+ dp_free_selection(gen->s_slist);
+ gen->s_slist = NULL;
+ }
+ if(gen->dlg != NULL) /* Protect against the evils of uncontrolled recursion. */
+ {
+ if(gen->ff != NULL)
+ gen->ff(gen->user); /* Let caller free his stuff. */
+ dlg_dialog_sync_destroy(gen->dlg);
+ gen->dlg = NULL;
+ gen->open = FALSE;
+ if(gen->need_update)
+ {
+ if(gen->flags & CGF_SRC)
+ dp_rescan(gen->src);
+ if(!(gen->flags & CGF_NODST))
+ dp_rescan(gen->dst);
+ gen->need_update = FALSE;
+ }
+ }
+}
+
+/* 2009-09-19 - Filter out current row, based on its file type. Returns TRUE if row is to be included. */
+static gboolean type_filter(const struct gen_info *gen)
+{
+ /* We need both target file type and actual non-following type. */
+ const GFileType tft = dp_row_get_file_type(dp_get_tree_model(gen->src), gen->s_iter->data, TRUE);
+ const GFileType ft = dp_row_get_file_type(dp_get_tree_model(gen->src), gen->s_iter->data, FALSE);
+ if((gen->flags & CGF_NODIRS) && (tft == G_FILE_TYPE_DIRECTORY))
+ return FALSE;
+ else if((gen->flags & CGF_LINKSONLY) && (ft != G_FILE_TYPE_SYMBOLIC_LINK))
+ return FALSE;
+ return TRUE;
+}
+
+/* 1998-05-29 - Find the first selected entry, initialize body using it, and return 1.
+** If no selected entry was found, 0 is returned.
+*/
+static gint first_body(struct gen_info *gen)
+{
+ for(gen->s_iter = gen->s_slist; gen->s_iter != NULL; gen->s_iter = g_slist_next(gen->s_iter))
+ {
+ if(type_filter(gen))
+ {
+ gen->bf(gen->min, gen->src, gen->s_iter->data, gen, gen->user);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* 1998-05-29 - Find the next selected entry, and generate body using it. If none is
+** found, we terminate by calling end_command().
+** 1999-03-05 - Rewritten for new selection and general call format.
+*/
+static void next_or_end(struct gen_info *gen)
+{
+ for(gen->s_iter = g_slist_next(gen->s_iter); gen->s_iter != NULL; gen->s_iter = g_slist_next(gen->s_iter))
+ {
+ if(!type_filter(gen))
+ continue;
+ gen->bf(gen->min, gen->src, gen->s_iter->data, gen, gen->user);
+ return;
+ }
+ end_command(gen);
+}
+
+/* 1998-05-29 - Execute the command on all selected entries, from the current and
+** onwards. Then close down the dialog and exit.
+*/
+static void all_then_end(struct gen_info *gen)
+{
+ for(; gen->s_iter != NULL; gen->s_iter = g_slist_next(gen->s_iter))
+ {
+ if(!type_filter(gen))
+ continue;
+ gen->need_update = TRUE;
+ if(!gen->af(gen->min, gen->src, gen->dst, gen->s_iter->data, &gen->error, gen->user))
+ break;
+ }
+ end_command(gen);
+}
+
+/* 1998-05-29 - General purpose command execution framework entry point.
+** 1998-05-31 - Set the CAN_DEFAULT flag on all four buttons, making them a lot
+** lower (of course). This made it look somewhat better.
+*/
+gint cmd_generic(MainInfo *min, const gchar *title, guint32 flags, GenBodyFunc bf, GenActionFunc af, GenFreeFunc ff, gpointer user)
+{
+ const gchar *btn1 = N_("_OK|A_ll|_Skip|_Cancel"),
+ *btn2 = N_("_OK|_Skip|_Cancel"), *btn;
+ static struct gen_info gen;
+
+ gen.flags = flags;
+ gen.min = min;
+ gen.src = min->gui->cur_pane;
+ gen.dst = dp_mirror(min, gen.src);
+
+ if((gen.s_iter = gen.s_slist = dp_get_selection(gen.src)) == NULL) /* No selection? */
+ return 0;
+
+ gen.bf = bf;
+ gen.af = af;
+ gen.ff = ff;
+
+ gen.open = TRUE;
+ gen.error = NULL;
+ gen.user = user;
+ gen.need_update = FALSE;
+ gen.ok = FALSE;
+
+ btn = _((flags & CGF_NOALL) ? btn2 : btn1);
+ gen.dlg = dlg_dialog_sync_new(*(GtkWidget **) user, title, btn);
+ /* Make dialog stay open, and in place, after wait() returns. Less annoying. */
+ dlg_dialog_sync_stay_open(gen.dlg);
+
+ if(first_body(&gen))
+ {
+ gint bid_ok = DLG_POSITIVE, bid_all = bid_ok + 1, bid_skip = bid_all + 1, bid_cancel = bid_skip + 1;
+ gint reply;
+
+ if(flags & CGF_NOALL) /* Adjust button IDs if no "All" present. */
+ bid_all = -1, bid_skip--, bid_cancel--;
+
+ gen.ok = TRUE;
+ while(gen.open && gen.ok)
+ {
+ reply = dlg_dialog_sync_wait(gen.dlg);
+ if(reply == bid_ok)
+ {
+ gen.need_update = TRUE;
+ if(!(gen.ok = gen.af(gen.min, gen.src, gen.dst, gen.s_iter->data, &gen.error, gen.user)))
+ {
+ err_set_gerror(min, &gen.error, title, dp_get_file_from_row(gen.src, gen.s_iter->data));
+ end_command(&gen);
+ }
+ else
+ next_or_end(&gen);
+ }
+ else if(reply == bid_all)
+ all_then_end(&gen);
+ else if(reply == bid_skip)
+ next_or_end(&gen);
+ else
+ end_command(&gen);
+ }
+ }
+ if(gen.dlg != NULL)
+ dlg_dialog_sync_destroy(gen.dlg);
+
+ return gen.ok;
+}
+
+/* 2010-06-13 - Track the state of an entry widget, allowing the command to execute only for non-empty strings. */
+void cmd_generic_track_entry(gpointer gen, GtkWidget *entry)
+{
+ struct gen_info *real_gen = gen;
+
+ dlg_dialog_track_entry(real_gen->dlg, entry);
+}
diff --git a/src/cmd_generic.h b/src/cmd_generic.h
new file mode 100644
index 0000000..b2360b1
--- /dev/null
+++ b/src/cmd_generic.h
@@ -0,0 +1,27 @@
+/*
+** 1998-05-29 - Header file for the generic command interface. A little more meat than other
+** command headers.
+*/
+
+#if !defined CMD_GENERIC_H
+#define CMD_GENERIC_H
+
+enum { CGF_NOALL = 1<<0, /* Skip the "All" button, useful for e.g. cmd_rename. */
+ CGF_NODST = 1<<1, /* Don't rescan the destination after command completes. */
+ CGF_NODIRS = 1<<2, /* Never call the body or action function on a directory. */
+ CGF_NORETURN = 1<<3, /* Don't bind Return to OK button. */
+ CGF_NOESC = 1<<4, /* Don't bind Escape to Cancel-button. */
+ CGF_SRC = 1<<5, /* DO rescan the SOURCE after completion (great for Clone). */
+ CGF_LINKSONLY = 1 << 6 /* Exclude all entries that are not symbolic links. Kind of specialized. */
+ };
+
+typedef void (*GenBodyFunc)(MainInfo *min, DirPane *src, DirRow2 *row, gpointer generic, gpointer user);
+typedef gint (*GenActionFunc)(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user);
+typedef void (*GenFreeFunc)(gpointer user);
+
+extern gint cmd_generic(MainInfo *min, const gchar *title, guint32 flags, GenBodyFunc bf, GenActionFunc af,
+ GenFreeFunc ff, gpointer user);
+
+extern void cmd_generic_track_entry(gpointer gen, GtkWidget *entry);
+
+#endif /* CMD_GENERIC_H */
diff --git a/src/cmd_getsize.c b/src/cmd_getsize.c
new file mode 100644
index 0000000..4cfc839
--- /dev/null
+++ b/src/cmd_getsize.c
@@ -0,0 +1,137 @@
+/*
+** 1998-09-12 - This is GETSIZE, a recursive size computation command. It will assign
+** the size of all contained files to directories.
+** 1998-12-19 - Rewritten to use the new fut_dir_size() function, rather than its own
+** routine. Simpler.
+** 1999-03-06 - Adjusted for the new selection handling.
+** 1999-04-09 - Added the cmd_clearsize() function, implementing the ClearSize command.
+*/
+
+#include "gentoo.h"
+
+#include <fcntl.h>
+
+#include "fileutil.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "progress.h"
+#include "cmdseq_config.h"
+
+#include "cmd_getsize.h"
+
+#define CMD_ID "getsize"
+#define CMD_ID2 "clearsize"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ gboolean modified;
+ gboolean unselect; /* Unselect rows when done computing size? */
+} OptGetSize;
+
+static OptGetSize getsize_options;
+static CmdCfg *getsize_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-12 - Recursive directory sizer.
+** 1999-04-09 - Now also updates the blocks field of the directory's stat buffer.
+*/
+gint cmd_getsize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GSList *slist, *iter;
+ guint num = 0;
+ FUCount fuc;
+ gboolean ok = TRUE;
+ GError *err = NULL;
+
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+ pgs_progress_begin(min, _("Getting sizes..."), PFLG_BUSY_MODE);
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ if(dp_row_get_file_type(m, iter->data, TRUE) == G_FILE_TYPE_DIRECTORY)
+ {
+ GFile *here = dp_get_file_from_row(src, iter->data);
+
+ if((ok = fut_size_gfile(min, here, NULL, &fuc, &err)))
+ {
+ dp_row_set_size(m, iter->data, fuc.num_bytes);
+ dp_row_set_flag(m, iter->data, DPRF_HAS_SIZE);
+ num++;
+ if(getsize_options.unselect)
+ dp_unselect(src, iter->data);
+ }
+ else
+ err_set_gerror(min, &err, CMD_ID, here);
+ }
+ }
+ pgs_progress_end(min);
+ dp_free_selection(slist);
+
+ if(num)
+ {
+ dp_update_stats(src);
+ dp_show_stats(src);
+ }
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-09 - Clear the recursive sizes from all selected directories. Ignores files, but
+** unselects them.
+*/
+gint cmd_clearsize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GSList *slist, *iter;
+ guint num = 0;
+ GError *err = NULL;
+ gboolean ok = TRUE;
+
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ if(dp_row_get_file_type(m, iter->data, TRUE) == G_FILE_TYPE_DIRECTORY && dp_row_get_flags(m, iter->data, DPRF_HAS_SIZE))
+ {
+ /* Now, we need to re-scan the file's info, and replace it in the model. Interesting, but
+ ** clearly a nitty job that needs to be done inside the dirpane module, not inline here.
+ */
+ ok = dp_rescan_row(src, iter->data, &err);
+ if(!ok)
+ err_set_gerror(min, &err, CMD_ID2, dp_get_file_from_row(src, iter->data));
+ num++;
+ }
+ if(getsize_options.unselect)
+ dp_unselect(src, iter->data);
+ }
+ dp_free_selection(slist);
+
+ if(num)
+ {
+ dp_update_stats(src);
+ dp_show_stats(src);
+ }
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-25 - Configure the GetSize command's (few) options. */
+void cfg_getsize(MainInfo *min)
+{
+ if(getsize_cmc == NULL)
+ {
+ getsize_options.modified = FALSE;
+ getsize_options.unselect = TRUE;
+
+ getsize_cmc = cmc_config_new("GetSize", &getsize_options);
+ cmc_field_add_boolean(getsize_cmc, "modified", NULL, offsetof(OptGetSize, modified));
+ cmc_field_add_boolean(getsize_cmc, "unselect", _("Unselect Rows When Done?"), offsetof(OptGetSize, unselect));
+ cmc_config_register(getsize_cmc);
+ }
+}
diff --git a/src/cmd_getsize.h b/src/cmd_getsize.h
new file mode 100644
index 0000000..208124a
--- /dev/null
+++ b/src/cmd_getsize.h
@@ -0,0 +1,8 @@
+/*
+** 1998-09-12 - The stream of one-line headers never does end.
+*/
+
+extern gint cmd_getsize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_clearsize(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern void cfg_getsize(MainInfo *min);
diff --git a/src/cmd_info.c b/src/cmd_info.c
new file mode 100644
index 0000000..1911033
--- /dev/null
+++ b/src/cmd_info.c
@@ -0,0 +1,394 @@
+/*
+** 1998-12-19 - Let's pretend we're one of those big, bad, desktop environments, and provide
+** users with an "Information" window in which we can show cool stuff... This
+** will basically repeat what stat() has told us, plus a few extras.
+** 1999-03-06 - Changed for the new selection/dirrow handling.
+** 1999-03-28 - Now uses the progress-indicating version of the fut_dir_size() routine.
+** 1999-04-05 - Added use of the new command configuration system, to allow user to have
+** some control over how this command operates. Nice.
+** 2000-07-02 - Internationalized. Lost some hard-coded plural suffix stuff (was English-only). :(
+** 2002-02-08 - Now uses the dialog module. Why it wasn't, nobody knows.
+*/
+
+#include "gentoo.h"
+
+#include <time.h>
+
+#include "errors.h"
+#include "file.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "iconutil.h"
+#include "sizeutil.h"
+#include "strutil.h"
+#include "fileutil.h"
+#include "userinfo.h"
+#include "progress.h"
+#include "cmdseq_config.h"
+
+#include "cmd_info.h"
+
+#define CMD_ID "info"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ gboolean modified;
+ gboolean use_file; /* Show 'file' output? */
+ gboolean recurse_dirs; /* Recurse directories? */
+ gchar df_access[DP_DATEFMT_SIZE]; /* Formatter for dates of last access, */
+ gchar df_modify[DP_DATEFMT_SIZE]; /* modification, */
+ gchar df_change[DP_DATEFMT_SIZE]; /* and change. */
+ gchar tick[2];
+} OptInfo;
+
+static OptInfo info_options;
+static CmdCfg *info_cmc = NULL;
+
+/* Special little struct used to hold information during background directory sizing. */
+typedef struct {
+ GtkWidget *size, *contents; /* Label widgets, updated. */
+ gpointer handle; /* Handle from fut_dir_size_start(). */
+} DirSizeInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void dir_size_update(const FUCount *count, gpointer user)
+{
+ DirSizeInfo *dsi = user;
+ gchar buf[64], sbuf[64], stbuf[64], dbuf[64], fbuf[64];
+
+ if(!count)
+ return;
+
+ /* Replace contents of previously built size-label. */
+ sze_put_offset(sbuf, sizeof sbuf, count->num_bytes, SZE_AUTO, 3, ',');
+ sze_put_offset(stbuf, sizeof stbuf, count->num_bytes, SZE_BYTES, 3, ',');
+
+ g_snprintf(buf, sizeof buf, _("%s (%s)"), sbuf, stbuf);
+ gtk_label_set_text(GTK_LABEL(dsi->size), buf);
+
+ /* And tell a little something about the contents. */
+ sze_put_offset(dbuf, sizeof dbuf, count->num_dirs, SZE_BYTES_NO_UNIT, 3, ',');
+ sze_put_offset(fbuf, sizeof fbuf, count->num_files, SZE_BYTES_NO_UNIT, 3, ',');
+ g_snprintf(buf, sizeof buf, _("%s dirs, %s files,\n%u symlinks, %u special files"),
+ dbuf, fbuf, count->num_links, count->num_specials);
+ gtk_label_set_text(GTK_LABEL(dsi->contents), buf);
+}
+
+static GtkWidget * label_pack(GtkWidget *grid, const gchar *text, gint x, gint y, gboolean left)
+{
+ GtkWidget *lab;
+
+ lab = gtk_label_new(text);
+ gtk_label_set_xalign(GTK_LABEL(lab), left ? 0.f : 0.9f);
+ gtk_widget_set_hexpand(lab, TRUE);
+ gtk_grid_attach(GTK_GRID(grid), lab, x, y, 1, 1);
+
+ return lab;
+}
+
+static gint build_date(const gchar *label, gint y, guint64 date, const gchar *fmt, GtkWidget *grid)
+{
+ gchar buf[64];
+ time_t tvalue;
+ struct tm *tm;
+
+ tvalue = (time_t) date;
+ if(tvalue != 0 && (tm = localtime(&tvalue)) != NULL)
+ {
+ label_pack(grid, label, 0, y, FALSE);
+ if(strftime(buf, sizeof buf, fmt, tm) > 0)
+ label_pack(grid, buf, 1, y++, TRUE);
+ }
+ return y;
+}
+
+/* 2010-03-02 - Build a second page (!) of the Information window, showing a large set of GIO attributes. */
+static GtkWidget * build_gio_info(const DirPane *dp, const DirRow2 *row)
+{
+ GtkListStore *lm = NULL;
+ GtkWidget *view, *scwin;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GFile *file;
+ GFileInfo *info;
+ const gchar *namespaces[] = { "standard", "access", "mountable", "unix", "time", "owner", "filesystem", NULL };
+ gchar **atts;
+ guint i, j;
+
+ if((file = dp_get_file_from_row(dp, row)) == NULL)
+ return NULL;
+ info = g_file_query_info(file, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL);
+ g_object_unref(file);
+ if(info == NULL)
+ return NULL;
+
+ lm = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ for(i = 0; namespaces[i] != NULL; i++)
+ {
+ atts = g_file_info_list_attributes(info, namespaces[i]);
+ if(atts != NULL)
+ {
+ GtkTreeIter iter;
+
+ for(j = 0; atts[j] != NULL; j++)
+ {
+ gchar *value;
+
+ if((value = g_file_info_get_attribute_as_string(info, atts[j])) != NULL)
+ {
+ gtk_list_store_insert_with_values(lm, &iter, -1, 0, atts[j], 1, value, -1);
+ g_free(value);
+ }
+ }
+ g_free(atts);
+ }
+ }
+
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(lm));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes(_("Name"), cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ vc = gtk_tree_view_column_new_with_attributes(_("Value"), cr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), view);
+
+ return scwin;
+}
+
+static GtkWidget * build_info(MainInfo *min, const DirPane *dp, const DirRow2 *row, DirSizeInfo **dsi)
+{
+ const GtkTreeModel *m = dp_get_tree_model(dp);
+ gchar buf[128], sbuf[32], *ptr;
+ guint y;
+ const gchar *iname;
+ GtkWidget *nbook, *grid, *szlab, *sep, *entry, *gp;
+
+ nbook = gtk_notebook_new();
+
+ grid = gtk_grid_new();
+ gtk_widget_set_margin_start(grid, 5);
+ gtk_widget_set_margin_end(grid, 5);
+ gtk_widget_set_margin_top(grid, 5);
+ gtk_widget_set_margin_bottom(grid, 5);
+ gtk_grid_set_column_spacing(GTK_GRID(grid), 5);
+ gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
+
+ y = 0;
+ if(dp_row_get_ftype(m, row)->style != NULL)
+ {
+ if((iname = stl_style_property_get_icon(dp_row_get_ftype(m, row)->style, SPN_ICON_UNSEL)) != NULL)
+ {
+ GdkPixbuf *pbuf;
+
+ if((pbuf = ico_icon_get_pixbuf(min, iname)) != NULL)
+ {
+ GtkWidget *img;
+
+ img = gtk_image_new_from_pixbuf(pbuf);
+ gtk_grid_attach(GTK_GRID(grid), img, 0, y, 1, 1);
+ }
+ }
+ }
+ label_pack(grid, dp_row_get_name_display(m, row), 1, y++, TRUE);
+
+ /* For symbolic links, display name of the target, at least. */
+ if(dp_row_get_file_type(m, row, FALSE) == G_FILE_TYPE_SYMBOLIC_LINK)
+ {
+ GtkWidget *hbox, *icon;
+
+ label_pack(grid, _("Link To"), 0, y, FALSE);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ entry = gtk_entry_new();
+ gtk_widget_set_sensitive(entry, FALSE); /* Used to be just non-editable, but ... this looks better. */
+ gtk_entry_set_text(GTK_ENTRY(entry), dp_row_get_link_target(m, row));
+ gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+ icon = gtk_image_new_from_icon_name(dp_row_get_flags(m, row, DPRF_LINK_EXISTS) ? "face-smile" : "face-sad", GTK_ICON_SIZE_BUTTON);
+ gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0);
+ gtk_widget_set_hexpand(hbox, TRUE);
+ gtk_widget_set_halign(hbox, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), hbox, 1, y, 1, 1);
+ y++;
+ }
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_grid_attach(GTK_GRID(grid), sep, 0, y, 2, 1);
+ y++;
+
+ label_pack(grid, _("Type"), 0, y, FALSE);
+ label_pack(grid, dp_row_get_ftype(m, row)->name, 1, y++, TRUE);
+
+ label_pack(grid, _("Location"), 0, y, FALSE);
+ label_pack(grid, dp->dir.path, 1, y++, TRUE);
+
+ label_pack(grid, _("Size"), 0, y, FALSE);
+ sze_put_offset(sbuf, sizeof sbuf, dp_row_get_size(m, row), SZE_AUTO, 3, ',');
+ if(dp_row_get_size(m, row) < 1024)
+ g_strlcpy(buf, sbuf, sizeof buf);
+ else
+ {
+ gchar stbuf[64], *st;
+
+ stbuf[sizeof stbuf - 1] = '\0';
+ st = stu_tickify(stbuf + sizeof stbuf - 1, dp_row_get_size(m, row), info_options.tick[0]);
+ g_snprintf(buf, sizeof buf, _("%s (%s bytes)"), sbuf, st);
+ }
+ szlab = label_pack(grid, buf, 1, y++, TRUE);
+ /* Building info for a directory, and recursing enabled? */
+ if(dp_row_get_file_type(m, row, TRUE) == G_FILE_TYPE_DIRECTORY && info_options.recurse_dirs)
+ {
+ GFile *dir = dp_get_file_from_row(dp, row);
+
+ /* Start asynchronous directory sizing. Nice. */
+ *dsi = g_malloc(sizeof *dsi);
+ (*dsi)->size = szlab;
+ label_pack(grid, _("Contains"), 0, y, FALSE);
+ (*dsi)->contents = label_pack(grid, "(content info)", 1, y++, TRUE);
+ (*dsi)->handle = fut_dir_size_gfile_start(dir, dir_size_update, *dsi);
+ }
+
+ /* Is the "Show 'file' Output?" option enabled? Requires "file -n -f -" to work. */
+#if defined HAVE_GOOD_FILE
+/* FIXME: This just isn't a good idea, for potentially remote or archived files ...*/
+ if(info_options.use_file)
+ {
+ gchar *path;
+
+ if((path = g_file_get_path(dp_get_file_from_row(dp, row))) != NULL)
+ {
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_grid_attach(GTK_GRID(grid), sep, 0, y, 2, 1);
+ y++;
+ label_pack(grid, _("'File' Info"), 0, y, FALSE);
+ label_pack(grid, fle_file(min, path), 1, y++, TRUE);
+ g_free(path);
+ }
+ }
+#endif
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_grid_attach(GTK_GRID(grid), sep, 0, y, 2, 1);
+ y++;
+
+ label_pack(grid, _("Owner"), 0, y, FALSE);
+ if((ptr = (gchar *) usr_lookup_uname(dp_row_get_uid(m, row))) != NULL)
+ g_snprintf(buf, sizeof buf, "%s (%d)", ptr, (gint) dp_row_get_uid(m, row));
+ else
+ g_snprintf(buf, sizeof buf, "%d", (gint) dp_row_get_uid(m, row));
+ label_pack(grid, buf, 1, y++, TRUE);
+
+ label_pack(grid, _("Group"), 0, y, FALSE);
+ if((ptr = (gchar *) usr_lookup_gname(dp_row_get_gid(m, row))) != NULL)
+ g_snprintf(buf, sizeof buf, "%s (%d)", ptr, (gint) dp_row_get_gid(m, row));
+ else
+ g_snprintf(buf, sizeof buf, "%d", (gint) dp_row_get_gid(m, row));
+ label_pack(grid, buf, 1, y++, TRUE);
+
+ sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_grid_attach(GTK_GRID(grid), sep, 0, y, 2, 1);
+ y++;
+
+ y = build_date(_("Accessed"), y, dp_row_get_time_accessed(m, row), info_options.df_access, grid);
+ y = build_date(_("Modified"), y, dp_row_get_time_modified(m, row), info_options.df_modify, grid);
+ y = build_date(_("Changed"), y, dp_row_get_time_changed(m, row), info_options.df_change, grid);
+ y = build_date(_("Created"), y, dp_row_get_time_created(m, row), info_options.df_change, grid);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(nbook), grid, gtk_label_new(_("Basic")));
+
+ if((gp = build_gio_info(dp, row)) != NULL)
+ {
+ gtk_notebook_append_page(GTK_NOTEBOOK(nbook), gp, gtk_label_new(_("Attributes")));
+ }
+ return nbook;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-10-16 - Callback when Information window is closing. Stop asynch. dir sizing, if in use. */
+static gboolean evt_delete(GtkWidget *wid, GdkEvent *event, gpointer user)
+{
+ DirSizeInfo *dsi = user;
+
+ if(dsi != NULL)
+ fut_dir_size_gfile_stop(dsi->handle);
+ g_free(dsi);
+ return FALSE;
+}
+
+/* 1999-03-06 - Create window showing all about <row>, which sits in <dp>. */
+static gint information(MainInfo *min, const DirPane *dp, const DirRow2 *row)
+{
+ DirSizeInfo *dsi = NULL;
+ GtkWidget *fr;
+
+ if((fr = build_info(min, dp, row, &dsi)) != NULL)
+ {
+ GtkWidget *win;
+
+ win = win_window_open(min->cfg.wininfo, WIN_INFO);
+ win_window_set_title(win, dp_row_get_name_display(dp_get_tree_model(dp), row));
+ g_signal_connect(G_OBJECT(win), "delete_event", G_CALLBACK(evt_delete), dsi);
+ gtk_container_add(GTK_CONTAINER(win), fr);
+ win_window_show(win);
+ }
+ return fr != NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-12-19 - Show information about files in <src>. Knows about double-click, and handles
+** it like everybody else.
+*/
+gint cmd_information(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist, *iter;
+ gboolean ok = TRUE;
+
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ pgs_progress_begin(min, _("Getting Information..."), PFLG_BUSY_MODE);
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ if((ok = information(min, src, iter->data)))
+ dp_unselect(src, iter->data);
+ }
+ pgs_progress_end(min);
+
+ dp_free_selection(slist);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Initialize configuration stuff. */
+void cfg_information(MainInfo *min)
+{
+ if(info_cmc == NULL)
+ {
+ /* Initialize default option values. */
+ info_options.modified = FALSE;
+ info_options.use_file = FALSE;
+ info_options.recurse_dirs = TRUE;
+ g_strlcpy(info_options.df_access, "%Y-%m-%d %H:%M.%S", sizeof info_options.df_access);
+ g_strlcpy(info_options.df_modify, "%Y-%m-%d %H:%M.%S", sizeof info_options.df_modify);
+ g_strlcpy(info_options.df_change, "%Y-%m-%d %H:%M.%S", sizeof info_options.df_change);
+ g_strlcpy(info_options.tick, ",", sizeof info_options.tick);
+
+ info_cmc = cmc_config_new("Information", &info_options);
+ cmc_field_add_boolean(info_cmc, "modified", NULL, offsetof(OptInfo, modified));
+#if defined HAVE_GOOD_FILE
+ cmc_field_add_boolean(info_cmc, "use_file", _("Show 'file' Output?"), offsetof(OptInfo, use_file));
+#endif
+ cmc_field_add_boolean(info_cmc, "recurse_dirs", _("Recurse Directories?"), offsetof(OptInfo, recurse_dirs));
+ cmc_field_add_string(info_cmc, "df_access", _("Access Date Format"), offsetof(OptInfo, df_access), sizeof info_options.df_access);
+ cmc_field_add_string(info_cmc, "df_modify", _("Modify Date Format"), offsetof(OptInfo, df_modify), sizeof info_options.df_modify);
+ cmc_field_add_string(info_cmc, "df_change", _("Change Date Format"), offsetof(OptInfo, df_change), sizeof info_options.df_change);
+ cmc_field_add_string(info_cmc, "tick", _("Size Tick Mark"), offsetof(OptInfo, tick), sizeof info_options.tick);
+
+ cmc_config_register(info_cmc);
+ }
+}
diff --git a/src/cmd_info.h b/src/cmd_info.h
new file mode 100644
index 0000000..593aa17
--- /dev/null
+++ b/src/cmd_info.h
@@ -0,0 +1,6 @@
+/*
+** 1998-12-19 - Header for the new Info command, which might be neat.
+*/
+
+extern gint cmd_information(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern void cfg_information(MainInfo *min);
diff --git a/src/cmd_join.c b/src/cmd_join.c
new file mode 100644
index 0000000..350178f
--- /dev/null
+++ b/src/cmd_join.c
@@ -0,0 +1,286 @@
+/*
+** 2000-02-12 - A Join command, to counter the long-existing (um, but still incomplete)
+** Split command. Features neat drag-and-drop support for ordering the files
+** to be joined.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+
+#include "cmd_copy.h"
+#include "cmd_delete.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "progress.h"
+#include "sizeutil.h"
+
+#include "cmd_join.h"
+
+#define CMD_ID "join"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-10-04 - Happy Cinnamon Bun day. Splices data from <in> into <out>, in discrete chunks so we can report
+** progress. glib's built-in g_output_stream_splice() does it all at once, which freezes gentoo
+** for large files. Not acceptable. This would be a good candidate for multi-threading, in the
+** future. Considering the size of this, it's kind of annoying that glib doesn't have it. :|
+*/
+static gssize chunked_splice(MainInfo *min, GInputStream *ins, GOutputStream *outs, gsize size, gchar *buf, gsize buf_size, GError **error)
+{
+ gssize to_go = size, out_size = 0;
+
+ while(to_go > 0)
+ {
+ const gssize chunk = to_go > buf_size ? buf_size : to_go;
+ gssize got, wrote;
+
+ got = g_input_stream_read(ins, buf, chunk, NULL, error);
+ if(got != chunk)
+ break;
+ wrote = g_output_stream_write(outs, buf, chunk, NULL, error);
+ if(wrote != chunk)
+ break;
+ out_size += chunk;
+ if(pgs_progress_item_update(min, out_size) != PGS_PROCEED)
+ break;
+ }
+ return out_size;
+}
+
+/* 2000-02-12 - Do the actual joining of the selected files. Returns TRUE on success. */
+static gboolean do_join(MainInfo *min, DirPane *src, DirPane *dst, GtkListStore *store, GtkEntry *entry, gsize total_size)
+{
+ const gchar *str = gtk_entry_get_text(entry);
+ GFile *out;
+ OvwRes owres;
+ gboolean doit = TRUE;
+ GError *err = NULL;
+ GFileOutputStream *outs;
+ gsize done_size = 0;
+
+ /* Protect against slashes in destination name. No rename-trickery! */
+ if(g_utf8_strchr(str, -1, G_DIR_SEPARATOR) != NULL)
+ {
+ err_set(min, EINVAL, CMD_ID, NULL);
+ return FALSE;
+ }
+
+ out = dp_get_file_from_name_display(dst, str);
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Continue With Join?"), 0U);
+ owres = ovw_overwrite_unary_file(dst, out);
+ switch(owres)
+ {
+ case OVW_SKIP:
+ case OVW_CANCEL:
+ doit = FALSE;
+ break;
+ case OVW_PROCEED:
+ break;
+ case OVW_PROCEED_FILE:
+ case OVW_PROCEED_DIR:
+ doit = del_delete_gfile(min, out, FALSE, &err);
+ break;
+ }
+ if(!doit)
+ {
+ err_set_gerror(min, &err, CMD_ID, out);
+ g_object_unref(out);
+ return FALSE;
+ }
+
+ if((outs = g_file_create(out, G_FILE_CREATE_NONE, NULL, &err)) != NULL)
+ {
+ GtkTreeIter iter;
+ gssize put;
+ gchar *buf;
+ const gsize buf_size = cpy_get_buf_size();
+
+ if((buf = g_malloc(buf_size)) != NULL)
+ {
+ pgs_progress_begin(min, _("Joining..."), PFLG_BYTE_VISIBLE);
+ gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
+ while(gtk_list_store_iter_is_valid(store, &iter))
+ {
+ GFile *in;
+ DirRow2 *dr;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 2, &dr, -1);
+ if((in = dp_get_file_from_row(src, dr)) != NULL)
+ {
+ GFileInputStream *ins;
+
+ if((ins = g_file_read(in, NULL, &err)) != NULL)
+ {
+ const gsize size = dp_row_get_size(dp_get_tree_model(src), dr);
+
+ pgs_progress_item_begin(min, dp_row_get_name_display(dp_get_tree_model(src), dr), size);
+ put = chunked_splice(min, G_INPUT_STREAM(ins), G_OUTPUT_STREAM(outs), size, buf, buf_size, &err);
+ if(put < 0 || !g_input_stream_close(G_INPUT_STREAM(ins), NULL, &err))
+ break;
+ pgs_progress_item_end(min);
+ dp_unselect(src, dr);
+ done_size += put;
+ }
+ g_object_unref(in);
+ }
+ else
+ break;
+ if(!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter))
+ break;
+ }
+ pgs_progress_end(min);
+ g_free(buf);
+ }
+ if(done_size == total_size)
+ dp_rescan_post_cmd(dst);
+ }
+ if(done_size != total_size)
+ err_set_gerror(min, &err, CMD_ID, out);
+
+ g_object_unref(out);
+ ovw_overwrite_end(min);
+
+ return done_size == total_size;
+}
+
+static void evt_dest_changed(GtkEditable *w, gpointer user)
+{
+ Dialog *dlg = user;
+ const gchar *str = gtk_entry_get_text(GTK_ENTRY(w));
+ gsize len;
+
+ /* Protect against empty destination name, nicely. */
+ len = strlen(str);
+ dlg_dialog_set_positive_enabled(dlg, len > 0);
+}
+
+gint cmd_join(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *sel;
+ gint ret = 1;
+
+ err_clear(min);
+
+ if((sel = dp_get_selection(src)) != NULL)
+ {
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GSList *iter;
+ gsize tot = 0, num = 0;
+
+ /* Compute size of all regular files in the selection; ignore 0-sized files. */
+ for(iter = sel; iter != NULL; iter = g_slist_next(iter))
+ {
+ guint64 size = dp_row_get_size(m, iter->data);
+ /* Follow symlinks, since we want to allow the joining of a bunch of link targets. */
+ if(size > 0 && dp_row_get_file_type(m, iter->data, TRUE) == G_FILE_TYPE_REGULAR)
+ {
+ tot += size;
+ num++;
+ }
+ }
+
+ /* Only open the dialog and proceed with command if there were, in
+ ** fact, more than one regular file selected.
+ */
+ if(num > 1)
+ {
+ Dialog *dlg;
+ GtkWidget *scwin, *vbox, *label, *entry, *view;
+ GtkListStore *store;
+ GtkCellRenderer *cr, *sr;
+ GtkTreeViewColumn *vc;
+ GtkTreeSelection *treesel;
+ gchar buf[FILENAME_MAX + 64];
+ const gchar *first = NULL, *tail;
+ gunichar ch;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Click and Drag Files to Reorder, Then Click Join."));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+ if(tot > (1 << 10))
+ {
+ gchar sbuf[16], bbuf[32];
+
+ sze_put_offset(sbuf, sizeof sbuf, tot, SZE_AUTO, 3, ',');
+ sze_put_offset(bbuf, sizeof bbuf, tot, SZE_BYTES, 3, ',');
+ g_snprintf(buf, sizeof buf, _("The total size is %s (%s)."), sbuf, bbuf);
+ }
+ else
+ g_snprintf(buf, sizeof buf, _("The total size is %lu bytes."), (unsigned long) tot);
+ label = gtk_label_new(buf);
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ /* Create and initialize list store with selected files and their sizes. */
+ store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ for(iter = sel; iter != NULL; iter = g_slist_next(iter))
+ {
+ if(dp_row_get_file_type(m, iter->data, TRUE) == G_FILE_TYPE_REGULAR && dp_row_get_size(m, iter->data) > 0)
+ {
+ GtkTreeIter ti;
+ gchar bbuf[32];
+
+ sze_put_offset(bbuf, sizeof bbuf, dp_row_get_size(m, iter->data), SZE_BYTES_NO_UNIT, 3, ',');
+ gtk_list_store_insert_with_values(store, &ti, -1,
+ 0, dp_row_get_name_display(m, iter->data),
+ 1, bbuf,
+ 2, iter->data,
+ -1);
+ if(first == NULL)
+ first = dp_row_get_name_display(m, iter->data);
+ }
+ }
+
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(title)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ sr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(sr), "xalign", 1.0f, NULL);
+ vc = gtk_tree_view_column_new_with_attributes("(title)", sr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+ gtk_tree_selection_set_mode(treesel, GTK_SELECTION_NONE);
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view), TRUE);
+ gtk_widget_set_size_request(view, 0, 256); /* Get a sensible minmum height. */
+ gtk_container_add(GTK_CONTAINER(scwin), view);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+
+ label = gtk_label_new(_("Enter Destination File Name"));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
+ entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(entry), FILENAME_MAX - 1);
+ /* Get a pointer to the terminating '\0' character. */
+ tail = g_utf8_offset_to_pointer(first, g_utf8_strlen(first, -1));
+ do
+ {
+ tail = g_utf8_find_prev_char(first, tail); /* Step backward. */
+ ch = g_utf8_get_char(tail);
+ } while(g_unichar_isxdigit(ch) || ch == '.');
+ gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(entry)), first, g_utf8_pointer_to_offset(first, tail) + 1);
+ gtk_editable_set_position(GTK_EDITABLE(entry), -1);
+ gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
+
+ dlg = dlg_dialog_sync_new(vbox, _("Join"), _("_Join|_Cancel"));
+ g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(evt_dest_changed), dlg);
+ gtk_widget_show_all(vbox);
+ gtk_widget_grab_focus(entry);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ ret = do_join(min, src, dst, store, GTK_ENTRY(entry), tot);
+ dlg_dialog_sync_destroy(dlg);
+ }
+ dp_free_selection(sel);
+ }
+ return ret;
+}
diff --git a/src/cmd_join.h b/src/cmd_join.h
new file mode 100644
index 0000000..8c73e95
--- /dev/null
+++ b/src/cmd_join.h
@@ -0,0 +1,5 @@
+/*
+** 2000-02-12 - Header for the Join command.
+*/
+
+extern gint cmd_join(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_menupopup.c b/src/cmd_menupopup.c
new file mode 100644
index 0000000..87e958e
--- /dev/null
+++ b/src/cmd_menupopup.c
@@ -0,0 +1,62 @@
+/*
+** 1999-06-12 - A simple command to show popup menu close the mouse pointer. Must be invoked
+** by a command bound to a mouse button, since we need the triggering GdkEventButton
+** handy.
+*/
+
+#include "gentoo.h"
+
+#include "cmdarg.h"
+#include "events.h"
+
+#include "menus.h"
+#include "cmd_menupopup.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define CELL_SPACING 1 /* This is a private internal GtkCList constant. Oops. */
+
+/* 2002-08-01 - This gets called if a "atfocus" bareword was present in the MenuPopup command.
+** So, figure out where the focused row is, and fill in <x> and <y> suitably. This
+** is kind of a hack, since it involves font computations that feel as if they
+** should be inside GTK+, but... It might work. :)
+*/
+static void func_position(GtkMenu *menu, gint *x, gint *y, gboolean *push, gpointer data)
+{
+#if 0
+ MainInfo *min = data;
+ GtkCList *cp = min->gui->cur_pane->view;
+ gint wx, wy, px, py, pw, ph, fr;
+
+ gdk_window_get_position(min->gui->window->window, &wx, &wy);
+ gdk_window_get_position(GTK_WIDGET(cp)->window, &px, &py);
+ gdk_window_get_size(GTK_WIDGET(cp)->window, &pw, &ph);
+ *x = (wx + px) + pw / 2;
+ *y = (wy + py) + ph / 2;
+#endif
+ g_warning("Menu popup pane positioning not implemented");
+}
+
+/* 2000-04-09 - Pop up the dirpane menu for the current pane. Now also works if bound to a
+** (keyboard) key, as opposed to only working for mouse buttons as before.
+** 2000-12-03 - Generality-boosted, through the new menu module.
+*/
+gint cmd_menupopup(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GdkEventButton *evt;
+ const gchar *name;
+ guint button = 0;
+ guint32 ac_time = 0U;
+ GtkMenuPositionFunc pos = NULL;
+
+ if((evt = (GdkEventButton *) evt_event_get(GDK_BUTTON_PRESS)) != NULL)
+ {
+ button = evt->button;
+ ac_time = evt->time;
+ }
+ name = car_keyword_get_value(ca, "menu", "DirPaneMenu");
+ if(car_bareword_present(ca, "atfocus"))
+ pos = func_position;
+ return mnu_menu_popup(min->cfg.menus, name, pos, min, button, ac_time);
+}
+
diff --git a/src/cmd_menupopup.h b/src/cmd_menupopup.h
new file mode 100644
index 0000000..18e0ab7
--- /dev/null
+++ b/src/cmd_menupopup.h
@@ -0,0 +1,5 @@
+/*
+** 1999-06-12 - A little header for the menu popup command. Very early code.
+*/
+
+extern gint cmd_menupopup(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_mkdir.c b/src/cmd_mkdir.c
new file mode 100644
index 0000000..4239203
--- /dev/null
+++ b/src/cmd_mkdir.c
@@ -0,0 +1,156 @@
+/*
+** 1998-08-27 - I've gotten pretty far without a native command for creating directories,
+** but now is the time. I want one!
+** 1998-09-01 - Added the possibility to enter the newly created directory, something I
+** find I want to do occasionally. Having it here saves one click. :^)
+** 1999-03-13 - Adjusted for new dialog module.
+** 1999-04-04 - Moved "CD New" flag out into min->cfg, making it behave a bit more like
+** the other commands and paving the way for saving this info in config file.
+** 1999-06-19 - Adapted for the new dialog module. Cleaner now.
+*/
+
+#include "gentoo.h"
+#include "cmd_delete.h"
+#include "cmdseq.h"
+#include "cmdseq_config.h"
+#include "configure.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "gfam.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "strutil.h"
+
+#include "cmd_mkdir.h"
+
+#define CMD_ID "mkdir"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *entry;
+ DirPane *src;
+} MkdInfo;
+
+typedef struct { /* Command-specific configuration data. */
+ gboolean modified; /* Has the setting(s) been modified? */
+ gboolean cd_new; /* CD into new directory after creation? */
+ gboolean focus_new; /* Focus the new directory? */
+} OptMkDir;
+
+static OptMkDir mkdir_options;
+static CmdCfg *mkdir_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean make_dir(const MkdInfo *mdi)
+{
+ const gchar *text;
+ GFile *dest;
+ gboolean ok = FALSE;
+ GError *err = NULL;
+
+ if(mdi == NULL)
+ return FALSE;
+ text = gtk_entry_get_text(GTK_ENTRY(mdi->entry));
+ if(*text == '\0')
+ return FALSE;
+ if(mdi->src->dir.root == NULL)
+ return FALSE;
+
+ err_clear(mdi->src->main);
+ if((dest = g_file_get_child_for_display_name(mdi->src->dir.root, text, &err)) != NULL)
+ {
+ ovw_overwrite_begin(mdi->src->main, _("\"%s\" Already Exists - Proceed With MkDir?"), 0UL);
+ switch(ovw_overwrite_unary_file(mdi->src, dest))
+ {
+ case OVW_SKIP:
+ case OVW_CANCEL:
+ ok = FALSE;
+ break;
+ case OVW_PROCEED:
+ ok = TRUE;
+ break;
+ case OVW_PROCEED_FILE:
+ ok = del_delete_gfile(mdi->src->main, dest, FALSE, &err);
+ break;
+ case OVW_PROCEED_DIR:
+ ok = FALSE;
+ break;
+ }
+ ovw_overwrite_end(mdi->src->main);
+ if(ok)
+ {
+ ok = g_file_make_directory(dest, NULL, &err);
+ if(ok)
+ {
+ gchar *pn = g_file_get_parse_name(dest);
+
+ if(mkdir_options.cd_new)
+ ok = csq_execute_format(mdi->src->main, "DirEnter 'dir=%s'", pn);
+ else if(mkdir_options.focus_new)
+ ok = csq_execute_format(mdi->src->main, "DpGotoRow focus=%s nocase=no 're=%s'", mkdir_options.focus_new ? "yes" : "no", pn);
+ if(!mkdir_options.cd_new)
+ dp_rescan_post_cmd(mdi->src);
+ g_free(pn);
+ }
+ }
+ g_object_unref(dest);
+ }
+ if(err != NULL)
+ err_set_gerror(mdi->src->main, &err, text, NULL);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-27 - The mkdir entry point. Simple stuff. */
+gint cmd_mkdir(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ Dialog *dlg;
+ MkdInfo mi;
+ GtkWidget *wid;
+ gboolean ok = FALSE;
+
+ mi.src = src;
+ mi.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ wid = gtk_label_new(_("Enter Name of Directory to Create"));
+ gtk_box_pack_start(GTK_BOX(mi.vbox), wid, FALSE, FALSE, 0);
+ mi.entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(mi.entry), MAXNAMLEN - 1);
+ gtk_box_pack_start(GTK_BOX(mi.vbox), mi.entry, FALSE, FALSE, 0);
+ wid = cmc_field_build(mkdir_cmc, "cd_new", &mkdir_options);
+ gtk_box_pack_start(GTK_BOX(mi.vbox), wid, FALSE, FALSE, 0);
+ wid = cmc_field_build(mkdir_cmc, "focus_new", &mkdir_options);
+ gtk_box_pack_start(GTK_BOX(mi.vbox), wid, FALSE, FALSE, 0);
+ dlg = dlg_dialog_sync_new(mi.vbox, _("Make Directory"), NULL);
+ gtk_widget_grab_focus(mi.entry);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ ok = make_dir(&mi);
+ dlg_dialog_sync_destroy(dlg);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-04 - Support function for dynamic command configuration management (buzz, buzz). */
+void cfg_mkdir(MainInfo *min)
+{
+ if(mkdir_cmc == NULL)
+ {
+ /* Initialize default option values. */
+ mkdir_options.modified = FALSE;
+ mkdir_options.cd_new = FALSE;
+ mkdir_options.focus_new = FALSE;
+
+ mkdir_cmc = cmc_config_new("MkDir", &mkdir_options);
+ cmc_field_add_boolean(mkdir_cmc, "modified", NULL, offsetof(OptMkDir, modified));
+ cmc_field_add_boolean(mkdir_cmc, "cd_new", _("CD Into New Directory?"), offsetof(OptMkDir, cd_new));
+ cmc_field_add_boolean(mkdir_cmc, "focus_new", _("Focus New Directory?"), offsetof(OptMkDir, focus_new));
+ cmc_config_register(mkdir_cmc);
+ }
+}
diff --git a/src/cmd_mkdir.h b/src/cmd_mkdir.h
new file mode 100644
index 0000000..3bfdd63
--- /dev/null
+++ b/src/cmd_mkdir.h
@@ -0,0 +1,7 @@
+/*
+** 1998-08-27 - One just can not have too many one-line headers.
+*/
+
+extern gint cmd_mkdir(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern void cfg_mkdir(MainInfo *min);
diff --git a/src/cmd_move.c b/src/cmd_move.c
new file mode 100644
index 0000000..4d84b5d
--- /dev/null
+++ b/src/cmd_move.c
@@ -0,0 +1,167 @@
+/*
+** 1998-05-30 - Implementation of the built-in MOVE command, which is used to, er, move
+** files and directories. It might become incredibly involved. We'll see
+** about that.
+** 1998-09-12 - Did changes in command arguments to ease implementation of MOVEAS, also
+** exported all the move_XXX() functions, as the cmd_copy module does.
+** 1999-03-06 - Adapted for new selection/dirrow representations.
+*/
+
+#include "gentoo.h"
+
+#include "cmd_copy.h"
+#include "cmd_delete.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "overwrite.h"
+#include "progress.h"
+
+#include "cmd_move.h"
+
+#define CMD_ID "move"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void cb_progress(goffset pos, goffset total, gpointer user)
+{
+ pgs_progress_item_update(user, pos);
+}
+
+static gboolean move_gfile_directory(MainInfo *min, DirPane *src, DirPane *dst, const GFile *from, const GFile *to, gboolean progress, GError **err)
+{
+ GFileEnumerator *fe;
+ GFileInfo *fi;
+ gboolean ok = TRUE;
+
+ /* First create the destination directory. It must be possible without overwriting
+ ** anything, gentoo's copy semantics do not allow merge on move.
+ */
+ if(!g_file_make_directory((GFile *) to, NULL, err))
+ return FALSE;
+
+ /* Now iterate over the children of the source, and move each file contained therein. */
+ if((fe = g_file_enumerate_children((GFile *) from, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) == NULL)
+ return FALSE;
+ while(ok && (fi = g_file_enumerator_next_file(fe, NULL, err)) != NULL)
+ {
+ GFile *sfile, *dfile;
+
+ ok = FALSE;
+ if((sfile = g_file_get_child((GFile *) from, g_file_info_get_name(fi))) != NULL)
+ {
+ if((dfile = g_file_get_child((GFile *) to, g_file_info_get_name(fi))) != NULL)
+ {
+ ok = move_gfile(min, src, dst, sfile, dfile, progress, err);
+ g_object_unref(dfile);
+ }
+ g_object_unref(sfile);
+ }
+ g_object_unref(fi);
+ }
+ g_object_unref(fe);
+
+ return ok;
+}
+
+gboolean move_gfile(MainInfo *min, DirPane *src, DirPane *dst, const GFile *sfile, const GFile *dfile, gboolean progress, GError **err)
+{
+ GFileInfo *fi;
+ gboolean ok;
+
+ if(src == NULL || dst == NULL || sfile == NULL || dfile == NULL)
+ return FALSE;
+
+ switch(ovw_overwrite_unary_file(dst, dfile))
+ {
+ case OVW_SKIP:
+ return TRUE;
+ case OVW_CANCEL:
+ return FALSE;
+ case OVW_PROCEED:
+ break;
+ case OVW_PROCEED_FILE:
+ case OVW_PROCEED_DIR:
+ if(!del_delete_gfile(min, (GFile *) dfile, FALSE, err))
+ return FALSE;
+ }
+ if((fi = g_file_query_info((GFile *) sfile, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) == NULL)
+ return FALSE;
+ /* First try a native move. This is so fast, that we don't want to spend time recursing
+ ** to figure out the true size of directories. Instead, use the directory entry's size.
+ */
+ pgs_progress_item_begin(min, g_file_info_get_display_name(fi), g_file_info_get_size(fi));
+ g_object_unref(fi);
+
+ ok = g_file_move((GFile *) sfile, (GFile *) dfile, G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_NO_FALLBACK_FOR_MOVE, pgs_progress_get_cancellable(), cb_progress, min, err);
+ if(!ok && !(err != NULL && g_error_matches(*err, G_IO_ERROR, G_IO_ERROR_CANCELLED)))
+ {
+ guint64 size = 0;
+
+ /* Initial native-only attempt failed, try again with the fallback enabled.
+ ** At this point we first need to figure out the size, for the progress reporting.
+ */
+ if(fut_size_gfile(min, sfile, &size, NULL, err))
+ {
+ g_clear_error(err);
+ pgs_progress_item_resize(min, size);
+ ok = g_file_move((GFile *) sfile, (GFile *) dfile, G_FILE_COPY_NOFOLLOW_SYMLINKS, pgs_progress_get_cancellable(), cb_progress, min, err);
+ /* If it failed, check if it was because it "would recurse". If so, then we need to
+ ** implement a fall-back, since GIO doesn't do that for us. Luckily, this whole
+ ** program is supposed to be a _file manager_, so it's right up our alley.
+ */
+ if(!ok && err != NULL && g_error_matches(*err, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE))
+ {
+ /* Drop the GError, since we've handled it and it was semi-expected. */
+ g_clear_error(err);
+ ok = move_gfile_directory(min, src, dst, sfile, dfile, progress, err);
+ }
+ }
+ }
+ pgs_progress_item_end(min);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-24 - Move selected files and/or directories to destination pane's directory. */
+gint cmd_move(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist, *iter;
+ GError *error = NULL;
+ GFile *sfile, *dfile;
+ gboolean ok = TRUE;
+ guint count = 0;
+
+ if((min == NULL) || (src == NULL) || (dst == NULL))
+ return 0;
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ err_clear(min);
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Continue With Move?"), 0UL);
+ pgs_progress_begin(min, _("Moving..."), PFLG_ITEM_VISIBLE | PFLG_BYTE_VISIBLE);
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ sfile = dp_get_file_from_row(src, iter->data);
+ dfile = dp_get_file_from_name(dst, dp_row_get_name(dp_get_tree_model(src), iter->data));
+ ok = move_gfile(min, src, dst, sfile, dfile, TRUE, &error);
+ if(!ok)
+ err_set_gerror(min, &error, CMD_ID, sfile);
+ count += (ok != FALSE);
+ g_object_unref(dfile);
+ g_object_unref(sfile);
+ }
+ if(count > 0)
+ {
+ dp_rescan_post_cmd(src);
+ dp_rescan_post_cmd(dst);
+ }
+ pgs_progress_end(min);
+ ovw_overwrite_end(min);
+ dp_free_selection(slist);
+
+ return ok;
+}
diff --git a/src/cmd_move.h b/src/cmd_move.h
new file mode 100644
index 0000000..69234c2
--- /dev/null
+++ b/src/cmd_move.h
@@ -0,0 +1,8 @@
+/*
+** 1998-05-30 - Header file for the MOVE module. Really simple.
+*/
+
+/* Top-level moving functions, for external use. */
+extern gboolean move_gfile(MainInfo *min, DirPane *src, DirPane *dst, const GFile *sfile, const GFile *dfile, gboolean progress, GError **err);
+
+extern gint cmd_move(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_moveas.c b/src/cmd_moveas.c
new file mode 100644
index 0000000..863fa69
--- /dev/null
+++ b/src/cmd_moveas.c
@@ -0,0 +1,115 @@
+/*
+** 1998-09-12 - A Move As command. Very useful.
+** 1999-03-06 - Adapted for the new selection/generic/dirrow representations.
+** 2010-02-28 - Ported to GIO and GTK+ 2.0.
+*/
+
+#include "gentoo.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "progress.h"
+#include "strutil.h"
+
+#include "cmd_move.h"
+#include "cmd_generic.h"
+
+#include "cmd_moveas.h"
+
+#define CMD_ID "move as"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *entry;
+ MainInfo *min;
+ gint ovw_open;
+ GQuark quark;
+} MvaInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-12 - Update body of move as GUI. */
+static void mva_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar buf[256];
+ MvaInfo *mva = user;
+
+ g_snprintf(buf, sizeof buf, _("Enter Name to Move \"%s\" As"), dp_row_get_name_display(dp_get_tree_model(src), row));
+ gtk_label_set_text(GTK_LABEL(mva->label), buf);
+ gtk_entry_set_text(GTK_ENTRY(mva->entry), dp_row_get_name_display(dp_get_tree_model(src), row));
+ gtk_editable_select_region(GTK_EDITABLE(mva->entry), 0, -1);
+ gtk_widget_grab_focus(mva->entry);
+
+ cmd_generic_track_entry(gen, mva->entry);
+
+ if(mva->ovw_open == FALSE)
+ {
+ ovw_overwrite_begin(mva->min, _("\"%s\" Already Exists - Continue With Move?"), 0U);
+ mva->ovw_open = TRUE;
+ }
+}
+
+static gint mva_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user)
+{
+ const gchar *text;
+ MvaInfo *mva = user;
+ GFile *file_src, *file_dst;
+ gboolean ret = FALSE;
+
+ text = gtk_entry_get_text(GTK_ENTRY(mva->entry));
+ if(text == NULL || *text == '\0' || g_utf8_strchr(text, -1, G_DIR_SEPARATOR) != NULL)
+ {
+ *error = g_error_new(mva->quark, EINVAL, _("Invalid destination name for MoveAs"));
+ return 0;
+ }
+
+ if((file_src = dp_get_file_from_row(src, row)) != NULL)
+ {
+ if((file_dst = dp_get_file_from_name_display(dst, text)) != NULL)
+ {
+ pgs_progress_begin(min, _("Moving As..."), PFLG_COUNT_RECURSIVE | PFLG_ITEM_VISIBLE | PFLG_BYTE_VISIBLE);
+ ret = move_gfile(min, src, dst, file_src, file_dst, TRUE, error);
+ pgs_progress_end(min);
+ g_object_unref(file_dst);
+ }
+ g_object_unref(file_src);
+ }
+
+ if(ret)
+ dp_unselect(src, row);
+
+ return ret;
+}
+
+static void mva_free(gpointer user)
+{
+ MvaInfo *mva = user;
+
+ if(mva->ovw_open)
+ ovw_overwrite_end(mva->min);
+}
+
+/* 1998-09-12 - The move as generic command function. */
+gint cmd_moveas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static MvaInfo mva;
+
+ mva.min = min;
+ mva.ovw_open = FALSE;
+
+ mva.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ mva.label = gtk_label_new(_("Move As"));
+ mva.entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(mva.entry), FILENAME_MAX - 1);
+ gtk_box_pack_start(GTK_BOX(mva.vbox), mva.label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(mva.vbox), mva.entry, FALSE, FALSE, 0);
+
+ mva.quark = g_quark_from_string(CMD_ID);
+
+ return cmd_generic(min, _("Move As"), CGF_NOALL, mva_body, mva_action, mva_free, &mva);
+}
diff --git a/src/cmd_moveas.h b/src/cmd_moveas.h
new file mode 100644
index 0000000..a292bb9
--- /dev/null
+++ b/src/cmd_moveas.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-12 - Header file for the native MOVEAS command implementation.
+*/
+
+extern gint cmd_moveas(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_parent.c b/src/cmd_parent.c
new file mode 100644
index 0000000..47b77d9
--- /dev/null
+++ b/src/cmd_parent.c
@@ -0,0 +1,67 @@
+/*
+** 1998-05-25 - The PARENT native command, which simply causes the currently active
+** dir pane to go up one level, to its parent directory.
+** 1999-07-03 - Rewrote entire function, should now work a little bit better. I hope.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "cmdseq.h"
+#include "dirpane.h"
+#include "strutil.h"
+
+#include "cmd_parent.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-07-03 - Go up one level in the source pane. Rewritten to add a little more armor
+** plating. Still far from bullet-proof, though...
+** 2010-06-05 - Rewritten to be lot more GIO, no more string-level parent computation.
+*/
+gint cmd_parent(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GFile *parent;
+ gchar *base = NULL;
+ gint ret = 0;
+
+ if(src->dir.root == NULL)
+ return 0;
+
+ if(car_keyword_get_boolean(ca, "select", 0) != 0)
+ base = g_file_get_basename(src->dir.root);
+
+ parent = g_file_get_parent(src->dir.root);
+ if(parent != NULL)
+ {
+ gchar *uri;
+
+ if((uri = g_file_get_uri(parent)) != NULL)
+ {
+ ret = csq_execute_format(min, "DirEnter 'dir=%s'", stu_escape(uri));
+ g_free(uri);
+ if(base != NULL)
+ {
+ GtkTreeModel *tm = dp_get_tree_model(src);
+ DirRow2 iter;
+ gboolean valid;
+
+ for(valid = gtk_tree_model_get_iter_first(tm, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next(tm, &iter))
+ {
+ const gchar *name = dp_row_get_name(tm, &iter);
+
+ if(strcmp(name, base) == 0)
+ {
+ dp_select(src, &iter);
+ break;
+ }
+ }
+ g_free(base);
+ }
+ }
+ }
+ return ret;
+}
diff --git a/src/cmd_parent.h b/src/cmd_parent.h
new file mode 100644
index 0000000..80d5447
--- /dev/null
+++ b/src/cmd_parent.h
@@ -0,0 +1,5 @@
+/*
+** 1998-05-25 - A very simple header file for the very simple PARENT command module.
+*/
+
+extern gint cmd_parent(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_quit.c b/src/cmd_quit.c
new file mode 100644
index 0000000..59530f2
--- /dev/null
+++ b/src/cmd_quit.c
@@ -0,0 +1,63 @@
+/*
+** 1998-10-21 - A little module to hold the quit commands. Purged them from the main
+** gentoo.c module, in an effort to shrink it a little.
+** 1999-05-07 - Slightly rewritten using the new command argument support. Removed
+** the QuitNow command, use "Quit dialog=false" for the same effect.
+** 1999-06-19 - Adapted for the new dialog module.
+** 2000-03-04 - Modified for the new window handling.
+*/
+
+#include "gentoo.h"
+#include "dialog.h"
+#include "cmdarg.h"
+#include "cmdseq.h"
+#include "cmd_configure.h"
+#include "configure.h"
+
+#include "cmd_quit.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Quit the program, but first check if there have been changes to the config. */
+gint cmd_quit(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ guint dd, dialog = FALSE;
+
+ if(win_window_update(min->gui->window))
+ cfg_modified_set(min);
+
+ dd = (min->cfg.flags & CFLG_CHANGED) ? 2 : 0;
+ dialog = car_keyword_get_boolean(ca, "dialog", dd);
+
+ if(dialog == 2)
+ {
+ gint res;
+
+ if(cmd_configure_autosave())
+ res = 1;
+ else
+ {
+ res = dlg_dialog_sync_new_simple_wait(_("You may have some unsaved configuration changes.\n"
+ "Quitting without saving will lose them. Really quit?"),
+ _("Confirm Quitting"), _("_Quit|_Save, then Quit|_Cancel"));
+ }
+
+ if(res == -1)
+ return TRUE;
+ if(res == 1)
+ csq_execute(min, "ConfigureSave");
+ else if(res == 2)
+ return FALSE;
+ }
+ else if(dialog == 1)
+ {
+ if(dlg_dialog_sync_new_simple_wait(_("Are you sure you want to quit?"), _("Confirm Quitting"), NULL) != DLG_POSITIVE)
+ return FALSE;
+ }
+
+ if(min->cfg.dp_history.save)
+ dph_history_save(min, min->gui->pane, sizeof min->gui->pane / sizeof min->gui->pane[0]);
+ gtk_main_quit();
+
+ return TRUE;
+}
diff --git a/src/cmd_quit.h b/src/cmd_quit.h
new file mode 100644
index 0000000..8980b18
--- /dev/null
+++ b/src/cmd_quit.h
@@ -0,0 +1,5 @@
+/*
+** 1998-10-21 - Header for the little quit command module.
+*/
+
+extern gint cmd_quit(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_rename.c b/src/cmd_rename.c
new file mode 100644
index 0000000..ed8b877
--- /dev/null
+++ b/src/cmd_rename.c
@@ -0,0 +1,398 @@
+/*
+** 1998-05-29 - A rename command might be useful. Since writing this also caused me
+** to implement the generic command interface in cmd_generic, it was
+** very useful indeed!
+** 1998-09-18 - Did some pretty massive changes/additions to provide overwrite protection.
+** 1999-01-30 - Bug fix: always called ovw_overwrite_end() in closing, regardless of
+** whether the _begin() function was ever called. This caused nesting errors.
+** 1999-02-23 - Um... That "bug fix" was buggy. I think I fixed it this time, though.
+** 1999-03-05 - Altered to comply with new selection handling (and its changes on the
+** generic command invocation parameters).
+*/
+
+#include "gentoo.h"
+#include "cmd_delete.h"
+#include "cmdseq_config.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "guiutil.h"
+#include "overwrite.h"
+
+#include "cmd_generic.h"
+#include "cmd_rename.h"
+
+#include <gdk/gdkkeysyms.h>
+
+#define CMD_ID "rename"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *entry;
+ MainInfo *min;
+ gboolean ovw_open;
+
+ /* These are only used when in-place rename is in progress. */
+ DirPane *inplace_pane;
+ GError *inplace_error;
+ gboolean inplace_success;
+} RenInfo;
+
+typedef enum {
+ PRESELECT_NONE = 0,
+ PRESELECT_FULL,
+ PRESELECT_NAME_ONLY,
+ PRESELECT_EXTENSION_ONLY
+} RenamePreselect;
+
+typedef struct { /* Options used by the "Rename" command. */
+ gboolean modified;
+ gboolean single_in_place;
+ RenamePreselect preselect;
+} OptRename;
+
+static OptRename rename_options;
+static CmdCfg *rename_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Guess (!) which preselection mode is active in the given editable. */
+static RenamePreselect guess_preselect(GtkEditable *editable)
+{
+ gint start, end;
+
+ if(gtk_editable_get_selection_bounds(editable, &start, &end))
+ {
+ /* We have a selection; grab the characters and inspect. */
+ gchar *chars = gtk_editable_get_chars(editable, 0, -1);
+
+ if(chars != NULL)
+ {
+ const glong len = g_utf8_strlen(chars, -1);
+ RenamePreselect ret = PRESELECT_NONE;
+
+ /* Entire string selected? */
+ if(start == 0 && end == len)
+ ret = PRESELECT_FULL;
+ /* Anchored to beginning, ends exactly with period? */
+ else if(start == 0 && end < len && *g_utf8_offset_to_pointer(chars, end) == '.')
+ ret = PRESELECT_NAME_ONLY;
+ /* Anchored to end, starts right after period? */
+ else if(end == len && start > 0 && *g_utf8_offset_to_pointer(chars, start - 1) == '.')
+ ret = PRESELECT_EXTENSION_ONLY;
+ g_free(chars);
+
+ return ret;
+ }
+ }
+ return PRESELECT_NONE;
+}
+
+/* Apply the indicated pre-selection. */
+static void apply_preselect(GtkEditable *editable, const gchar *name, RenamePreselect mode)
+{
+ gpointer dot_ptr;
+ gulong dot_pos;
+
+ switch(mode)
+ {
+ case PRESELECT_NONE:
+ /* Rather unexpectedly, we must do this or else GTK+ selects all. */
+ gtk_editable_select_region(editable, 0, 0);
+ break;
+ case PRESELECT_FULL:
+ gtk_editable_select_region(editable, 0, -1);
+ break;
+ case PRESELECT_NAME_ONLY:
+ case PRESELECT_EXTENSION_ONLY:
+ if((dot_ptr = g_utf8_strchr(name, -1, '.')) != NULL)
+ {
+ dot_pos = g_utf8_pointer_to_offset(name, dot_ptr);
+ if(mode == PRESELECT_NAME_ONLY)
+ gtk_editable_select_region(editable, 0, dot_pos);
+ else
+ gtk_editable_select_region(editable, dot_pos + 1, -1);
+ }
+ break;
+ }
+}
+
+/* Keypress handler for whatever widget hosts the renaming. */
+static gboolean evt_rename_keypress(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ const GdkEventKey *ke = &evt->key;
+
+ /* Hard-coded (control-period) shortcut to cycle selection. Pretty cool. */
+ if(ke->type == GDK_KEY_PRESS && ke->state & GDK_CONTROL_MASK && ke->keyval == GDK_KEY_period)
+ {
+ const RenamePreselect mode = guess_preselect(GTK_EDITABLE(wid));
+ RenamePreselect new_mode;
+ gchar *chars;
+
+ if(mode == PRESELECT_EXTENSION_ONLY)
+ new_mode = PRESELECT_NONE;
+ else
+ new_mode = mode + 1;
+
+ /* Slightly iffy to re-allocate for the chars, but think of the frequency, here. */
+ if((chars = gtk_editable_get_chars(GTK_EDITABLE(wid), 0, -1)) != NULL)
+ {
+ apply_preselect(GTK_EDITABLE(wid), chars, new_mode);
+ g_free(chars);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* Apply the configured preselection-mode. */
+static void init_preselect(GtkEditable *editable, const gchar *name, RenamePreselect mode)
+{
+ g_signal_connect(G_OBJECT(editable), "key_press_event", G_CALLBACK(evt_rename_keypress), NULL);
+ apply_preselect(editable, name, mode);
+}
+
+static void ren_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar temp[PATH_MAX + 256];
+ const gchar *name;
+ RenInfo *ren = user;
+
+ name = dp_row_get_name_display(dp_get_tree_model(src), row);
+ g_snprintf(temp, sizeof temp, _("Enter New Name For \"%s\""), name);
+ gtk_label_set_text(GTK_LABEL(ren->label), temp);
+ gtk_entry_set_text(GTK_ENTRY(ren->entry), name);
+ gtk_widget_grab_focus(ren->entry);
+ init_preselect(GTK_EDITABLE(ren->entry), name, rename_options.preselect);
+
+ cmd_generic_track_entry(gen, ren->entry);
+
+ if(!ren->ovw_open)
+ {
+ ovw_overwrite_begin(ren->min, _("\"%s\" Already Exists - Proceed With Rename?"), 0U);
+ ren->ovw_open = TRUE;
+ }
+}
+
+static gboolean do_rename(DirPane *src, const DirRow2 *row, const gchar *new_name, GError **error)
+{
+ GFile *file;
+
+ if((file = dp_get_file_from_row(src, row)) != NULL)
+ {
+ GFile *nf;
+
+ nf = g_file_set_display_name(file, new_name, NULL, error);
+ if(nf != NULL)
+ g_object_unref(nf);
+ g_object_unref(file);
+
+ return nf != NULL;
+ }
+ return FALSE;
+}
+
+static gint ren_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user)
+{
+ RenInfo *ren = user;
+ const gchar *old_name, *new_name;
+ GFile *df;
+ gboolean ok;
+
+ old_name = dp_row_get_name(dp_get_tree_model(src), row);
+ new_name = gtk_entry_get_text(GTK_ENTRY(ren->entry));
+
+ /* Ignore renames to self. */
+ if(strcmp(old_name, new_name) == 0)
+ {
+ dp_unselect(src, row);
+ return 1;
+ }
+
+ err_clear(min);
+
+ /* Check for overwrite, and attempt to clear the way. */
+ switch(ovw_overwrite_unary_name(src, new_name))
+ {
+ case OVW_SKIP:
+ return 1;
+ case OVW_CANCEL:
+ return 0;
+ case OVW_PROCEED:
+ break;
+ case OVW_PROCEED_FILE:
+ case OVW_PROCEED_DIR:
+ df = dp_get_file_from_name(src, new_name);
+ if(df == NULL)
+ return 0;
+ ok = del_delete_gfile(min, df, FALSE, error);
+ g_object_unref(df);
+ if(!ok)
+ return 0;
+ break;
+ }
+
+ /* All is well, open the file and do the rename. */
+ return do_rename(src, row, new_name, error);
+}
+
+static void ren_free(gpointer user)
+{
+ if(((RenInfo *) user)->ovw_open)
+ ovw_overwrite_end(((RenInfo *) user)->min);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-06-29 - Cell editing started. We would like to just call do_preselect() here, but GTK+ seems to
+** also have ideas about the selection of the newly editing-enabled cell renderer. So we just
+** sneakily buffer the pointer, and hack it later. This is not pretty, but it seems to work.
+*/
+static void evt_cell_editing_started(GtkCellRenderer *cr, GtkCellEditable *editable, gchar *path, gpointer user)
+{
+ if(GTK_IS_EDITABLE(editable))
+ *(GtkEditable **) user = GTK_EDITABLE(editable);
+}
+
+/* 2011-01-03 - When editing ends, try to do the rename. */
+static void evt_cell_edited(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user)
+{
+ RenInfo *ri = user;
+ GtkTreeIter row;
+
+ if(new_text != NULL && *new_text != '\0')
+ {
+ if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(ri->inplace_pane->dir.store), &row, path))
+ {
+ ri->inplace_success = do_rename(ri->inplace_pane, &row, new_text, &ri->inplace_error);
+ if(!ri->inplace_success)
+ {
+ /* No generic framework, we need to do this ourselves. */
+ err_set_gerror(ri->min, &ri->inplace_error, NULL, NULL); /* Doesn't include file information, but whatever. */
+ }
+ }
+ }
+ gtk_main_quit();
+}
+
+/* 2011-01-03 - Pick up editing cancellation, and exit the recursive GTK+ main loop. */
+static void evt_cell_editing_canceled(GtkCellRenderer *cr, gpointer user)
+{
+ gtk_main_quit();
+}
+
+gint cmd_rename(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static RenInfo ri;
+
+ if(rename_options.single_in_place && dp_has_single_selection(src)) /* In-place? */
+ {
+ gsize i;
+ GtkTreeViewColumn *col = NULL;
+ GSList *sel;
+ GtkTreePath *path;
+ GList *cells;
+ GtkCellRenderer *cr;
+ GtkEditable *editable = NULL;
+
+ ri.inplace_pane = src;
+ ri.inplace_error = NULL;
+ ri.inplace_success = FALSE;
+
+ /* Find the (first) column that displays the name, if any. If there are several, you lose. */
+ for(i = 0; i < min->cfg.dp_format[src->index].num_columns; i++)
+ {
+ if(min->cfg.dp_format[src->index].format[i].content == DPC_NAME)
+ {
+ col = gtk_tree_view_get_column(GTK_TREE_VIEW(src->view), i);
+ break;
+ }
+ }
+ if(col == NULL)
+ return 0;
+
+ /* Get the cell renderer, so we can connect a signal handler. */
+ cells = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(col));
+ if(cells == NULL)
+ return 0;
+ cr = cells->data;
+ g_list_free(cells);
+
+ /* Make name's renderer editable, this *must* be done last-minute or it breaks double-clicking. */
+ g_object_set(G_OBJECT(cr), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, "editable", TRUE, "editable-set", TRUE, NULL);
+
+ /* Make sure the signal handler is connected, but only once. */
+ g_signal_handlers_disconnect_by_func(G_OBJECT(cr), G_CALLBACK(evt_cell_editing_started), &ri);
+ g_signal_connect(G_OBJECT(cr), "editing-started", G_CALLBACK(evt_cell_editing_started), &editable);
+ g_signal_handlers_disconnect_by_func(G_OBJECT(cr), G_CALLBACK(evt_cell_edited), &ri);
+ g_signal_connect(G_OBJECT(cr), "edited", G_CALLBACK(evt_cell_edited), &ri);
+ g_signal_handlers_disconnect_by_func(G_OBJECT(cr), G_CALLBACK(evt_cell_editing_canceled), &ri);
+ g_signal_connect(G_OBJECT(cr), "editing-canceled", G_CALLBACK(evt_cell_editing_canceled), &ri);
+
+ /* Get the path, and activate cell editing. */
+ sel = dp_get_selection(src);
+ if((path = gtk_tree_model_get_path(GTK_TREE_MODEL(src->dir.store), sel->data)) != NULL)
+ {
+ gtk_tree_view_set_cursor_on_cell(GTK_TREE_VIEW(src->view), path, col, NULL, TRUE);
+ gtk_tree_path_free(path);
+
+ /* Detach the keyboard acceleration context to prevent clashes. */
+ kbd_context_detach(min->gui->kbd_ctx, GTK_WINDOW(min->gui->window));
+
+ /* This got set by the the evt_cell_editing_started() callback, now apply preselection. */
+ if(editable != NULL)
+ {
+ gchar *text;
+
+ if((text = gtk_editable_get_chars(GTK_EDITABLE(editable), 0, -1)) != NULL)
+ {
+ init_preselect(GTK_EDITABLE(editable), text, rename_options.preselect);
+ g_free(text);
+ }
+ }
+ /* Recurse, so we keep Rename fully synchronous. */
+ gtk_main();
+
+ /* Editing is done, remove the editability. */
+ g_object_set(G_OBJECT(cr), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, "editable", FALSE, "editable-set", FALSE, NULL);
+
+ /* Re-attach keyboard modifiers. */
+ kbd_context_attach(min->gui->kbd_ctx, GTK_WINDOW(min->gui->window));
+ }
+ dp_free_selection(sel);
+ return ri.inplace_success;
+ }
+ else /* Do the classical generic-based dialog rename. */
+ {
+ ri.ovw_open = FALSE;
+ ri.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ ri.label = gtk_label_new("");
+ ri.entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(ri.entry), MAXNAMLEN - 1);
+ gtk_box_pack_start(GTK_BOX(ri.vbox), ri.label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(ri.vbox), ri.entry, FALSE, FALSE, 0);
+
+ return cmd_generic(min, _("Rename"), CGF_NOALL | CGF_NODST, ren_body, ren_action, ren_free, &ri);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void cfg_rename(MainInfo *min)
+{
+ if(rename_cmc == NULL)
+ {
+ /* Set the default values for module's options. */
+ rename_options.modified = FALSE;
+ rename_options.single_in_place = FALSE;
+ rename_options.preselect = PRESELECT_FULL;
+
+ rename_cmc = cmc_config_new("Rename", &rename_options);
+ cmc_field_add_boolean(rename_cmc, "modified", NULL, offsetof(OptRename, modified));
+ cmc_field_add_boolean(rename_cmc, "inplace", _("Rename Single File In-Place (Without Dialog)?"), offsetof(OptRename, single_in_place));
+ cmc_field_add_enum(rename_cmc, "preselect", _("Automatically Pre-Select"), offsetof(OptRename, preselect), _("None|Entire Name|Filename Only|Extension Only"));
+ cmc_config_register(rename_cmc);
+ }
+}
diff --git a/src/cmd_rename.h b/src/cmd_rename.h
new file mode 100644
index 0000000..a90585d
--- /dev/null
+++ b/src/cmd_rename.h
@@ -0,0 +1,6 @@
+/*
+** 1998-05-29 - Header for the native RENAME command. Can you say "simple"?
+*/
+
+extern gint cmd_rename(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern void cfg_rename(MainInfo *min);
diff --git a/src/cmd_renamere.c b/src/cmd_renamere.c
new file mode 100644
index 0000000..79a5063
--- /dev/null
+++ b/src/cmd_renamere.c
@@ -0,0 +1,534 @@
+/*
+** 1999-09-11 - A fun Rename command, with support for both simplistic replacement in filenames
+** as well as powerful regular expression replacement thingie. The former is handy
+** for changing the extension in all selected names from ".jpg" to ".jpeg", for
+** example. The latter RE mode can be used to do rather complex mappings and trans-
+** forms on the filenames. For example, consider having a set of 100 image files,
+** named "frame0.gif", "frame1.gif", ..., "frame99.gif". You want to rename these
+** to include a movie index (11), and also (of course) change the extension to ".png".
+** No problem. Just enter "^frame([0-9]+)\.gif$" in the 'From' text entry field
+** on the Reg Exp page, and "frame-11-$1.png" in the 'To' entry, and bam! The point
+** here is that you can use up to 9 parenthesized (?) subexpressions, and then access
+** the text that matched each with $n (n is a digit, 1 to 9) in the 'To' string.
+** If you've programmed any Perl, you might be familiar with the concept.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+
+#include "cmd_delete.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "strutil.h"
+
+#include "cmd_renamere.h"
+
+#define CMD_ID "renamere"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef enum {
+ LOWER, UPPER, INITIAL, HEADLINE
+} CaseMode;
+
+typedef struct {
+ Dialog *dlg;
+
+ GtkWidget *nbook;
+
+ /* Simple replace mode. */
+ GtkWidget *r_vbox;
+ GtkWidget *r_from;
+ GtkWidget *r_to;
+ GtkWidget *r_cnocase;
+ GtkWidget *r_cglobal;
+
+ /* Full RE matching mode. */
+ GtkWidget *re_vbox;
+ GtkWidget *re_from;
+ GtkWidget *re_to;
+ GtkWidget *re_cnocase;
+
+ /* Mapping mode (for character substitutions). */
+ GtkWidget *map_vbox;
+ GtkWidget *map_from;
+ GtkWidget *map_to;
+ GtkWidget *map_remove;
+
+ /* Case-conversion mode. */
+ GtkWidget *case_vbox;
+ GtkWidget *case_lower;
+ GtkWidget *case_upper;
+ GtkWidget *case_initial;
+
+ MainInfo *min;
+ DirPane *src;
+ gint page;
+ GSList *selection;
+} RenREInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean do_rename(MainInfo *min, DirPane *dp, const DirRow2 *row, const gchar *newname, GError **error)
+{
+ OvwRes ores;
+ GFile *file;
+ gboolean ok, doit = TRUE;
+
+ if(strcmp(dp_row_get_name_display(dp_get_tree_model(dp), row), newname) == 0)
+ {
+ dp_unselect(dp, row);
+ return TRUE;
+ }
+
+ /* Get imaginary destination file. */
+ if((file = dp_get_file_from_name(dp, newname)) == NULL)
+ return FALSE;
+ ores = ovw_overwrite_unary_file(dp, file);
+ if(ores == OVW_SKIP)
+ ok = !(doit = FALSE); /* H4xX0r. */
+ else if(ores == OVW_CANCEL)
+ ok = doit = FALSE;
+ else if(ores == OVW_PROCEED_FILE || ores == OVW_PROCEED_DIR)
+ ok = del_delete_gfile(min, file, FALSE, error);
+ else
+ ok = TRUE;
+
+ if(ok && doit)
+ {
+ GFile *dfile;
+
+ if((dfile = dp_get_file_from_row(dp, row)) != NULL)
+ {
+ GFile *nfile;
+
+ if((nfile = g_file_set_display_name(dfile, newname, NULL, error)) != NULL)
+ g_object_unref(nfile);
+ g_object_unref(dfile);
+ ok = nfile != NULL;
+ }
+ else
+ ok = FALSE;
+ }
+ if(!ok && error != NULL && *error != NULL)
+ err_set_gerror(min, error, CMD_ID, file);
+ g_object_unref(file);
+
+ if(ok)
+ dp_unselect(dp, row);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean rename_simple(RenREInfo *ri, GError **err)
+{
+ const gchar *fromd, *tod;
+ GString *nn;
+ GSList *iter;
+ gboolean nocase, global, ok = TRUE;
+
+ if((fromd = gtk_entry_get_text(GTK_ENTRY(ri->r_from))) == NULL)
+ return 0;
+ tod = gtk_entry_get_text(GTK_ENTRY(ri->r_to));
+
+ nocase = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->r_cnocase));
+ global = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->r_cglobal));
+
+ ovw_overwrite_begin(ri->min, _("\"%s\" Already Exists - Proceed With Rename?"), 0U);
+ nn = g_string_new("");
+ for(iter = ri->selection; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ if(stu_replace_simple(nn, dp_row_get_name_display(dp_get_tree_model(ri->src), iter->data), fromd, tod, global, nocase) > 0)
+ ok = do_rename(ri->min, ri->src, iter->data, nn->str, err);
+ }
+ g_string_free(nn, TRUE);
+ ovw_overwrite_end(ri->min);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-09-11 - Go through <def>, copying characters to <str>. If the sequence $n is found,
+** where n is a digit 1..9, replace that with the n:th piece of <src>, as described
+** by <match>. To get a single dollar in the output, write $$ in <def>.
+** Returns TRUE if the entire <def> was successfully interpolated, FALSE on error.
+*/
+static gboolean interpolate(GString *str, const gchar *def, const GMatchInfo *match)
+{
+ const gchar *ptr;
+
+ g_string_truncate(str, 0);
+ for(ptr = def; *ptr; ptr = g_utf8_next_char(ptr))
+ {
+ gunichar here;
+
+ here = g_utf8_get_char(ptr);
+ if(here == '$')
+ {
+ ptr = g_utf8_next_char(ptr);
+ here = g_utf8_get_char(ptr);
+ if(g_unichar_isdigit(here))
+ {
+ gint slot;
+
+ slot = g_unichar_digit_value(here);
+ if(slot >= 0 && slot <= 9)
+ {
+ gchar *ms = g_match_info_fetch(match, slot);
+
+ if(ms != NULL)
+ {
+ g_string_append(str, ms);
+ g_free(ms);
+ }
+ else
+ return FALSE;
+ }
+ else
+ return FALSE;
+ }
+ else if(*ptr == '$')
+ g_string_append_c(str, '$'), ptr++;
+ else
+ return FALSE;
+ }
+ else
+ g_string_append_unichar(str, here);
+ }
+ return TRUE;
+}
+
+static gboolean rename_regexp(RenREInfo *ri, GError **err)
+{
+ const gchar *fromdefd, *tod;
+ guint reflags;
+ GRegex *fromre = NULL;
+ gboolean ok = TRUE;
+
+ if((fromdefd = gtk_entry_get_text(GTK_ENTRY(ri->re_from))) == NULL)
+ return FALSE;
+ if((tod = gtk_entry_get_text(GTK_ENTRY(ri->re_to))) == NULL)
+ return FALSE;
+
+ reflags = G_REGEX_EXTENDED | (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->re_cnocase)) ? G_REGEX_CASELESS : 0);
+ if((fromre = g_regex_new(fromdefd, reflags, G_REGEX_MATCH_NOTEMPTY, err)) != NULL)
+ {
+ GSList *iter;
+ GString *nn;
+
+ ovw_overwrite_begin(ri->min, _("\"%s\" Already Exists - Proceed With Rename?"), 0U);
+ nn = g_string_new("");
+ for(iter = ri->selection; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ GMatchInfo *mi = NULL;
+
+ if(g_regex_match(fromre, dp_row_get_name_display(dp_get_tree_model(ri->src), iter->data), G_REGEX_MATCH_NOTEMPTY, &mi))
+ {
+ if(interpolate(nn, tod, mi) && g_utf8_strchr(nn->str, G_DIR_SEPARATOR, -1) == NULL)
+ ok = do_rename(ri->min, ri->src, iter->data, nn->str, err);
+ g_match_info_free(mi);
+ }
+ }
+ g_string_free(nn, TRUE);
+ ovw_overwrite_end(ri->min);
+ }
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean rename_map(RenREInfo *ri, GError **err)
+{
+ const gchar *fromdef, *todef, *remdef;
+ GSList *iter;
+ GString *nn, *nr;
+ gsize fl, rl, i, nl;
+ gboolean ok = TRUE;
+
+ if((fromdef = gtk_entry_get_text(GTK_ENTRY(ri->map_from))) == NULL)
+ return FALSE;
+ if((todef = gtk_entry_get_text(GTK_ENTRY(ri->map_to))) == NULL)
+ return FALSE;
+ if(g_utf8_strchr(todef, -1, G_DIR_SEPARATOR) != NULL) /* As always, prevent rogue moves. */
+ return FALSE;
+ if((remdef = gtk_entry_get_text(GTK_ENTRY(ri->map_remove))) == NULL)
+ return FALSE;
+
+ /* Totally important: some lengths are in chars (for iteration), some in bytes for g_utf8_strchr(). */
+ fl = strlen(fromdef);
+ rl = strlen(remdef);
+
+ ovw_overwrite_begin(ri->min, _("\"%s\" Already Exists - Proceed With Rename?"), 0U);
+ nn = g_string_new("");
+ nr = g_string_new("");
+ for(iter = ri->selection; iter != NULL; iter = g_slist_next(iter))
+ {
+ const gchar *ptr, *map;
+
+ /* Step 1: clear the dynamic string. */
+ g_string_truncate(nn, 0);
+ ptr = dp_row_get_name_display(dp_get_tree_model(ri->src), iter->data);
+ nl = g_utf8_strlen(ptr, -1);
+ /* Step 2: go through and do the mapping. */
+ for(i = 0; i < nl; i++, ptr = g_utf8_next_char(ptr))
+ {
+ gunichar ch = g_utf8_get_char(ptr);
+
+ if((map = g_utf8_strchr(fromdef, fl, ch)) != NULL)
+ {
+ glong index = g_utf8_pointer_to_offset(fromdef, map);
+ const gchar *tptr = g_utf8_offset_to_pointer(todef, index);
+
+ ch = g_utf8_get_char(tptr); /* Map. */
+ }
+ g_string_append_unichar(nn, ch);
+ }
+ /* Step 3: remove any characters found in the 'remove' string. */
+ ptr = nn->str;
+ nl = g_utf8_strlen(ptr, -1);
+ g_string_truncate(nr, 0);
+ for(i = 0; i < nl; i++, ptr = g_utf8_next_char(ptr))
+ {
+ gunichar ch = g_utf8_get_char(ptr);
+
+ if(g_utf8_strchr(remdef, rl, ch) == NULL)
+ g_string_append_unichar(nr, ch);
+ }
+ /* Step 4: do the rename, using the now-built "display name". */
+ ok = do_rename(ri->min, ri->src, iter->data, nr->str, err);
+ }
+ g_string_free(nr, TRUE);
+ g_string_free(nn, TRUE);
+ ovw_overwrite_end(ri->min);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-07-19 - Converts the given string to have an upper-case initial character, while the
+ * remainder is lower-case. This is a very western idea of a useful case
+ * conversion, but ... I'll include it anyway.
+*/
+static gchar * utf8_str_initial(const gchar *str, gssize len)
+{
+ GString *tmp;
+ gchar *buf;
+ gunichar here;
+
+ tmp = g_string_sized_new(len);
+
+ here = g_utf8_get_char(str);
+ g_string_append_unichar(tmp, g_unichar_toupper(here));
+
+ while(--len)
+ {
+ str = g_utf8_next_char(str);
+ here = g_utf8_get_char(str);
+ g_string_append_unichar(tmp, g_unichar_tolower(here));
+ }
+ buf = tmp->str;
+ g_string_free(tmp, FALSE);
+
+ return buf;
+}
+
+/* 2008-04-20 - Minor touch-ups due to GTK+ 2.0 and UTF-8 in strings. We need to make a decision:
+ * Is the map operation happening in file-system or display space? The obvious
+ * choice seems to be file-system, which is after all what the filenames are for.
+ * However, we don't have a general way of downcasing if the local file system is
+ * using UTF-8 ... So we use the display versions of the names, downcase in UTF-8,
+ * and then convert back.
+*/
+static gboolean rename_case(RenREInfo *ri, GError **err)
+{
+ GString *nn;
+ GSList *iter;
+ gchar * (*func)(const gchar *, gssize), *cc;
+ gboolean ok = TRUE;
+
+ /* Select the case-conversion function, once. */
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->case_lower)))
+ func = g_utf8_strdown;
+ else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->case_upper)))
+ func = g_utf8_strup;
+ else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ri->case_initial)))
+ func = utf8_str_initial;
+ else
+ return FALSE;
+
+ ovw_overwrite_begin(ri->min, _("\"%s\" Already Exists - Proceed With Rename?"), 0U);
+ nn = g_string_new("");
+ for(iter = ri->selection; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ const gchar *dn = dp_row_get_name_display(dp_get_tree_model(ri->src), iter->data);
+
+ /* Step 1: set the dynamic string to the input filename. */
+ g_string_assign(nn, dn);
+ /* Step 2: perform case conversion. */
+ cc = func(nn->str, nn->len);
+ /* Step 3: if resulting name is different, rename on disk. */
+ if(strcmp(dn, cc) != 0)
+ {
+ ok = do_rename(ri->min, ri->src, iter->data, cc, err);
+ }
+ g_free(cc);
+ }
+ g_string_free(nn, TRUE);
+ ovw_overwrite_end(ri->min);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_nbook_switchpage(GtkWidget *wid, gpointer page, gint page_num, gpointer user)
+{
+ RenREInfo *ri = user;
+
+ ri->page = page_num;
+ gtk_widget_grab_focus(ri->page ? ri->re_from : ri->r_from);
+}
+
+gint cmd_renamere(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GtkWidget *label, *grid;
+ static RenREInfo ri = { NULL };
+ gboolean ok = TRUE;
+
+ ri.min = min;
+ ri.src = src;
+
+ if((ri.selection = dp_get_selection(ri.src)) == NULL)
+ return 1;
+
+ if(ri.dlg == NULL)
+ {
+ ri.nbook = gtk_notebook_new();
+ g_signal_connect(G_OBJECT(ri.nbook), "switch-page", G_CALLBACK(evt_nbook_switchpage), &ri);
+
+ /* Build the 'Simple' mode's GUI. */
+ ri.r_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Look for substring in all filenames, and replace\nit with another string."));
+ gtk_box_pack_start(GTK_BOX(ri.r_vbox), label, FALSE, FALSE, 0);
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("Replace"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ ri.r_from = gui_dialog_entry_new();
+ gtk_widget_set_hexpand(ri.r_from, TRUE);
+ gtk_widget_set_halign(ri.r_from, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), ri.r_from, 1, 0, 1, 1);
+ label = gtk_label_new(_("With"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ ri.r_to = gui_dialog_entry_new();
+ gtk_grid_attach(GTK_GRID(grid), ri.r_to, 1, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(ri.r_vbox), grid, FALSE, FALSE, 0);
+ grid = gtk_grid_new();
+ ri.r_cnocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ gtk_widget_set_hexpand(ri.r_cnocase, TRUE);
+ gtk_widget_set_halign(ri.r_cnocase, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), ri.r_cnocase, 0, 0, 1, 1);
+ ri.r_cglobal = gtk_check_button_new_with_label(_("Replace All?"));
+ gtk_grid_attach(GTK_GRID(grid), ri.r_cglobal, 1, 0, 1, 1);
+ gtk_box_pack_start(GTK_BOX(ri.r_vbox), grid, FALSE, FALSE, 0);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(ri.nbook), ri.r_vbox, gtk_label_new(_("Simple")));
+
+ /* Build the 'Reg Exp' mode's GUI. */
+ ri.re_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new( _("Execute the 'From' RE on each filename, storing\n"
+ "parenthesised subexpression matches. Then replace\n"
+ "any occurance of $n in 'To', where n is the index\n"
+ "(counting from 1) of a subexpression, with the text\n"
+ "that matched, and use the result as a new filename."));
+ gtk_box_pack_start(GTK_BOX(ri.re_vbox), label, FALSE, FALSE, 0);
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("From"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ ri.re_from = gui_dialog_entry_new();
+ gtk_widget_set_hexpand(ri.re_from, TRUE);
+ gtk_widget_set_halign(ri.re_from, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), ri.re_from, 1, 0, 1, 1);
+ label = gtk_label_new(_("To"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ ri.re_to = gui_dialog_entry_new();
+ gtk_grid_attach(GTK_GRID(grid), ri.re_to, 1, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(ri.re_vbox), grid, FALSE, FALSE, 0);
+ ri.re_cnocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ gtk_box_pack_start(GTK_BOX(ri.re_vbox), ri.re_cnocase, FALSE, FALSE, 0);
+
+ gtk_notebook_append_page(GTK_NOTEBOOK(ri.nbook), ri.re_vbox, gtk_label_new(_("Reg Exp")));
+ gtk_widget_show_all(ri.re_vbox);
+
+ /* Build the 'Map' mode's GUI. */
+ ri.map_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Look for each character in the 'From' string, and replace\n"
+ "any hits with the corresponding character in the 'To' string.\n"
+ "Then, any characters in the 'Remove' string are removed from\n"
+ "the filename, and the result used as the new name for each file."));
+ gtk_box_pack_start(GTK_BOX(ri.map_vbox), label, FALSE, FALSE, 0);
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("From"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ ri.map_from = gui_dialog_entry_new();
+ gtk_widget_set_hexpand(ri.map_from, TRUE);
+ gtk_widget_set_halign(ri.map_from, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), ri.map_from, 1, 0, 1, 1);
+ label = gtk_label_new(_("To"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ ri.map_to = gui_dialog_entry_new();
+ gtk_grid_attach(GTK_GRID(grid), ri.map_to, 1, 1, 1, 1);
+ label = gtk_label_new(_("Remove"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1);
+ ri.map_remove = gui_dialog_entry_new();
+ gtk_grid_attach(GTK_GRID(grid), ri.map_remove, 1, 2, 1, 1);
+ gtk_box_pack_start(GTK_BOX(ri.map_vbox), grid, FALSE, FALSE, 0);
+ gtk_notebook_append_page(GTK_NOTEBOOK(ri.nbook), ri.map_vbox, gtk_label_new(_("Map")));
+
+ /* Build the 'Case' mode's GUI. */
+ ri.case_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Changes the case (upper/lower) of the characters\nin the selected filename(s)."));
+ gtk_box_pack_start(GTK_BOX(ri.case_vbox), label, FALSE, FALSE, 0);
+ ri.case_lower = gtk_radio_button_new_with_label(NULL, _("Lower Case?"));
+ gtk_box_pack_start(GTK_BOX(ri.case_vbox), ri.case_lower, FALSE, FALSE, 0);
+ ri.case_upper = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(ri.case_lower)), _("Upper Case?"));
+ gtk_box_pack_start(GTK_BOX(ri.case_vbox), ri.case_upper, FALSE, FALSE, 0);
+ ri.case_initial = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(ri.case_lower)), _("Upper Case Initial?"));
+ gtk_box_pack_start(GTK_BOX(ri.case_vbox), ri.case_initial, FALSE, FALSE, 0);
+ gtk_widget_show_all(ri.map_vbox);
+ gtk_notebook_append_page(GTK_NOTEBOOK(ri.nbook), ri.case_vbox, gtk_label_new(_("Case")));
+
+ ri.dlg = dlg_dialog_sync_new(ri.nbook, _("RenameRE"), NULL);
+
+ ri.page = 0;
+ }
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(ri.nbook), ri.page);
+ gtk_widget_grab_focus(ri.page ? ri.re_from : ri.r_from);
+
+ if(dlg_dialog_sync_wait(ri.dlg) == DLG_POSITIVE)
+ {
+ GError *err = NULL;
+
+ if(ri.page == 0)
+ ok = rename_simple(&ri, &err);
+ else if(ri.page == 1)
+ ok = rename_regexp(&ri, &err);
+ else if(ri.page == 2)
+ ok = rename_map(&ri, &err);
+ else
+ ok = rename_case(&ri, &err);
+ if(ok)
+ dp_rescan_post_cmd(ri.src);
+ }
+ dp_free_selection(ri.selection);
+ ri.selection = NULL;
+
+ return ok;
+}
diff --git a/src/cmd_renamere.h b/src/cmd_renamere.h
new file mode 100644
index 0000000..a8e5f07
--- /dev/null
+++ b/src/cmd_renamere.h
@@ -0,0 +1,5 @@
+/*
+** 1999-09-11 - Just another boring command module header.
+*/
+
+extern gint cmd_renamere(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_renameseq.c b/src/cmd_renameseq.c
new file mode 100644
index 0000000..d23d493
--- /dev/null
+++ b/src/cmd_renameseq.c
@@ -0,0 +1,386 @@
+/*
+** 2001-09-30 - A rename command that creates numbered sequences. I want it when arranging
+** images from a digital camera, but it might be handy for other stuff too, I'm
+** sure.
+**
+** This is slightly more complicated than you might think at first, since
+** it actually does _two_ renames: first all affected files are renamed
+** to sequential temporary names, and then in a second pass the final names
+** are set. This allows the final sequence to overlap the initial, which I
+** predict will be useful.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+
+#include "cmd_delete.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "strutil.h"
+
+#include "cmd_renameseq.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef enum { BASE_8, BASE_10, BASE_16L, BASE_16U } RSBase;
+
+typedef struct {
+ MainInfo *min;
+
+ guint start; /* Index to start at. */
+ RSBase base; /* The base we're using. */
+ guint precision; /* Precision, i.e. number of digits. */
+ GString *head; /* First part of name, before number. */
+ GString *tail; /* End part, after number. */
+} RenSeqInfo;
+
+/* Widgets that are used to set the various parameters above, in dialog mode. */
+typedef struct {
+ RenSeqInfo *rsi;
+ const gchar *name; /* Name from first selected row, for Guess. */
+ Dialog *dlg;
+ GtkWidget *start;
+ GtkWidget *base;
+ GtkWidget *precision;
+ GtkWidget *head;
+ GtkWidget *tail;
+ GtkWidget *guess;
+ GtkWidget *preview;
+} RenSeqDialog;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static const gchar * compute_name(RenSeqInfo *rsi, guint index)
+{
+ static gchar buf[PATH_MAX];
+ const gchar *fptr = NULL;
+
+ switch(rsi->base)
+ {
+ case BASE_8: fptr = "%s%0*o%s"; break;
+ case BASE_10: fptr = "%s%0*u%s"; break;
+ case BASE_16L: fptr = "%s%0*x%s"; break;
+ case BASE_16U: fptr = "%s%0*X%s"; break;
+ }
+ g_snprintf(buf, sizeof buf, fptr, rsi->head->str, rsi->precision, rsi->start + index, rsi->tail->str);
+
+ return buf;
+}
+
+static void temp_file_undo(GSList *titer, GSList *siter, GtkTreeModel *model)
+{
+ g_file_set_display_name(titer->data, dp_row_get_name_display(model, siter->data), NULL, NULL);
+}
+
+/* 2009-10-04 - Given a list of selected input files, and a list of temporary renamed files, undo the renames.
+** The length of tlist might be shorter than that of slist, so let it decide.
+*/
+static void temp_files_undo(GSList *tlist, GSList *slist, GtkTreeModel *model)
+{
+ GSList *titer, *siter;
+
+ for(titer = tlist, siter = slist; titer != NULL; titer = g_slist_next(titer), siter = g_slist_next(siter))
+ {
+ if(titer->data != NULL)
+ temp_file_undo(titer, siter, model);
+ }
+}
+
+/* 2009-10-04 - Free a list of temporary files. */
+static void temp_files_free(GSList *tlist)
+{
+ GSList *titer;
+
+ for(titer = tlist; titer != NULL; titer = g_slist_next(titer))
+ {
+ if(titer->data != NULL)
+ g_object_unref(titer->data);
+ }
+ g_slist_free(tlist);
+}
+
+static gboolean do_renameseq(RenSeqInfo *rsi, DirPane *src, GError **err)
+{
+ GSList *slist, *iter, *tlist = NULL;
+ GString *tmppfx;
+ gboolean ok = TRUE;
+ guint index;
+ GtkTreeModel *m = dp_get_tree_model(src);
+
+ /* A Rename in gentoo is never a move. Gotta keep'em separated. */
+ if(strchr(rsi->head->str, G_DIR_SEPARATOR) != NULL ||
+ strchr(rsi->tail->str, G_DIR_SEPARATOR) != NULL)
+ return FALSE;
+
+ slist = dp_get_selection(src);
+ tmppfx = g_string_sized_new(64);
+ g_string_append_printf(tmppfx, ".gt!%u:%x", (guint) getpid(), (guint) time(NULL) % 1007);
+ /* Give all files temporary names, so we can handle overlaps in sequencing. */
+ for(iter = slist, index = 0; ok && (iter != NULL); iter = g_slist_next(iter), index++)
+ {
+ GFile *f, *nf;
+
+ if((f = dp_get_file_from_row(src, iter->data)) != NULL)
+ {
+ gchar dname[PATH_MAX];
+
+ g_snprintf(dname, sizeof dname, "%s,%u", tmppfx->str, index);
+ nf = g_file_set_display_name(f, dname, NULL, err);
+ if(nf != NULL)
+ {
+ tlist = g_slist_append(tlist, nf);
+ dp_unselect(src, iter->data);
+ }
+ else
+ ok = FALSE;
+ }
+ else
+ ok = FALSE;
+ }
+ /* If temporary-naming went fine, continue with final renames. */
+ if(ok)
+ {
+ GSList *titer, *siter;
+ GFile *nf;
+
+ /* Note: can't iterate over selection, the pane's GFile pointers are stale after the temporary rename. */
+ ovw_overwrite_begin(rsi->min, _("\"%s\" Already Exists - Proceed With Rename?"), OVWF_NO_RECURSE_TEST);
+ for(titer = tlist, siter = slist, index = 0; ok && (titer != NULL); titer = g_slist_next(titer), siter = g_slist_next(siter), index++)
+ {
+ const gchar *nn = compute_name(rsi, index);
+ OvwRes ores;
+ GFile *dest;
+
+ dest = dp_get_file_from_name(src, nn);
+ ores = ovw_overwrite_unary_file(src, dest);
+ if(ores == OVW_SKIP)
+ {
+ /* On skip, a single temporary name must be undo:ed. */
+ temp_file_undo(titer, siter, m);
+ /* Then this file must be removed from the temporary list. We do this by just blanking it out. */
+ g_object_unref(titer->data);
+ titer->data = NULL;
+ /* Drop the destination file, so we can continue the loop. */
+ g_object_unref(dest);
+ continue;
+ }
+ else if(ores == OVW_CANCEL)
+ ok = FALSE;
+ else if(ores == OVW_PROCEED_DIR || ores == OVW_PROCEED_FILE)
+ ok = del_delete_gfile(rsi->min, dest, FALSE, err);
+
+ if(ok)
+ {
+ nf = g_file_set_display_name(titer->data, compute_name(rsi, index), NULL, err);
+ if(nf != NULL)
+ g_object_unref(nf);
+ else
+ ok = FALSE;
+ }
+ g_object_unref(dest);
+ }
+ ovw_overwrite_end(rsi->min);
+ }
+ else
+ temp_files_undo(tlist, slist, m);
+ temp_files_free(tlist);
+ dp_free_selection(slist);
+
+ return ok;
+}
+
+static void init_start(const RenSeqInfo *rsi, GtkWidget *entry)
+{
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(entry), rsi->start);
+}
+
+/* 2001-10-02 - Crap day. Anyway, extract state from various widgets, and dump it into the
+** 'rsi' field of <dlg>.
+*/
+static void rsi_update(RenSeqDialog *dlg)
+{
+ /* First, extract current base so we know how to parse the start index. */
+ dlg->rsi->base = gtk_combo_box_get_active(GTK_COMBO_BOX(dlg->base));
+ gtk_widget_set_sensitive(dlg->guess, dlg->rsi->base == BASE_10);
+
+ if(sscanf(gtk_entry_get_text(GTK_ENTRY(dlg->start)), "%u", &dlg->rsi->start) != 1)
+ dlg->rsi->start = 1;
+
+ dlg->rsi->precision = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(dlg->precision));
+
+ g_string_assign(dlg->rsi->head, gtk_entry_get_text(GTK_ENTRY(dlg->head)));
+ g_string_assign(dlg->rsi->tail, gtk_entry_get_text(GTK_ENTRY(dlg->tail)));
+}
+
+static void preview_update(RenSeqDialog *dlg)
+{
+ rsi_update(dlg);
+ gtk_entry_set_text(GTK_ENTRY(dlg->preview), compute_name(dlg->rsi, 0U));
+}
+
+/* 2001-10-02 - Joint widget-changed handler. Just call preview_update(). */
+static void evt_something_changed(GtkWidget *wid, gpointer user)
+{
+ preview_update(user);
+}
+
+static gboolean find_digit(gunichar here, gpointer user)
+{
+ return g_unichar_isdigit(here);
+}
+
+/* 2010-03-07 - Inspect first name in selection, and attempt to set parameters
+** accordingly. Glitzy, sure, but I do like sugar in my software. :)
+** Now works in UTF-8 (display names), and only in decimal mode.
+*/
+static void evt_guess_clicked(GtkWidget *wid, gpointer user)
+{
+ RenSeqDialog *dlg = user;
+ GString *head;
+ const gchar *dptr;
+ gunichar here;
+
+ /* String processing here is on dlg->name, which is a GIO "display name". */
+ /* Extract characters up to the first digit. */
+ head = g_string_new("");
+ if((dptr = stu_utf8_find(dlg->name, find_digit, NULL)) != NULL && dptr > dlg->name)
+ {
+ guint value = 0, prec = 0;
+
+ g_string_append_len(head, dlg->name, dptr - dlg->name);
+ /* Count the number of digits, while extracting actual (decimal) number. */
+ while(*dptr && g_unichar_isdigit(here = g_utf8_get_char(dptr)))
+ {
+ value *= 10;
+ value += here - '0';
+ prec++;
+ dptr = g_utf8_next_char(dptr);
+ }
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(dlg->start), value);
+ gtk_entry_set_text(GTK_ENTRY(dlg->head), head->str);
+ gtk_entry_set_text(GTK_ENTRY(dlg->tail), dptr);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(dlg->precision), prec);
+ }
+ else if((dptr = g_utf8_strchr(dlg->name, -1, '.')) != NULL)
+ {
+ g_string_append_len(head, dlg->name, dptr - dlg->name);
+ gtk_entry_set_text(GTK_ENTRY(dlg->head), head->str);
+ gtk_entry_set_text(GTK_ENTRY(dlg->tail), dptr);
+ }
+}
+
+/* 2001-10-03 - Well, here's the actual command entrypoint, like usual. */
+gint cmd_renameseq(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static RenSeqInfo rsi = { NULL };
+ const gchar *bname[] = { N_("8, Octal"), N_("10, Decimal"), N_("16, Hex (a-f)"), N_("16, Hex (A-F)") };
+ GtkAdjustment *adj;
+ GtkWidget *vbox, *grid, *label;
+ RenSeqDialog dlg;
+ gint i, ret;
+ GSList *sel;
+ gboolean ok = FALSE;
+
+ if((sel = dp_get_selection(src)) == NULL)
+ return 0;
+ dlg.name = dp_row_get_name_display(dp_get_tree_model(src), sel->data);
+ dp_free_selection(sel);
+
+ if(rsi.min == NULL)
+ {
+ rsi.min = min;
+ rsi.start = 1;
+ rsi.base = BASE_10;
+ rsi.precision = 5;
+ rsi.head = g_string_new("");
+ rsi.tail = g_string_new("");
+ }
+ dlg.rsi = &rsi;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("This command renames all selected files\n"
+ "into a numbered sequence. The controls\n"
+ "below let you define how the names are\n"
+ "formed."));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("Start At"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ adj = gtk_adjustment_new(1.0, 0.0, 4924967295.0, 1.0, 10.0, 0.0);
+ dlg.start = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
+ init_start(&rsi, dlg.start);
+ g_signal_connect(G_OBJECT(dlg.start), "changed", G_CALLBACK(evt_something_changed), &dlg);
+ gtk_widget_set_hexpand(dlg.start, TRUE);
+ gtk_widget_set_halign(dlg.start, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), dlg.start, 1, 0, 2, 1);
+ label = gtk_label_new("(Base 10)");
+ gtk_grid_attach(GTK_GRID(grid), label, 3, 0, 1, 1);
+
+ label = gtk_label_new(_("Base"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ dlg.base = gtk_combo_box_text_new();
+ for(i = 0; i < sizeof bname / sizeof bname[0]; i++)
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(dlg.base), _(bname[i]));
+ g_signal_connect(G_OBJECT(dlg.base), "changed", G_CALLBACK(evt_something_changed), &dlg);
+ gtk_grid_attach(GTK_GRID(grid), dlg.base, 1, 1, 1, 1);
+
+ label = gtk_label_new(_("Precision"));
+ gtk_grid_attach(GTK_GRID(grid), label, 2, 1, 1, 1);
+ adj = gtk_adjustment_new(rsi.precision, 0.0, 10.0, 1.0, 1.0, 0.0);
+ dlg.precision = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0, 0);
+ g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(evt_something_changed), &dlg);
+ gtk_grid_attach(GTK_GRID(grid), dlg.precision, 3, 1, 1, 1);
+
+ label = gtk_label_new(_("Head"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1);
+ dlg.head = gui_dialog_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(dlg.head), rsi.head->str);
+ g_signal_connect(G_OBJECT(dlg.head), "changed", G_CALLBACK(evt_something_changed), &dlg);
+ gtk_grid_attach(GTK_GRID(grid), dlg.head, 1, 2, 2, 1);
+
+ label = gtk_label_new(_("Tail"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 3, 1, 1);
+ dlg.tail = gui_dialog_entry_new();
+ gtk_entry_set_text(GTK_ENTRY(dlg.tail), rsi.tail->str);
+ g_signal_connect(G_OBJECT(dlg.tail), "changed", G_CALLBACK(evt_something_changed), &dlg);
+ gtk_grid_attach(GTK_GRID(grid), dlg.tail, 1, 3, 2, 1);
+
+ dlg.guess = gtk_button_new_with_label(_("Guess"));
+ g_signal_connect(G_OBJECT(dlg.guess), "clicked", G_CALLBACK(evt_guess_clicked), &dlg);
+ gtk_grid_attach(GTK_GRID(grid), dlg.guess, 3, 2, 1, 2);
+
+ label = gtk_label_new(_("Preview"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 4, 1, 1);
+ dlg.preview = gui_dialog_entry_new();
+ gtk_editable_set_editable(GTK_EDITABLE(dlg.preview), FALSE);
+ gtk_grid_attach(GTK_GRID(grid), dlg.preview, 1, 4, 3, 1);
+
+ gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(dlg.base), rsi.base);
+ preview_update(&dlg);
+
+ dlg.dlg = dlg_dialog_sync_new(vbox, _("Sequential Rename"), NULL);
+ ret = dlg_dialog_sync_wait(dlg.dlg);
+
+ if(ret == DLG_POSITIVE)
+ {
+ GError *err = NULL;
+
+ rsi_update(&dlg);
+ err_clear(min);
+ ok = do_renameseq(&rsi, src, &err);
+ dp_rescan_post_cmd(src);
+ if(!ok)
+ err_set_gerror(min, &err, "RenameSeq", NULL);
+ }
+ dlg_dialog_sync_destroy(dlg.dlg);
+
+ return ok;
+}
diff --git a/src/cmd_renameseq.h b/src/cmd_renameseq.h
new file mode 100644
index 0000000..8b3c901
--- /dev/null
+++ b/src/cmd_renameseq.h
@@ -0,0 +1,5 @@
+/*
+** 2001-09-30 - Sequential rename declaration.
+*/
+
+extern gint cmd_renameseq(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_run.c b/src/cmd_run.c
new file mode 100644
index 0000000..bb99aee
--- /dev/null
+++ b/src/cmd_run.c
@@ -0,0 +1,52 @@
+/*
+** 1998-09-12 - A simple yet very useful command; pop up the list of built-ins, and
+** let the user pick one. Then run that command!
+** 1998-09-27 - Reimplemented using the new command sequence architecture (and dialog).
+** Renamed the module too, since there is no longer any need for a RunUser
+** command.
+** 1999-03-29 - Simplified thanks to new cmdseq_dialog semantics.
+*/
+
+#include "gentoo.h"
+
+#include "cmdseq.h"
+#include "cmdseq_dialog.h"
+
+#include "cmd_run.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static char last_command[512] = "";
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Pop up a dialog letting user select (or type) a command name,
+** and then run it.
+*/
+gint cmd_run(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *cmd;
+ gint ok = 0;
+
+ if((cmd = csq_dialog_sync_new_wait(min, NULL)) != NULL)
+ {
+ /* Don't store Rerun itself, life becomes so circular and repetitive then. */
+ if(strncmp(cmd, "Rerun", 5) != 0)
+ {
+ /* Attempt to remember, but if command overflows, drop it but still let it run. */
+ if(g_snprintf(last_command, sizeof last_command, "%s", cmd) > sizeof last_command)
+ last_command[0] = '\0';
+ }
+
+ ok = csq_execute(min, cmd);
+ }
+ return ok;
+}
+
+/* 2010-01-01 - Rerun the last run command. Handy during testing, at least. */
+gint cmd_rerun(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ if(last_command[0] != '\0')
+ return csq_execute(min, last_command);
+ return cmd_run(min, src, dst, ca);
+}
diff --git a/src/cmd_run.h b/src/cmd_run.h
new file mode 100644
index 0000000..7ac3d01
--- /dev/null
+++ b/src/cmd_run.h
@@ -0,0 +1,6 @@
+/*
+** 1998-09-12 - Header file for the run command module.
+*/
+
+extern gint cmd_run(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_rerun(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_select.c b/src/cmd_select.c
new file mode 100644
index 0000000..44d9c99
--- /dev/null
+++ b/src/cmd_select.c
@@ -0,0 +1,777 @@
+/*
+** 1998-05-29 - This command is simply essential. It selects all entries in the current
+** pane.
+** 1998-06-04 - Greatly expanded; now also includes commands to deselect all entries,
+** toggle selected/unselected, and a quite powerful regular expression
+** selection tool. :) Also added freezing/thawing of the dirpane clist
+** during execution of these routines; helps speed, improves looks.
+** 1998-06-05 - Added a glob->RE translator, triggered by a check box in the selreg
+** dialog. Simplifies life for casual users (like myself). Also added
+** a check box which allows the user to invert the RE matching set, i.e.
+** to act upon all entries that do NOT match the expression.
+** BUG: The matching should check for regexec() internal errors!
+** 1998-08-02 - Added (mysteriously missing) support for SM_TYPE_FILES in selection,
+** and also closing the dialog by return/enter (accepts) and escape (cancels).
+** 1998-09-19 - Replaced regexp routines with the POSIX ones in the C library, which I
+** just discovered. Better.
+** 1999-03-04 - Changes in how selections are handled through-out gentoo made some
+** changes in this module necessary. We're on GTK+ 1.2.0 now.
+** 1999-05-06 - Adapted for built-in command argument support. Really cool.
+** 1999-06-19 - Adapted for the new dialog module. Fun, fun, fun. Not. ;^)
+** 1999-11-14 - Added support for user-selectable content matching in SelectRE. I like it.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "cmdparse.h"
+#include "dirpane.h"
+#include "dialog.h"
+#include "dpformat.h"
+#include "events.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "strutil.h"
+#include "types.h"
+
+#include "cmd_select.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+
+/* Selection parameters.
+ * FIXME: Converted over from #defines, could do with some more loving.
+*/
+enum {
+ SM_SET = 0,
+ SM_TYPE = 1,
+ SM_ACTION = 2,
+
+ SM_SET_ALL = 0,
+ SM_SET_SELECTED = 1,
+ SM_SET_UNSELECTED = 2,
+
+ SM_TYPE_ALL = 0,
+ SM_TYPE_DIRS = 1,
+ SM_TYPE_FILES = 2,
+
+ SM_ACTION_SELECT = 0,
+ SM_ACTION_UNSELECT = 1,
+ SM_ACTION_TOGGLE = 2
+};
+
+typedef void (*SelAction)(DirPane *, const DirRow2 *);
+
+/* Base selection parameters. Filled-in either by GUI, or by direct command arguments. */
+typedef struct {
+ guint set; /* In which set of rows should we operate? */
+ guint type; /* Do we operate only on files, dirs, or both? */
+ guint action; /* What do we do with matching rows? */
+ DPContent content; /* Which field of the pane should we match against? */
+} SelParam;
+
+typedef struct {
+ SelParam basic; /* Basic parameters (selection set, action, content). */
+ gboolean glob; /* Treat the RE as a glob pattern? */
+ gboolean invert; /* Invert the matching sense? */
+ gboolean full; /* Require RE to match entire row? */
+ gboolean nocase; /* Ignore case differences? */
+ GString *re; /* The actual regular expression string. */
+} SelParamRE;
+
+typedef struct {
+ SelParam basic; /* Basic parameters (selection set, action, content). */
+ GString *cmd; /* Shell command to execute. */
+} SelParamShell;
+
+static SelParamRE old_sp_re = {
+ { SM_SET_ALL, SM_TYPE_ALL, SM_ACTION_SELECT, DPC_NAME },
+ TRUE, FALSE, TRUE, FALSE, NULL
+};
+
+static SelParamShell old_sp_shell = {
+ { SM_SET_ALL, SM_TYPE_ALL, SM_ACTION_SELECT, DPC_NAME },
+ NULL
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Select a specific row, or, if the row=ROW keyword is not specified, the one that was last clicked. */
+gint cmd_selectrow(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gint ri;
+ gchar buf[16];
+ GtkTreeIter iter;
+
+ ri = car_keyword_get_integer(ca, "row", -1);
+ if(ri < 0)
+ {
+ GdkEventButton *evt;
+ gint ok = 0;
+
+ if((evt = (GdkEventButton *) evt_event_get(GDK_BUTTON_PRESS)) != NULL)
+ {
+ GtkTreePath *path;
+
+ if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(src->view), evt->x, evt->y, &path, NULL, NULL, NULL))
+ {
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter(dp_get_tree_model(src), &iter, path))
+ {
+ dp_select(src, &iter);
+ ok = 1;
+ }
+ gtk_tree_path_free(path);
+ }
+ }
+ return ok;
+ }
+
+ g_snprintf(buf, sizeof buf, "%d", ri);
+ if(gtk_tree_model_get_iter_from_string(dp_get_tree_model(src), &iter, buf))
+ {
+ guint action;
+ void (*afunc)(DirPane *dp, const DirRow2 *row);
+
+ action = car_keyword_get_enum(ca, "action", 0, "select", "unselect", "toggle", NULL);
+ afunc = (action == 0) ? dp_select : (action == 1) ? dp_unselect : dp_toggle;
+ afunc(src, (DirRow2 *) &iter);
+ gui_events_flush();
+ return 1;
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-04 - Select all rows in the currently active pane. Rewritten for the new cooler
+** selection management made possible by GTK+ 1.2.0.
+*/
+gint cmd_selectall(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_select_all(src);
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-04 - Unselect all rows of current pane. Rewritten. */
+gint cmd_selectnone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_unselect_all(src);
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-04 - Invert the selection set, making all currently selected files become
+** unselected, and all unselected become selected.
+** 2002-08-25 - Complete rewrite, now uses bit vector for speed. 40-100X faster.
+** 2009-10-01 - Complete rewrite, ported to GTK+ 2.0, one-third the size.
+*/
+gint cmd_selecttoggle(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(dp_get_tree_model(src), &iter))
+ {
+ GtkTreeSelection *ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(src->view));
+ g_signal_handler_block(G_OBJECT(ts), src->sig_sel_changed);
+ do
+ {
+ if(gtk_tree_selection_iter_is_selected(ts, &iter))
+ gtk_tree_selection_unselect_iter(ts, &iter);
+ else
+ gtk_tree_selection_select_iter(ts, &iter);
+ } while(gtk_tree_model_iter_next(dp_get_tree_model(src), &iter));
+ g_signal_handler_unblock(G_OBJECT(ts), src->sig_sel_changed);
+ g_signal_emit_by_name(G_OBJECT(ts), "changed", src);
+ }
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-06 - Inspect which set (selected or unselected) the given row is, and determine
+** if it complies with the wanted one as specified in <sp>.
+*/
+static gboolean filter_set(DirPane *dp, const DirRow2 *row, const SelParam *sp)
+{
+ gboolean sel;
+
+ if(sp->set == SM_SET_ALL)
+ return TRUE;
+ sel = dp_is_selected(dp, row);
+ return (sp->set == SM_SET_SELECTED) ? sel : !sel;
+}
+
+/* 1999-05-06 - Inspect type (dir or non-dir) given row has, and match against <sp>. */
+static gboolean filter_type(DirPane *dp, const DirRow2 *row, const SelParam *sp)
+{
+ gboolean dir;
+
+ if(sp->type == SM_TYPE_ALL)
+ return TRUE;
+ dir = dp_row_get_file_type(dp_get_tree_model(dp), row, TRUE) == G_FILE_TYPE_DIRECTORY;
+
+ return (sp->type == SM_TYPE_DIRS) ? dir : !dir;
+}
+
+/* 2005-06-04 - Select action fuction. The <action> should be one of the SM_ACTION_ values. */
+static SelAction select_action_func(gint action)
+{
+ switch(action)
+ {
+ case SM_ACTION_SELECT:
+ return dp_select;
+ case SM_ACTION_UNSELECT:
+ return dp_unselect;
+ case SM_ACTION_TOGGLE:
+ return dp_toggle;
+ }
+ return NULL;
+}
+
+/* 1999-05-06 - Once we have all the selection's parameters neatly tucked into <sp>, perform the
+** actual operation.
+*/
+static void do_selectre(MainInfo *min, DirPane *dp, SelParamRE *sp)
+{
+ GString *tmp;
+ GRegex *re;
+ void (*sel_action)(DirPane *dp, const DirRow2 *row) = NULL;
+
+ if(sp->re == NULL)
+ return;
+ sel_action = select_action_func(sp->basic.action);
+ if((tmp = g_string_new(sp->re->str)) != NULL)
+ {
+ GError *error = NULL;
+
+ if(sp->glob)
+ stu_gstring_glob_to_re(tmp);
+ if(sp->full) /* Require RE to match entire name? Then surround it with "^$". */
+ {
+ g_string_prepend_c(tmp, '^');
+ g_string_append_c(tmp, '$');
+ }
+ if((re = g_regex_new(tmp->str, G_REGEX_EXTENDED | (sp->nocase ? G_REGEX_CASELESS : 0), G_REGEX_MATCH_NOTEMPTY, &error)) != NULL)
+ {
+ gboolean matchok;
+ GtkTreeIter iter;
+ gchar text[1024];
+ GtkTreeModel *m = dp_get_tree_model(dp);
+
+ matchok = !sp->invert;
+ if(gtk_tree_model_get_iter_first(m, &iter))
+ {
+ do
+ {
+ if(filter_set(dp, &iter, &sp->basic) && filter_type(dp, &iter, &sp->basic))
+ {
+ if(dpf_get_content(min, dp, &iter, sp->basic.content, text, sizeof text))
+ {
+ if(g_regex_match(re, text, G_REGEX_MATCH_NOTEMPTY, NULL) == matchok)
+ sel_action(dp, &iter);
+ }
+ }
+ } while(gtk_tree_model_iter_next(m, &iter));
+ }
+ g_regex_unref(re);
+ }
+ else
+ {
+ if(error != NULL)
+ {
+ dlg_dialog_async_new_error(error->message);
+ g_error_free(error);
+ }
+ }
+ g_string_free(tmp, TRUE);
+ }
+}
+
+/* 1999-05-06 - Build a mode selection menu, using items from <def>. Items are separated by vertical
+** bars. Each item will have it's user data set to the index of the item in question.
+** 2010-05-15 - Now builds a combo box, rather than a menu.
+*/
+static GtkWidget * build_mode_combo_box(const gchar *def)
+{
+ GtkWidget *cbox = NULL;
+ gchar *temp, *iname, *iend;
+ guint minor;
+
+ if((temp = g_strdup(def)) != NULL)
+ {
+ cbox = gtk_combo_box_text_new();
+ for(iname = temp, minor = 0; (*iname != '\0') && (iend = strchr(iname, '|')) != NULL; iname = iend + 1, minor++)
+ {
+ *iend = '\0';
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbox), iname);
+ }
+ g_free(temp);
+ }
+ return cbox;
+}
+
+/* 2005-06-04 - Compute which index in a content menu (as created by build_content_menu(), above)
+ * a given content type has. Returns 0 if <content> is not used by <dp>.
+*/
+static guint content_menu_find(const DirPane *dp, DPContent content)
+{
+ const MainInfo *min = dp->main;
+ const DPFormat *dpf;
+ guint i, index;
+
+ dpf = &min->cfg.dp_format[dp->index];
+ for(i = index = 0; i < dpf->num_columns; i++)
+ {
+ if(dpf->format[i].content == DPC_ICON)
+ continue;
+ if(dpf->format[i].content == content)
+ return index;
+ index++;
+ }
+ return 0;
+}
+
+/* 1999-05-06 - Build option menus for mode selections. */
+static void selparam_init_menus(DirPane *dp, GtkWidget *vbox, GtkWidget *opt_menu[4], guint *history[4])
+{
+ const gchar *mdef[] = { N_("All rows|Selected|Unselected|"),
+ N_("All types|Directories only|Non-directories only|"),
+ N_("Select|Unselect|Toggle|") },
+ *mlabel[] = { N_("Set"), N_("Type"), N_("Action") };
+ GtkWidget *grid, *label;
+ guint i;
+
+ grid = gtk_grid_new();
+ for(i = 0; i < sizeof mdef / sizeof mdef[0]; i++)
+ {
+ label = gtk_label_new(_(mlabel[i]));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
+ opt_menu[i] = build_mode_combo_box(_(mdef[i]));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(opt_menu[i]), *history[i]);
+ gtk_widget_set_hexpand(opt_menu[i], TRUE);
+ gtk_widget_set_halign(opt_menu[i], GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), opt_menu[i], 1, i, 1, 1);
+ }
+ label = gtk_label_new(_("Content"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, i, 1, 1);
+ opt_menu[3] = dpf_get_content_combo_box(NULL, NULL); /* We read out choice later, no callback needed. */
+ gtk_combo_box_set_active(GTK_COMBO_BOX(opt_menu[3]), content_menu_find(dp, *history[3]));
+ gtk_grid_attach(GTK_GRID(grid), opt_menu[3], 1, i, 1, 1);
+
+ gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
+}
+
+/* 2005-06-04 - Parse out basic select parameters from command arguments. */
+static void selparam_set_from_cmdarg(SelParam *sp, const CmdArg *ca)
+{
+ const gchar *content;
+
+ /* Always allow non-bareword arguments to alter the settings. */
+ sp->set = car_keyword_get_enum(ca, "set", sp->set, "all rows", "selected", "unselected", NULL);
+ sp->type = car_keyword_get_enum(ca, "type", sp->type, "all types", "directories only", "non-directories only", NULL);
+ sp->action = car_keyword_get_enum(ca, "action", sp->action, "select", "unselect", "toggle", NULL);
+ if((content = car_keyword_get_value(ca, "content", NULL)) != NULL)
+ {
+ DPContent ac;
+
+ if((ac = dpf_get_content_from_mnemonic(content)) < DPC_NUM_TYPES)
+ sp->content = ac;
+ }
+}
+
+/* 2005-06-04 - Get pointers to each value in a SelParam, useful with option menus and selparam_init_menus(). */
+static void selparam_get_value_pointers(guint **ptr, SelParam *sp)
+{
+ ptr[0] = &sp->set;
+ ptr[1] = &sp->type;
+ ptr[2] = &sp->action;
+ ptr[3] = (guint *) &sp->content;
+}
+
+static void selparam_read_menus(guint **ptr, GtkWidget *opt_menu[])
+{
+ guint i;
+
+ for(i = 0; i < 4; i++)
+ *ptr[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(opt_menu[i]));
+}
+
+/* 1998-06-04 - Pop up a dialog window asking the user for a regular expression, and
+** then match only those entries whose names match. Very Opus.
+** 1999-05-06 - Basically rewritten, to accomodate command arguments in a nice way. Now
+** the GUI uses no external state; all values are extracted from the
+** widgets after the dialog is closed.
+*/
+gint cmd_selectre(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ SelParamRE sp;
+ const gchar *str;
+ guint res = 0;
+
+ /* Always start from the previous set of parameters. */
+ sp = old_sp_re;
+
+ selparam_set_from_cmdarg(&sp.basic, ca);
+ sp.glob = car_keyword_get_boolean(ca, "glob", sp.glob);
+ sp.invert = car_keyword_get_boolean(ca, "invert", sp.invert);
+ sp.full = car_keyword_get_boolean(ca, "full", sp.full);
+ sp.nocase = car_keyword_get_boolean(ca, "nocase", sp.nocase);
+
+ /* If actual bareword expression found, it's all we need to do a search. */
+ if((str = car_bareword_get(ca, 0)) != NULL)
+ {
+ if(sp.re == NULL)
+ sp.re = g_string_new(str);
+ else
+ g_string_assign(sp.re, str);
+ }
+ else /* No bareword, so pop up dialog with settings, asking for expression. */
+ {
+ GtkWidget *vbox, *opt_menu[4], *glob, *invert, *full, *nocase, *re;
+ guint *mptr[sizeof opt_menu / sizeof *opt_menu];
+ Dialog *dlg;
+
+ mptr[0] = &sp.basic.set;
+ mptr[1] = &sp.basic.type;
+ mptr[2] = &sp.basic.action;
+ mptr[3] = (guint *) &sp.basic.content;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 2);
+ selparam_init_menus(src, vbox, opt_menu, mptr);
+
+ glob = gtk_check_button_new_with_label(_("Treat RE as Glob Pattern?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glob), sp.glob);
+ gtk_box_pack_start(GTK_BOX(vbox), glob, FALSE, FALSE, 0);
+ invert = gtk_check_button_new_with_label(_("Invert RE Matching?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(invert), sp.invert);
+ gtk_box_pack_start(GTK_BOX(vbox), invert, FALSE, FALSE, 0);
+ full = gtk_check_button_new_with_label(_("Require Match on Full Name?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(full), sp.full);
+ gtk_box_pack_start(GTK_BOX(vbox), full, FALSE, FALSE, 0);
+ nocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nocase), sp.nocase);
+ gtk_box_pack_start(GTK_BOX(vbox), nocase, FALSE, FALSE, 0);
+
+ re = gui_dialog_entry_new();
+ if(sp.re != NULL)
+ {
+ gtk_entry_set_text(GTK_ENTRY(re), sp.re->str);
+ gtk_editable_select_region(GTK_EDITABLE(re), 0, -1);
+ }
+ gtk_box_pack_start(GTK_BOX(vbox), re, FALSE, FALSE, 0);
+ dlg = dlg_dialog_sync_new(vbox, _("Select Using RE"), NULL);
+ gtk_widget_grab_focus(re);
+ res = dlg_dialog_sync_wait(dlg);
+ if(res == DLG_POSITIVE) /* If user accepted, collect widget state into 'sp'. */
+ {
+ guint i;
+
+ for(i = 0; i < 3; i++)
+ *mptr[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(opt_menu[i]));
+ sp.basic.content = gtk_combo_box_get_active(GTK_COMBO_BOX(opt_menu[3]));
+ sp.glob = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glob));
+ sp.invert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(invert));
+ sp.full = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(full));
+ sp.nocase = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(nocase));
+ if(sp.re != NULL)
+ g_string_assign(sp.re, gtk_entry_get_text(GTK_ENTRY(re)));
+ else
+ sp.re = g_string_new(gtk_entry_get_text(GTK_ENTRY(re)));
+ }
+ dlg_dialog_sync_destroy(dlg);
+ }
+ if(res == 0)
+ {
+ do_selectre(min, src, &sp);
+ old_sp_re = sp; /* Make this search's parameter the defaults for the next. */
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-12 - Extend the selection to include all rows having styles that are siblings to
+** the currently selected row(s). Typically useful to select e.g. all images
+** after selecting one, and things like that. Assumes the style tree layout is
+** sensible (i.e. rather deep and with "abstract" parents).
+*/
+gint cmd_selectext(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist, *iter;
+ GtkTreeIter riter;
+ GtkTreeModel *model;
+
+ slist = dp_get_selection(src);
+ model = dp_get_tree_model(src);
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ const DirRow2 *sel = iter->data;
+
+ if(gtk_tree_model_get_iter_first(model, &riter))
+ {
+ do
+ {
+ if(memcmp(sel, &riter, sizeof *sel) == 0)
+ continue;
+ if(stl_styleinfo_style_siblings(min->cfg.style, dp_row_get_ftype(model, sel)->style, dp_row_get_ftype(model, &riter)->style))
+ dp_select(src, &riter);
+ } while(gtk_tree_model_iter_next(model, &riter));
+ }
+ }
+ dp_free_selection(slist);
+
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-12 - Perform a suffix selection. If there is a mouse button event available, use
+** it to determine which row has the desired suffix. If not, use the focus if
+** one exists. Else, do nothing.
+*/
+gint cmd_selectsuffix(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *suff = NULL;
+ GtkTreeModel *m = dp_get_tree_model(src);
+
+ if((suff = car_bareword_get(ca, 0)) != NULL)
+ ;
+ if(suff == NULL)
+ {
+ GdkEventButton *evt;
+ GtkTreeIter si;
+ gboolean siok = FALSE;
+
+ if((evt = (GdkEventButton *) evt_event_get(GDK_BUTTON_PRESS)) != NULL)
+ {
+ GtkTreePath *path = NULL;
+
+ if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(src->view), evt->x, evt->y, &path, NULL, NULL, NULL) && path != NULL)
+ {
+ siok = gtk_tree_model_get_iter(m, &si, path);
+ gtk_tree_path_free(path);
+ }
+ }
+ else
+ g_warning("Suffix selection from focused row is not implemented");
+ if(siok)
+ {
+ const gchar *dn = dp_row_get_name_display(dp_get_tree_model(src), (DirRow2 *) &si);
+ suff = g_utf8_strrchr(dn, -1, '.');
+ }
+ }
+
+ /* Did we find a suffix? If we did, extract its suffix, and select all matching rows. */
+ if(suff != NULL)
+ {
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(m, &iter))
+ {
+ guint action;
+ void (*afunc)(DirPane *dp, const DirRow2 *row);
+
+ action = car_keyword_get_enum(ca, "action", 0, "select", "unselect", "toggle", NULL);
+ afunc = (action == 0) ? dp_select : (action == 1) ? dp_unselect : dp_toggle;
+ do
+ {
+ if(g_str_has_suffix(dp_row_get_name_display(m, &iter), suff))
+ afunc(src, &iter);
+
+ } while(gtk_tree_model_iter_next(m, &iter));
+ }
+ }
+ return 1;
+}
+
+/* 1999-06-12 - Alter the selected state of all rows having the same type as a controlling
+** row. The latter is either the one most recently clicked, or the focused row.
+** NOTE NOTE This command replaces a command that had the same name, but that I think
+** wasn't very useful. If you disagree, get in touch. Thanks.
+*/
+gint cmd_selecttype(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *tname;
+ GList *types = NULL;
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GtkTreeIter iter;
+
+ if((tname = car_bareword_get(ca, 0U)) != NULL)
+ types = typ_type_lookup_glob(min->cfg.type, tname);
+ else
+ {
+ GdkEventButton *evt;
+ GtkTreePath *path = NULL;
+
+ if((evt = (GdkEventButton *) evt_event_get(GDK_BUTTON_PRESS)) != NULL)
+ gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(src->view), evt->x, evt->y, &path, NULL, NULL, NULL);
+ else
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(src->view), &path, NULL);
+
+ if(path != NULL)
+ {
+ GtkTreeIter ei;
+
+ if(gtk_tree_model_get_iter(m, &ei, path))
+ types = g_list_append(NULL, dp_row_get_ftype(dp_get_tree_model(src), (DirRow2* ) &ei));
+ gtk_tree_path_free(path);
+ }
+ }
+
+ if(types != NULL)
+ {
+ if(gtk_tree_model_get_iter_first(m, &iter))
+ {
+ guint action;
+ void (*afunc)(DirPane *dp, const DirRow2 *row);
+
+ action = car_keyword_get_enum(ca, "action", 0, "select", "unselect", "toggle", NULL);
+ afunc = (action == 0) ? dp_select : (action == 1) ? dp_unselect : dp_toggle;
+
+ do
+ {
+ if(g_list_find(types, dp_row_get_ftype(m, &iter)))
+ afunc(src, &iter);
+ } while(gtk_tree_model_iter_next(m, &iter));
+ }
+ g_list_free(types);
+ }
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef enum {
+ SHELL_BOOLEAN = 0 /* Interpret shell exit status as boolean, 0 is success. */
+} ShellMode;
+
+typedef struct {
+ ShellMode mode;
+} ShellRule;
+
+/* 2009-10-04 - Rewritten, now uses glib primitive to run a full commandline, doesn't require splitting. */
+static gboolean shell_select(const gchar *commandline, const ShellRule *rule)
+{
+ gint status;
+
+ if(g_spawn_command_line_sync(commandline, NULL, NULL, &status, NULL))
+ {
+ switch(rule->mode)
+ {
+ case SHELL_BOOLEAN:
+ return WEXITSTATUS(status) == 0;
+ }
+ }
+ return FALSE;
+}
+
+/* 2006-04-24 - Select based on return value of shell command. */
+gint cmd_selectshell(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ SelParamShell sp;
+ const gchar *str;
+ GString *cmd;
+ gint reply = DLG_POSITIVE;
+
+ /* Start from previous set of parameters. */
+ sp = old_sp_shell;
+ selparam_set_from_cmdarg(&sp.basic, ca);
+ /* If bareword found, use it as command. Else, pop up the big old dialog. */
+ if((str = car_bareword_get(ca, 0)) != NULL)
+ {
+ if(sp.cmd == NULL)
+ sp.cmd = g_string_new(str);
+ else
+ g_string_assign(sp.cmd, str);
+ }
+ else
+ {
+ GtkWidget *vbox, *opt_menu[4], *label, *entry;
+ guint *mptr[sizeof opt_menu / sizeof *opt_menu];
+ Dialog *dlg;
+
+ selparam_get_value_pointers(mptr, &sp.basic);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ selparam_init_menus(src, vbox, opt_menu, mptr);
+ label = gtk_label_new(_("Enter shell command to run. The command\nwill have the selected content appended.\nAction is performed on successful exit."));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+ entry = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(entry), 1024);
+ if(sp.cmd != NULL)
+ gtk_entry_set_text(GTK_ENTRY(entry), sp.cmd->str);
+ gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
+ dlg = dlg_dialog_sync_new(vbox, _("Select using shell command"), _("OK|Cancel"));
+ gtk_editable_select_region(GTK_EDITABLE(entry), 0, 1 << 30);
+ gtk_widget_grab_focus(entry);
+ reply = dlg_dialog_sync_wait(dlg);
+ if(reply == DLG_POSITIVE)
+ {
+ selparam_read_menus(mptr, opt_menu);
+ if(sp.cmd == NULL)
+ sp.cmd = g_string_new(gtk_entry_get_text(GTK_ENTRY(entry)));
+ else
+ g_string_assign(sp.cmd, gtk_entry_get_text(GTK_ENTRY(entry)));
+ }
+ dlg_dialog_sync_destroy(dlg);
+ }
+
+ if(reply == DLG_POSITIVE)
+ {
+ SelAction sel_action;
+ GtkTreeModel *m = dp_get_tree_model(src);
+ GtkTreeIter iter;
+ gchar text[1024];
+ const ShellRule rule = { SHELL_BOOLEAN };
+
+ if(gtk_tree_model_get_iter_first(m, &iter))
+ {
+ cmd = g_string_sized_new(4096); /* Static for simplicity. */
+ sel_action = select_action_func(sp.basic.action);
+ do
+ {
+ if(!filter_set(src, &iter, &sp.basic) || !filter_type(src, &iter, &sp.basic))
+ continue;
+ g_string_assign(cmd, sp.cmd->str);
+ g_string_append_c(cmd, ' ');
+ if(!dpf_get_content(min, src, &iter, sp.basic.content, text, sizeof text))
+ continue;
+ g_string_append(cmd, text);
+ if(cmd->str[0] == '\0' || cmd->str[0] == ' ')
+ continue;
+ if(shell_select(cmd->str, &rule))
+ sel_action(src, &iter);
+ } while(gtk_tree_model_iter_next(m, &iter));
+ g_string_free(cmd, TRUE);
+ }
+ old_sp_shell = sp; /* Remember parameters for next time. */
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-20 - The UnselectFirst command. In wrong module?
+** 1998-12-16 - This was freeze/thaw bracketed, for no good reason. Didn't work.
+*/
+gint cmd_unselectfirst(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist;
+
+ if((slist = dp_get_selection(src)) != NULL)
+ {
+ dp_unselect(src, slist->data);
+ dp_free_selection(slist);
+ }
+ return 1;
+}
diff --git a/src/cmd_select.h b/src/cmd_select.h
new file mode 100644
index 0000000..9c2396b
--- /dev/null
+++ b/src/cmd_select.h
@@ -0,0 +1,25 @@
+/*
+** 1998-05-29 - One must always have a header.
+** 1998-06-04 - Extended to include support for selecting none and toggling,
+** and also renamed to cmd_select.h.
+*/
+
+extern gint cmd_selectrow(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gint cmd_selectall(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selectnone(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selecttoggle(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selectre(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selectext(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selecttype(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gint cmd_selectsuffix(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_selecttype(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+#if 0
+extern gint cmd_selectcmp(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+#endif
+
+extern gint cmd_unselectfirst(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+extern gint cmd_selectshell(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_split.c b/src/cmd_split.c
new file mode 100644
index 0000000..6403976
--- /dev/null
+++ b/src/cmd_split.c
@@ -0,0 +1,669 @@
+/*
+** 1998-07-05 - The Split command, handy for, er, splitting files into parts. Mucho GUI.
+** 1999-03-07 - Altered for the new selection/generic handler. Hum, I really should finish
+** this command off some day...
+** 1999-06-19 - Adapted for the new dialog module. Sheesh, I really should finish this command
+** some day!
+*/
+
+#include "gentoo.h"
+
+#include <fcntl.h>
+
+#include "cmd_delete.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "sizeutil.h"
+#include "strutil.h"
+
+#include "cmd_generic.h"
+#include "cmd_split.h"
+
+#define CMD_ID "split"
+
+#define NFORMAT_LIMIT (MAXNAMLEN + 16)
+#define SPLIT_CHUNK (1 << 18)
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define VALUE_SIZE 16
+
+typedef struct
+{
+ /* Basic parameters, extracted from UI. */
+ guint64 file_size;
+ guint64 part_size;
+ guint64 base;
+ guint64 step;
+ guint64 last;
+ guint64 num;
+
+ /* Parameters made visible through a dictionary, for interpolation. */
+ GHashTable *parameters;
+ gchar v_format[16];
+ gchar v_index[VALUE_SIZE];
+ gchar v_base[VALUE_SIZE];
+ gchar v_step[VALUE_SIZE];
+ gchar v_last[VALUE_SIZE];
+ gchar v_num[VALUE_SIZE];
+ gchar v_offset[VALUE_SIZE];
+} NameGenerator;
+
+typedef struct {
+ GtkWidget *vbox; /* This really is required. */
+ GtkWidget *label; /* Tells the user what's up. */
+ GtkWidget *mode; /* Option menu for selecting mode of split. */
+ GtkWidget *mvbox; /* Sub-vbox for the mode-specific widgets. */
+ GtkWidget *nhbox; /* Hbox for the naming issue. */
+ GtkWidget *nformat; /* Entry widget for name formatter. */
+ GtkWidget *nfill; /* Check box for zero-fill of number in format. */
+ GtkAdjustment *npadj; /* Adjustment for precision. */
+ GtkWidget *nprec; /* Scale widget for number precision. */
+ GtkAdjustment *nbadj; /* Adjustment for index base. */
+ GtkWidget *nbase; /* Spin widget for index base. */
+ GtkAdjustment *nsadj; /* Adjustment for index step. */
+ GtkWidget *nstep; /* Spin widget for index step. */
+
+ GtkWidget *nbook; /* Notebook with mode-settings. */
+
+ GtkWidget *sssize; /* Combo holding the wanted size. */
+ GtkWidget *snframe; /* Frame for "split to fixed number". */
+
+ GtkWidget *fccount; /* Spinner for the count, 2+. */
+
+ GtkListStore *preview_store; /* Preview list model. */
+ GtkWidget *preview; /* GtkTreeView for the preview. */
+
+ MainInfo *min;
+ guint curr_mode; /* 0 for fixed size, 1 for fixed amount. */
+ const gchar *name; /* Source file being split. */
+ goffset file_size; /* Size of the current file. */
+
+ NameGenerator *namegen;
+} SplitInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static const gchar * get_name_format(const SplitInfo *spi)
+{
+ return gtk_entry_get_text(GTK_ENTRY(spi->nformat));
+}
+
+static guint get_name_base(const SplitInfo *spi)
+{
+ return gtk_adjustment_get_value(GTK_ADJUSTMENT(spi->nbadj));
+}
+
+static guint get_name_step(const SplitInfo *spi)
+{
+ return gtk_adjustment_get_value(GTK_ADJUSTMENT(spi->nsadj));
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define PREVIEW_MAX 30 /* Must be at least 2, and must be even. */
+
+typedef enum {
+ DISPLAY_NORMAL,
+ DISPLAY_ELLIPSIS,
+ DISPLAY_NOTHING
+} PreviewDisplay;
+
+/* 2010-12-03 - Returns one of the PreviewDisplay values depending on how the part_index:th row should be shown. */
+static PreviewDisplay get_preview_display(guint64 index, guint64 num)
+{
+ if(num <= PREVIEW_MAX)
+ return DISPLAY_NORMAL;
+ if(index < PREVIEW_MAX / 2)
+ return DISPLAY_NORMAL;
+ if(index == PREVIEW_MAX / 2 + 1)
+ return DISPLAY_ELLIPSIS;
+ if(index >= num - PREVIEW_MAX / 2)
+ return DISPLAY_NORMAL;
+ return DISPLAY_NOTHING;
+}
+
+static void namegenerator_configure(NameGenerator *sng, const SplitInfo *spi);
+
+/* 2010-12-03 - Create a "name generator", which is basically the parameters needed to (on-demand) generate name 'i' from a split sequence. */
+static NameGenerator * namegenerator_new(const SplitInfo *spi)
+{
+ NameGenerator *sng = g_malloc(sizeof *sng);
+
+ namegenerator_configure(sng, spi);
+
+ return sng;
+}
+
+/* 2010-12-11 - Configure the name generator, based on state in spi's widgets. */
+static void namegenerator_configure(NameGenerator *sng, const SplitInfo *spi)
+{
+ sng->file_size = spi->file_size;
+
+ /* Inspect combo state, and compute a suitable part size. */
+ if(gtk_combo_box_get_active(GTK_COMBO_BOX(spi->mode)) == 0)
+ sng->part_size = sze_get_offset(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(spi->sssize)));
+ else
+ {
+ const gchar *num = gtk_entry_get_text(GTK_ENTRY(spi->fccount));
+ const guint64 num_parts = g_ascii_strtoull(num, NULL, 0);
+
+ /* This actually works. Imagine proof, here. */
+ sng->part_size = (goffset) ((sng->file_size + num_parts - 1) / num_parts);
+ }
+
+ sng->base = get_name_base(spi);
+ sng->step = get_name_step(spi);
+ sng->num = (sng->file_size + sng->part_size - 1) / sng->part_size;
+ sng->last = sng->base + (sng->num - 1) * sng->step;
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(spi->nfill)))
+ g_snprintf(sng->v_format, sizeof sng->v_format, "%%0%u" G_GUINT64_FORMAT, (guint) gtk_adjustment_get_value(GTK_ADJUSTMENT(spi->npadj)));
+ else
+ strcpy(sng->v_format, "%" G_GUINT64_FORMAT);
+
+ sng->parameters = g_hash_table_new(g_str_hash, g_str_equal);
+ sng->v_index[0] = '\0';
+ g_hash_table_insert(sng->parameters, "index", sng->v_index);
+ g_snprintf(sng->v_base, sizeof sng->v_base, sng->v_format, sng->base);
+ g_hash_table_insert(sng->parameters, "base", sng->v_base);
+ g_snprintf(sng->v_step, sizeof sng->v_step, sng->v_format, sng->step);
+ g_hash_table_insert(sng->parameters, "step", sng->v_step);
+ g_snprintf(sng->v_num, sizeof sng->v_num, sng->v_format, sng->num);
+ g_hash_table_insert(sng->parameters, "num", sng->v_num);
+ g_snprintf(sng->v_last, sizeof sng->v_last, sng->v_format, sng->last);
+ g_hash_table_insert(sng->parameters, "last", sng->v_last);
+ sng->v_offset[0] = '\0';
+ g_hash_table_insert(sng->parameters, "offset", sng->v_offset);
+}
+
+static void namegenerator_update_offset(NameGenerator *sng, guint64 offset)
+{
+ g_snprintf(sng->v_offset, sizeof sng->v_offset, sng->v_format, offset);
+}
+
+static gboolean namegenerator_generate(NameGenerator *sng, gchar *buf, gsize buf_size, const gchar *format, guint64 index)
+{
+ g_snprintf(sng->v_index, sizeof sng->v_index, sng->v_format, sng->base + index * sng->step);
+
+ return stu_interpolate_dictionary(buf, buf_size, format, sng->parameters);
+}
+
+static void namegenerator_destroy(NameGenerator *sng)
+{
+ g_hash_table_destroy(sng->parameters);
+ g_free(sng);
+}
+
+static void update_preview_ss(const gchar *format, gboolean zero_fill, gint precision, guint64 base, guint64 step, SplitInfo *spi)
+{
+ goffset size = spi->file_size, chunk;
+ guint64 pos = 0, part_index;
+ GtkTreeIter iter;
+
+ gtk_list_store_clear(spi->preview_store);
+ namegenerator_configure(spi->namegen, spi);
+
+ for(part_index = 0; size > 0; size -= chunk, pos += chunk, part_index++)
+ {
+ PreviewDisplay dpl;
+
+ if(size > spi->namegen->part_size)
+ chunk = spi->namegen->part_size;
+ else
+ chunk = size;
+ dpl = get_preview_display(part_index, spi->namegen->num);
+ if(dpl == DISPLAY_NORMAL)
+ {
+ gchar part[2 * MAXNAMLEN], part2[2 * MAXNAMLEN], part3[2 * MAXNAMLEN];
+ sze_put_offset(part, sizeof part, pos, SZE_BYTES_NO_UNIT, 0, ',');
+ namegenerator_update_offset(spi->namegen, pos);
+ namegenerator_generate(spi->namegen, part2, sizeof part2, format, part_index);
+ sze_put_offset(part3, sizeof part3, chunk, SZE_BYTES_NO_UNIT, 0, ',');
+ gtk_list_store_insert_with_values(spi->preview_store, &iter, -1, 0, part, 1, part2, 2, part3, -1);
+ }
+ else if(dpl == DISPLAY_ELLIPSIS)
+ {
+ gtk_list_store_insert_with_values(spi->preview_store, &iter, -1, 1, "...", -1);
+ }
+ }
+}
+
+static void update_preview_fc(const gchar *format, gboolean zero_fill, gint precision, guint64 base, guint64 step, SplitInfo *spi)
+{
+ update_preview_ss(format, zero_fill, precision, base, step, spi);
+}
+
+static void update_preview(SplitInfo *spi)
+{
+ const gchar *format = get_name_format(spi);
+ const guint base = get_name_base(spi);
+ const guint step = get_name_step(spi);
+ const gboolean zero_fill = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(spi->nfill));
+ const gint precision = gtk_adjustment_get_value(GTK_ADJUSTMENT(spi->npadj));
+
+ if(spi->curr_mode == 0)
+ update_preview_ss(format, zero_fill, precision, base, step, spi);
+ else
+ update_preview_fc(format, zero_fill, precision, base, step, spi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-01 - Pretty much rewrote this function, now that the sizeutil module exists. */
+static void spt_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ gchar buf[2 * MAXNAMLEN], siz1[32], siz2[32];
+ SplitInfo *spi = user;
+ GtkTreeModel *m = dp_get_tree_model(src);
+ gint pos;
+
+ spi->name = dp_row_get_name(m, row);
+ spi->file_size = dp_row_get_size(m, row);
+
+ if(spi->namegen == NULL)
+ spi->namegen = namegenerator_new(spi);
+
+ sze_put_offset(siz1, sizeof siz1, dp_row_get_size(m, row), SZE_BYTES, 3, ',');
+ sze_put_offset(siz2, sizeof siz2, dp_row_get_size(m, row), SZE_AUTO, 3, ',');
+ if(strcmp(siz1, siz2) != 0)
+ g_snprintf(buf, sizeof buf, _("Split \"%s\".\nFile is %s (%s)."), dp_row_get_name_display(m, row), siz1, siz2);
+ else
+ g_snprintf(buf, sizeof buf, _("Split \"%s\".\nFile is %s."), dp_row_get_name_display(m, row), siz1);
+ gtk_label_set_text(GTK_LABEL(spi->label), buf);
+ gtk_entry_set_text(GTK_ENTRY(spi->nformat), dp_row_get_name_display(m, row));
+ pos = gtk_entry_get_text_length(GTK_ENTRY(spi->nformat));
+ gtk_editable_insert_text(GTK_EDITABLE(spi->nformat), ".{index}", 8, &pos);
+
+ cmd_generic_track_entry(gen, spi->nformat);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(spi->mode), spi->curr_mode);
+
+ update_preview(spi);
+}
+
+/* 2009-10-07 - Do a partial "splice", i.e. a copying of data from an input stream into an output stream.
+** Here, 'chunk' is the number of bytes to copy, and 'buf' & 'buf_size' describe the buffer
+** used to hold the data.
+*/
+static gboolean streams_splice_partial(GOutputStream *out, GInputStream *in, gsize chunk, gpointer buf, gsize buf_size, GError **err)
+{
+ gsize to_go = chunk, bite;
+ gssize did;
+
+ while(to_go > 0)
+ {
+ bite = to_go > buf_size ? buf_size : to_go;
+ did = g_input_stream_read(in, buf, bite, NULL, err);
+ if(did == bite)
+ {
+ did = g_output_stream_write(out, buf, bite, NULL, err);
+ if(did != bite)
+ break;
+ }
+ else
+ break;
+ to_go -= bite;
+ }
+ return to_go == 0;
+}
+
+/* 1998-09-01 - Split file on row <row> of <src>, producing a bunch of segment files in <dst>.
+** Each segment (except possibly the last) will have the same size.
+** 1998-09-12 - Didn't have any closing of the output files. I really should be shot. Also
+** fixed the protection bits for the output; now same as the source file.
+** 1999-11-13 - Adapted to use new fut_copy_partial() function, fixed bug with closing output
+** file on failed write.
+** 2010-07-22 - Now supports both split modes, in an attack of epic closure.
+** 2010-12-11 - Now uses the NameGenerator API to generate actual names, to sync with preview.
+*/
+static gint do_split(SplitInfo *spi, DirPane *src, DirPane *dst, DirRow2 *row, GError **error)
+{
+ const gchar *format = gtk_entry_get_text(GTK_ENTRY(spi->nformat));
+ gchar outname[PATH_MAX];
+ gsize to_go = 0, chunk;
+ gint piece = 0;
+ GFile *fin, *fout;
+ GFileInputStream *sin;
+ gpointer tmp;
+ gboolean ok = TRUE;
+
+ /* Make sure the name generator is updated and valid-seeming. */
+ namegenerator_configure(spi->namegen, spi);
+ if(spi->namegen->part_size == 0)
+ return 0;
+
+ if((fin = dp_get_file_from_row(src, row)) == NULL)
+ return 0;
+ if((sin = g_file_read(fin, NULL, error)) == NULL)
+ {
+ g_object_unref(fin);
+ return 0;
+ }
+ if((tmp = g_malloc(SPLIT_CHUNK)) == NULL)
+ {
+ g_object_unref(fin);
+ g_object_unref(sin);
+ return 0;
+ }
+
+ ovw_overwrite_begin(spi->min, _("\"%s\" Already Exists - Continue With Split?"), 0UL);
+
+ to_go = dp_row_get_size(dp_get_tree_model(src), row);
+ for(piece = 0; ok && to_go > 0; to_go -= chunk, piece++)
+ {
+ if(to_go > spi->namegen->part_size)
+ chunk = spi->namegen->part_size;
+ else
+ chunk = to_go;
+ namegenerator_generate(spi->namegen, outname, sizeof outname, format, piece);
+ if((fout = g_file_get_child_for_display_name(dst->dir.root, outname, error)) != NULL)
+ {
+ GFileOutputStream *sout;
+ OvwRes ores;
+
+ ores = ovw_overwrite_unary_file(dst, fout);
+ if(ores == OVW_CANCEL)
+ ok = FALSE;
+ else if(ores == OVW_SKIP)
+ ok = g_seekable_seek(G_SEEKABLE(sin), chunk, G_SEEK_CUR, NULL, error);
+ else if(ores == OVW_PROCEED_FILE || ores == OVW_PROCEED_DIR)
+ ok = del_delete_gfile(spi->min, fout, FALSE, error);
+ if(ok && (sout = g_file_create(fout, G_FILE_CREATE_NONE, NULL, error)) != NULL)
+ {
+ ok = streams_splice_partial(G_OUTPUT_STREAM(sout), G_INPUT_STREAM(sin), chunk, tmp, SPLIT_CHUNK, error);
+ g_object_unref(sout);
+ }
+ else
+ ok = FALSE;
+ g_object_unref(fout);
+ }
+ else
+ ok = FALSE;
+ }
+
+ ovw_overwrite_end(spi->min);
+ g_free(tmp);
+ g_object_unref(sin);
+ g_object_unref(fin);
+
+ return ok;
+}
+
+static gint spt_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user)
+{
+ SplitInfo *spi = user;
+ gint ret = 0;
+
+ if((ret = do_split(spi, src, dst, row, error)))
+ dp_unselect(src, row);
+
+ return ret;
+}
+
+static void spt_free(gpointer user)
+{
+ SplitInfo *spi = user;
+
+ namegenerator_destroy(spi->namegen);
+ spi->namegen = NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_ss_combo_changed(GtkWidget *combo, gpointer user)
+{
+ update_preview(user);
+}
+
+/* 1998-07-09 - Build widgetry needed to support splitting to fixed part size. */
+static GtkWidget * build_ss(SplitInfo *spi)
+{
+ GtkWidget *frame, *hbox, *label;
+
+ frame = gtk_frame_new(_("Fixed Size Split"));
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Segment Size"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ spi->sssize = gtk_combo_box_text_new_with_entry();
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("1457000 bytes (3.5\" floppy)"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("10485760 bytes (10 MB)"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("26214400 bytes (25 MB)"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("52428800 bytes (50 MB)"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("78643200 bytes (75 MB)"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(spi->sssize), _("100431360 bytes (95 MB, Zip disk)"));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(spi->sssize), 0);
+ g_signal_connect(G_OBJECT(spi->sssize), "changed", G_CALLBACK(evt_ss_combo_changed), spi);
+ gtk_box_pack_start(GTK_BOX(hbox), spi->sssize, TRUE, TRUE, 0);
+
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+
+ return frame;
+}
+
+static void evt_fc_spin_changed(GtkWidget *spin, gpointer user)
+{
+ update_preview(user);
+}
+
+/* 2010-07-22 - Quite a while later, I actually got around to implementing the other split
+** mode: fixed count (=number of parts).
+*/
+static GtkWidget * build_fc(SplitInfo *spi)
+{
+ GtkWidget *frame, *hbox, *label;
+
+ frame = gtk_frame_new(_("Fixed Count Split"));
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Segment Count"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ spi->fccount = gtk_spin_button_new_with_range(2, 1000, 1); /* Incredibly arbitrary, yes. */
+ g_signal_connect(G_OBJECT(spi->fccount), "value_changed", G_CALLBACK(evt_fc_spin_changed), spi);
+ gtk_box_pack_start(GTK_BOX(hbox), spi->fccount, TRUE, TRUE, 0);
+
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+
+ return frame;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-01 - Callback for mode option menu. */
+static void evt_mode_select(GtkWidget *wid, guint index, gpointer user)
+{
+ SplitInfo *spi = user;
+
+ spi->curr_mode = index;
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(spi->nbook), spi->curr_mode);
+ update_preview(spi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void evt_nformat_insert(GtkEntryBuffer *buffer, guint position, gchar *chars, guint nchars, gpointer user)
+{
+ update_preview(user);
+}
+
+static void evt_nformat_delete(GtkEntryBuffer *buffer, guint position, guint nchars, gpointer user)
+{
+ update_preview(user);
+}
+
+static void evt_nformat_details_clicked(GtkWidget *button, gpointer user)
+{
+ /* FIXME: This data should, of course, be part of the dictionary-based interpolation
+ * system, this is very un-DRY design. Something for a future refactoring, there's
+ * also an obvious need (eh) to make the Split command and the regular Command config
+ * use the same subsystem for managing their interpolation needs.
+ */
+ static const struct {
+ const gchar *symbol;
+ const gchar *desc;
+ } sym_doc[] = {
+ { "index", N_("Current part number, unique for every created file") },
+ { "base", N_("The value from the Base box") },
+ { "step", N_("The amount that index will change for each file") },
+ { "num", N_("The total number of files that will be created") },
+ { "last", N_("The value of index for the last file to be created") },
+ { "offset", N_("The part's offset into the original file") },
+ };
+ Dialog *dlg;
+ GtkListStore *store;
+ GtkTreeIter iter;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkWidget *scwin, *view;
+ gsize i;
+
+ store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+ for(i = 0; i < sizeof sym_doc / sizeof *sym_doc; ++i)
+ {
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, sym_doc[i].symbol, 1, _(sym_doc[i].desc), -1);
+ }
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_BROWSE);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(code)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ vc = gtk_tree_view_column_new_with_attributes("(description)", cr, "text", 1, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+ gtk_container_add(GTK_CONTAINER(scwin), view);
+
+ dlg = dlg_dialog_sync_new(scwin, _("Pick Code"), NULL);
+ gtk_widget_set_size_request(GTK_WIDGET(dlg_dialog_get_dialog(dlg)), 380, 240);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ SplitInfo *spi = user;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), NULL, &iter))
+ {
+ gchar *code = NULL, buf[1024];
+ gint pos;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &code, -1);
+ /* FIXME: We could be more intelligent here, and not add the braces if the cursor is after an opening brace. */
+ g_snprintf(buf, sizeof buf, "{%s}", code);
+ gtk_editable_insert_text(GTK_EDITABLE(spi->nformat), buf, -1, &pos);
+ }
+ }
+}
+
+static void evt_check_changed(GtkWidget *button, gpointer user)
+{
+ SplitInfo *spi = user;
+
+ gtk_widget_set_sensitive(spi->nprec, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
+ update_preview(user);
+}
+
+static void evt_spin_changed(GtkWidget *button, gpointer user)
+{
+ update_preview(user);
+}
+
+gint cmd_split(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static SplitInfo spi = { 0 };
+ const gchar *mode[] = { N_("Fixed size, variable number of parts"),
+ N_("Fixed number of parts, variable sizes"),
+ NULL };
+ GtkWidget *hbox, *label;
+ GtkWidget *hsep, *exp, *scwin, *fdet;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ spi.min = min;
+ spi.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ spi.label = gtk_label_new(_("Split"));
+
+ /* Build this early, since the signal handler references it. */
+ spi.nbook = gtk_notebook_new();
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(spi.nbook), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(spi.nbook), FALSE);
+ gtk_notebook_append_page(GTK_NOTEBOOK(spi.nbook), build_ss(&spi), NULL);
+ gtk_notebook_append_page(GTK_NOTEBOOK(spi.nbook), build_fc(&spi), NULL);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Mode"));
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), spi.label, FALSE, FALSE, 0);
+ hsep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), hsep, FALSE, FALSE, 4);
+ spi.mode = gui_build_combo_box(mode, G_CALLBACK(evt_mode_select), &spi);
+ gtk_box_pack_start(GTK_BOX(hbox), spi.mode, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), hbox, FALSE, FALSE, 0);
+ spi.nhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ label = gtk_label_new(_("Name Format"));
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), label, FALSE, FALSE, 2);
+ spi.nformat = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(spi.nformat), NFORMAT_LIMIT);
+ g_signal_connect(G_OBJECT(gtk_entry_get_buffer(GTK_ENTRY(spi.nformat))), "inserted_text", G_CALLBACK(evt_nformat_insert), &spi);
+ g_signal_connect(G_OBJECT(gtk_entry_get_buffer(GTK_ENTRY(spi.nformat))), "deleted_text", G_CALLBACK(evt_nformat_delete), &spi);
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), spi.nformat, TRUE, TRUE, 0);
+ fdet = gui_details_button_new();
+ g_signal_connect(G_OBJECT(fdet), "clicked", G_CALLBACK(evt_nformat_details_clicked), &spi);
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), fdet, FALSE, FALSE, 0);
+ label = gtk_label_new(_("Base"));
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), label, FALSE, FALSE, 0);
+ spi.nbadj = gtk_adjustment_new(0, 0, 999, 1, 16, 0.);
+ spi.nbase = gtk_spin_button_new(GTK_ADJUSTMENT(spi.nbadj), 0, 0);
+ g_signal_connect(G_OBJECT(spi.nbase), "value_changed", G_CALLBACK(evt_spin_changed), &spi);
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), spi.nbase, FALSE, FALSE, 0);
+ label = gtk_label_new(_("Step"));
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), label, FALSE, FALSE, 0);
+ spi.nsadj = gtk_adjustment_new(1, 1, 63, 1, 16, 0.);
+ spi.nstep = gtk_spin_button_new(GTK_ADJUSTMENT(spi.nsadj), 0, 0);
+ g_signal_connect(G_OBJECT(spi.nstep), "value_changed", G_CALLBACK(evt_spin_changed), &spi);
+ gtk_box_pack_start(GTK_BOX(spi.nhbox), spi.nstep, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), spi.nhbox, FALSE, FALSE, 2);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ spi.nfill = gtk_check_button_new_with_label(_("Zero-Fill Numbers?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(spi.nfill), TRUE);
+ g_signal_connect(G_OBJECT(spi.nfill), "toggled", G_CALLBACK(evt_check_changed), &spi);
+ gtk_box_pack_start(GTK_BOX(hbox), spi.nfill, TRUE, TRUE, 0);
+ label = gtk_label_new("Precision");
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ spi.npadj = gtk_adjustment_new(3, 2, 9, 1, 3, 0.);
+ spi.nprec = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT(spi.npadj));
+ gtk_scale_set_digits(GTK_SCALE(spi.nprec), 0);
+ gtk_scale_set_value_pos(GTK_SCALE(spi.nprec), GTK_POS_RIGHT);
+ g_signal_connect(G_OBJECT(spi.nprec), "value_changed", G_CALLBACK(evt_spin_changed), &spi);
+ gtk_box_pack_start(GTK_BOX(hbox), spi.nprec, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), hbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(spi.vbox), spi.nbook, FALSE, FALSE, 0);
+
+ spi.preview_store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ spi.preview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(spi.preview_store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(spi.preview), TRUE);
+ cr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cr), "xalign", 1.0f, NULL);
+ vc = gtk_tree_view_column_new_with_attributes(_("Offset"), cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(spi.preview), vc);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes(_("Name"), cr, "text", 1, NULL);
+ gtk_tree_view_column_set_sizing(vc, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(spi.preview), vc);
+ cr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cr), "xalign", 1.0f, NULL);
+ vc = gtk_tree_view_column_new_with_attributes(_("Size"), cr, "text", 2, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(spi.preview), vc);
+
+ exp = gtk_expander_new(_("Preview"));
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), spi.preview);
+ gtk_container_add(GTK_CONTAINER(exp), scwin);
+ gtk_box_pack_start(GTK_BOX(spi.vbox), exp, TRUE, TRUE, 5);
+
+ return cmd_generic(min, _("Split"), CGF_NOALL | CGF_NODIRS, spt_body, spt_action, spt_free, &spi);
+}
diff --git a/src/cmd_split.h b/src/cmd_split.h
new file mode 100644
index 0000000..4187978
--- /dev/null
+++ b/src/cmd_split.h
@@ -0,0 +1,5 @@
+/*
+** 1998-07-06 - Sort of like another one of those micro-headers.
+*/
+
+extern gint cmd_split(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_swap.c b/src/cmd_swap.c
new file mode 100644
index 0000000..190604b
--- /dev/null
+++ b/src/cmd_swap.c
@@ -0,0 +1,79 @@
+/*
+** 1998-08-08 - The Swap command is reborn, sort of. This swaps the contents of the panes,
+** not the active one. Very useful.
+** 1998-08-27 - Since this module was so small, I crammed in another command; the Other
+** command, which simply "copies" the directory from the other dirpane into
+** the one current. Very useful, believe it or not.
+** 1999-03-06 - Adapted for the new selection handling.
+*/
+
+#include "gentoo.h"
+#include "cmdseq.h"
+#include "dirhistory.h"
+#include "dirpane.h"
+#include "strutil.h"
+
+#include "cmd_swap.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-25 - Updated to play by the new selection rules, and also understand that the
+** path is displayed in a combo, and not a plain GtkEntry. Far less efficient
+** now, though. Too bad.
+** 2008-09-22 - Changes for new path entry widget in GTK+ 2.0.
+** 2010-03-27 - Totally stopped trying to be efficient, since it's hard to swap GtkTreeModels.
+*/
+gint cmd_swap(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ gchar cmd[2][32 + sizeof src->dir.path];
+
+ g_snprintf(cmd[0], sizeof cmd[0], "DirEnter %s", src->dir.path);
+ g_snprintf(cmd[1], sizeof cmd[1], "DirEnter %s", dst->dir.path);
+
+ csq_execute(min, cmd[1]);
+ csq_execute(min, "ActivateOther");
+ csq_execute(min, cmd[0]);
+ csq_execute(min, "ActivateOther");
+
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-20 - Assume that <dst> and <src> show the same path; copy the selection from <src>
+** into <dst>.
+** 1999-03-06 - Rewritten using the new selection abstraction and stuff. Probably takes 100
+** times longer to run now... Not a big deal.
+*/
+static void get_selection(DirPane *dst, DirPane *src)
+{
+ DHSel *sel;
+
+ if((sel = dph_dirsel_new(src)) != NULL)
+ {
+ dph_dirsel_apply(dst, sel);
+ dph_dirsel_destroy(sel);
+ }
+}
+
+/* 1998-08-27 - Go to the same directory as the other (i.e. destination) pane. */
+gint cmd_fromother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_unselect_all(src);
+ csq_execute_format(min, "DirEnter 'dir=%s'", stu_escape(dst->dir.path));
+ get_selection(src, dst);
+
+ return 1;
+}
+
+/* 1998-09-20 - Added this to complement the old DirOther command, which was also renamed. */
+gint cmd_toother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ dp_unselect_all(dst);
+ csq_execute(min, "ActivateOther");
+ csq_execute_format(min, "DirEnter 'dir=%s'", stu_escape(src->dir.path));
+ csq_execute(min, "ActivateOther");
+ get_selection(dst, src);
+
+ return 1;
+}
diff --git a/src/cmd_swap.h b/src/cmd_swap.h
new file mode 100644
index 0000000..962f448
--- /dev/null
+++ b/src/cmd_swap.h
@@ -0,0 +1,7 @@
+/*
+** 1998-08-08 - Header for the SWAP module.
+*/
+
+extern gint cmd_swap(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_fromother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_toother(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_symlink.c b/src/cmd_symlink.c
new file mode 100644
index 0000000..7b358f9
--- /dev/null
+++ b/src/cmd_symlink.c
@@ -0,0 +1,274 @@
+/*
+** 1999-05-29 - A command analogous to Copy, but not quite. Instead of copying the selected source files to
+** the destination directory, this command creates a link at the destination, pointing to the
+** source. Pretty cool. This module also implements the SymLinkEdit command, which can be used
+** to create (!) and edit symbolic links.
+*/
+
+#include "gentoo.h"
+
+#include "cmdarg.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "overwrite.h"
+#include "strutil.h"
+
+#include "cmd_delete.h"
+#include "cmd_generic.h"
+#include "cmd_symlink.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Symbolic link editing info. */
+ GtkWidget *vbox;
+ GtkWidget *name; /* Entry for the name of the link (not editable unless creating new link). */
+ GtkWidget *contents; /* Entry for the contents of the link (with pick button for coolness). */
+
+ MainInfo *min;
+ DirPane *src;
+} SleInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-09-19 - Creates a symlink at <dfile>, pointing at <sfile>. */
+static gboolean set_link(MainInfo *min, const GFile *dfile, const GFile *sfile, GError **error)
+{
+ gchar *pn;
+ gboolean ok = FALSE;
+
+ if((pn = g_file_get_parse_name((GFile *) sfile)) != NULL)
+ {
+ ok = g_file_make_symbolic_link((GFile *) dfile, pn, NULL, error);
+ g_free(pn);
+ }
+ return ok;
+}
+
+/* 1999-05-29 - Create (absolute) symbolic links for all selected entries in <src> at <dst>. */
+gint cmd_symlink(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ GSList *slist, *iter;
+ OvwRes res;
+ guint num = 0;
+ GFile *dfile = NULL;
+ gboolean ok = TRUE;
+ GError *error = NULL;
+
+ err_clear(min);
+
+ if((src == NULL) || (dst == NULL))
+ return 1;
+
+ if((slist = dp_get_selection(src)) == NULL)
+ return 1;
+
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Continue With Link?"), OVWF_NO_RECURSE_TEST);
+ for(iter = slist; ok && (iter != NULL); iter = g_slist_next(iter))
+ {
+ if(dfile != NULL)
+ g_object_unref(dfile);
+ dfile = dp_get_file_from_name(dst, dp_row_get_name(dp_get_tree_model(src), iter->data));
+ res = ovw_overwrite_unary_file(dst, dfile);
+ if(res == OVW_SKIP)
+ continue;
+ else if(res == OVW_CANCEL)
+ break;
+ else if(res == OVW_PROCEED_FILE || res == OVW_PROCEED_DIR)
+ {
+ if(!(ok = del_delete_gfile(min, dfile, FALSE, &error)))
+ break;
+ }
+ ok = set_link(min, dfile, dp_get_file_from_row(src, iter->data), &error);
+ if(ok)
+ {
+ dp_unselect(src, iter->data);
+ num++;
+ }
+ else
+ err_set_gerror(min, &error, "SymLink", dfile);
+ }
+ if(dfile != NULL)
+ g_object_unref(dfile);
+ ovw_overwrite_end(min);
+ dp_free_selection(slist);
+
+ if(num)
+ dp_rescan_post_cmd(dst);
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-30 - Update generic command dialog for a new link. */
+static void link_body(MainInfo *min, DirPane *src, DirRow2 *row, gpointer gen, gpointer user)
+{
+ SleInfo *sle = user;
+ const gchar *link;
+
+ gtk_entry_set_text(GTK_ENTRY(sle->name), dp_row_get_name_display(dp_get_tree_model(src), row));
+ link = dp_row_get_link_target(dp_get_tree_model(src), row);
+ gtk_entry_set_text(GTK_ENTRY(sle->contents), link);
+ gtk_editable_select_region(GTK_EDITABLE(sle->contents), 0, -1);
+ gtk_widget_grab_focus(sle->contents);
+
+ cmd_generic_track_entry(gen, sle->contents);
+}
+
+/* 2009-09-19 - Change a link. This is a GIO rewrite; it seems impossible to actually *change* an existing
+** symbolic link in-place; GIO gives me a "file exists" error when I try. So let's just delete
+** the existing link, and create a new one. Clumsy, but the semantics are right.
+*/
+static gint link_action(MainInfo *min, DirPane *src, DirPane *dst, DirRow2 *row, GError **error, gpointer user)
+{
+ SleInfo *sle = user;
+ GFile *sfile;
+ gboolean ret;
+
+ sfile = dp_get_file_from_row(src, row);
+ if((ret = del_delete_gfile(min, sfile, FALSE, error)) != 0)
+ {
+ const gchar *contents = gtk_entry_get_text(GTK_ENTRY(sle->contents));
+
+ ret = g_file_make_symbolic_link(sfile, contents, NULL, error);
+ }
+ if(!ret)
+ err_set_gerror(min, error, "SymLink", sfile);
+ g_object_unref(sfile);
+
+ return ret;
+}
+
+/* 1999-05-30 - Free the link GUI when the generic module is done with it. */
+static void link_free(gpointer user)
+{
+ SleInfo *sle = user;
+
+ gtk_widget_destroy(sle->vbox);
+ sle->vbox = NULL;
+}
+
+/* 1999-05-30 - User clicked the "details" button for setting link target from file selector. Pop it up. */
+static void evt_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ const gchar *text;
+ SleInfo *sle = user;
+ GtkWidget *fsel;
+ gint resp;
+
+ fsel = gtk_file_chooser_dialog_new(_("Select Link Target"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, _("OK"), GTK_RESPONSE_OK, _("Cancel"), GTK_RESPONSE_CANCEL, NULL);
+ text = gtk_entry_get_text(GTK_ENTRY(sle->contents));
+ if(text != NULL && *text != '\0')
+ {
+ /* Absolute-looking? */
+ if(strchr(text, G_DIR_SEPARATOR) != NULL)
+ gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(fsel), text);
+ else
+ {
+ GFile *child = g_file_get_child_for_display_name(sle->src->dir.root, text, NULL);
+
+ /* Try to find the actual target file in the same directory as the link, and move the chooser there. */
+ if(child != NULL)
+ {
+ gchar *uri = g_file_get_uri(child);
+
+ gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(fsel), uri);
+ g_free(uri);
+ g_object_unref(child);
+ }
+ }
+ }
+ resp = gtk_dialog_run(GTK_DIALOG(fsel));
+ gtk_widget_hide(fsel);
+ if(resp == GTK_RESPONSE_OK)
+ {
+ gchar *sel = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fsel));
+
+ if(sel != NULL)
+ {
+ gtk_entry_set_text(GTK_ENTRY(sle->contents), sel);
+ g_free(sel);
+ }
+ }
+ gtk_widget_destroy(fsel);
+}
+
+/* 1999-05-30 - Edit all selected symbolic links one at a time, or, if there is no selection,
+** create a new link letting the user type both source and destination names.
+*/
+gint cmd_symlinkedit(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ static SleInfo sle;
+ GtkWidget *label, *grid, *pick;
+ Dialog *dlg;
+ gboolean ok = FALSE;
+
+ sle.min = min;
+ sle.src = src;
+
+ sle.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ grid = gtk_grid_new();
+ label = gtk_label_new(_("Name"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ sle.name = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(sle.name), FILENAME_MAX - 1);
+ gtk_widget_set_hexpand(sle.name, TRUE);
+ gtk_widget_set_halign(sle.name, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), sle.name, 1, 0, 2, 1);
+ label = gtk_label_new(_("Contents"));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ sle.contents = gui_dialog_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(sle.contents), PATH_MAX - 1);
+ gtk_grid_attach(GTK_GRID(grid), sle.contents, 1, 1, 1, 1);
+ pick = gui_details_button_new();
+ g_signal_connect(G_OBJECT(pick), "clicked", G_CALLBACK(evt_pick_clicked), &sle);
+ gtk_grid_attach(GTK_GRID(grid), pick, 2, 1, 1, 1);
+ gtk_box_pack_start(GTK_BOX(sle.vbox), grid, TRUE, TRUE, 0);
+
+ if(dp_has_selection(src))
+ {
+ gtk_editable_set_editable(GTK_EDITABLE(sle.name), FALSE);
+ return cmd_generic(min, _("Edit Symbolic Link"), CGF_NOALL | CGF_LINKSONLY, link_body, link_action, link_free, &sle);
+ }
+ else
+ {
+ /* No selection to edit, so create new symlink in the source pane. */
+ dlg = dlg_dialog_sync_new(sle.vbox, _("Create Symbolic Link"), NULL);
+ gtk_widget_grab_focus(sle.name);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ const gchar *name, *contents;
+ GFile *sfile;
+ OvwRes ores;
+ GError *error = NULL;
+
+ /* If name contains slashes, treat it as a full URI, otherwise it's local. */
+ name = gtk_entry_get_text(GTK_ENTRY(sle.name));
+ if(g_utf8_strchr(name, -1, G_DIR_SEPARATOR) != NULL)
+ sfile = g_vfs_parse_name(min->vfs.vfs, name);
+ else
+ sfile = dp_get_file_from_name(src, name);
+ contents = gtk_entry_get_text(GTK_ENTRY(sle.contents));
+ ovw_overwrite_begin(min, _("\"%s\" Already Exists - Continue With Link?"), 0UL);
+ ores = ovw_overwrite_unary_file(src, sfile);
+ if(ores == OVW_PROCEED)
+ ok = TRUE;
+ else if(ores == OVW_PROCEED_FILE || ores == OVW_PROCEED_DIR)
+ ok = del_delete_gfile(min, sfile, FALSE, &error);
+ else
+ ok = FALSE;
+ if(ok)
+ {
+ if((ok = g_file_make_symbolic_link(sfile, contents, NULL, &error)) != FALSE)
+ dp_rescan_post_cmd(src);
+ }
+ else
+ err_set_gerror(min, &error, "SymLink", sfile);
+ ovw_overwrite_end(min);
+ }
+ dlg_dialog_sync_destroy(dlg);
+ }
+ return ok;
+}
diff --git a/src/cmd_symlink.h b/src/cmd_symlink.h
new file mode 100644
index 0000000..409cda6
--- /dev/null
+++ b/src/cmd_symlink.h
@@ -0,0 +1,6 @@
+/*
+** 1999-05-29 - Symlink management command header.
+*/
+
+extern gint cmd_symlink(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+extern gint cmd_symlinkedit(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
diff --git a/src/cmd_viewtext.c b/src/cmd_viewtext.c
new file mode 100644
index 0000000..0caf7a3
--- /dev/null
+++ b/src/cmd_viewtext.c
@@ -0,0 +1,209 @@
+/*
+** 1999-02-03 - Moved this code from the textview module, cleaning it up.
+** 1999-03-06 - Changed for new selection management. Major changes, but it became
+** a *lot* cleaner. At least internally.
+** 1999-04-06 - Added use of the new command configuration system. Note that the info is
+** actually shared across the three individual commands defined in this module.
+** Also rewrote the hex-or-text decision code, and added error reporting to the
+** ViewTextOrHex command.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "cmdseq_config.h"
+#include "convstream.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "textview.h"
+#include "cmd_viewtext.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Options for the "ViewText" command. */
+ gboolean modified;
+ gsize buf_size; /* Buffer size. */
+ gsize check_size; /* The ViewTextOrHex command inspects this many bytes. */
+ gboolean exit_on_left; /* Exit text reader on Left Arrow keypress? */
+} OptViewText;
+
+static OptViewText viewtext_options;
+static CmdCfg *viewtext_cmc = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-19 - Just open a window containing some text viewing widgetry.
+** 1998-09-10 - The creation of txi_open() above allowed this one to shrink from 50 to 5 lines, sort of.
+*/
+static gint view_file_text(MainInfo *min, GFile *file, const gchar *encoding, GError **err)
+{
+ GtkWidget *txv;
+
+ if((txv = txv_open(min, NULL)) != NULL)
+ {
+ txv_show(txv);
+ txv_text_load(txv, file, viewtext_options.buf_size, encoding, err);
+ txv_enable(txv);
+ }
+ return txv != NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-12-18 - View file in hex mode. */
+static gint view_file_hex(MainInfo *min, GFile *file, const gchar *encoding, GError **err)
+{
+ GtkWidget *txv;
+
+ if((txv = txv_open(min, NULL)) != NULL)
+ {
+ txv_show(txv);
+ txv_text_load_hex(txv, file, err);
+ txv_enable(txv);
+ }
+ return txv != NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-02-03 - Inspect the first bytes (check_size) for printability. If all are OK, return 1.
+** Otherwise return 0. If an error occurs, -1 is returned.
+** 2010-02-28 - Ported to GIO, some comments that no longer apply were removed.
+** 2010-07-20 - Now tries to charset-convert the input, if that fails it's not text. Nice.
+*/
+static gint file_is_text(MainInfo *min, GFile *file, const gchar *encoding, GError **err)
+{
+ GFileInputStream *is;
+ gboolean txt = FALSE;
+
+ if(encoding == NULL)
+ encoding = convstream_get_default_encoding();
+
+ if((is = g_file_read(file, NULL, err)) != NULL)
+ {
+ gchar *buf;
+ gssize got;
+
+ buf = g_malloc(viewtext_options.check_size);
+ if((got = g_input_stream_read(G_INPUT_STREAM(is), buf, viewtext_options.check_size, NULL, err)) > 0)
+ {
+ gchar *out = g_convert(buf, got, convstream_get_target_encoding(), encoding, NULL, NULL, NULL);
+
+ txt = (out != NULL);
+ g_free(out);
+ }
+ g_free(buf);
+ g_object_unref(is);
+ }
+ return *err != NULL ? -1 : txt;
+}
+
+/* 1999-02-03 - This function views a file named <full_name> as either ASCII text or hex data.
+** Note that it does this by actually inspecting the first few bytes of the file,
+** rather than using gentoo's type system. This makes it work for all files, even
+** those of type "Unknown".
+** 2010-02-28 - Ported to GIO.
+*/
+static gint view_file_text_or_hex(MainInfo *min, GFile *file, const gchar *encoding, GError **err)
+{
+ gint res;
+
+ if((res = file_is_text(min, file, encoding, err)) >= 0)
+ {
+ if(res == 0)
+ view_file_hex(min, file, NULL, err);
+ else
+ view_file_text(min, file, encoding, err);
+ }
+ return res >= 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-06 - A general viewer-trampoline. Will view all currently selected files using
+** the given viewing function.
+** 2010-02-28 - Ported to GIO and GTK+ 2.0.
+*/
+static gint view_selection(MainInfo *min, DirPane *dp, gint (*viewer)(MainInfo *min, GFile *file, const gchar *encoding, GError **err), const gchar *encoding)
+{
+ gboolean ok = TRUE;
+ GSList *slist, *iter;
+ GError *err = NULL;
+
+ if((slist = dp_get_selection(dp)) == NULL)
+ return 1;
+ for(iter = slist; ok && iter != NULL; iter = g_slist_next(iter))
+ {
+ GFile *file;
+
+ if((file = dp_get_file_from_row(dp, iter->data)) != NULL)
+ {
+ ok = viewer(min, file, encoding, &err);
+ if(ok)
+ dp_unselect(dp, iter->data);
+ else
+ err_set_gerror(min, &err, "ViewText", file);
+ g_object_unref(file);
+ }
+ }
+ dp_free_selection(slist);
+
+ return ok;
+}
+
+/* 1999-03-06 - View selected files in plain text mode.
+** 1999-05-29 - Now uses the command argument system to control plain/hex/auto modes, thus
+** replacing the old ViewTextHex and ViewTextOrHex commands. Neater.
+*/
+gint cmd_viewtext(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca)
+{
+ const gchar *encoding;
+ gint mode;
+
+ encoding = car_keyword_get_value(ca, "encoding", "");
+ /* Map an empty encoding to NULL, which gives us the system's default. */
+ if(encoding != NULL && *encoding == '\0')
+ encoding = NULL;
+ mode = car_keyword_get_enum(ca, "mode", 1, "auto", "text", "hex", NULL);
+ switch(mode)
+ {
+ case 0:
+ return view_selection(min, src, view_file_text_or_hex, encoding);
+ case 1:
+ return view_selection(min, src, view_file_text, encoding);
+ case 2:
+ return view_selection(min, src, view_file_hex, NULL);
+ default:
+ ;
+ }
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-06 - Register the ViewText & friends configuration info. */
+void cfg_viewtext(MainInfo *min)
+{
+ if(viewtext_cmc == NULL)
+ {
+ /* Initialize options to legacy default values. */
+ viewtext_options.modified = FALSE;
+ viewtext_options.buf_size = (1 << 18);
+ viewtext_options.check_size = (1 << 9);
+ viewtext_options.exit_on_left = TRUE;
+
+ viewtext_cmc = cmc_config_new("ViewText", &viewtext_options);
+ cmc_field_add_boolean(viewtext_cmc, "modified", NULL, offsetof(OptViewText, modified));
+ cmc_field_add_size(viewtext_cmc, "buf_size", _("Buffer Size"), offsetof(OptViewText, buf_size), 1024, (1 << 20), 1024);
+ cmc_field_add_size(viewtext_cmc, "check_size", _("Hex-Check First"), offsetof(OptViewText, check_size), 32, (1 << 16), 32);
+ cmc_field_add_boolean(viewtext_cmc, "exit_left", _("Exit on Left Arrow Key?"), offsetof(OptViewText, exit_on_left));
+ cmc_config_register(viewtext_cmc);
+ }
+}
diff --git a/src/cmd_viewtext.h b/src/cmd_viewtext.h
new file mode 100644
index 0000000..281471c
--- /dev/null
+++ b/src/cmd_viewtext.h
@@ -0,0 +1,10 @@
+/*
+** 1999-02-03 - Header for the module implementing the ViewText and ViewHex commands.
+*/
+
+extern gint cmd_viewtext(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+
+/* Since the three related commands are in the same module, they can share one config
+** structure, making the user interface cleaner. Nice.
+*/
+extern void cfg_viewtext(MainInfo *min);
diff --git a/src/cmdarg.c b/src/cmdarg.c
new file mode 100644
index 0000000..e6c73c5
--- /dev/null
+++ b/src/cmdarg.c
@@ -0,0 +1,278 @@
+/*
+** 1999-05-06 - This module implements some support for passing arguments to built-in commands.
+** The point is to move as much as possible of the burden of parsing those args out
+** of the actual command implementations, to reduce code duplication and generally
+** keep the commands themselves lean and mean.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "strutil.h"
+#include "cmdarg.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Determine if given character can be part of a key word. */
+#define IS_KEYWORD(c) (((c) != '\0') && ((c) != '='))
+
+struct CmdArg {
+ GHashTable *keywords; /* All KEYWORD=VALUE pairs get hashed into here. */
+ GList *barewords; /* All other things get listed here. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-06 - Compute a hash value for <key>, assuming it to be pointing at the first letter
+** of a "keyword=value" string. Only characters up to (but not including) the '='
+** are included in the hash. Algorithm stolen from glib.
+*/
+static guint keyword_hash(gconstpointer key)
+{
+ const gchar *ptr;
+ guint hash = 0U, g;
+
+ for(ptr = key; (*ptr != '\0') && (*ptr != '='); ptr++)
+ {
+ hash = (hash << 4) + *ptr;
+ if((g = hash & 0xf0000000))
+ {
+ hash ^= (g >> 24);
+ hash ^= g;
+ }
+ }
+ return hash;
+}
+
+/* 1999-05-06 - Compare two keywords <a> and <b>, return TRUE if they're equal. A bit tricky,
+** since a keyword can be terminated either by '\0' or '='. For glib hash table.
+** Note that keywords, rather un-Unixedly, are cAsE iNsenSitIve. Ouch. :)
+*/
+static gint keyword_equal(gconstpointer a, gconstpointer b)
+{
+ const gchar *ap = a, *bp = b;
+
+ for(; IS_KEYWORD(*ap) && IS_KEYWORD(*bp) && (toupper((guchar) *ap) == toupper((guchar) *bp)); ap++, bp++)
+ ;
+ return !(IS_KEYWORD(*ap) && IS_KEYWORD(*bp));
+}
+
+/* 1999-05-06 - Go through the given <argv> vector (typically created by a call to cpr_parse() in
+** the cmdparse module), and build the command argument representation from it. <argv>
+** must be NULL-terminated. Note that we assume that the <argv> data will be around
+** longer than the CmdArg being built here, so we don't need to duplicate any strings.
+** Note: this routine cannot fail. If it returns NULL, that means there were no
+** arguments to the command. That is expected to be a common case, and so worth to
+** optimize a bit. All routines in this module interpret a NULL CmdArg argument as
+** being empty, and react accordingly.
+*/
+CmdArg * car_create(gchar **argv)
+{
+ CmdArg *ca = NULL;
+
+ if((argv != NULL) && (argv[1] != NULL)) /* Safe, because if argv != NULL, argv[0] != NULL too. */
+ {
+ gchar *eq;
+ guint i;
+
+ ca = g_malloc(sizeof *ca);
+ ca->keywords = NULL;
+ ca->barewords = NULL;
+ for(i = 1; argv[i] != NULL; i++)
+ {
+ if((eq = strchr(argv[i], '=')) != NULL)
+ {
+ if(ca->keywords == NULL)
+ ca->keywords = g_hash_table_new(keyword_hash, keyword_equal);
+ g_hash_table_insert(ca->keywords, argv[i], eq + 1);
+ }
+ else
+ ca->barewords = g_list_append(ca->barewords, argv[i]);
+ }
+ if((ca->keywords != NULL) || (ca->barewords != NULL))
+ return ca;
+ car_destroy(ca);
+ }
+ return NULL;
+}
+
+/* 1999-05-06 - Destroy given CmdArg. After this, it is no longer valid. */
+void car_destroy(CmdArg *ca)
+{
+ if(ca != NULL)
+ {
+ if(ca->keywords != NULL)
+ g_hash_table_destroy(ca->keywords);
+ if(ca->barewords != NULL)
+ g_list_free(ca->barewords);
+ g_free(ca);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-06 - Return the value given with <keyword>, or <default_value> if not present. */
+const gchar * car_keyword_get_value(const CmdArg *ca, const gchar *keyword, const gchar *default_value)
+{
+ if((ca != NULL) && (keyword != NULL))
+ {
+ if(ca->keywords != NULL)
+ return g_hash_table_lookup(ca->keywords, keyword);
+ }
+ return default_value;
+}
+
+/* 2009-07-03 - Return the integer value given with <keyword>, or <default_value> if not present.
+** Note that the value returned is signed, "foo=-12" is fine.
+*/
+gint car_keyword_get_integer(const CmdArg *ca, const gchar *keyword, gint default_value)
+{
+ if((ca != NULL) && (keyword != NULL))
+ {
+ const gchar *value = car_keyword_get_value(ca, keyword, NULL);
+
+ if(value != NULL)
+ {
+ gchar *eptr;
+ long v;
+
+ v = strtol(value, &eptr, 10);
+ if(eptr > value)
+ return v;
+ }
+ }
+ return default_value;
+}
+
+/* 1999-05-06 - Match the value of <keyword> to an enumerated list of strings, and return the index
+** of the string that matched.
+** The var-args part should be a list of strings, the index of which is returned on a
+** successful match. In case there is no match, default_map is returned.
+** Example: if the command string was "SelectRE set=unselected re=*.jpg", and you call
+** this with: car_map_keyword(ca, "set", 0, "all", "selected", "unselected", NULL), it
+** will return 2, that being the index of "unselected". It's really not that hard! :)
+*/
+gint car_keyword_get_enum(const CmdArg *ca, const gchar *keyword, gint default_value, ...)
+{
+ gint ret = default_value;
+
+ if((ca != NULL) && (keyword != NULL))
+ {
+ const gchar *value;
+
+ if((value = car_keyword_get_value(ca, keyword, NULL)) != NULL)
+ {
+ gint index;
+ const gchar *word;
+ va_list arg;
+
+ va_start(arg, default_value);
+ for(index = 0; (word = va_arg(arg, const gchar *)) != NULL; index++)
+ {
+ if(strcmp(value, word) == 0)
+ {
+ ret = index;
+ break;
+ }
+ }
+ va_end(arg);
+ }
+ }
+ return ret;
+}
+
+/* 1999-05-07 - Check if the value for <keyword> was either true or false. The tokens "", "yes",
+** "true", "1" and "on" all map to TRUE, any other to FALSE. Note that since the
+** return type is really guint, it's legal to have a default value outside of {0, 1}.
+** This is not only cool, its sometimes even useful.
+** 2004-12-26 - Make sure comparison is always done against English strings, too.
+*/
+guint car_keyword_get_boolean(const CmdArg *ca, const gchar *keyword, guint default_value)
+{
+ if((ca != NULL) && (keyword != NULL))
+ {
+ const gchar *value;
+
+ if((value = car_keyword_get_value(ca, keyword, NULL)) != NULL)
+ {
+ const gchar *yes[] = { "", N_("yes"), N_("true"), N_("on"), "1" };
+ guint i;
+
+ for(i = 0; i < sizeof yes / sizeof yes[0]; i++)
+ {
+ if(strcmp(value, yes[i]) == 0)
+ return TRUE;
+ if(strcmp(value, _(yes[i])) == 0)
+ return TRUE;
+ }
+ return FALSE;
+ }
+ }
+ return default_value;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-11 - Return the number of barewords in <ca>. */
+guint car_bareword_get_amount(const CmdArg *ca)
+{
+ if((ca != NULL) && (ca->barewords != NULL))
+ return g_list_length(ca->barewords);
+ return 0U;
+}
+
+/* 1999-05-11 - Return the <index>'th bareword, or NULL. */
+const gchar * car_bareword_get(const CmdArg *ca, guint index)
+{
+ if((ca != NULL) && (index < car_bareword_get_amount(ca)))
+ return g_list_nth_data(ca->barewords, index);
+ return NULL;
+}
+
+/* 1999-05-11 - Check whether <word> is among the barewords in <ca> or not. Ignores case. */
+gboolean car_bareword_present(const CmdArg *ca, const gchar *word)
+{
+ if((ca != NULL) && (ca->barewords != NULL) && (word != NULL))
+ {
+ GList *iter;
+
+ for(iter = ca->barewords; iter != NULL; iter = g_list_next(iter))
+ {
+ if(strcmp(iter->data, word) == 0)
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* 1999-05-11 - Do something similar to car_keyword_get_enum(), but on bareword number <index>. */
+guint car_bareword_get_enum(const CmdArg *ca, guint index, guint default_value, ...)
+{
+ guint ret = default_value;
+
+ if((ca != NULL) && (index < car_bareword_get_amount(ca)))
+ {
+ const gchar *bw = g_list_nth_data(ca->barewords, index);
+
+ if(bw != NULL)
+ {
+ const gchar *word;
+ va_list arg;
+
+ va_start(arg, default_value);
+ for(index = 0; (word = va_arg(arg, const gchar *)) != NULL; index++)
+ {
+ if(strcmp(bw, word) == 0)
+ {
+ ret = index;
+ break;
+ }
+ }
+ va_end(arg);
+ }
+ }
+ return ret;
+}
diff --git a/src/cmdarg.h b/src/cmdarg.h
new file mode 100644
index 0000000..a430022
--- /dev/null
+++ b/src/cmdarg.h
@@ -0,0 +1,35 @@
+/*
+** 1999-05-06 - Header for the built-in command argument parsing/handling module.
+*/
+
+#if !defined CMDARG_H
+#define CMDARG_H
+
+/* An opaque type that acts as a "handle" on the arguments given to a command. */
+typedef struct CmdArg CmdArg;
+
+/* These are never called by individual command implementations, only by the
+** main cmdseq command execution core. Gee, that sounded cool. :)
+*/
+extern CmdArg * car_create(gchar **argv);
+extern void car_destroy(CmdArg *ca);
+
+/* These are called by command implementations, to find out about the command
+** argument keywords provided by the user. They all react very sanely to being
+** called with a NULL <ca> argument.
+*/
+extern const gchar * car_keyword_get_value(const CmdArg *ca, const gchar *keyword, const gchar *default_value);
+extern gint car_keyword_get_integer(const CmdArg *ca, const gchar *keyword, gint default_value);
+extern gint car_keyword_get_enum(const CmdArg *ca, const gchar *keyword, gint default_value, ...);
+extern guint car_keyword_get_boolean(const CmdArg *ca, const gchar *keyword, guint default_value);
+
+/* These deal with the "bare" arguments, i.e. those that are NOT of the form
+** keyword=value. Useful when a command needs a single "core" argument, that
+** is not conceptually an option or modifier.
+*/
+extern guint car_bareword_get_amount(const CmdArg *ca);
+extern gboolean car_bareword_present(const CmdArg *ca, const gchar *word);
+extern const gchar * car_bareword_get(const CmdArg *ca, guint index);
+extern guint car_bareword_get_enum(const CmdArg *ca, guint index, guint default_value, ...);
+
+#endif /* CMDARG_H */
diff --git a/src/cmdgrab.c b/src/cmdgrab.c
new file mode 100644
index 0000000..1e584d7
--- /dev/null
+++ b/src/cmdgrab.c
@@ -0,0 +1,188 @@
+/*
+** 1998-09-26 - This module deals with grabbing (i.e. redirecting) a sub-process' output.
+** Very useful when running external commands. This code was extracted from the
+** remains of the old (bloated) command module. If the interface seems rather
+** un-intuitive, that is probably because it's a mess. :^)
+** 1999-03-02 - Cleaned up interface with textviewing module, geting rid (I hope) of some
+** nasty races having to do with closing it down in mid-capture.
+** 1999-03-08 - Did some changes due to seemingly different semantics in GTK+ 1.2.0. This
+** requires handling of GDK_INPUT_EXCEPTION input condition (um, perhaps it
+** did in 1.0.6 too, but it worked even if I didn't care).
+** 2008-05-16 - Took a leap into the future, and ported to GIOChannels.
+** 2010-03-11 - Sliced away lots of code, parent uses glib to get pipes set up, we just grab.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "guiutil.h"
+#include "textview.h"
+
+#include "cmdgrab.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define GRAB_CHUNK (512) /* We read this many bytes on each "input available" callback. */
+
+typedef struct {
+ MainInfo *min;
+ GPid child;
+ GIOChannel *c_stdout, *c_stderr; /* Channels for stdout and stderr from child. */
+ gint fd_out, fd_err; /* File descriptors for output & error channels. */
+ gint tag_out, tag_err; /* GTK+ input tags for those channels. */
+ gulong evt_del; /* Delete event handler. */
+ GdkColor stderr_color; /* Color used for stderr. */
+ GtkWidget *txv; /* Text viewing window. */
+} GrabInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - This gets called when the user tries to delete (i.e., close) the output
+** window. We now need to disconnect the input grabbers, kill the child,
+** free the grabinfo, and close the window. We don't do need to do much of
+** that, though; killing the children generates a last callback-call, and
+** so we can reuse the close-down code already there!
+*/
+static gint evt_grab_deleted(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ GrabInfo *gri = user;
+
+ txv_close(gri->txv);
+ kill(gri->child, SIGTERM);
+ gri->txv = NULL; /* This signals the I/O handler that the viewer is closed. */
+
+ return FALSE;
+}
+
+/* 1999-02-23 - User just pressed a key in the grab window. If Escape, close down. */
+static gint evt_grab_keypress(GtkWidget *wid, GdkEventKey *event, gpointer user)
+{
+ GrabInfo *gri;
+
+ if(event->keyval == GDK_KEY_Escape)
+ {
+ if((gri = g_object_get_data(G_OBJECT(wid), "gri")) != NULL)
+ {
+ kill(gri->child, SIGTERM);
+ gri->txv = NULL;
+ }
+ txv_close(wid);
+ }
+ return FALSE;
+}
+
+/* 1998-09-26 - Here's a callback for the gtk_input_add() stuff. This gets called when there's
+** something to read from our child process, on either its stdout or stderr pipes.
+** We read it out (in small chunks) and use a GtkText widget to display the stuff.
+** This feels a lot more stable than the previous implementation, by the way.
+** 1998-12-15 - Now shows the window as the first output appears. Makes the window invisible
+** for commands that don't cause output. Note the manual destruction for that case.
+** 1999-04-22 - Added quick fix for weird condition: we get called with GDK_INPUT_READ although
+** there is nothing more to read. Added explicit grab termination via recursion.
+** 2008-05-16 - Ported to GLib 2.0 and GIOChannels.
+*/
+static gboolean grab_callback(GIOChannel *channel, GIOCondition cond, gpointer data)
+{
+ GrabInfo *gri = data;
+
+ if(cond & G_IO_IN)
+ {
+ gchar *line;
+ gsize linelen = 0u;
+
+ while(g_io_channel_read_line(channel, &line, &linelen, NULL, NULL) == G_IO_STATUS_NORMAL)
+ {
+ if(gri->txv != NULL)
+ {
+ txv_show(gri->txv);
+ if(channel == gri->c_stdout)
+ txv_text_append(gri->txv, line, linelen);
+ else
+ txv_text_append_with_color(gri->txv, line, linelen, &gri->stderr_color);
+ gui_events_flush();
+ }
+ g_free(line);
+ }
+ }
+ if((cond & G_IO_ERR) || (cond & G_IO_HUP))
+ {
+ if(channel == gri->c_stdout)
+ {
+ g_source_remove(gri->tag_out);
+ g_io_channel_shutdown(gri->c_stdout, FALSE, NULL);
+ g_io_channel_unref(gri->c_stdout);
+ gri->c_stdout = NULL;
+ close(gri->fd_out);
+ gri->fd_out = 0;
+ }
+ else if(channel == gri->c_stderr)
+ {
+ g_source_remove(gri->tag_err);
+ g_io_channel_shutdown(gri->c_stderr, FALSE, NULL);
+ g_io_channel_unref(gri->c_stderr);
+ gri->c_stderr = NULL;
+ close(gri->fd_err);
+ gri->fd_err = 0;
+ }
+ if(gri->c_stdout == NULL && gri->c_stderr == NULL)
+ {
+ if(gri->txv != NULL) /* Window still open? */
+ {
+ txv_connect_delete(gri->txv, NULL, NULL);
+ txv_connect_keypress(gri->txv, NULL, NULL);
+ txv_enable(gri->txv);
+ if(!gtk_widget_get_realized(gri->txv))
+ gtk_widget_destroy(gri->txv);
+ }
+ g_free(gri);
+ }
+ }
+ return TRUE;
+}
+
+/* 1998-09-26 - Set up two GTK+ input listeners, one on <fd_out> and one on <fd_err>. Is
+** cool (?) enough to share a single output window between these two channels.
+*/
+gboolean cgr_grab_output(MainInfo *min, const gchar *prog, GPid child, gint fd_out, gint fd_err)
+{
+ gchar buf[MAXNAMLEN + 32];
+ GrabInfo *gri;
+
+ gri = g_malloc(sizeof *gri);
+ gri->min = min;
+ gri->child = child;
+ gri->fd_out = fd_out;
+ /* TODO: This color should be GUI-settable, of course. Later ... */
+ gri->stderr_color.red = 0xfefeu;
+ gri->stderr_color.green = 0x1e1eu;
+ gri->stderr_color.blue = 0x1e1eu;
+ if((gri->c_stdout = g_io_channel_unix_new(fd_out)) != NULL)
+ {
+ /*g_io_channel_set_buffered(gri->stdout, FALSE);*/
+ g_io_channel_set_buffer_size(gri->c_stdout, GRAB_CHUNK);
+ gri->fd_err = fd_err;
+ if((gri->c_stderr = g_io_channel_unix_new(fd_err)) != NULL)
+ {
+ if((gri->txv = txv_open(min, NULL)) != NULL)
+ {
+ g_snprintf(buf, sizeof buf, _("Output of %s (pid %d)"), prog, (gint) child);
+ txv_set_label(gri->txv, buf);
+ g_object_set_data(G_OBJECT(gri->txv), "gri", gri);
+ txv_connect_delete(gri->txv, G_CALLBACK(evt_grab_deleted), gri);
+ txv_connect_keypress(gri->txv, G_CALLBACK(evt_grab_keypress), gri);
+ gri->tag_out = g_io_add_watch(gri->c_stdout, G_IO_IN | G_IO_PRI | G_IO_HUP, grab_callback, gri);
+ gri->tag_err = g_io_add_watch(gri->c_stderr, G_IO_IN | G_IO_PRI | G_IO_HUP, grab_callback, gri);
+
+ return TRUE;
+ }
+ }
+ }
+ g_free(gri);
+
+ return FALSE;
+}
diff --git a/src/cmdgrab.h b/src/cmdgrab.h
new file mode 100644
index 0000000..fb5698d
--- /dev/null
+++ b/src/cmdgrab.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-26 - Header file for the output-grabbing module.
+*/
+
+extern gboolean cgr_grab_output(MainInfo *min, const gchar *prog, GPid child, gint fd_out, gint fd_err);
diff --git a/src/cmdparse.c b/src/cmdparse.c
new file mode 100644
index 0000000..ac85271
--- /dev/null
+++ b/src/cmdparse.c
@@ -0,0 +1,846 @@
+/*
+** 1998-09-25 - This module contains code formerly in the 'commands.c' module. It deals
+** with the parsing and transformation of command arguments in string format
+** (e.g. "ls -l {fp}") to argv-style argument vectors. Very useful in command
+** execution code. All code was modified for the new command format, of course.
+** 1999-02-25 - Finished (?) some major rewrites. This should be a lot more flexible now, and
+** perhaps even a couple of small measures faster. Now does half-decent quoting.
+** 1999-03-07 - Changes for the new selection representation.
+** 1999-05-08 - Simplified main cpr_parse() interface slightly; now just takes a const gchar
+** string rather than a GString.
+** 1999-06-19 - Adapted for new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dialog.h"
+#include "dirpane.h"
+#include "strutil.h"
+#include "userinfo.h"
+#include "cmdparse.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define INP_PATTERN "\1" "INP%02d" "\2" /* Shouldn't occur in regular text. Really. */
+#define INP_PAT_LEN (7) /* Guaranteed length produced by above. */
+
+#define DLG_MAX_INPUT (16) /* Maximum amount of individual inputs {I}s for a single command. */
+
+typedef enum { CITP_STRING, CITP_MENU, CITP_COMBO, CITP_LABEL, CITP_CHECKBOX } CIType;
+
+typedef struct {
+ GtkWidget *entry;
+} CIString;
+
+typedef struct {
+ GList *items; /* List of item texts (dynamic). */
+ gint current; /* Index of currently selected item. */
+} CIMenu;
+
+typedef struct {
+ GtkWidget *combo;
+} CICombo;
+
+typedef struct {
+ GtkWidget *label; /* This is either a GtkLabel or a HSeparator (from {It:-}). */
+} CILabel;
+
+typedef struct {
+ GtkWidget *check; /* Just a GtkCheckButton. */
+ const gchar *active, *inactive; /* Choice texts. If NULL, the defauls of TRUE and FALSE are used. */
+} CICheckbox;
+
+typedef struct {
+ CIType type;
+ union {
+ CIString string;
+ CIMenu menu;
+ CICombo combo;
+ CILabel label;
+ CICheckbox checkbox;
+ } inp;
+} CmdInp;
+
+typedef struct {
+ MainInfo *min; /* So unbelievably handy. */
+ Dialog *dlg; /* The dialog window. */
+ CmdInp input[DLG_MAX_INPUT];
+ GtkWidget *body; /* This holds the entire GUI. */
+ GtkWidget *grid; /* Input widgets and labels are added here. */
+ gint row; /* Current row in table. */
+ gchar *wintitle; /* Title to set on window (example: {Iw:"gentoo"}). */
+ gint str_count; /* Counts number of string fields (for focus). */
+ gboolean str_focused; /* Gets set as the string is first focused. */
+} CmdDlg;
+
+static const gchar the_true[] = "true", the_false[] = "false";
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void parse_code(MainInfo *min, GString *cstr, gchar *code, CmdDlg *dlg, gboolean input_ok);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Parse a code beginning with 'f' or 'F'.
+** 1998-10-26 - Added the 'd' flag to get at the destination pane, rather than the source.
+** 1999-02-24 - Rewritten for new argument handling style. Quotes filenames now.
+*/
+static void parse_code_file(MainInfo *min, GString *cstr, const gchar *code)
+{
+ DirPane *dp = min->gui->cur_pane;
+ const gchar *name;
+ const gboolean unsel = (strchr(code + 1, 'u') != NULL),
+ path = (strchr(code + 1, 'p') != NULL),
+ dest = (strchr(code + 1, 'd') != NULL),
+ quote = (strchr(code + 1, 'Q') == NULL), /* Upper case for default-on. */
+ ext = (strchr(code + 1, 'E') == NULL);
+ GSList *slist, *iter;
+
+ if(dest) /* User requested the destination pane? */
+ dp = dp_mirror(min, dp);
+ if((slist = dp_get_selection(dp)) == NULL)
+ return;
+
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ name = quote ? dp_name_quoted(dp, iter->data, path) : dp_row_get_name(dp_get_tree_model(dp), iter->data);
+
+ if(iter != slist)
+ g_string_append_c(cstr, ' ');
+ if(ext)
+ g_string_append(cstr, name);
+ else
+ {
+ const gchar *dot = strchr(name, '.');
+ if(dot != NULL && dot > name)
+ {
+ /* Only append up to, but not including, the dot. */
+ g_string_append_len(cstr, name, dot - name);
+ }
+ else
+ g_string_append(cstr, name);
+ }
+ if(unsel)
+ dp_unselect(dp, iter->data);
+ if(code[0] == 'f') /* Only first? */
+ break;
+ }
+ dp_free_selection(slist);
+}
+
+/* 1998-09-25 - Parse a code beginning with 'P', resulting in a path.
+** 1999-02-24 - Touched up to comply with the new argument handling style.
+*/
+static void parse_code_path(MainInfo *min, GString *cstr, const gchar *code)
+{
+ const gchar *path = NULL;
+ DirPane *src = min->gui->cur_pane, *dst = dp_mirror(min, src);
+
+ if(code[1] == '\0') /* Nothing but the 'P'? */
+ path = src->dir.path;
+ else
+ {
+ if(code[1] == 's')
+ path = src->dir.path;
+ else if(code[1] == 'd')
+ path = dst->dir.path;
+ else if(code[1] == 'l')
+ path = min->gui->pane[0].dir.path;
+ else if(code[1] == 'r')
+ path = min->gui->pane[1].dir.path;
+ else if(code[1] == 'h')
+ path = getenv("HOME");
+ else
+ fprintf(stderr, "**CMDPARSE: Illegal path code '%s'\n", code + 1);
+ }
+ if(path != NULL)
+ {
+ if(strncmp(path, "file://", 7) == 0)
+ path += 7;
+ g_string_append(cstr, path);
+ }
+}
+
+/* 2010-03-14 - Parse a {u} code to look up an URI. */
+static void parse_code_uri(MainInfo *min, GString *cstr, const gchar *code)
+{
+ DirPane *dp = min->gui->cur_pane;
+ const gboolean single = code[0] == 'u',
+ unsel = (strchr(code + 1, 'u') != NULL),
+ dest = (strchr(code + 1, 'd') != NULL),
+ quote = (strchr(code + 1, 'Q') == NULL); /* Upper case for default-on. */
+ GSList *slist, *iter;
+
+ if(dest) /* User requested the destination pane? */
+ dp = dp_mirror(min, dp);
+ if((slist = dp_get_selection(dp)) == NULL)
+ return;
+
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ GFile *child;
+
+ child = dp_get_file_from_row(dp, iter->data);
+ if(child != NULL)
+ {
+ gchar *uri;
+
+ if((uri = g_file_get_uri(child)) != NULL)
+ {
+ if(iter != slist)
+ g_string_append_c(cstr, ' ');
+ if(quote)
+ g_string_append_c(cstr, '"');
+ g_string_append(cstr, uri);
+ if(quote)
+ g_string_append_c(cstr, '"');
+ if(unsel)
+ dp_unselect(dp, iter->data);
+ if(code[0] == 'f') /* Only first? */
+ break;
+ g_free(uri);
+ }
+ if(single)
+ break;
+ }
+ }
+ dp_free_selection(slist);
+}
+
+/* 1998-09-25 - Parse an environment variable lookup-code, {$...}.
+** 1999-02-24 - Touched up for the new argument handling style.
+*/
+static void parse_code_env(MainInfo *min, GString *cstr, const gchar *code)
+{
+ const gchar *val;
+
+ if((val = g_getenv(code + 1)) != NULL)
+ g_string_append(cstr, val);
+}
+
+/* 1998-09-25 - Parse a PID-lookup code. Currently that's just {#}, and gives the main
+** program's PID.
+** 1999-02-24 - Upgraded for new style. Not very much to change. :)
+*/
+static void parse_code_pid(MainInfo *min, GString *cstr, const gchar *code)
+{
+ g_string_sprintfa(cstr, "%d", (gint) getpid());
+}
+
+/* 1998-12-23 - Parse a {~...} code, used to look after user's home directories.
+** 1999-02-24 - Upgraded argument handling.
+*/
+static void parse_code_home(MainInfo *min, GString *cstr, const gchar *code)
+{
+ const gchar *uhome;
+
+ if((uhome = usr_lookup_uhome(code + 1)) != NULL)
+ g_string_append(cstr, uhome);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Initialize the command input dialog, by simply constructing the relevant
+** GTK+ widgets and connecting them together. GIMP-ified in this reimplementation,
+** to keep it simpler.
+*/
+static void init_input_dialog(CmdDlg *dlg)
+{
+ dlg->body = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ dlg->grid = gtk_grid_new();
+ gtk_grid_set_column_spacing(GTK_GRID(dlg->grid), 5);
+ gtk_box_pack_start(GTK_BOX(dlg->body), dlg->grid, TRUE, TRUE, 0);
+}
+
+/* 1999-02-27 - A little helper routine to pack widgets into the table forming the command input
+** dialog. <pos> can be either 0 (left column), 1 (right column) or 2 (both columns).
+** The <padding> is vertical, and best left at 0 for non-separator widgets.
+*/
+static void pack_input_widget(CmdDlg *dlg, GtkWidget *wid, gint pos, gint padding)
+{
+ if(dlg != NULL && wid != NULL)
+ {
+ gint x = 0, width = 2; /* Assume <pos> will be 2. */
+
+ if(pos == 0)
+ --width;
+ else if(pos == 1)
+ ++x;
+ gtk_widget_set_hexpand(wid, TRUE);
+ gtk_widget_set_halign(wid, GTK_ALIGN_FILL);
+ if(padding != 0)
+ {
+ gtk_widget_set_margin_top(wid, padding);
+ gtk_widget_set_margin_bottom(wid, padding);
+ }
+ gtk_grid_attach(GTK_GRID(dlg->grid), wid, x, dlg->row, width, 1);
+ }
+}
+
+/* 1999-02-23 - Since we can't focus the widget until it actually is visible, and the root
+** gtk_widget_show() call is done inside the dialog module, this gross event
+** hack is used instead. Note how a special flag is used to avoid doing this
+** more than once during the lifetime of the dialog.
+*/
+static gint evt_input_string_realize(GtkWidget *wid, gpointer user)
+{
+ gboolean *flag = user;
+
+ if(!*flag)
+ {
+ gtk_widget_grab_focus(wid);
+ *flag = TRUE;
+ }
+ return TRUE;
+}
+
+/* 1998-09-25 - Build a string widget for an input dialog. Cut-down version.
+** 1999-02-27 - Modified for the new packing scheme.
+** 2003-11-16 - Now supports brace codes in the default specifier.
+*/
+static gint build_input_string(CmdDlg *dlg, const gchar *def, CmdInp *inp)
+{
+ GtkWidget *ent;
+ gchar *end;
+
+ inp->type = CITP_STRING;
+ ent = gtk_entry_new();
+ if(*def == '*') /* Password mode? */
+ {
+ gtk_entry_set_visibility(GTK_ENTRY(ent), FALSE);
+ def++;
+ }
+ if(*def == '=' && def[1] == '"')
+ {
+ if((end = strchr(def + 2, '"')) != NULL)
+ {
+ GString *tmp, *dstr;
+
+ *end = '\0';
+ tmp = g_string_new(def + 2);
+ dstr = g_string_new("");
+ parse_code(dlg->min, dstr, tmp->str, dlg, FALSE);
+ g_string_free(tmp, TRUE);
+ gtk_entry_set_text(GTK_ENTRY(ent), dstr->str);
+ gtk_editable_select_region(GTK_EDITABLE(ent), 0, -1);
+ g_string_free(dstr, TRUE);
+ }
+ }
+ pack_input_widget(dlg, inp->inp.string.entry = ent, 1, 0);
+
+ return 1;
+}
+
+/* 1998-10-07 - User selected an option in an option menu widget (created by {Im...}).
+** Store the index in the menu.
+*/
+static gint evt_menu_activated(GtkWidget *wid, gpointer user)
+{
+ CmdInp *inp = user;
+
+ inp->inp.menu.current = gtk_combo_box_get_active(GTK_COMBO_BOX(wid));
+
+ return TRUE;
+}
+
+/* 1998-10-07 - Build an input menu widget, as defined by the {Im...} code.
+** 1999-02-27 - Modified for new packing scheme.
+*/
+static gint build_input_menu(CmdDlg *dlg, const gchar *def, CmdInp *inp)
+{
+ GtkWidget *combo;
+ const gchar *itext, *colon;
+
+ if(*def != '=')
+ return 0;
+ combo = gtk_combo_box_text_new();
+ inp->type = CITP_MENU;
+ inp->inp.menu.items = NULL;
+ inp->inp.menu.current = 0;
+ while((def = stu_scan_string(def, &itext)) != NULL)
+ {
+ if((colon = strchr(itext, ':')) != NULL)
+ {
+ gchar tmp[2048];
+
+ g_strlcpy(tmp, itext, sizeof tmp);
+ tmp[colon - itext] = '\0';
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), tmp);
+ }
+ else
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), itext);
+
+ inp->inp.menu.items = g_list_append(inp->inp.menu.items, (gpointer) itext);
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+ g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(evt_menu_activated), inp);
+ pack_input_widget(dlg, combo, 1, 0);
+
+ return 1;
+}
+
+/* 1998-11-29 - Build an input combo box widget, defined by a {Ic...} code.
+** 1999-02-27 - New packing scheme fixes.
+*/
+static gint build_input_combo(CmdDlg *dlg, const gchar *def, CmdInp *inp)
+{
+ GtkWidget *combo;
+ const gchar *itext;
+
+ if(*def != '=')
+ return 0;
+
+ combo = gtk_combo_box_text_new();
+ while((def = stu_scan_string(def, &itext)) != NULL)
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), itext);
+ inp->type = CITP_COMBO;
+ pack_input_widget(dlg, inp->inp.combo.combo = combo, 1, 0);
+
+ return 1;
+}
+
+/* 1999-02-27 - Build a label for the input window. This replaces the old single label, which was
+** only *set* by {It...}, not created. Now {It...} creates and packs another label,
+** or even a separator (if the code is {It:-}).
+*/
+static gint build_input_label(CmdDlg *dlg, const gchar *def, CmdInp *inp)
+{
+ if(def != NULL)
+ {
+ if(strcmp(def, "-") == 0) /* Is the label a single hyphen? Then generate separator bar. */
+ {
+ inp->type = CITP_LABEL;
+ pack_input_widget(dlg, inp->inp.label.label = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), 2, 5);
+ }
+ else
+ {
+ if(*def == '-') /* Skip first hyphen. To get a single visible one, use {It:"--"}. */
+ def++;
+ inp->type = CITP_LABEL;
+ pack_input_widget(dlg, inp->inp.label.label = gtk_label_new(def), 2, 0);
+ }
+ }
+ return def != NULL;
+}
+
+/* 1999-08-29 - Build an input checkbox. Currently rather uglily (?) rendered, with just a box and
+** the label on the left side. A pressed-in ("checked") box generates TRUE, a non-
+** checked box emits a FALSE.
+*/
+static gint build_input_checkbox(CmdDlg *dlg, const gchar *label, const gchar *def, CmdInp *inp)
+{
+ if(def != NULL)
+ {
+ inp->type = CITP_CHECKBOX;
+ inp->inp.checkbox.check = gtk_check_button_new_with_label(label);
+ inp->inp.checkbox.active = the_true;
+ inp->inp.checkbox.inactive = the_false;
+
+ if(*def == '*') /* Pre-checked mode? */
+ {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(inp->inp.checkbox.check), TRUE);
+ def++;
+ }
+ if(*def == '=') /* Non-default result strings requested? */
+ {
+ def = stu_scan_string(++def, (const gchar **) &inp->inp.checkbox.active);
+ if(*def == ',')
+ stu_scan_string(++def, (const gchar **) &inp->inp.checkbox.inactive);
+ }
+ pack_input_widget(dlg, inp->inp.checkbox.check, 1, 0);
+ }
+ return def != NULL;
+}
+
+/* 1998-09-25 - Parse a code dealing with an input dialog {I...}. Tough stuff.
+** 1999-02-24 - Updated to use new argument storage/handling format.
+*/
+static void parse_code_input(MainInfo *min, GString *cstr, gchar *code, CmdDlg *dlg)
+{
+ gchar *ltxt = NULL, *end;
+ gchar *def = code + 1;
+ gint succ = 0;
+ GtkWidget *label;
+
+ dlg->min = min;
+ if(dlg->body == NULL)
+ init_input_dialog(dlg);
+
+ if(strlen(code) >= 5) /* Enough room for a (possibly empty) label? */
+ {
+ if(code[2] == ':' && code[3] == '"') /* Colon followed by quote? */
+ {
+ ltxt = code + 4;
+ if((end = strchr(ltxt, '"')) != NULL)
+ {
+ *end = '\0';
+ def = end + 1;
+ }
+ else
+ ltxt = NULL;
+ }
+ }
+ else
+ def++;
+
+ switch(code[1])
+ {
+ case 's':
+ succ = build_input_string(dlg, def, &dlg->input[dlg->row]);
+ if(dlg->str_count++ == 0)
+ g_signal_connect(G_OBJECT(dlg->input[dlg->row].inp.string.entry), "realize", G_CALLBACK(evt_input_string_realize), &dlg->str_focused);
+ break;
+ case 'm':
+ succ = build_input_menu(dlg, def, &dlg->input[dlg->row]);
+ break;
+ case 'c':
+ succ = build_input_combo(dlg, def, &dlg->input[dlg->row]);
+ break;
+ case 't':
+ succ = build_input_label(dlg, ltxt, &dlg->input[dlg->row]);
+ break;
+ case 'w':
+ if(dlg->wintitle != NULL)
+ g_free(dlg->wintitle);
+ dlg->wintitle = g_strdup(ltxt);
+ break;
+ case 'x':
+ succ = build_input_checkbox(dlg, ltxt, def, &dlg->input[dlg->row]);
+ ltxt = NULL;
+ break;
+ }
+
+ if(succ) /* Input widget built successfully? */
+ {
+ /* Don't do standard label and INPxx-field for label-type fields. */
+ if(dlg->input[dlg->row].type != CITP_LABEL)
+ {
+ if(ltxt)
+ {
+ label = gtk_label_new(ltxt);
+ gtk_grid_attach(GTK_GRID(dlg->grid), label, 0, dlg->row, 1, 1);
+ }
+ g_string_sprintfa(cstr, INP_PATTERN, dlg->row++);
+ }
+ else
+ dlg->row++;
+ }
+}
+
+/* 1998-09-25 - Get a pointer to a string representation of row <row> in dialog <dlg>.
+** 2010-05-16 - Don't return text pointers; append to the given GString, return FALSE on failure.
+*/
+static gboolean eval_and_append_input(CmdDlg *dlg, gint row, GString *out)
+{
+ GList *data;
+ gchar *tmp;
+
+ if(row >= 0 && row < dlg->row)
+ {
+ switch(dlg->input[row].type)
+ {
+ case CITP_STRING:
+ g_string_append(out, gtk_entry_get_text(GTK_ENTRY(dlg->input[row].inp.string.entry)));
+ return TRUE;
+ case CITP_MENU:
+ if((data = g_list_nth(dlg->input[row].inp.menu.items, dlg->input[row].inp.menu.current)) != NULL)
+ {
+ gchar *colon;
+
+ if((colon = strchr(data->data, ':')) != NULL)
+ g_string_append(out, colon + 1);
+ else
+ g_string_append(out, data->data);
+ return TRUE;
+ }
+ return FALSE;
+ case CITP_COMBO:
+ tmp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dlg->input[row].inp.combo.combo));
+ g_string_append(out, tmp);
+ return TRUE;
+ case CITP_CHECKBOX:
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dlg->input[row].inp.checkbox.check)))
+ g_string_append(out, dlg->input[row].inp.checkbox.active);
+ else
+ g_string_append(out, dlg->input[row].inp.checkbox.inactive);
+ return TRUE;
+ case CITP_LABEL:
+ return TRUE; /* Just to keep the compiler happy. Labels don't generate INPxx's. */
+ }
+ }
+ return FALSE;
+}
+
+/* 1999-02-24 - Interpolate any INP-fields into <cstr>, by grabbing data from <dlg>.
+ ** For simplicity, done in two steps with an intermediate scratch string.
+*/
+static void interpolate_input(GString *cstr, CmdDlg *dlg)
+{
+ gchar *ptr;
+ gint row;
+ GString *scratch;
+
+ scratch = g_string_new(NULL);
+ for(ptr = cstr->str; *ptr;)
+ {
+ if(sscanf(ptr, INP_PATTERN, &row) == 1)
+ {
+ eval_and_append_input(dlg, row, scratch);
+ ptr += INP_PAT_LEN;
+ }
+ else
+ g_string_append_c(scratch, *ptr++);
+ }
+ g_string_assign(cstr, scratch->str);
+ g_string_free(scratch, TRUE);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-10-07 - Free a string from a menu item list. */
+static void free_menu(gpointer a, gpointer b)
+{
+ g_free(a);
+}
+
+/* 1998-10-07 - Destroy any extra data kept by input fields. */
+static void destroy_input(CmdDlg *dlg)
+{
+ guint i;
+
+ for(i = 0; i < dlg->row; i++)
+ {
+ switch(dlg->input[i].type)
+ {
+ case CITP_STRING:
+ break;
+ case CITP_MENU:
+ g_list_foreach(dlg->input[i].inp.menu.items, free_menu, NULL);
+ g_list_free(dlg->input[i].inp.menu.items);
+ break;
+ case CITP_COMBO:
+ break;
+ case CITP_LABEL:
+ break;
+ case CITP_CHECKBOX:
+ if(dlg->input[i].inp.checkbox.active != the_true)
+ g_free((gpointer) dlg->input[i].inp.checkbox.active);
+ if(dlg->input[i].inp.checkbox.inactive != the_false)
+ g_free((gpointer) dlg->input[i].inp.checkbox.inactive);
+ break;
+ }
+ }
+ if(dlg->wintitle != NULL)
+ g_free(dlg->wintitle);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-16 - Get ending brace for a code definition. Knows about embedded braces, unlike strchr(). */
+static const gchar * get_code_end(const gchar *def)
+{
+ const gchar *base = def;
+ gint level;
+
+ for(level = 1; *def; def++)
+ {
+ if(def > base && def[-1] != '\\')
+ {
+ if(*def == '{')
+ level++;
+ else if(*def == '}')
+ level--;
+ if(level == 0)
+ break;
+ }
+ }
+ if(*def && level == 0)
+ return def;
+ return NULL;
+}
+
+/* 1998-09-25 - Parse a word that contains 1 or more special "brace-codes". The codes
+** need to be replaced by a value, or an input-dialog place holder.
+*/
+static void parse_code(MainInfo *min, GString *cstr, gchar *code, CmdDlg *dlg, gboolean input_ok)
+{
+ if(code == NULL || cstr == NULL)
+ return;
+
+ while(code && *code)
+ {
+ if(*code == '\\') /* Backslash escape? */
+ {
+ if(code[1])
+ {
+ g_string_append_c(cstr, code[1]);
+ code += 2;
+ }
+ else
+ break;
+ }
+ else if(*code == '{') /* Code here? */
+ {
+ gchar *end;
+
+ code++;
+ if((end = (gchar *) get_code_end(code)) != NULL)
+ {
+ *end = '\0'; /* This is in a GString, so OK. */
+ if(code[0] == 'f' || code[0] == 'F')
+ parse_code_file(min, cstr, code);
+ else if(code[0] == 'P')
+ parse_code_path(min, cstr, code);
+ else if(code[0] == 'u' || code[0] == 'U')
+ parse_code_uri(min, cstr, code);
+ else if(code[0] == '$')
+ parse_code_env(min, cstr, code);
+ else if(code[0] == '#')
+ parse_code_pid(min, cstr, code);
+ else if(code[0] == '~')
+ parse_code_home(min, cstr, code);
+ else if(code[0] == 'I' && input_ok)
+ parse_code_input(min, cstr, code, dlg);
+ code = end + 1;
+ }
+ }
+ else
+ g_string_append_c(cstr, *code++);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-02-25 - Return a pointer to the character *after* the closing brace matching the
+** one at <ptr>. Returns NULL if no such brace could be found.
+*/
+static const gchar * code_end(const gchar *ptr)
+{
+ if(ptr != NULL)
+ {
+ gint count;
+
+ for(count = 1, ptr++; *ptr && count > 0; ptr++)
+ {
+ if(*ptr == '{' && ptr[-1] != '\\')
+ count++;
+ else if(*ptr == '}' && ptr[-1] != '\\')
+ count--;
+ }
+ return ptr;
+ }
+ return NULL;
+}
+
+/* 1999-02-25 - Interpolate {}-codes in <str>, replacing them with whatever they should
+** evaluate to. For input codes, this means the placeholder "INPxx" string.
+** Returns new version of string. Doesn't touch <str> at all. Note that
+** quotes don't suppress {}-code interpolation; the only way to do so is to
+** escape the initial brace with a backslash.
+*/
+static GString * interpolate_brace_codes(MainInfo *min, const gchar *str, CmdDlg *dlg)
+{
+ const gchar *base, *ptr;
+ GString *tmp;
+
+ tmp = g_string_new(NULL);
+
+ for(base = ptr = str; base != NULL && ptr != NULL;)
+ {
+ if((ptr = strchr(base, '{')) != NULL) /* Get next code. */
+ {
+ if(ptr == base || (*(ptr - 1) != '\\')) /* Genuine? */
+ {
+ const gchar *end;
+
+ if((end = code_end(ptr)) != NULL)
+ {
+ GString *code;
+
+ for(; base < ptr;)
+ g_string_append_c(tmp, *base++);
+ code = g_string_new(ptr);
+ g_string_truncate(code, end - ptr);
+ parse_code(min, tmp, code->str, dlg, TRUE);
+ g_string_free(code, TRUE);
+ base = end;
+ }
+ }
+ else
+ {
+ for(; base <= ptr;)
+ g_string_append_c(tmp, *base++);
+ }
+ }
+ else
+ g_string_append(tmp, base);
+ }
+ return tmp;
+}
+
+/* 1998-09-25 - Rewritten from scratch. This function parses the command definition in <def>, and returns
+** an argv-style vector of the "words" contained therein. It also does {}-code substitution,
+** and is generally cool. The returned vector is dynamically allocated and MUST be freed
+** when you're done with it - first word by word, then the entire vector!
+** The major change in this rewrite is that it is self-contained; the caller need not bother
+** with the dialog any longer - it's all internal. We just return the argument vector, with
+** any dialog-related stuff *already there*, or NULL on failure (or dialog cancel). Great!
+** 1999-02-24 - Semi-rewritten. In the old version, each {}-code except for {f} resulted in exactly ONE
+** argument, regardless of the number of words emitted. This has changed, now spaces separate
+** arguments, and quoting has to be used to create arguments with spaces in them. This is
+** more like the shell, a lot more flexible, and generally the right thing. I think.
+*/
+gchar ** cpr_parse(MainInfo *min, const gchar *def)
+{
+ GString *cstr;
+ static CmdDlg dlg;
+
+ if(min == NULL || def == NULL)
+ return NULL;
+
+ dlg.body = NULL;
+ dlg.row = 0;
+ dlg.wintitle = NULL;
+ dlg.str_count = 0;
+ dlg.str_focused = FALSE;
+
+ cstr = interpolate_brace_codes(min, def, &dlg);
+
+ if(dlg.body != NULL) /* Do we need an input window? */
+ {
+ dlg.dlg = dlg_dialog_sync_new(dlg.body, dlg.wintitle, NULL);
+ if(dlg_dialog_sync_wait(dlg.dlg) == DLG_POSITIVE) /* OK? */
+ interpolate_input(cstr, &dlg);
+ else
+ {
+ g_string_free(cstr, TRUE);
+ cstr = NULL;
+ }
+ destroy_input(&dlg);
+ dlg_dialog_sync_destroy(dlg.dlg);
+ }
+ if(cstr != NULL) /* Did we get any arguments? */
+ {
+ gchar **argv;
+
+ argv = stu_split_args(cstr->str);
+ g_string_free(cstr, TRUE);
+ return argv;
+ }
+ return NULL;
+}
+
+/* 1998-09-26 - Free an argument vector as returned by cpr_parse(). Not complex, but more than
+** one line - so well worth a function of its own.
+** 1999-02-24 - Thanks to the allocation intelligence of the new stu_split_args() routine, this
+** has considerably less to do. Fine by me.
+*/
+void cpr_free(gchar **argv)
+{
+ if(argv != NULL)
+ g_free(argv);
+}
diff --git a/src/cmdparse.h b/src/cmdparse.h
new file mode 100644
index 0000000..65ff8d3
--- /dev/null
+++ b/src/cmdparse.h
@@ -0,0 +1,6 @@
+/*
+** 1998-09-25 - Header for the new command definition parser. Very useful.
+*/
+
+extern gchar ** cpr_parse(MainInfo *min, const gchar *def);
+extern void cpr_free(gchar **argv);
diff --git a/src/cmdseq.c b/src/cmdseq.c
new file mode 100644
index 0000000..4f52e0f
--- /dev/null
+++ b/src/cmdseq.c
@@ -0,0 +1,794 @@
+/*
+** 1998-09-25 - Here's a complete rewrite of the command subsystem, with a far more
+** flexible and fun architecture behind it. Some parts will undboubtely
+** be copied from the old code, but much is brand new. Fun.
+** 1998-10-21 - Moved the huge native command initialization function in here.
+** 1999-04-04 - Completely redid handling of builtin ("native") commands. Now accomodates
+** support for command-specific configuration data, and stuff.
+** 1999-06-20 - Adapted for new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "commands.h"
+#include "errors.h"
+#include "strutil.h"
+#include "dirpane.h"
+#include "dialog.h"
+#include "fileutil.h"
+
+#include "children.h"
+#include "cmdparse.h"
+#include "cmdgrab.h"
+#include "cmdarg.h"
+#include "cmdseq.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static const gchar *row_type_name[] = { "Built-In", "External" };
+
+/* This describes a single built-in command. The 'cmd' field is the actual command execution
+** function, like cmd_mkdir or cmd_activateother. The 'cfg' field is the corresponding commands's
+** configuration function, it is called to establish the connection between the command's
+** internal configuration data and the cmdseq_config module which handles loading / saving.
+** Most built-in commands don't have any config data; they will have a NULL 'cfg' pointer.
+*/
+typedef struct {
+ Command cmd;
+ CommandCfg cfg; /* Another function pointer. */
+} CmdDesc;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void csq_add_builtin(MainInfo *min, const gchar *name, Command cmd, CommandCfg cmd_cfg)
+{
+ CfgInfo *cfg = &min->cfg;
+
+ if(cfg->commands.builtin == NULL)
+ cfg->commands.builtin = g_hash_table_new(g_str_hash, g_str_equal);
+ if(cfg->commands.builtin != NULL)
+ {
+ CmdDesc *cdesc;
+
+ if((cdesc = g_slice_alloc(sizeof *cdesc)) != NULL)
+ {
+ cdesc->cmd = cmd;
+ cdesc->cfg = cmd_cfg;
+ g_hash_table_insert(cfg->commands.builtin, (gpointer) name, cdesc);
+ if(cmd_cfg != NULL)
+ cmd_cfg(min);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Copy characters one by one from <src> to <dst>, while doing some special
+** operations to make the result "more suitable" as a command sequence name.
+** These operations include stripping out whitespace and almost all other
+** non-alphanumerical letters.
+*/
+static void csq_cmdseq_filter_name(gchar *dst, const gchar *src)
+{
+ gchar *od = dst;
+
+ if((dst != NULL) && (src != NULL))
+ {
+ for(; *src != '\0' && dst - od < CSQ_NAME_SIZE - 1; src++)
+ {
+ if(isalnum((guchar) *src) || *src == '_')
+ *dst++ = *src;
+ }
+ *dst = '\0';
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - A callback for g_hash_table; find maximum X in all UnnamedX-keys. OK? */
+static void check_name(gpointer key, gpointer data, gpointer user)
+{
+ gint here, *iptr = user;
+
+ if((strcmp(key, "Unnamed") == 0) && iptr != NULL && *iptr == -1)
+ *iptr = 0;
+ else if(sscanf(key, "Unnamed_%d", &here) == 1)
+ {
+ if(iptr != NULL && here > *iptr)
+ *iptr = here;
+ }
+}
+
+/* 1998-09-27 - Construct (and return a pointer to) a somewhat neutral name, with the
+** interesting property that it is unique among all keys of <hash>.
+*/
+const gchar * csq_cmdseq_unique_name(GHashTable *hash)
+{
+ static gchar buf[CSQ_NAME_SIZE];
+ gint index = -1;
+
+ if(hash != NULL)
+ {
+ g_hash_table_foreach(hash, check_name, &index);
+ if(index == -1)
+ return "Unnamed";
+ g_snprintf(buf, sizeof buf, "Unnamed_%d", index + 1);
+ return buf;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-22 - Emit a warning message, and return <to>. */
+static const gchar * map_name(const gchar *from, const gchar *to, const gchar *context)
+{
+ fprintf(stderr, "**Notice: Reference to obsolete command '%s' replaced by '%s' in %s\n", from, to, context);
+
+ return to;
+}
+
+/* 1999-05-22 - Map a command sequence name, if necessary. This should be called by all code
+** that loads cmdseq names, from config files and stuff. It should not be used
+** on input directly from the user, since that might be very annoying. :) The
+** point of the function is to create a central location where old obsolete
+** command names can be translated into their modern equivalents.
+** This function is not written for speed.
+*/
+const gchar * csq_cmdseq_map_name(const gchar *name, const gchar *context)
+{
+ /* Ignore NULL and names beginning with a lower case letter (user-defined). */
+ if((name == NULL) || (islower((guchar) *name)))
+ return name;
+
+ if(strcmp(name, "FileDefault") == 0)
+ return map_name(name, "FileAction", context);
+ else if(strcmp(name, "FileView") == 0)
+ return map_name(name, "FileAction action=View", context);
+ else if(strcmp(name, "FileEdit") == 0)
+ return map_name(name, "FileAction action=Edit", context);
+ else if(strcmp(name, "FilePrint") == 0)
+ return map_name(name, "FileAction action=Print", context);
+ else if(strcmp(name, "FilePlay") == 0)
+ return map_name(name, "FileAction action=Play", context);
+ else if(strcmp(name, "ViewTextHex") == 0)
+ return map_name(name, "ViewText mode=Hex", context);
+ else if(strcmp(name, "ViewTextOrHex") == 0)
+ return map_name(name, "ViewText mode=Auto", context);
+ else if(strcmp(name, "DirPrevious") == 0) /* Gone in 0.11.8. */
+ return map_name(name, "DirBackward", context);
+
+ return name;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Create a new command sequence of the given name. The sequence is created
+** empty, i.e. with no rows attached.
+*/
+CmdSeq * csq_cmdseq_new(const gchar *name, guint32 flags)
+{
+ CmdSeq *cs;
+
+ if((cs = g_malloc(sizeof *cs)) != NULL)
+ {
+ g_strlcpy(cs->name, name, sizeof cs->name);
+ cs->flags = flags;
+ cs->rows = NULL;
+ }
+ return cs;
+}
+
+/* 1998-09-26 - Create a "deep" (non-memory-sharing) copy of <src>, and return it. */
+CmdSeq * csq_cmdseq_copy(const CmdSeq *src)
+{
+ CmdSeq *dst = NULL;
+ CmdRow *row;
+ GList *iter;
+
+ if((dst = g_malloc(sizeof *dst)) != NULL)
+ {
+ g_strlcpy(dst->name, src->name, sizeof dst->name);
+ dst->flags = src->flags;
+ dst->rows = NULL;
+ for(iter = src->rows; iter != NULL; iter = g_list_next(iter))
+ {
+ if((row = csq_cmdrow_copy(iter->data)) != NULL)
+ dst->rows = g_list_append(dst->rows, row);
+ else
+ {
+ csq_cmdseq_destroy(dst);
+ return NULL;
+ }
+ }
+ }
+ return dst;
+}
+
+/* 1998-09-25 - Set the name of a command sequence. Takes care to filter it first. This
+** is somewhat more complex than it might seem, since it needs to rehash
+** the sequence.
+*/
+void csq_cmdseq_set_name(GHashTable *hash, CmdSeq *cs, const gchar *name)
+{
+ if(hash != NULL && cs != NULL && name != NULL)
+ {
+ g_hash_table_remove(hash, cs->name);
+ csq_cmdseq_filter_name(cs->name, name);
+ if(cs->name[0] == '\0' || g_hash_table_lookup(hash, cs->name) != NULL)
+ g_strlcpy(cs->name, csq_cmdseq_unique_name(hash), sizeof cs->name);
+ csq_cmdseq_hash(&hash, cs);
+ }
+}
+
+/* 1998-09-25 - Insert given command <cs> into hash table at <*hash>. The hash table is
+** created if it doesn't already exist.
+*/
+void csq_cmdseq_hash(GHashTable **hash, CmdSeq *cs)
+{
+ if(hash != NULL)
+ {
+ if(*hash == NULL)
+ *hash = g_hash_table_new(g_str_hash, g_str_equal);
+ if(*hash != NULL)
+ g_hash_table_insert(*hash, cs->name, cs);
+ }
+}
+
+/* 1998-09-25 - Just a callback for g_list_foreach(). */
+static void row_destroy(gpointer d, gpointer u)
+{
+ csq_cmdrow_destroy((CmdRow *) d);
+}
+
+/* 1998-09-25 - Destroy a command sequence, freing all memory used by it (that includes
+** the memory occupied by the rows, of course.
+*/
+void csq_cmdseq_destroy(CmdSeq *cs)
+{
+ if(cs != NULL)
+ {
+ g_list_foreach(cs->rows, row_destroy, NULL);
+ g_free(cs);
+ }
+}
+
+/* 1998-09-25 - Append a row to the given command sequence. Returns the index of the
+** newly appended row (i.e. the length of the list minus one).
+*/
+gint csq_cmdseq_row_append(CmdSeq *cs, CmdRow *row)
+{
+ if(cs != NULL && row != NULL)
+ {
+ cs->rows = g_list_append(cs->rows, row);
+ return g_list_length(cs->rows) - 1;
+ }
+ return -1;
+}
+
+/* 2009-03-20 - Reorder the rows of the given sequence, to match the given new list.
+** The new list is assumed to re-use the actual CmdRow pointers that are
+** in our current list. All we need to do is free the GList part of our
+** old list, and then replace the list with the new, taking ownership.
+*/
+void csq_cmdseq_rows_relink(CmdSeq *cs, GList *rows)
+{
+ if(cs == NULL || rows == NULL)
+ return;
+ g_list_free(cs->rows); /* This doesn't touch the data, glib doesn't know how. */
+ cs->rows = rows;
+}
+
+/* 1998-09-25 - Remove given row from command sequence. Returns the index of the
+** item following the deleted one (or the one before if deleting the
+** last).
+*/
+gint csq_cmdseq_row_delete(CmdSeq *cs, CmdRow *row)
+{
+ gint pos;
+
+ if(cs != NULL && row != NULL)
+ {
+ pos = g_list_index(cs->rows, row);
+ cs->rows = g_list_remove(cs->rows, row);
+ if(pos >= (gint) g_list_length(cs->rows))
+ return pos - 1;
+ return pos;
+ }
+ return -1;
+}
+
+/* 2009-03-18 - Clears the command sequence of all rows, freeing them while doing so. */
+void csq_cmdseq_row_delete_all(CmdSeq *cs)
+{
+ GList *iter;
+
+ if(cs == NULL)
+ return;
+
+ /* Don't disassemble the list link by link. Walk through and destroy the rows,
+ ** then free the entire list in one ... you-know-what. With a swoop.
+ */
+ for(iter = cs->rows; iter != NULL; iter = g_list_next(iter))
+ csq_cmdrow_destroy(iter->data);
+ g_list_free(cs->rows);
+ cs->rows = NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Execute a built-in command. Currently very simple.
+** 1999-05-06 - Rewritten, now handles command arguments. Very nice.
+*/
+static gint execute_builtin(MainInfo *min, const gchar *cmd)
+{
+ gchar msg[CSQ_NAME_SIZE + 64];
+ gchar **argv;
+ CmdDesc *cdesc;
+
+ if(strchr(cmd, ' ') != NULL) /* Does command string contain space, and thus arguments? */
+ {
+ if((argv = cpr_parse(min, cmd)) != NULL)
+ {
+ if((cdesc = g_hash_table_lookup(min->cfg.commands.builtin, argv[0])) != NULL)
+ {
+ CmdArg *ca;
+ DirPane *src = min->gui->cur_pane;
+ gint ret;
+
+ ca = car_create(argv);
+ ret = cdesc->cmd(min, src, dp_mirror(min, src), ca);
+ car_destroy(ca);
+ g_free(argv); /* Don't forget to free the parsed arguments. */
+ return ret;
+ }
+ g_snprintf(msg, sizeof msg, _("Unable to execute unknown\ncommand \"%s\"."), cmd);
+ dlg_dialog_async_new_error(msg);
+ g_free(argv);
+ }
+ return 1;
+ }
+ else
+ {
+ if((cdesc = g_hash_table_lookup(min->cfg.commands.builtin, cmd)) != NULL)
+ {
+ DirPane *src = min->gui->cur_pane;
+
+ return cdesc->cmd(min, src, dp_mirror(min, src), NULL);
+ }
+ }
+ g_snprintf(msg, sizeof msg, _("Unable to execute unknown\ncommand \"%s\"."), cmd);
+ dlg_dialog_async_new_error(msg);
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-26 - Handle a set of before or after flags. */
+gboolean csq_handle_ba_flags(MainInfo *min, guint32 flags)
+{
+ DirPane *src = min->gui->cur_pane, *dst = dp_mirror(min, src);
+
+ if(flags & CBAF_REQSEL_SOURCE)
+ {
+ if(!dp_has_selection(src))
+ return FALSE;
+ }
+ if(flags & CBAF_REQSEL_DEST)
+ {
+ if(!dp_has_selection(dst))
+ return FALSE;
+ }
+
+ if(flags & CBAF_RESCAN_SOURCE)
+ dp_rescan_post_cmd(src);
+ if(flags & CBAF_RESCAN_DEST)
+ dp_rescan_post_cmd(dst);
+
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-27 - Do the actual fork() call, and execution of external command. Put in a separate routine
+** to make handling of pre-command dialogues easier (GTK+ - the library that calls back).
+** 1998-05-28 - Major bug fix: when waiting for a synchronous child, we really DO want to hang (so, no WNOHANG).
+** 1998-05-30 - Fixed up the error-checking after waitpid(), which was completely broken. If command fails
+** (i.e. returns non-zero exit status), we now detect that and inform the user. In a perfect
+** world, we would like to have access to the child's 'errno' at its time of failure... Also
+** shut down the child's file descriptors, to avoid it flooding the original shell with output.
+** This is a temporary solution; I would like the stdin/out/err behaviour to be configurable.
+** 1998-07-04 - Um... It seems that I'm not exactly king at programming with processes and stuff, since the
+** exit status check was completely broken. I blame the man-page for waitpid(2), which uses
+** language not compatible with my brain. :) It seems WIFEXITED() returns non-zero (meaning the
+** child exited normally), even if the child failed. I mis-parsed that one.
+** 1998-09-10 - Massively extended and rewritten. Now supports output capturing, and always runs stuff asynch.
+** 1998-09-11 - Detected a race condition here; if the child terminates before we register its pid, there's
+** a chance that the SIGCHLD signal handler hasn't got the data it needs to properly handle
+** the child's death. To fix this, we generate a SIGCHLD when we know that the data is there.
+** 1998-09-25 - Moved into the new cmdseq module, and adapted accordingly.
+** 1999-05-29 - Added pre-fork() protection through new call in fileutil module. Very nice.
+*/
+static gint fork_and_execute(MainInfo *min, CmdRow *row, gchar **argv)
+{
+ GPid child;
+ gchar *working_directory = NULL;
+ gboolean capture, ok;
+ gint fd_out, fd_err, *fd_out_ptr = NULL, *fd_err_ptr = NULL;
+ CX_Ext *ext = &row->extra.external;
+ GError *err = NULL;
+
+ if(ext->gflags & CGF_KILLPREV)
+ chd_kill_child(argv[0]);
+
+ /* Figure out where to CD, if requested and sensible. */
+ if(ext->baflags[0] & CBAF_CD_SOURCE)
+ {
+ if(g_file_is_native(min->gui->cur_pane->dir.root))
+ working_directory = g_file_get_path(min->gui->cur_pane->dir.root);
+ }
+ else if(ext->baflags[0] & CBAF_CD_DEST)
+ {
+ GFile *droot = min->gui->pane[1 - min->gui->cur_pane->index].dir.root;
+ if(g_file_is_native(droot))
+ working_directory = g_file_get_path(droot);
+ }
+
+ capture = (row->type == CRTP_EXTERNAL && row->extra.external.gflags & CGF_GRABOUTPUT);
+ if(capture)
+ {
+ fd_out_ptr = &fd_out;
+ fd_err_ptr = &fd_err;
+ }
+ if((ok = g_spawn_async_with_pipes(working_directory, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, NULL, NULL, &child, NULL, fd_out_ptr, fd_err_ptr, &err)))
+ {
+ chd_register(argv[0], child, ext->gflags, ext->baflags[1]);
+ if(capture)
+ cgr_grab_output(min, argv[0], child, fd_out, fd_err);
+ }
+ if(working_directory != NULL)
+ g_free(working_directory);
+ if(!ok)
+ {
+ if(err)
+ err_set_gerror(min, &err, argv[0], NULL);
+ else
+ err_set(min, -1, argv[0], NULL);
+ }
+ return ok;
+}
+
+/* 1998-09-25 - Execute an external command. */
+static gint execute_external(MainInfo *min, CmdRow *row)
+{
+ gchar **argv;
+ gint ok = 0;
+
+ if(!csq_handle_ba_flags(min, row->extra.external.baflags[0]))
+ return 0;
+ if((argv = cpr_parse(min, row->def->str)) != NULL)
+ {
+ ok = fork_and_execute(min, row, argv);
+ cpr_free(argv);
+ }
+ return ok;
+}
+
+/* 1998-09-25 - Execute a single row, returning success or failure. */
+static gint execute_row(MainInfo *min, CmdRow *row)
+{
+ switch(row->type)
+ {
+ case CRTP_BUILTIN:
+ return execute_builtin(min, row->def->str);
+ case CRTP_EXTERNAL:
+ return execute_external(min, row);
+ default:
+ fprintf(stderr, "**CMDSEQ: Unknown type for row!\n");
+ }
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Figure out whether running <row> results in a block (i.e. no further rows are
+** executed until <row> has completed, or not.
+*/
+static gint row_is_blocking(MainInfo *min, CmdRow *row)
+{
+ switch(row->type)
+ {
+ case CRTP_BUILTIN: /* Built-ins never block. */
+ return 0;
+ case CRTP_EXTERNAL: /* Externals may or may not block. */
+ return (row->extra.external.gflags & CGF_RUNINBG) ? 0 : 1;
+ default:
+ ;
+ }
+ return 0;
+}
+
+/* 1998-09-25 - Execute a command sequence. This, of course, is sort of the most important
+** functionality in this module, the core that makes the rest worth having.
+*/
+static gint cmdseq_execute(MainInfo *min, CmdSeq *cs)
+{
+ GList *iter;
+ gint ok = 0, block, i;
+
+ if(cs == NULL)
+ return 0;
+
+ err_clear(min);
+ for(iter = cs->rows, i = 0; iter != NULL; iter = g_list_next(iter), i++)
+ {
+ block = row_is_blocking(min, iter->data);
+ if((ok = execute_row(min, iter->data)) != 0)
+ {
+ if(block)
+ {
+ chd_set_running(cs, i + 1);
+ break;
+ }
+ }
+ else
+ break;
+ }
+ return ok;
+}
+
+/* 1998-09-25 - Execute a command. The <name> parameter is somewhat magic: if it is the name of
+** an existing sequence (multi-row aggregate command), that sequence is executed.
+** Otherwise, if the name is that of a built-in command, the built-in is run!
+** This duality provides a nice, clean way of running a known built-in without the
+** overhead of a named sequence just to contain that single built-in.
+** 1998-10-04 - Now ignores empty (and NULL) command names.
+*/
+gint csq_execute(MainInfo *min, const gchar *name)
+{
+ CmdSeq *cs;
+ gint ok;
+
+ if((name == NULL) || (*name == '\0'))
+ return 0;
+
+ if((min->cfg.commands.cmdseq != NULL) && ((cs = g_hash_table_lookup(min->cfg.commands.cmdseq, name)) != NULL))
+ ok = cmdseq_execute(min, cs);
+ else
+ ok = execute_builtin(min, name);
+ if(!ok)
+ err_show(min);
+
+ return ok;
+}
+
+/* 1999-06-06 - Build a command from a printf()-style format string and suitable arguments, then
+** execute the command. Very handy.
+*/
+gint csq_execute_format(MainInfo *min, const gchar *fmt, ...)
+{
+ gchar buf[4 * PATH_MAX]; /* Hm, should perhaps be dynamic. */
+ va_list va;
+
+ va_start(va, fmt);
+ g_vsnprintf(buf, sizeof buf, fmt, va);
+ va_end(va);
+
+ return csq_execute(min, buf);
+}
+
+/* 1998-09-25 - Continue execution of a command.
+** 1999-03-08 - Added support for the repeat flag.
+*/
+void csq_continue(MainInfo *min)
+{
+ CmdSeq *cs;
+ CmdRow *row;
+ GList *iter = NULL;
+ guint index;
+
+ if((cs = chd_get_running(&index)) != NULL)
+ {
+ for(iter = g_list_nth(cs->rows, index); iter != NULL; iter = g_list_next(iter))
+ {
+ chd_set_running(cs, ++index);
+ row = iter->data;
+ if(row_is_blocking(min, row))
+ {
+ if(execute_row(min, row))
+ return;
+ else
+ break;
+ }
+ if(!execute_row(min, row))
+ break;
+ }
+ }
+ chd_clear_running();
+
+ /* Determine if the sequence should repeat. */
+ if((cs != NULL) && (iter == NULL) && (cs->flags & CSFLG_REPEAT) && dp_has_selection(min->gui->cur_pane))
+ csq_execute(min, cs->name);
+
+ min->gui->pane[0].dbclk_row = min->gui->pane[1].dbclk_row = -1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Convert a command row type identifier to a string. */
+const gchar * csq_cmdrow_type_to_string(CRType type)
+{
+ if((type >= CRTP_BUILTIN) && (type < CRTP_NUM_TYPES))
+ return row_type_name[type];
+ return NULL;
+}
+
+/* 1998-09-27 - Convert a string to a type identifier, if possible. */
+CRType csq_cmdrow_string_to_type(const gchar *type)
+{
+ guint i;
+
+ for(i = 0; i < sizeof row_type_name / sizeof row_type_name[0]; i++)
+ {
+ if(strcmp(row_type_name[i], type) == 0)
+ return (CRType) i;
+ }
+ return -1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-25 - Create a new command sequence row with the given type, definition, and flags. */
+CmdRow * csq_cmdrow_new(CRType type, const gchar *def, guint32 flags)
+{
+ CmdRow *row;
+ const gchar *def2;
+
+ row = g_malloc(sizeof *row);
+ row->type = type;
+ row->flags = flags;
+ memset(&row->extra, 0, sizeof row->extra);
+ if(row->type == CRTP_BUILTIN)
+ def2 = csq_cmdseq_map_name(def, "command row");
+ else
+ def2 = def;
+ if((row->def = g_string_new(def2)) != NULL)
+ return row;
+ g_free(row);
+ return NULL;
+}
+
+/* 1998-09-26 - Create and return a verbatim copy of <src>. The copy is "deep"; i.e. there is
+** zero sharing of memory between the original and the copy.
+*/
+CmdRow * csq_cmdrow_copy(const CmdRow *src)
+{
+ CmdRow *dst;
+
+ if((dst = g_malloc(sizeof *dst)) != NULL)
+ {
+ dst->type = src->type;
+ dst->flags = src->flags;
+ dst->extra = src->extra;
+ if((dst->def = g_string_new(src->def->str)) != NULL)
+ return dst;
+ g_free(dst);
+ }
+ return NULL;
+}
+
+/* 1998-09-27 - Set a new command type for the given command row. */
+void csq_cmdrow_set_type(CmdRow *row, CRType type)
+{
+ if(row != NULL)
+ {
+ row->type = type;
+ memset(&row->extra, 0, sizeof row->extra);
+ }
+}
+
+/* 1998-09-27 - Change the definition of the given row. */
+void csq_cmdrow_set_def(CmdRow *row, const gchar *def)
+{
+ if(row != NULL && def != NULL)
+ g_string_assign(row->def, def);
+}
+
+/* 1998-09-25 - Destroy a command sequence row. */
+void csq_cmdrow_destroy(CmdRow *row)
+{
+ if(row != NULL)
+ {
+ if(row->def != NULL)
+ g_string_free(row->def, TRUE);
+ g_free(row);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-10-21 - Init built-in commands. Any new commands written must be added to the
+** hash table by adding a line in here. This might not be elegant, but it works.
+** 1999-04-04 - Completely rewritten, since we now handle config data for commands.
+*/
+void csq_init_commands(MainInfo *min)
+{
+ min->cfg.commands.builtin = NULL;
+
+ csq_add_builtin(min, "DirEnter", cmd_direnter, NULL);
+ csq_add_builtin(min, "DirFromOther", cmd_fromother, NULL);
+ csq_add_builtin(min, "DirToOther", cmd_toother, NULL);
+ csq_add_builtin(min, "DirParent", cmd_parent, NULL);
+ csq_add_builtin(min, "DirRescan", cmd_dirrescan, NULL);
+ csq_add_builtin(min, "DirSwap", cmd_swap, NULL);
+
+ csq_add_builtin(min, "DpHide", cmd_dphide, NULL);
+ csq_add_builtin(min, "DpRecenter", cmd_dprecenter, NULL);
+ csq_add_builtin(min, "DpReorient", cmd_dpreorient, NULL);
+ csq_add_builtin(min, "DpFocus", cmd_dpfocus, NULL);
+ csq_add_builtin(min, "DpFocusPath", cmd_dpfocuspath, NULL);
+ csq_add_builtin(min, "DpFocusISrch", cmd_dpfocusisrch, cfg_dpfocusisrch);
+ csq_add_builtin(min, "DpGotoRow", cmd_dpgotorow, NULL);
+ csq_add_builtin(min, "DpMaximize", cmd_dpmaximize, NULL);
+
+ csq_add_builtin(min, "ActivateOther", cmd_activateother, NULL);
+ csq_add_builtin(min, "ActivateLeft", cmd_activateleft, NULL);
+ csq_add_builtin(min, "ActivateRight", cmd_activateright, NULL);
+ csq_add_builtin(min, "ActivatePush", cmd_activatepush, NULL);
+ csq_add_builtin(min, "ActivatePop", cmd_activatepop, NULL);
+
+ csq_add_builtin(min, "Copy", cmd_copy, cfg_copy);
+ csq_add_builtin(min, "CopyAs", cmd_copyas, NULL);
+ csq_add_builtin(min, "Clone", cmd_clone, NULL);
+ csq_add_builtin(min, "Move", cmd_move, NULL);
+ csq_add_builtin(min, "MoveAs", cmd_moveas, NULL);
+ csq_add_builtin(min, "Delete", cmd_delete, cfg_delete);
+ csq_add_builtin(min, "Rename", cmd_rename, cfg_rename);
+ csq_add_builtin(min, "RenameRE", cmd_renamere, NULL);
+ csq_add_builtin(min, "RenameSeq", cmd_renameseq, NULL);
+ csq_add_builtin(min, "ChMod", cmd_chmod, NULL);
+ csq_add_builtin(min, "ChOwn", cmd_chown, NULL);
+ csq_add_builtin(min, "Split", cmd_split, NULL);
+ csq_add_builtin(min, "Join", cmd_join, NULL);
+ csq_add_builtin(min, "MkDir", cmd_mkdir, cfg_mkdir);
+ csq_add_builtin(min, "GetSize", cmd_getsize, cfg_getsize);
+ csq_add_builtin(min, "ClearSize", cmd_clearsize, NULL);
+ csq_add_builtin(min, "SymLink", cmd_symlink, NULL);
+ csq_add_builtin(min, "SymLinkAs", cmd_symlinkas, NULL);
+ csq_add_builtin(min, "SymLinkClone", cmd_symlinkclone, NULL);
+ csq_add_builtin(min, "SymLinkEdit", cmd_symlinkedit, NULL);
+
+ csq_add_builtin(min, "ViewText", cmd_viewtext, cfg_viewtext);
+
+ csq_add_builtin(min, "FileAction", cmd_fileaction, NULL);
+
+ csq_add_builtin(min, "MenuPopup", cmd_menupopup, NULL);
+
+ csq_add_builtin(min, "SelectRow", cmd_selectrow, NULL);
+ csq_add_builtin(min, "SelectAll", cmd_selectall, NULL);
+ csq_add_builtin(min, "SelectNone", cmd_selectnone, NULL);
+ csq_add_builtin(min, "SelectToggle", cmd_selecttoggle, NULL);
+ csq_add_builtin(min, "SelectRE", cmd_selectre, NULL);
+ csq_add_builtin(min, "SelectExt", cmd_selectext, NULL);
+ csq_add_builtin(min, "SelectType", cmd_selecttype, NULL);
+ csq_add_builtin(min, "SelectSuffix", cmd_selectsuffix, NULL);
+/* csq_add_builtin(min, "SelectCmp", cmd_selectcmp, NULL);*/
+ csq_add_builtin(min, "UnselectFirst", cmd_unselectfirst, NULL);
+ csq_add_builtin(min, "SelectShell", cmd_selectshell, NULL);
+
+ csq_add_builtin(min, "Information", cmd_information, cfg_information);
+
+ csq_add_builtin(min, "About", cmd_about, NULL);
+ csq_add_builtin(min, "Run", cmd_run, NULL);
+ csq_add_builtin(min, "Rerun", cmd_rerun, NULL);
+ csq_add_builtin(min, "Configure", cmd_configure, cfg_configurecmd);
+ csq_add_builtin(min, "ConfigureSave", cmd_configuresave, NULL);
+ csq_add_builtin(min, "Quit", cmd_quit, NULL);
+}
diff --git a/src/cmdseq.h b/src/cmdseq.h
new file mode 100644
index 0000000..dc51a0d
--- /dev/null
+++ b/src/cmdseq.h
@@ -0,0 +1,46 @@
+/*
+** 1998-09-25 - Header for the new command sequence module. It's a rewrite!
+*/
+
+#if !defined CMDSEQ_H
+#define CMDSEQ_H
+
+#include "cmdarg.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef gint (*Command)(MainInfo *min, DirPane *src, DirPane *dst, const CmdArg *ca);
+typedef void (*CommandCfg)(MainInfo *min);
+
+extern const gchar * csq_cmdseq_unique_name(GHashTable *hash);
+
+extern const gchar * csq_cmdseq_map_name(const gchar *name, const gchar *context);
+
+extern CmdSeq * csq_cmdseq_new(const gchar *name, guint32 flags);
+extern void csq_cmdseq_set_name(GHashTable *hash, CmdSeq *cs, const gchar *name);
+extern CmdSeq * csq_cmdseq_copy(const CmdSeq *src);
+extern void csq_cmdseq_hash(GHashTable **hash, CmdSeq *cs);
+
+extern void csq_cmdseq_destroy(CmdSeq *cs);
+extern gint csq_cmdseq_row_append(CmdSeq *cs, CmdRow *row);
+extern void csq_cmdseq_rows_relink(CmdSeq *cs, GList *rows);
+extern gint csq_cmdseq_row_delete(CmdSeq *cs, CmdRow *row);
+extern void csq_cmdseq_row_delete_all(CmdSeq *cs);
+
+extern gint csq_execute(MainInfo *min, const gchar *name);
+extern gint csq_execute_format(MainInfo *min, const gchar *fmt, ...);
+extern void csq_continue(MainInfo *min);
+extern gboolean csq_handle_ba_flags(MainInfo *min, guint32 flags);
+
+extern const gchar * csq_cmdrow_type_to_string(CRType type);
+extern CRType csq_cmdrow_string_to_type(const gchar *type);
+
+extern CmdRow * csq_cmdrow_new(CRType type, const gchar *def, guint32 flags);
+extern CmdRow * csq_cmdrow_copy(const CmdRow *src);
+extern void csq_cmdrow_set_type(CmdRow *row, CRType type);
+extern void csq_cmdrow_set_def(CmdRow *row, const gchar *def);
+extern void csq_cmdrow_destroy(CmdRow *row);
+
+extern void csq_init_commands(MainInfo *min);
+
+#endif /* CMDSEQ_H */
diff --git a/src/cmdseq_config.c b/src/cmdseq_config.c
new file mode 100644
index 0000000..b33a3cb
--- /dev/null
+++ b/src/cmdseq_config.c
@@ -0,0 +1,859 @@
+/*
+** 1999-04-04 - Backend support for command sequence configuration. This deals with the specific
+** configuration data for command sequences. This data is used by individual commands,
+** and loaded/saved/visualized by the cfg_cmdseq.c module.
+** BUG BUG BUG Currently handles only "flat", simple data types. Goes a long way, though.
+*/
+
+#include "gentoo.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "color_dialog.h"
+#include "dialog.h"
+#include "guiutil.h"
+#include "list_dialog.h"
+#include "odmultibutton.h"
+#include "sizeutil.h"
+#include "strutil.h"
+#include "xmlutil.h"
+
+#include "cmdseq_config.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define CMC_FIELD_SIZE (24)
+
+struct CmdCfg {
+ gchar name[CSQ_NAME_SIZE];
+ gpointer base;
+ GList *fields;
+};
+
+typedef enum { CFT_INTEGER = 0, CFT_BOOLEAN, CFT_ENUM, CFT_SIZE, CFT_STRING, CFT_PATH } CFType;
+
+typedef struct {
+ gint min, max;
+} CFInt;
+
+typedef struct {
+ gsize num;
+ gchar *label[4]; /* Static limits... They rule! */
+ gchar *def;
+} CFEnum;
+
+typedef struct {
+ gsize size;
+ gunichar separator; /* Used for CFT_PATH. */
+} CFStr;
+
+typedef struct {
+ gsize min, max;
+ gsize step; /* Minimum change. */
+} CFSize;
+
+typedef struct {
+ CFType type;
+ gchar name[CMC_FIELD_SIZE];
+ gchar *desc;
+ gsize offset;
+
+ union {
+ CFInt integer;
+ CFEnum fenum;
+ CFSize size;
+ CFStr string;
+ } field;
+} CField;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* This holds "registered" command configs; these are the ones that are stored in the config
+** file, and dealt with by the command options config page. For now, this will in fact be all
+** cmc's created. That will change if I ever add nesting support, though.
+*/
+static GList *cmdcfg_list = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void field_destroy(CField *fld);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-04 - Create a new, empty, command config descriptor to which fields can then be
+** added. Also, in most cases you'd want to register it. The <base_instance>
+** is the (typically static) base configuration data store.
+*/
+CmdCfg * cmc_config_new(const gchar *cmdname, gpointer base_instance)
+{
+ CmdCfg *cmc;
+
+ cmc = g_malloc(sizeof *cmc);
+ g_strlcpy(cmc->name, cmdname, sizeof cmc->name);
+ cmc->base = base_instance;
+ cmc->fields = NULL;
+
+ return cmc;
+}
+
+/* 1999-04-05 - Just get the name of a given config descriptor. Typically, this will be the
+** name of the command whose config data is described by it.
+*/
+const gchar * cmc_config_get_name(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ return cmc->name;
+ return NULL;
+}
+
+/* 1999-04-05 - Save given <cmc>'s base instance to file <out>, in XML format. */
+void cmc_config_base_save(CmdCfg *cmc, FILE *out)
+{
+ if((cmc != NULL) && (out != NULL))
+ {
+ const GList *iter;
+ CField *fld;
+
+ xml_put_node_open(out, cmc->name);
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ fld = iter->data;
+
+ if(strcmp(fld->name, "modified") == 0)
+ continue;
+ switch(fld->type)
+ {
+ case CFT_INTEGER:
+ xml_put_integer(out, fld->name, *(gint *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_BOOLEAN:
+ xml_put_boolean(out, fld->name, *(gboolean *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_ENUM:
+ xml_put_uinteger(out, fld->name, *(gint *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_SIZE:
+ xml_put_uinteger(out, fld->name, *(guint *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_STRING:
+ case CFT_PATH:
+ xml_put_text(out, fld->name, (gchar *) cmc->base + fld->offset);
+ break;
+ }
+ }
+ xml_put_node_close(out, cmc->name);
+ }
+}
+
+/* 1999-04-05 - Load (parse) data from <node> into the base instance of <cmc>. */
+void cmc_config_base_load(CmdCfg *cmc, const XmlNode *node)
+{
+ if((cmc != NULL) && (node != NULL))
+ {
+ const GList *iter;
+ CField *fld;
+
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ fld = iter->data;
+
+ if(strcmp(fld->name, "modified") == 0)
+ continue;
+ switch(fld->type)
+ {
+ case CFT_INTEGER:
+ xml_get_integer(node, fld->name, (gint *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_BOOLEAN:
+ xml_get_boolean(node, fld->name, (gboolean *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_ENUM:
+ xml_get_uinteger(node, fld->name, (guint *) ((gchar *) cmc->base + fld->offset));
+ break;
+ case CFT_SIZE:
+ {
+ guint tmp;
+
+ xml_get_uinteger(node, fld->name, &tmp);
+ *(gsize *) ((gchar *) cmc->base + fld->offset) = tmp;
+ }
+ break;
+ case CFT_STRING:
+ case CFT_PATH:
+ xml_get_text_copy(node, fld->name, (gchar *) cmc->base + fld->offset, fld->field.string.size);
+ break;
+ }
+ }
+ }
+}
+
+/* 1999-04-05 - Compare two command config namess; useful to keep them sorted. */
+static gint cmp_cmc_name(gconstpointer a, gconstpointer b)
+{
+ return strcmp(((CmdCfg *) a)->name, ((CmdCfg *) b)->name);
+}
+
+/* 1999-04-05 - Register given <cmc>, so iterators and other things become aware of it. */
+void cmc_config_register(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ cmdcfg_list = g_list_insert_sorted(cmdcfg_list, cmc, cmp_cmc_name);
+}
+
+/* 1999-04-05 - Call a user-defined function for each registered command config descriptor. */
+void cmc_config_registered_foreach(void (*func)(CmdCfg *cmc, gpointer user), gpointer user)
+{
+ const GList *iter;
+
+ for(iter = cmdcfg_list; iter != NULL; iter = g_list_next(iter))
+ func(iter->data, user);
+}
+
+/* 1999-04-05 - Return the number of registered command config descriptors. */
+guint cmc_config_registered_num(void)
+{
+ return g_list_length(cmdcfg_list);
+}
+
+/* 1999-04-05 - Unregister a <cmc>. */
+void cmc_config_unregister(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ {
+ GList *link;
+
+ if((link = g_list_find(cmdcfg_list, cmc)) != NULL)
+ {
+ cmdcfg_list = g_list_remove_link(cmdcfg_list, link);
+ g_list_free_1(link);
+ }
+ }
+}
+
+/* 1999-04-05 - Free a single field. */
+static void free_field(gpointer data, gpointer user)
+{
+ field_destroy(data);
+}
+
+/* 1999-04-05 - Destroy a command config descriptor. Also causes it to be unregistered. */
+void cmc_config_destroy(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ {
+ cmc_config_unregister(cmc);
+ if(cmc->fields != NULL)
+ {
+ g_list_foreach(cmc->fields, free_field, NULL);
+ g_list_free(cmc->fields);
+ }
+ g_free(cmc);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static CField * field_new(CFType type, const gchar *name, const gchar *desc, gsize offset)
+{
+ CField *fld;
+
+ fld = g_malloc(sizeof *fld);
+
+ fld->type = type;
+ if(name != NULL)
+ g_strlcpy(fld->name, name, sizeof fld->name);
+ if(desc != NULL)
+ fld->desc = strdup(desc);
+ else
+ fld->desc = NULL;
+ fld->offset = offset;
+
+ return fld;
+}
+
+static void field_destroy(CField *fld)
+{
+ if(fld != NULL)
+ {
+ if(fld->desc != NULL)
+ g_free(fld->desc);
+ g_free(fld);
+ }
+}
+
+/* 1999-04-04 - Compare fields, sorting them in increasing offset order. */
+static gint cmp_field(gconstpointer a, gconstpointer b)
+{
+ return (((CField *) a)->offset - ((CField *) b)->offset);
+}
+
+static void field_add(CmdCfg *cmc, CField *fld)
+{
+ if((cmc != NULL) && (fld != NULL))
+ {
+ if((cmc->fields == NULL) && strcmp(fld->name, "modified") != 0)
+ g_error("CMDCFG: First field should be boolean named 'modified' (%s)", cmc->name);
+
+ cmc->fields = g_list_insert_sorted(cmc->fields, fld, cmp_field);
+ }
+}
+
+void cmc_field_add_integer(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gint min, gint max)
+{
+ if(cmc != NULL)
+ {
+ CField *fld = field_new(CFT_INTEGER, name, desc, offset);
+
+ fld->field.integer.min = min;
+ fld->field.integer.max = max;
+
+ field_add(cmc, fld);
+ }
+}
+
+void cmc_field_add_boolean(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset)
+{
+ if(cmc != NULL)
+ field_add(cmc, field_new(CFT_BOOLEAN, name, desc, offset));
+}
+
+/* 2003-10-23 - Split a string "looking|like|this" into enum labels. */
+void cmc_field_add_enum(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, const gchar *def)
+{
+ if(cmc != NULL)
+ {
+ gchar *str;
+ CField *fld = field_new(CFT_ENUM, name, desc, offset);
+
+ fld->field.fenum.num = 0;
+ fld->field.fenum.def = g_strdup(def);
+ for(str = fld->field.fenum.def; *str;)
+ {
+ fld->field.fenum.label[fld->field.fenum.num++] = str;
+ while(*str && *str != '|')
+ str++;
+ if(*str == '|')
+ {
+ *str = '\0';
+ str++;
+ }
+ }
+ field_add(cmc, fld);
+ }
+}
+
+void cmc_field_add_size(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize min, gsize max, gsize step)
+{
+ if(cmc != NULL)
+ {
+ CField *fld = field_new(CFT_SIZE, name, desc, offset);
+
+ fld->field.size.min = min;
+ fld->field.size.max = max + step;
+ fld->field.size.step = step;
+
+ field_add(cmc, fld);
+ }
+}
+
+void cmc_field_add_string(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize size)
+{
+ if(cmc != NULL)
+ {
+ CField *fld = field_new(CFT_STRING, name, desc, offset);
+
+ fld->field.string.size = size;
+
+ field_add(cmc, fld);
+ }
+}
+
+void cmc_field_add_path(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize size, gunichar separator)
+{
+ if(cmc != NULL)
+ {
+ CField *fld = field_new(CFT_PATH, name, desc, offset);
+
+ /* Sneaky: use the 'string' member for CFT_PATH, too. */
+ fld->field.string.size = size;
+ fld->field.string.separator = separator;
+
+ field_add(cmc, fld);
+ }
+}
+
+/* 1999-04-05 - Find a named field. */
+static CField * field_find(CmdCfg *cmc, const gchar *name)
+{
+ if((cmc != NULL) && (name != NULL))
+ {
+ const GList *iter;
+
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ if(strcmp(((CField *) iter->data)->name, name) == 0)
+ return iter->data;
+ }
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Attach some data handy to have in event handlers. */
+static void set_object_data(GObject *obj, CField *fld, gpointer instance)
+{
+ if(obj != NULL)
+ {
+ g_object_set_data(obj, "field", fld);
+ g_object_set_data(obj, "instance", instance);
+ }
+}
+
+/* 1999-04-05 - Retrieve the data set by set_object_data() above. */
+static void get_object_data(GObject *obj, CField **fld, gpointer *instance)
+{
+ if(obj != NULL)
+ {
+ if(fld != NULL)
+ *fld = g_object_get_data(obj, "field");
+ if(instance != NULL)
+ *instance = g_object_get_data(obj, "instance");
+ }
+}
+
+/* 1999-04-05 - Set the mandatory 'modified' field to <value>. */
+static void set_modified(CmdCfg *cmc, gpointer instance, gboolean value)
+{
+ if((cmc != NULL) && (instance != NULL))
+ {
+ CField *fld;
+
+ if((fld = field_find(cmc, "modified")) != NULL)
+ *(gboolean *) ((gchar *) instance + fld->offset) = value;
+ }
+}
+
+/* 1999-04-05 - Return the value of the mandatory 'modified' field. */
+static gboolean get_modified(CmdCfg *cmc, gpointer instance)
+{
+ if((cmc != NULL) && (instance != NULL))
+ {
+ CField *fld;
+
+ if((fld = field_find(cmc, "modified")) != NULL)
+ return *(gboolean *) ((gchar *) instance + fld->offset);
+ }
+ return FALSE; /* A safe default? */
+}
+
+/* 1999-04-05 - User clicked a check button (boolean field). Update field value. */
+static gint evt_boolean_clicked(GtkWidget *wid, gpointer user)
+{
+ CmdCfg *cmc = user;
+ CField *fld = NULL;
+ gpointer instance = NULL;
+
+ get_object_data(G_OBJECT(wid), &fld, &instance);
+
+ if((cmc != NULL) && (fld != NULL) && (instance != NULL))
+ {
+ *(gboolean *) ((gchar *) instance + fld->offset) = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ set_modified(cmc, instance, TRUE);
+ }
+ return TRUE;
+}
+
+static gint evt_enum_changed(GtkWidget *wid, gpointer user)
+{
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid)))
+ {
+ CmdCfg *cmc = user;
+ CField *fld = NULL;
+ gpointer instance = NULL;
+
+ get_object_data(G_OBJECT(wid), &fld, &instance);
+ if(cmc && fld && instance)
+ {
+ *(gint *) ((gchar *) instance + fld->offset) = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "value"));
+ set_modified(cmc, instance, TRUE);
+ }
+ }
+ return TRUE;
+}
+
+/* 1999-04-05 - A string has been modified, so we need to update the instance. */
+static gint evt_string_changed(GtkWidget *wid, gpointer user)
+{
+ CmdCfg *cmc = user;
+ CField *fld;
+ gpointer instance;
+
+ get_object_data(G_OBJECT(wid), &fld, &instance);
+
+ if((cmc != NULL) && (fld != NULL) && (instance != NULL))
+ {
+ const gchar *text;
+
+ if((text = gtk_entry_get_text(GTK_ENTRY(wid))) != NULL)
+ g_strlcpy((gchar *) instance + fld->offset, text, fld->field.string.size);
+ set_modified(cmc, instance, TRUE);
+ }
+ return TRUE;
+}
+
+static gint evt_size_changed(GObject *obj, gpointer user)
+{
+ CmdCfg *cmc = user;
+ CField *fld;
+ gpointer instance;
+
+ get_object_data(obj, &fld, &instance);
+
+ if((cmc != NULL) && (fld != NULL) && (instance != NULL))
+ {
+ gchar buf[32];
+ gsize value = gtk_adjustment_get_value(GTK_ADJUSTMENT(obj));
+ GtkWidget *label = g_object_get_data(obj, "label");
+
+ value *= fld->field.size.step;
+ if(fld->field.size.step >= 512)
+ sze_put_offset(buf, sizeof buf, value, SZE_KB, 0, ',');
+ else
+ sze_put_offset(buf, sizeof buf, value, SZE_BYTES, 0, ',');
+ gtk_label_set_text(GTK_LABEL(label), buf);
+
+ *(gsize *) ((gchar *) instance + fld->offset) = value;
+ set_modified(cmc, instance, TRUE);
+ }
+
+ return TRUE;
+}
+
+static void evt_path_pick_clicked(GtkWidget *wid, gpointer user)
+{
+ CField *fld;
+ gpointer instance;
+ GtkEntry *entry;
+
+ get_object_data(G_OBJECT(wid), &fld, &instance);
+ ldl_dialog_sync_new_wait((gchar *) instance + fld->offset, fld->field.string.size, fld->field.string.separator, fld->desc);
+ entry = GTK_ENTRY(g_object_get_data(G_OBJECT(wid), "entry"));
+ gtk_entry_set_text(entry, (gchar *) instance + fld->offset);
+}
+
+/* 2002-08-01 - Build a neatly right-aligned label, and stuff it into <table>. */
+static void label_build(const gchar *text, GtkWidget *grid, gint x, gint y)
+{
+ GtkWidget *lab;
+
+ lab = gtk_label_new(text);
+ gtk_widget_set_halign(lab, GTK_ALIGN_END);
+ gtk_widget_set_margin_end(lab, 5);
+ gtk_grid_attach(GTK_GRID(grid), lab, x, y, 1, 1);
+}
+
+/* 1999-04-05 - Build config widgetry for given <fld>. This function is a bit schizophrenic, since it
+** does one of two things: if <grid> is non-NULL, the widgetry is packed into it, which
+** looks neat. If it is NULL, a new grid is created, packed, and returned.
+*/
+static GtkWidget * field_build(CmdCfg *cmc, CField *fld, gpointer instance, GtkWidget *grid, gint row)
+{
+ if((cmc != NULL) && (fld != NULL) && (instance != NULL))
+ {
+ GtkWidget *wid, *hbox, *label;
+ GtkAdjustment *adj;
+
+ if(grid == NULL)
+ {
+ grid = gtk_grid_new();
+ row = 0;
+ }
+ switch(fld->type)
+ {
+ case CFT_INTEGER:
+ label_build(fld->desc, grid, 0, row);
+ wid = gtk_spin_button_new(NULL, 1, 0);
+ set_object_data(G_OBJECT(wid), fld, instance);
+ adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(wid));
+ gtk_adjustment_clamp_page(adj, fld->field.integer.min, fld->field.integer.max);
+ gtk_adjustment_set_value(adj, *(gint *) ((gchar *) instance + fld->offset));
+ gtk_widget_set_hexpand(wid, TRUE);
+ gtk_widget_set_halign(wid, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), wid, 1, row, 1, 1);
+ break;
+ case CFT_BOOLEAN:
+ wid = gtk_check_button_new_with_label(fld->desc);
+ set_object_data(G_OBJECT(wid), fld, instance);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wid), *(gboolean *) ((gchar *) instance + fld->offset));
+ g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(evt_boolean_clicked), cmc);
+ gtk_widget_set_hexpand(wid, TRUE);
+ gtk_widget_set_halign(wid, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), wid, 0, row, 2, 1);
+ break;
+ case CFT_ENUM:
+ wid = gtk_frame_new(fld->desc);
+ {
+ GtkWidget *vbox, *radio[sizeof fld->field.fenum.label / sizeof *fld->field.fenum.label];
+ gint i, current = *(gint *) ((gchar *) instance + fld->offset);
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gui_radio_group_new(fld->field.fenum.num, (const gchar **) fld->field.fenum.label, radio);
+ for(i = 0; i < fld->field.fenum.num; i++)
+ {
+ set_object_data(G_OBJECT(radio[i]), fld, instance);
+ g_object_set_data(G_OBJECT(radio[i]), "value", GINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(radio[i]), "toggled", G_CALLBACK(evt_enum_changed), cmc);
+ gtk_box_pack_start(GTK_BOX(vbox), radio[i], FALSE, FALSE, 0);
+ if(i == current)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio[i]), TRUE);
+ }
+ gtk_container_add(GTK_CONTAINER(wid), vbox);
+ }
+ gtk_widget_set_hexpand(wid, TRUE);
+ gtk_widget_set_halign(wid, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), wid, 0, row, 2, 1);
+ break;
+ case CFT_SIZE:
+ label_build(fld->desc, grid, 0, row);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ adj = gtk_adjustment_new((gfloat) *(gint *) ((gchar *) instance + fld->offset) / fld->field.size.step,
+ fld->field.size.min / fld->field.size.step,
+ fld->field.size.max / fld->field.size.step,
+ 1, 1, 0);
+
+ set_object_data(G_OBJECT(adj), fld, instance);
+ wid = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, adj);
+ gtk_scale_set_draw_value(GTK_SCALE(wid), FALSE);
+ gtk_box_pack_start(GTK_BOX(hbox), wid, TRUE, TRUE, 0);
+ label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ g_object_set_data(G_OBJECT(adj), "label", label);
+ g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(evt_size_changed), cmc);
+ gtk_widget_set_hexpand(hbox, TRUE);
+ gtk_widget_set_halign(hbox, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
+ break;
+ case CFT_STRING:
+ label_build(fld->desc, grid, 0, row);
+ wid = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(wid), fld->field.string.size - 1);
+ set_object_data(G_OBJECT(wid), fld, instance);
+ gtk_entry_set_text(GTK_ENTRY(wid), (gchar *) instance + fld->offset);
+ g_signal_connect(G_OBJECT(wid), "changed", G_CALLBACK(evt_string_changed), cmc);
+ gtk_widget_set_hexpand(wid, TRUE);
+ gtk_widget_set_halign(wid, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), wid, 1, row, 1, 1);
+ break;
+ case CFT_PATH:
+ {
+ GtkWidget *pick;
+
+ label_build(fld->desc, grid, 0, row);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ wid = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(wid), fld->field.string.size - 1);
+ set_object_data(G_OBJECT(wid), fld, instance);
+ gtk_entry_set_text(GTK_ENTRY(wid), (gchar *) instance + fld->offset);
+ g_signal_connect(G_OBJECT(wid), "changed", G_CALLBACK(evt_string_changed), cmc);
+ gtk_box_pack_start(GTK_BOX(hbox), wid, TRUE, TRUE, 0);
+ pick = gui_details_button_new();
+ set_object_data(G_OBJECT(pick), fld, instance);
+ g_object_set_data(G_OBJECT(pick), "entry", wid);
+ g_signal_connect(G_OBJECT(pick), "clicked", G_CALLBACK(evt_path_pick_clicked), cmc);
+ gtk_box_pack_start(GTK_BOX(hbox), pick, FALSE, FALSE, 0);
+ gtk_widget_set_hexpand(hbox, TRUE);
+ gtk_widget_set_halign(hbox, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
+ }
+ break;
+ }
+ return grid;
+ }
+ return NULL;
+}
+
+/* 1999-04-05 - Build configuration widgetry for field <name> in given <cmc>. */
+GtkWidget * cmc_field_build(CmdCfg *cmc, const gchar *name, gpointer instance)
+{
+ if((cmc != NULL) && (name != NULL))
+ {
+ CField *fld;
+
+ if((fld = field_find(cmc, name)) != NULL)
+ return field_build(cmc, fld, instance, NULL, 0);
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-04 - Remove a named field from given <cmc>. Rarely used, if ever. */
+void cmc_field_remove(CmdCfg *cmc, const gchar *name)
+{
+ if((cmc != NULL) && (name != NULL))
+ {
+ CField *fld;
+
+ if((fld = field_find(cmc, name)) != NULL)
+ {
+ cmc->fields = g_list_remove(cmc->fields, fld);
+ field_destroy(fld);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-05 - Allocate memory to hold an instance of a command config structure, as described
+** by the fields list in <cmc>.
+*/
+gpointer cmc_instance_new(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ {
+ const GList *iter;
+ gsize size = 0, fsize;
+ CField *fld;
+
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ fld = iter->data;
+
+ fsize = fld->offset;
+ switch(fld->type)
+ {
+ case CFT_INTEGER:
+ fsize += sizeof (gint);
+ break;
+ case CFT_BOOLEAN:
+ fsize += sizeof (gboolean);
+ break;
+ case CFT_ENUM:
+ fsize += sizeof (gint);
+ break;
+ case CFT_SIZE:
+ fsize += sizeof (gsize);
+ break;
+ case CFT_STRING:
+ case CFT_PATH:
+ fsize += fld->field.string.size;
+ break;
+ }
+ if(fsize > size)
+ size = fsize;
+ }
+ if(size)
+ return g_malloc(size);
+ }
+ return NULL;
+}
+
+/* 1999-04-05 - Create a new instance initialized to the current contents of the base one.
+** This is infinitely more useful than an empty instance.
+*/
+gpointer cmc_instance_new_from_base(CmdCfg *cmc)
+{
+ if(cmc != NULL)
+ {
+ gpointer inst;
+
+ if((inst = cmc_instance_new(cmc)) != NULL)
+ {
+ cmc_instance_copy(cmc, inst, cmc->base);
+ return inst;
+ }
+ }
+ return NULL;
+}
+
+/* 1999-04-05 - Copy the instance <src> into <dst>. This would probably work as a straight
+** memory copy once the correct size of the instance is computed, but doing it
+** field-by-field seems somehow clearer, or something. There's no great rush.
+*/
+void cmc_instance_copy(CmdCfg *cmc, gpointer dst, gpointer src)
+{
+ if((cmc != NULL) && (dst != NULL) && (src != NULL))
+ {
+ const GList *iter;
+ CField *fld;
+
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ fld = iter->data;
+
+ switch(fld->type)
+ {
+ case CFT_INTEGER:
+ *(gint *) ((gchar *) dst + fld->offset) = *(gint *) ((gchar *) src + fld->offset);
+ break;
+ case CFT_BOOLEAN:
+ *(gboolean *) ((gchar *) dst + fld->offset) = *(gboolean *) ((gchar *) src + fld->offset);
+ break;
+ case CFT_ENUM:
+ *(gint *) ((gchar *) dst + fld->offset) = *(gboolean *) ((gchar *) src + fld->offset);
+ break;
+ case CFT_SIZE:
+ *(gsize *) ((gchar *) dst + fld->offset) = *(gsize *) ((gchar *) src + fld->offset);
+ break;
+ case CFT_STRING:
+ case CFT_PATH:
+ g_strlcpy((gchar *) dst + fld->offset, (gchar *) src + fld->offset, fld->field.string.size);
+ break;
+ }
+ }
+ }
+}
+
+/* 1999-04-05 - Copy <src> into the given <cmc>'s base instance. The given source instance had
+** better be legit (i.e., created with the same cmc).
+*/
+void cmc_instance_copy_to_base(CmdCfg *cmc, gpointer src)
+{
+ if((cmc != NULL) && (src != NULL))
+ cmc_instance_copy(cmc, cmc->base, src);
+}
+
+/* 1999-04-05 - Copy <cmc>'s base instance into <dst>. */
+void cmc_instance_copy_from_base(CmdCfg *cmc, gpointer dst)
+{
+ if((cmc != NULL) && (dst != NULL))
+ cmc_instance_copy(cmc, dst, cmc->base);
+}
+
+/* 1999-04-05 - Build a container widget containing the widgetry for configuring each field. */
+GtkWidget * cmc_instance_build(CmdCfg *cmc, gpointer instance)
+{
+ GtkWidget *grid = NULL;
+
+ if((cmc != NULL) && (instance != NULL))
+ {
+ const GList *iter;
+ gint row = 0;
+
+ grid = gtk_grid_new();
+ for(iter = cmc->fields; iter != NULL; iter = g_list_next(iter))
+ {
+ if(strcmp(((CField *) iter->data)->name, "modified") == 0)
+ continue;
+ field_build(cmc, iter->data, instance, grid, row++);
+ }
+ }
+ return grid;
+}
+
+/* 1999-04-05 - Get the 'modified' state of given instance. */
+gboolean cmc_instance_get_modified(CmdCfg *cmc, gpointer inst)
+{
+ return get_modified(cmc, inst);
+}
+
+/* 1999-04-05 - Destroy an instance created by cmc_instance_new() above. Don't call this on
+** a static instance.
+*/
+void cmc_instance_destroy(gpointer inst)
+{
+ if(inst != NULL)
+ g_free(inst);
+}
diff --git a/src/cmdseq_config.h b/src/cmdseq_config.h
new file mode 100644
index 0000000..f4ba33b
--- /dev/null
+++ b/src/cmdseq_config.h
@@ -0,0 +1,44 @@
+/*
+** 1999-04-04 - Interface definitions for the command sequence configuration module.
+*/
+
+#if !defined CMDSEQ_CONFIG_H
+#define CMDSEQ_CONFIG_H
+
+#include <stddef.h>
+
+#include "xmlutil.h"
+
+typedef struct CmdCfg CmdCfg;
+
+CmdCfg * cmc_config_new(const gchar *cmdname, gpointer base_instance);
+const gchar * cmc_config_get_name(CmdCfg *cmc);
+void cmc_config_base_save(CmdCfg *cmc, FILE *out);
+void cmc_config_base_load(CmdCfg *cmc, const XmlNode *data);
+void cmc_config_register(CmdCfg *cmc);
+void cmc_config_registered_foreach(void (*func)(CmdCfg *cmc, gpointer user), gpointer user);
+guint cmc_config_registered_num(void);
+void cmc_config_unregister(CmdCfg *cmc);
+void cmc_config_destroy(CmdCfg *cmc);
+
+void cmc_field_add_integer(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gint min, gint max);
+void cmc_field_add_boolean(CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset);
+void cmc_field_add_enum (CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, const gchar *def);
+void cmc_field_add_size (CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize min, gsize max, gsize step);
+void cmc_field_add_string (CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize size);
+void cmc_field_add_path (CmdCfg *cmc, const gchar *name, const gchar *desc, gsize offset, gsize size, gunichar separator);
+
+GtkWidget * cmc_field_build(CmdCfg *cmc, const gchar *name, gpointer instance);
+
+void cmc_field_remove(CmdCfg *cmc, const gchar *name);
+
+gpointer cmc_instance_new(CmdCfg *cmc);
+gpointer cmc_instance_new_from_base(CmdCfg *cmc);
+GtkWidget * cmc_instance_build(CmdCfg *cmc, gpointer instance);
+void cmc_instance_copy(CmdCfg *cmc, gpointer dst, gpointer src);
+void cmc_instance_copy_to_base(CmdCfg *cmc, gpointer src);
+void cmc_instance_copy_from_base(CmdCfg *cmc, gpointer dst);
+gboolean cmc_instance_get_modified(CmdCfg *cmc, gpointer inst);
+void cmc_instance_destroy(gpointer instance);
+
+#endif /* CMDSEQ_CONFIG_H */
diff --git a/src/cmdseq_dialog.c b/src/cmdseq_dialog.c
new file mode 100644
index 0000000..228717f
--- /dev/null
+++ b/src/cmdseq_dialog.c
@@ -0,0 +1,267 @@
+/*
+** 1998-09-27 - A pretty cool dialog, that allows the selection of a command sequence
+** OR a built-in command. Should be very convenient.
+** 1998-12-16 - Now tracks and remembers the collapsed/expanded state of the two sub-trees.
+** 1999-03-13 - Adjustments for new dialog module.
+** 1999-05-08 - Slight adjustments; now keeps the command sequence as a GString.
+** 1999-05-09 - Celbrated my birthday by changing my old (sucky) auto-completion code into
+** use of glib's g_completion_XXX() API. A lot nicer, although a bit tricky
+** and (for me) non-intuitive to use. I think it works now, though.
+** 1999-06-19 - Adapted for new dialog module.
+** 1999-08-29 - Did trivial modifications to retain the command entered between uses.
+*/
+
+#include "gentoo.h"
+
+#include <gdk/gdkkeysyms.h>
+
+#include "dialog.h"
+#include "guiutil.h"
+#include "strutil.h"
+
+#include "cmdseq_dialog.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GString *cmd; /* Keep at top for correct initialization. */
+ Dialog *dlg;
+ GtkWidget *vbox;
+ GtkWidget *entry;
+ GList *builtin, *cmdseq;
+ GList *clist, *citer;
+ GtkTreeStore *store;
+ GtkListStore *lstore; /* Only used for completion, to work around sub-tree issues. */
+ gboolean expanded[2];
+} CDlg;
+
+static CDlg the_cdlg = { NULL };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Add <key> to a list, sorted. */
+static void insert_key(gpointer key, gpointer data, gpointer user)
+{
+ GList **list = user;
+
+ *list = g_list_insert_sorted(*list, key, (GCompareFunc) strcmp);
+}
+
+/* 1998-09-27 - Take a hash table with string keys, and build a linear list from it, sorting
+** the keys in lexicographically.
+*/
+static GList * hash_to_list(GHashTable *hash)
+{
+ GList *list = NULL;
+
+ if(hash != NULL)
+ g_hash_table_foreach(hash, insert_key, &list);
+
+ return list;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2004-12-03 - Cursor moved, i.e. item was selected. */
+static void evt_cursor_changed(GtkWidget *wid, gpointer user)
+{
+ CDlg *cdlg = user;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gchar *text = NULL;
+
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(wid), &path, NULL);
+ if(path == NULL)
+ return;
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(cdlg->store), &iter, path);
+ if(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(cdlg->store), &iter) != 0)
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(cdlg->store), &iter, 0, &text, -1);
+ if(text != NULL)
+ {
+ gtk_entry_set_text(GTK_ENTRY(cdlg->entry), text);
+ gtk_widget_grab_focus(cdlg->entry);
+ g_string_assign(cdlg->cmd, text);
+ g_free(text);
+ }
+}
+
+/* 2004-11-21 - Expanded/collapsed state of a tree row changed; update state. */
+static void evt_row_collapsed_expanded(GtkWidget *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer user)
+{
+ gint *ind = gtk_tree_path_get_indices(path);
+ CDlg *cdlg = user;
+
+ cdlg->expanded[ind[0]] = gtk_tree_view_row_expanded(GTK_TREE_VIEW(treeview), path);
+}
+
+/* 2009-10-22 - Accept double-clicked row, for speed. */
+static void evt_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user)
+{
+ CDlg *cdlg = user;
+
+ dlg_dialog_sync_close(cdlg->dlg, DLG_POSITIVE);
+}
+
+/* 2004-11-21 - Append a subtree from a list of strings. */
+static void append_subtree_list(const GList *list, GtkTreeStore *store, GtkTreeIter *parent)
+{
+ for(; list != NULL; list = g_list_next(list))
+ {
+ GtkTreeIter iter;
+
+ gtk_tree_store_append(store, &iter, parent);
+ gtk_tree_store_set(store, &iter, 0, list->data, -1);
+ }
+}
+
+static void append_liststore_list(const GList *list, GtkListStore *store)
+{
+ for(; list != NULL; list = g_list_next(list))
+ {
+ GtkTreeIter iter;
+
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, list->data, -1);
+ }
+}
+
+/* 2012-05-23 - Callback for GTK+'s built-in completion support. This replaces the old
+** TAB-triggered completion, since that in turn was based on GCompletion
+** (in glib), which has been deprecated.
+*/
+static gboolean cb_match_func(GtkEntryCompletion *ec, const gchar *key, GtkTreeIter *iter, gpointer user)
+{
+ CDlg *cdlg = user;
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(cdlg->entry));
+ gchar *cname;
+ gboolean ret;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(gtk_entry_completion_get_model(ec)), iter, 0, &cname, -1);
+ ret = strstr(cname, text) != NULL;
+ g_free(cname);
+
+ return ret;
+}
+
+/* 2004-11-21 - Build tree holding built-in and user commands. New GTK+ 2.0 version. */
+static GtkWidget * build_tree(MainInfo *min, CDlg *cdlg)
+{
+ GtkTreeIter iter;
+ GtkWidget *view;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreePath *path;
+ GtkEntryCompletion *compl;
+ gchar label[32];
+
+ /* Create tree store, populate with contents of built-in and user-defined lists. */
+ cdlg->store = gtk_tree_store_new(1, G_TYPE_STRING);
+ gtk_tree_store_append(cdlg->store, &iter, NULL);
+ g_snprintf(label, sizeof label, _("Built-Ins (%u)"), g_list_length(cdlg->builtin));
+ gtk_tree_store_set(cdlg->store, &iter, 0, label, -1);
+ append_subtree_list(cdlg->builtin, cdlg->store, &iter);
+
+ gtk_tree_store_append(cdlg->store, &iter, NULL);
+ g_snprintf(label, sizeof label, _("User Defined (%u)"), g_list_length(cdlg->cmdseq));
+ gtk_tree_store_set(cdlg->store, &iter, 0, label, -1);
+ append_subtree_list(cdlg->cmdseq, cdlg->store, &iter);
+
+ cdlg->lstore = gtk_list_store_new(1, G_TYPE_STRING);
+ append_liststore_list(cdlg->builtin, cdlg->lstore);
+ append_liststore_list(cdlg->cmdseq, cdlg->lstore);
+
+ /* Create view, renderer, and column, and stuff it all together. */
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(cdlg->store));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(Commands)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+ /* Expand whatever was previously expanded. */
+ if(cdlg->expanded[0])
+ {
+ path = gtk_tree_path_new_from_indices(0, -1);
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE);
+ gtk_tree_path_free(path);
+ }
+ if(cdlg->expanded[1])
+ {
+ path = gtk_tree_path_new_from_indices(1, -1);
+ gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE);
+ gtk_tree_path_free(path);
+ }
+
+ /* Connect expand/collapse-tracking signals. */
+ g_signal_connect(G_OBJECT(view), "row_collapsed", G_CALLBACK(evt_row_collapsed_expanded), cdlg);
+ g_signal_connect(G_OBJECT(view), "row_expanded", G_CALLBACK(evt_row_collapsed_expanded), cdlg);
+
+ /* And track command selections, too. */
+ g_signal_connect(G_OBJECT(view), "cursor_changed", G_CALLBACK(evt_cursor_changed), cdlg);
+
+ /* Support accept on double-click, for speedier feel. */
+ g_signal_connect(G_OBJECT(view), "row_activated", G_CALLBACK(evt_row_activated), cdlg);
+
+ /* Create GtkEntryCompletion and link to tree. */
+ compl = gtk_entry_completion_new();
+ gtk_entry_completion_set_match_func(compl, cb_match_func, cdlg, NULL);
+ gtk_entry_completion_set_text_column(compl, 0);
+ gtk_entry_completion_set_model(compl, GTK_TREE_MODEL(cdlg->lstore));
+ gtk_entry_completion_set_inline_selection(compl, TRUE);
+ gtk_entry_set_completion(GTK_ENTRY(cdlg->entry), compl);
+
+ return view;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-27 - Open up a dialog where the user can select (or type) a command name.
+** The <cmdseq> argument should contain the current user-defined command sequences.
+** If it is NULL, the possibly-not-so-current ones in min->cfg.commands are used.
+** 1999-03-29 - Simplified semantics; now runs synchronously, and simply returns command name (or NULL).
+*/
+const gchar * csq_dialog_sync_new_wait(MainInfo *min, GHashTable *cmdseq)
+{
+ CDlg *cdlg = &the_cdlg;
+ const gchar *ret = NULL;
+ GtkWidget *label, *scwin, *tree;
+
+ if(cmdseq == NULL) /* No alternative command sequence hash? */
+ cmdseq = min->cfg.commands.cmdseq;
+
+ cdlg->builtin = hash_to_list(min->cfg.commands.builtin);
+ cdlg->cmdseq = hash_to_list(cmdseq);
+ if(cdlg->cmd == NULL)
+ cdlg->cmd = g_string_new(NULL);
+
+ cdlg->clist = cdlg->citer = NULL;
+
+ cdlg->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ label = gtk_label_new(_("Select a command, or type part of its name."));
+ gtk_box_pack_start(GTK_BOX(cdlg->vbox), label, FALSE, FALSE, 0);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ cdlg->entry = gui_dialog_entry_new();
+ if((tree = build_tree(min, cdlg)) != NULL)
+ {
+ gtk_container_add(GTK_CONTAINER(scwin), tree);
+ gtk_box_pack_start(GTK_BOX(cdlg->vbox), scwin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(cdlg->vbox), cdlg->entry, FALSE, FALSE, 0);
+
+ gtk_entry_set_text(GTK_ENTRY(cdlg->entry), cdlg->cmd->str);
+ gtk_editable_select_region(GTK_EDITABLE(cdlg->entry), 0, -1);
+
+ cdlg->dlg = dlg_dialog_sync_new(cdlg->vbox, _("Select Command"), NULL);
+ gtk_window_set_default_size(GTK_WINDOW(dlg_dialog_get_dialog(cdlg->dlg)), 320, 544);
+ gtk_widget_grab_focus(cdlg->entry);
+ if(dlg_dialog_sync_wait(cdlg->dlg) == DLG_POSITIVE)
+ {
+ g_string_assign(cdlg->cmd, gtk_entry_get_text(GTK_ENTRY(cdlg->entry)));
+ ret = cdlg->cmd->str;
+ }
+ dlg_dialog_sync_destroy(cdlg->dlg);
+ g_list_free(cdlg->builtin);
+ g_list_free(cdlg->cmdseq);
+ g_object_unref(cdlg->lstore);
+ }
+ return ret;
+}
diff --git a/src/cmdseq_dialog.h b/src/cmdseq_dialog.h
new file mode 100644
index 0000000..4abdf81
--- /dev/null
+++ b/src/cmdseq_dialog.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-27 - Header for the command selection dialog.
+*/
+
+extern const char * csq_dialog_sync_new_wait(MainInfo *min, GHashTable *cmdseq);
diff --git a/src/color_dialog.c b/src/color_dialog.c
new file mode 100644
index 0000000..b2aba05
--- /dev/null
+++ b/src/color_dialog.c
@@ -0,0 +1,54 @@
+/*
+** 1999-05-02 - A little color dialog module. Really just a convenience wrapper around
+** the GTK+ GtkColorSelection widget. Saves a few uppercase keystrokes.
+** 1999-06-19 - Adapted for the new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include "dialog.h"
+#include "color_dialog.h"
+
+typedef struct {
+ GtkWidget *chooser; /* The core widget. */
+ ColChangedFunc func;
+ gpointer user;
+} ColDlg;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-02 - This gets called as the user changes color controls in dialog. Call callback. */
+static void evt_color_activated(GtkWidget *wid, GdkRGBA *color, gpointer user)
+{
+ ColDlg *dlg = user;
+
+ if(dlg->func != NULL)
+ dlg->func(color, dlg->user);
+}
+
+gint cdl_dialog_sync_new_wait(const gchar *label, ColChangedFunc func, const GdkRGBA *initial, gpointer user)
+{
+ static ColDlg dlg;
+ Dialog *d;
+ gint ret = -1;
+
+ dlg.func = func;
+ dlg.user = user;
+
+ dlg.chooser = gtk_color_chooser_widget_new();
+ g_signal_connect(G_OBJECT(dlg.chooser), "color_activated", G_CALLBACK(evt_color_activated), &dlg);
+ if(initial != NULL)
+ gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(dlg.chooser), initial);
+ d = dlg_dialog_sync_new(dlg.chooser, label ? label : _("Edit Color"), NULL);
+ ret = dlg_dialog_sync_wait(d);
+ if(ret == DLG_POSITIVE && dlg.func != NULL)
+ {
+ GdkRGBA color;
+
+ gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(dlg.chooser), &color);
+ dlg.func(&color, dlg.user);
+ }
+ dlg_dialog_sync_destroy(d);
+
+ return ret;
+}
diff --git a/src/color_dialog.h b/src/color_dialog.h
new file mode 100644
index 0000000..e027597
--- /dev/null
+++ b/src/color_dialog.h
@@ -0,0 +1,16 @@
+/*
+** 1999-05-02 - Header for the little color dialog module.
+*/
+
+#if !defined COLOR_DIALOG_H
+#define COLOR_DIALOG_H
+
+#include <gdk/gdk.h>
+
+#include "dialog.h"
+
+typedef void (*ColChangedFunc)(const GdkRGBA *color, gpointer user);
+
+extern gint cdl_dialog_sync_new_wait(const gchar *label, ColChangedFunc func, const GdkRGBA *initial, gpointer user);
+
+#endif /* COLOR_DIALOG_H */
diff --git a/src/commands.h b/src/commands.h
new file mode 100644
index 0000000..02e459d
--- /dev/null
+++ b/src/commands.h
@@ -0,0 +1,37 @@
+/*
+** 1998-09-25 - Include headers for all built-in commands. In alphabetical
+** order, for tidiness.
+*/
+
+#include "cmd_about.h"
+#include "cmd_activate.h"
+#include "cmd_chmod.h"
+#include "cmd_chown.h"
+#include "cmd_configure.h"
+#include "cmd_copy.h"
+#include "cmd_copyas.h"
+#include "cmd_delete.h"
+#include "cmd_direnter.h"
+#include "cmd_dirrescan.h"
+#include "cmd_dpfocus.h"
+#include "cmd_dpfocusisrch.h"
+#include "cmd_dpmisc.h"
+#include "cmd_file.h"
+#include "cmd_getsize.h"
+#include "cmd_info.h"
+#include "cmd_join.h"
+#include "cmd_menupopup.h"
+#include "cmd_mkdir.h"
+#include "cmd_move.h"
+#include "cmd_moveas.h"
+#include "cmd_parent.h"
+#include "cmd_quit.h"
+#include "cmd_rename.h"
+#include "cmd_renamere.h"
+#include "cmd_renameseq.h"
+#include "cmd_run.h"
+#include "cmd_select.h"
+#include "cmd_split.h"
+#include "cmd_swap.h"
+#include "cmd_symlink.h"
+#include "cmd_viewtext.h"
diff --git a/src/configure.c b/src/configure.c
new file mode 100644
index 0000000..a98d69f
--- /dev/null
+++ b/src/configure.c
@@ -0,0 +1,602 @@
+/*
+** 1998-05-31 - After a long wait, here it finally is - the gdtool GUI config
+** module! This will be *big*, I can feel it.
+** 1998-06-16 - Smartened up the window handling. Now the config window is only ever
+** built (created) once. It is then reused! Environmentally safe.
+** It also allows me to use the config GUI to keep all the state,
+** although I'm not exactly convinced that's what I want to do...
+** 1998-06-22 - Redesigned. Cut away all old notebook-page-creation code (~140
+** lines) and implemented a new, more modular way of doing it.
+** 1998-07-26 - Added a global cache of page descriptors, avoiding having to
+** repeat the describe-calls all the time.
+** 1998-08-25 - Implemented a slim way of having the individual page modules
+** notify this main module of program-wide things they want done when
+** config closes. As an example, it is important to rescan the directories
+** if the styles or types change.
+** 1998-08-30 - Fixed version handling in config file, at least somewhat. Also added
+** a system-wide config, which is loaded if the user doesn't have one.
+** 1998-10-16 - System-wide config path now configurable via a symbol.
+** 1999-12-24 - Now uses the window utility module to handle the root config window,
+** thus making its size and position configurable and savable.
+** 2000-07-02 - Translated.
+** 2002-07-19 - Renamed, and recast the interface to use a tree. Cleaner-looking, and
+** handles nested stuff better.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "cmdseq.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "fileutil.h"
+#include "iconutil.h"
+#include "nag_dialog.h"
+#include "window.h"
+#include "xmlutil.h"
+
+#include "configure.h"
+
+#include "cfg_module.h"
+
+#include "cfg_buttonlayout.h"
+#include "cfg_buttons.h"
+#include "cfg_cmdcfg.h"
+#include "cfg_cmdseq.h"
+#include "cfg_controls.h"
+#include "cfg_dialogs.h"
+#include "cfg_dirpane.h"
+#include "cfg_errors.h"
+#include "cfg_menus.h"
+#include "cfg_nag.h"
+#include "cfg_paths.h"
+#include "cfg_styles.h"
+#include "cfg_types.h"
+#include "cfg_windows.h"
+
+/* This should be set in the Makefile, and passed along using the -D
+** compiler option, If not, let's default to nice old Slackware style.
+*/
+#if !defined PATH_CFG
+#define PATH_CFG "/usr/local/etc/"
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ MainInfo *min;
+ GtkWidget *dlg;
+ GtkWidget *view;
+ GtkTreeStore *store;
+ GtkTreeIter treeiter[4];
+ guint level; /* Current depth in tree, used when building. */
+ GtkWidget *first; /* Keeps track of first leaf node during build, for select. */
+ GtkWidget *nbook; /* A notebook widget holding all the config pages. */
+ GtkWidget *ok, *save, *cancel;
+ gint page; /* Index of last selected page. */
+
+ guint32 flags; /* Flags for stuff that need to be done when window closes. */
+} CfgGui;
+
+/* A global (yuck!) vector of page descriptor functions. This is where pointers to new pages go. */
+static const CMDescribeFunc describe_page[] = { cdp_describe,
+ ccs_describe, ccc_describe,
+ cst_describe, ctp_describe,
+ cbt_describe, cbl_describe,
+ cpt_describe,
+ cwn_describe, cdl_describe,
+ cct_describe, cer_describe,
+ cng_describe,
+ };
+
+#define CFG_PAGES (sizeof describe_page / sizeof describe_page[0])
+/* A global vector of the resulting page descriptors. */
+static const CfgModule *cfg_page[CFG_PAGES];
+
+
+static CfgGui the_cfggui = { NULL };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-07-24 - Returns the base directory where the proper configuration file is to be found. */
+static const gchar * get_config_dirname(void)
+{
+ static gchar buf[1024] = "";
+
+ if(buf[0] == '\0')
+ {
+ const gchar *confdir;
+
+ if((confdir = g_get_user_config_dir()) != NULL)
+ g_snprintf(buf, sizeof buf, "%s" G_DIR_SEPARATOR_S PACKAGE, confdir);
+ }
+ return buf;
+}
+
+/* 2011-07-24 - Returns pointer to the proper filename for our configuration file. */
+static const gchar * get_config_filename(const gchar *filename)
+{
+ static gchar buf[1024] = "";
+
+ if(buf[0] == '\0')
+ {
+ const gchar *confdir = get_config_dirname();
+
+ g_snprintf(buf, sizeof buf, "%s" G_DIR_SEPARATOR_S "%s", confdir, filename);
+ }
+ return buf;
+}
+
+/* 2011-07-24 - Returns pointer to the old and outdated filename used by our configuration file. */
+static const gchar * get_config_filename_old(const gchar *filename)
+{
+ static gchar buf[1024];
+
+ if(buf[0] == '\0')
+ {
+ const gchar *home = g_getenv("HOME");
+
+ if(home == NULL)
+ home = g_get_home_dir();
+ if(home != NULL)
+ g_snprintf(buf, sizeof buf, "%s" G_DIR_SEPARATOR_S "%s", home, filename);
+ }
+ return buf;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-26 - Do the work of hiding the config GUI. */
+static void hide_config(CfgGui *cgu)
+{
+ guint i;
+
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(cfg_page[i]->hide != NULL)
+ cfg_page[i]->hide(cgu->min);
+ }
+ if(the_cfggui.flags & CFLG_RESET_KEYBOARD)
+ kbd_context_clear(cgu->min->gui->kbd_ctx);
+
+ if(the_cfggui.flags & CFLG_REBUILD_TOP)
+ rebuild_top(cgu->min);
+ if(the_cfggui.flags & CFLG_REBUILD_MIDDLE)
+ rebuild_middle(cgu->min);
+
+ /* The rescanning needs to happen early, since we now have potentially stale Type pointers in the panes. */
+ if(the_cfggui.flags & CFLG_RESCAN_LEFT)
+ dp_rescan(&cgu->min->gui->pane[0]);
+ else if(the_cfggui.flags & CFLG_REDISP_LEFT)
+ dp_redisplay_preserve(&cgu->min->gui->pane[0]);
+ if(the_cfggui.flags & CFLG_RESCAN_RIGHT)
+ dp_rescan(&cgu->min->gui->pane[1]);
+ else if(the_cfggui.flags & CFLG_REDISP_RIGHT)
+ dp_redisplay_preserve(&cgu->min->gui->pane[1]);
+
+ if(the_cfggui.flags & CFLG_REBUILD_BOTTOM)
+ {
+ rebuild_bottom(cgu->min);
+ csq_execute(cgu->min, "ActivateOther");
+ csq_execute(cgu->min, "ActivateOther");
+ }
+
+ if(the_cfggui.flags & CFLG_FLUSH_ICONS)
+ ico_flush(cgu->min);
+
+ if(the_cfggui.flags & CFLG_RESET_KEYBOARD)
+ ctrl_keys_install(cgu->min->cfg.ctrlinfo, cgu->min->gui->kbd_ctx);
+
+ gtk_grab_remove(cgu->dlg);
+ win_window_relink(cgu->min->cfg.wininfo, WIN_CONFIG, cgu->dlg);
+ win_window_close(cgu->dlg);
+}
+
+/* 1998-06-26 - The user just clicked the OK button. Let all page modules know, then hide the
+** GUI.
+*/
+static gint evt_ok_clicked(GtkWidget *wid, gpointer user)
+{
+ CfgGui *cgu = user;
+ MainInfo *min = cgu->min;
+ guint i;
+
+ cfg_modified_set(min);
+
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(cfg_page[i]->accept != NULL)
+ cfg_page[i]->accept(min);
+ }
+ hide_config(cgu);
+ return TRUE;
+}
+
+/* 1998-09-18 - Broke the saving code out of the button handler, and made it globally
+** accessible.
+*/
+void cfg_save_all(MainInfo *min)
+{
+ const gchar *root = "GentooConfig", *rcname = get_config_filename(RCNAME);
+ FILE *out;
+ guint i;
+ const CfgModule *page;
+
+ cfg_modified_clear(min);
+ if((out = xml_put_open(rcname)) != NULL)
+ {
+ xml_put_node_open(out, root);
+ xml_put_text(out, "version", VERSION);
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if((page = describe_page[i](min)) != NULL && (page->save != NULL))
+ page->save(min, out);
+ }
+ xml_put_node_close(out, root);
+ xml_put_close(out);
+ }
+ else
+ dlg_dialog_async_new_error(_("Couldn't open configuration file for output"));
+}
+
+/* 1998-07-25 - I guess it's becoming time to grow up and start outputting a config file.
+** XML seems to be the format of the week, so I'll just go for something like
+** that.
+** 1998-09-18 - Broke out the actual saving code and put in in a function of its own.
+*/
+static gint evt_save_clicked(GtkWidget *wid, gpointer user)
+{
+ CfgGui *cgu = user;
+ MainInfo *min = cgu->min;
+ guint i;
+
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(cfg_page[i]->accept != NULL)
+ cfg_page[i]->accept(min);
+ }
+ cfg_save_all(min);
+ hide_config(cgu);
+
+ return TRUE;
+}
+
+/* 1998-07-12 - User clicked the cancel button. Hide the GUI. */
+static gint evt_cancel_clicked(GtkWidget *wid, gpointer user)
+{
+ hide_config(user);
+ return TRUE;
+}
+
+/* 1998-05-31 - Build the buttons at the bottom of the config window (OK, Save, Cancel). */
+static void build_buttons(CfgGui *cgu)
+{
+ cgu->ok = gtk_button_new_with_label(_("OK"));
+ g_signal_connect(G_OBJECT(cgu->ok), "clicked", G_CALLBACK(evt_ok_clicked), cgu);
+ gtk_dialog_add_action_widget(GTK_DIALOG(cgu->dlg), cgu->ok, GTK_RESPONSE_OK);
+ cgu->save = gtk_button_new_with_label(_("Save"));
+ g_signal_connect(G_OBJECT(cgu->save), "clicked", G_CALLBACK(evt_save_clicked), cgu);
+ gtk_dialog_add_action_widget(GTK_DIALOG(cgu->dlg), cgu->save, GTK_RESPONSE_OK);
+ cgu->cancel = gtk_button_new_with_label(_("Cancel"));
+ g_signal_connect(G_OBJECT(cgu->cancel), "clicked", G_CALLBACK(evt_cancel_clicked), cgu);
+ gtk_dialog_add_action_widget(GTK_DIALOG(cgu->dlg), cgu->cancel, GTK_RESPONSE_CANCEL);
+
+ gtk_widget_set_can_default(cgu->ok, TRUE);
+ gtk_widget_set_can_default(cgu->save, TRUE);
+ gtk_widget_set_can_default(cgu->cancel, TRUE);
+ gtk_widget_grab_default(cgu->ok);
+}
+
+/* 1998-06-16 - This gets called as the user clicks the close button of the config GUI.
+** Unlike what the function name might lead you to expect, we don't destroy the
+** GUI we so laborously (sp?) created. We just hide it so we can use it again
+** later. Neat for several reasons.
+*/
+static gint evt_cfg_delete(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ hide_config(user);
+
+ return TRUE;
+}
+
+/* 2004-11-2x - Page tree cursor changed, so switch page in the notebook on the right. */
+static void evt_view_cursor_changed(GtkWidget *view, gpointer user)
+{
+ CfgGui *cgu = user;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ gtk_tree_view_get_cursor(GTK_TREE_VIEW(view), &path, NULL);
+ if(path == NULL)
+ return;
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(cgu->store), &iter, path);
+ if(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(cgu->store), &iter) > 0) /* Disregard interior nodes. */
+ return;
+ gtk_tree_model_get(GTK_TREE_MODEL(cgu->store), &iter, 1, &cgu->page, -1);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(cgu->nbook), cgu->page);
+}
+
+/* 1998-06-16 - Cooled up (?) this routine a lot. It is now recursive, in a rather
+** interesting manner. The point is not to reconstruct the entire config-
+** GUI each time it is needed, but rather to just build it once and then
+** hide/show it as needed.
+*/
+gint cfg_configure(MainInfo *min)
+{
+ CfgGui *cgu = &the_cfggui;
+ gchar *name = NULL;
+ guint i;
+ GtkWidget *hbox, *scwin, *simple;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ the_cfggui.flags = 0U;
+
+ /* Do the widgets already exist? Then just update and display. */
+ if(cgu->dlg != NULL)
+ {
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(cfg_page[i]->update != NULL)
+ cfg_page[i]->update(min);
+ }
+ win_window_show(cgu->dlg);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(cgu->nbook), the_cfggui.page);
+ gtk_widget_show_all(cgu->dlg);
+ gtk_grab_add(cgu->dlg);
+ return 1;
+ }
+
+ /* Initialize the cache of page descriptors. */
+ for(i = 0; i < CFG_PAGES; i++)
+ cfg_page[i] = describe_page[i](min);
+
+ cgu->min = min;
+ cgu->dlg = win_window_open(min->cfg.wininfo, WIN_CONFIG);
+ gtk_window_set_modal(GTK_WINDOW(cgu->dlg), TRUE);
+ g_signal_connect(G_OBJECT(cgu->dlg), "delete_event", G_CALLBACK(evt_cfg_delete), cgu);
+
+ cgu->store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT); /* Simply store notebook page# in second column. */
+ cgu->level = 0U;
+
+ cgu->first = NULL;
+ cgu->nbook = gtk_notebook_new();
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(cgu->nbook), FALSE);
+
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(cfg_page[i]->init != NULL)
+ {
+ if((simple = cfg_page[i]->init(min, &name)) != NULL)
+ {
+ gint pn = gtk_notebook_append_page(GTK_NOTEBOOK(cgu->nbook), simple, NULL);
+
+ gtk_tree_store_append(cgu->store, &cgu->treeiter[cgu->level], NULL);
+ gtk_tree_store_set(cgu->store, &cgu->treeiter[cgu->level], 0, name, -1);
+ gtk_tree_store_set(cgu->store, &cgu->treeiter[cgu->level], 1, pn, -1);
+ }
+ }
+ }
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ /* Build tree view, showing only the first column. */
+ cgu->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(cgu->store));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(ConfigPages)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(cgu->view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(cgu->view), FALSE);
+ g_signal_connect(G_OBJECT(cgu->view), "cursor_changed", G_CALLBACK(evt_view_cursor_changed), cgu);
+ gtk_container_add(GTK_CONTAINER(scwin), cgu->view);
+ gtk_box_pack_start(GTK_BOX(hbox), scwin, FALSE, FALSE, 0);
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), cgu->nbook);
+ gtk_box_pack_start(GTK_BOX(hbox), scwin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(cgu->dlg))), hbox, TRUE, TRUE, 0);
+ build_buttons(cgu);
+
+ return cfg_configure(min); /* Recurse! */
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean goto_iterate(const CfgGui *cgu, GtkTreeIter *iter, const char *label)
+{
+ GtkTreeIter citer;
+ const gchar *lh;
+ gint lp;
+
+ do
+ {
+ gtk_tree_model_get(GTK_TREE_MODEL(cgu->store), iter, 0, &lh, 1, &lp, -1);
+ if(strcmp(lh, label) == 0)
+ {
+ GtkTreePath *path;
+
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(cgu->nbook), lp);
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(cgu->store), iter);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(cgu->view), path);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(cgu->view), path, NULL, FALSE);
+ gtk_tree_path_free(path);
+ return TRUE;
+ }
+ if(gtk_tree_model_iter_children(GTK_TREE_MODEL(cgu->store), &citer, iter))
+ {
+ if(goto_iterate(cgu, &citer, label))
+ return TRUE;
+ }
+ } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(cgu->store), iter));
+
+ return FALSE;
+}
+
+/* 2014-12-26 - Switch to a named configuration page. */
+void cfg_goto_page(const char *label)
+{
+ const CfgGui *cgu = &the_cfggui;
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(cgu->store), &iter))
+ {
+ goto_iterate(cgu, &iter, label);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void cfg_tree_level_begin(const gchar *label)
+{
+ CfgGui *cgu = &the_cfggui;
+
+ if(cgu->level + 1 < sizeof cgu->treeiter / sizeof *cgu->treeiter)
+ {
+ gtk_tree_store_append(cgu->store, &cgu->treeiter[cgu->level], cgu->level > 0 ? &cgu->treeiter[cgu->level - 1] : NULL);
+ gtk_tree_store_set(cgu->store, &cgu->treeiter[cgu->level], 0, label, -1);
+ cgu->level++;
+ }
+}
+
+void cfg_tree_level_append(const gchar *label, GtkWidget *page)
+{
+ CfgGui *cgu = &the_cfggui;
+
+ gtk_tree_store_append(cgu->store, &cgu->treeiter[cgu->level], &cgu->treeiter[cgu->level - 1]);
+ gtk_tree_store_set(cgu->store, &cgu->treeiter[cgu->level], 0, label, -1);
+
+ if(page != NULL)
+ {
+ gint pn = gtk_notebook_append_page(GTK_NOTEBOOK(the_cfggui.nbook), page, NULL);
+ gtk_tree_store_set(cgu->store, &cgu->treeiter[cgu->level], 1, pn, -1);
+ }
+}
+
+/* 2002-07-19 - Replace <old> tree widget with the <new> one. Handy for cases where config widgets
+** are seriously rebuilt during update(), such as in cfg_cmdcfg.c.
+*/
+void cfg_tree_level_replace(GtkWidget *old, GtkWidget *new)
+{
+ if(old)
+ {
+ gint pn = gtk_notebook_page_num(GTK_NOTEBOOK(the_cfggui.nbook), old);
+ gtk_container_remove(GTK_CONTAINER(the_cfggui.nbook), old);
+ gtk_notebook_insert_page(GTK_NOTEBOOK(the_cfggui.nbook), new, NULL, pn);
+ gtk_widget_show(new);
+ }
+}
+
+void cfg_tree_level_end(void)
+{
+ if(the_cfggui.level > 0)
+ the_cfggui.level--;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void load_node(const XmlNode *node, gpointer user)
+{
+ MainInfo *min = user;
+ guint i;
+
+ for(i = 0; i < CFG_PAGES; i++)
+ {
+ if(xml_node_has_name(node, cfg_page[i]->node) && cfg_page[i]->load != NULL)
+ {
+ cfg_page[i]->load(min, node);
+ return;
+ }
+ }
+}
+
+/* 1998-07-26 - Load the entire program configuration. Pretty complex stuff, made considerably
+** less so by the modularization and tree organization.
+** 1998-08-30 - Now keeps knowledge about config file name to itself. First checks if there
+** is a local config; if so, it is loaded. If not, the system-wide default
+** config from /etc/local/etc/ is used. If that fails, whine.
+** 1998-10-21 - Now returns a set of flags, rather than the single first boolean.
+** 1999-08-25 - Made the error dialog shown when no config is found a bit more informative.
+*/
+guint32 cfg_load_config(MainInfo *min)
+{
+ XmlNode *tree;
+ gchar name[PATH_MAX] = "";
+ const gchar *rcdir, *rcname;
+ guint32 i, flags = 0UL, bad_dir = 0;
+
+ /* Since we know this function is called during boot, ensure the user's config directory exists. */
+ rcdir = get_config_dirname();
+ if(*rcdir == '\0')
+ g_error("Failed to retrieve user's configuration directory, can't save configuration data");
+ else if(!fut_exists(rcdir))
+ g_mkdir_with_parents(rcdir, 0700);
+
+ /* Does the user seem to have a local config? */
+ rcname = get_config_filename(RCNAME);
+ if(!fut_can_read_named(rcname))
+ {
+ rcname = get_config_filename_old("." RCNAME); /* Nope, check old location and name. */
+ bad_dir = 1;
+ }
+ if(!fut_can_read_named(rcname))
+ {
+ g_snprintf(name, sizeof name, PATH_CFG G_DIR_SEPARATOR_S "%s", RCNAME); /* Nope, check for global one. */
+ rcname = name;
+ bad_dir = 1;
+ }
+
+ /* If loading from a "bad" (non-standard) directory, nag. */
+ if(bad_dir)
+ ndl_dialog_sync_new_wait(min, "rcpath", _("Configuration Path Notice"), _("Configuration was not loaded from the current default location.\nPress Save in the Configuration window to update."));
+
+ /* Initialize the cache of page descriptors. */
+ for(i = 0; i < CFG_PAGES; i++)
+ cfg_page[i] = describe_page[i](min);
+
+ if((tree = xml_tree_load(rcname)) != NULL)
+ {
+ const gchar *fver;
+
+ if(xml_get_text(tree, "version", &fver) && strcmp(fver, VERSION) != 0)
+ g_warning(_("Config file version (%s) doesn't match program version (%s)"), fver, VERSION);
+ xml_node_visit_children(tree, load_node, (gpointer) min);
+ xml_tree_destroy(tree);
+ }
+ else
+ {
+ const gchar *rcname, *oldrcname;
+ gchar syscfg[PATH_MAX], whine[3 * PATH_MAX];
+
+ rcname = get_config_filename(RCNAME);
+ oldrcname = get_config_filename_old("." RCNAME);
+ g_snprintf(syscfg, sizeof syscfg, PATH_CFG G_DIR_SEPARATOR_S "%s", RCNAME);
+ g_snprintf(whine, sizeof whine, _("Couldn't find any configuration file; checked:\n"
+ "\"%s\",\n\"%s\" and\n\"%s\".\n"
+ "Using built-in minimal configuration."),
+ rcname, oldrcname, syscfg);
+ dlg_dialog_async_new_error(whine);
+ flags |= CLDF_NONE_FOUND;
+ }
+ return flags;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-25 - Log a request to get something done. */
+void cfg_set_flags(guint32 flags)
+{
+ the_cfggui.flags |= flags;
+}
+
+/* 1999-04-09 - Set the 'configuration modified' flag. */
+void cfg_modified_set(MainInfo *min)
+{
+ min->cfg.flags |= CFLG_CHANGED;
+}
+
+/* 1999-04-09 - Clear the 'configuration modified' flag. Use with care. */
+void cfg_modified_clear(MainInfo *min)
+{
+ min->cfg.flags &= ~CFLG_CHANGED;
+}
diff --git a/src/configure.h b/src/configure.h
new file mode 100644
index 0000000..7236308
--- /dev/null
+++ b/src/configure.h
@@ -0,0 +1,50 @@
+/*
+** 1998-05-31 - Header for the GUI configuration main module.
+*/
+
+#if !defined CONFIGURE_H
+#define CONFIGURE_H
+
+/* These are flags useful in calls to cfg_set_flags(). */
+enum {
+ CFLG_RESCAN_LEFT = (1 << 0),
+ CFLG_RESCAN_RIGHT = (1 << 1),
+ CFLG_RESCAN_BOTH = (CFLG_RESCAN_LEFT | CFLG_RESCAN_RIGHT),
+ CFLG_REDISP_LEFT = (1 << 2),
+ CFLG_REDISP_RIGHT = (1 << 3),
+ CFLG_FLUSH_ICONS = (1 << 4),
+ CFLG_REBUILD_TOP = (1 << 5),
+ CFLG_REBUILD_MIDDLE = (1 << 6),
+ CFLG_REBUILD_BOTTOM = (1 << 7),
+ CFLG_RESET_MOUNT = (1 << 8),
+ CFLG_RESET_KEYBOARD = (1 << 9),
+};
+
+/* These are flags returned by cfg_load_config(). */
+enum {
+ CLDF_NONE_FOUND = (1 << 0) /* There was no config available. */
+};
+
+gint cfg_configure(MainInfo *min);
+
+void cfg_goto_page(const char *label);
+
+/* Config modules which have internal hierarchy use these from their init() function.
+** Simpler modules don't, they just return their single page and set the label, as
+** with the old tabs-based layout.
+*/
+void cfg_tree_level_begin(const gchar *label);
+void cfg_tree_level_append(const gchar *label, GtkWidget *page);
+void cfg_tree_level_replace(GtkWidget *old, GtkWidget *new);
+void cfg_tree_level_end(void);
+
+void cfg_save_all(MainInfo *min);
+
+guint32 cfg_load_config(MainInfo *min);
+
+void cfg_set_flags(guint32 flags);
+
+void cfg_modified_set(MainInfo *min);
+void cfg_modified_clear(MainInfo *min);
+
+#endif /* CONFIGURE_H */
diff --git a/src/controls.c b/src/controls.c
new file mode 100644
index 0000000..72fd3e4
--- /dev/null
+++ b/src/controls.c
@@ -0,0 +1,774 @@
+/*
+** 1999-03-16 - A module to deal with various forms of user controls. Currently, this
+** will simply implement global keyboard shortcuts. In future, this might
+** be the place to add configuration of mouse buttons, and stuff.
+** 1999-05-08 - Minor changes due to the fact that command sequences are now best stored
+** as GStrings.
+** 2000-02-18 - Completed implementation of new NumLock-ignore support. Should help users.
+*/
+
+#include "gentoo.h"
+
+#include "strutil.h"
+
+#include "controls.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct CtrlInfo {
+ MainInfo *min; /* So incredibly handy to have around. */
+
+ gboolean nonumlock; /* Ignore num lock for both keyboard and mouse bindings? */
+
+ GHashTable *keys; /* Contains all key-to-cmdseq bindings. */
+ GSList *keys_inst; /* List of KbdContexts into which we're currently installed. */
+
+ GList *mouse; /* List of CtrlMouse mouse button mappings. Why hurry? */
+
+ struct {
+ GString *cmdseq; /* Command assigned to Click-M-Click action gesture. */
+ gfloat delay; /* Max delay in seconds to trigger cmc. */
+ } clickmclick;
+
+ GHashTable *general; /* General bindings. */
+};
+
+struct CtrlKey {
+ gchar keyname[KEY_NAME_SIZE];
+ GString *cmdseq;
+};
+
+struct CtrlMouse {
+ guint button; /* Which button this is for (in range 1..5). */
+ guint state; /* Modifier bits that need to be set (see GdkModifierType). */
+ GString *cmdseq; /* The command we run when triggerec. */
+};
+
+#define CONTEXT_NAME_SIZE (32)
+
+typedef struct {
+ gchar context[CONTEXT_NAME_SIZE];
+ GString *cmdseq;
+} CtrlGen;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static CtrlKey * key_new(const gchar *keyname, const gchar *cmdseq);
+static void key_destroy(CtrlKey *key);
+static void mouse_destroy(CtrlMouse *cm);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Create a new control info, the main representation of this module's work. */
+CtrlInfo * ctrl_new(MainInfo *min)
+{
+ CtrlInfo *ctrl;
+
+ ctrl = g_malloc(sizeof *ctrl);
+ ctrl->min = min;
+ ctrl->nonumlock = TRUE;
+ ctrl->keys = g_hash_table_new(g_str_hash, g_str_equal);
+ ctrl->keys_inst = NULL;
+
+ ctrl->mouse = NULL;
+
+ ctrl->clickmclick.cmdseq = NULL;
+ ctrl->clickmclick.delay = 0.400f;
+
+ ctrl->general = NULL;
+
+ return ctrl;
+}
+
+/* 1999-03-16 - Return a control info with the default controls already configured into it.
+** These are simply the few keys that have had hardcoded functions since more
+** or less the beginning of gentoo. It's nice to see them reborn like this. :)
+*/
+CtrlInfo * ctrl_new_default(MainInfo *min)
+{
+ CtrlInfo *ctrl;
+
+ ctrl = ctrl_new(min);
+
+ ctrl_key_add(ctrl, "BackSpace", "DirParent");
+ ctrl_key_add(ctrl, "Delete", "Delete");
+ ctrl_key_add(ctrl, "F2", "Rename");
+ ctrl_key_add(ctrl, "F5", "DirRescan");
+ ctrl_key_add(ctrl, "h", "DpHide");
+ ctrl_key_add(ctrl, "r", "DpRecenter");
+ ctrl_key_add(ctrl, "space", "ActivateOther");
+
+ /* These are the "legacy" default actions for mouse button presses, that used to be hardcoded. */
+ ctrl_mouse_add(ctrl, 1, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "SelectSuffix action=toggle");
+ ctrl_mouse_add(ctrl, 1, GDK_MOD1_MASK, "SelectType action=toggle");
+ ctrl_mouse_add(ctrl, 1, GDK_MOD1_MASK | GDK_SHIFT_MASK, "SelectType action=select");
+ ctrl_mouse_add(ctrl, 1, GDK_MOD1_MASK | GDK_CONTROL_MASK, "SelectType action=unselect");
+ ctrl_mouse_add(ctrl, 2, 0U, "DirParent");
+ ctrl_mouse_add(ctrl, 3, 0U, "MenuPopup");
+
+ return ctrl;
+}
+
+/* 1999-03-16 - Remove a key; this is a g_hash_table_foreach_remove() callback. */
+static gboolean key_remove(gpointer key, gpointer value, gpointer user)
+{
+ key_destroy(value);
+ return TRUE;
+}
+
+/* 1999-03-16 - Copy a key. A callback for ctrl_copy() below. */
+static void key_copy(gpointer key, gpointer value, gpointer user)
+{
+ if(((CtrlKey *) value)->cmdseq != NULL)
+ ctrl_key_add(user, ((CtrlKey *) value)->keyname, ((CtrlKey *) value)->cmdseq->str);
+ else
+ ctrl_key_add(user, ((CtrlKey *) value)->keyname, NULL);
+}
+
+/* 1999-06-13 - A g_list_foreach() callback to destroy a mouse mapping. */
+static void mouse_remove(gpointer data, gpointer user)
+{
+ mouse_destroy(data);
+}
+
+/* 1999-06-13 - Copy a mouse button command mapping. */
+static void mouse_copy(gpointer data, gpointer user)
+{
+ CtrlMouse *cm = data;
+
+ ctrl_mouse_add(user, ctrl_mouse_get_button(cm), ctrl_mouse_get_state(cm), ctrl_mouse_get_cmdseq(cm));
+}
+
+/* 2004-04-25 - Copy a general binding. */
+static void general_copy(gpointer key, gpointer value, gpointer user)
+{
+ if(value != NULL && ((CtrlGen *) value)->cmdseq != NULL) /* Don't copy NULL cmdseq. */
+ ctrl_general_set_cmdseq(user, key, ((CtrlGen *) value)->cmdseq->str);
+}
+
+/* 2004-04-25 - Remove a general binding. */
+static gboolean general_remove(gpointer key, gpointer value, gpointer user)
+{
+ CtrlGen *cg = value;
+
+ if(cg != NULL)
+ {
+ if(cg->cmdseq != NULL)
+ g_string_free(cg->cmdseq, TRUE);
+ g_free(cg);
+ }
+ return TRUE;
+}
+
+/* 1999-03-16 - Copy the entire control info structure. Very useful for config. Note that
+** the copy will NOT retain the installation status of the original; in fact,
+** it will not be installed anywhere (which is generally what you (should) want).
+*/
+CtrlInfo * ctrl_copy(CtrlInfo *ctrl)
+{
+ CtrlInfo *copy = NULL;
+
+ if(ctrl != NULL)
+ {
+ copy = ctrl_new(ctrl->min);
+ g_hash_table_foreach(ctrl->keys, key_copy, copy);
+ g_list_foreach(ctrl->mouse, mouse_copy, copy);
+ ctrl_clickmclick_set_cmdseq(copy, ctrl_clickmclick_get_cmdseq(ctrl));
+ ctrl_clickmclick_set_delay(copy, ctrl_clickmclick_get_delay(ctrl));
+ if(ctrl->general != NULL)
+ g_hash_table_foreach(ctrl->general, general_copy, copy);
+ ctrl_numlock_ignore_set(copy, ctrl_numlock_ignore_get(ctrl));
+ }
+ return copy;
+}
+
+/* 1999-03-16 - Destroy a control info. */
+void ctrl_destroy(CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ {
+ ctrl_keys_uninstall_all(ctrl);
+ g_hash_table_foreach_remove(ctrl->keys, key_remove, NULL);
+ g_hash_table_destroy(ctrl->keys);
+ g_list_foreach(ctrl->mouse, mouse_remove, NULL);
+ if(ctrl->clickmclick.cmdseq)
+ g_string_free(ctrl->clickmclick.cmdseq, TRUE);
+ if(ctrl->general != NULL)
+ {
+ g_hash_table_foreach_remove(ctrl->general, general_remove, NULL);
+ g_hash_table_destroy(ctrl->general);
+ }
+ g_free(ctrl);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void ctrl_numlock_ignore_set(CtrlInfo *ctrl, gboolean ignore)
+{
+ if(ctrl != NULL)
+ ctrl->nonumlock = ignore;
+}
+
+gboolean ctrl_numlock_ignore_get(CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ return ctrl->nonumlock;
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Create a new key control with the given mapping. */
+static CtrlKey * key_new(const gchar *keyname, const gchar *cmdseq)
+{
+ CtrlKey *key;
+
+ key = g_malloc(sizeof *key);
+ g_strlcpy(key->keyname, keyname, sizeof key->keyname);
+ if(cmdseq != NULL)
+ key->cmdseq = g_string_new(cmdseq);
+ else
+ key->cmdseq = NULL;
+
+ return key;
+}
+
+/* 1999-03-16 - Destroy a key mapping. */
+static void key_destroy(CtrlKey *key)
+{
+ if(key != NULL)
+ {
+ if(key->cmdseq != NULL)
+ g_string_free(key->cmdseq, TRUE);
+ g_free(key);
+ }
+}
+
+/* 1999-03-16 - Add a keyboard mapping to the given <ctrl>. Note that if the ctrl has
+** already been installed, adding keys to it won't activate them until it
+** is reinstalled.
+*/
+CtrlKey * ctrl_key_add(CtrlInfo *ctrl, const gchar *keyname, const gchar *cmdseq)
+{
+ CtrlKey *key = NULL;
+
+ if((ctrl != NULL) && (keyname != NULL))
+ {
+ key = key_new(keyname, cmdseq);
+ ctrl_key_remove_by_name(ctrl, key->keyname);
+ g_hash_table_insert(ctrl->keys, key->keyname, key);
+ }
+ return key;
+}
+
+/* 1999-03-17 - Add a new key->command mapping, with the rather peculiar property that
+** the key name is in fact illegal (it is not an existing key), and the
+** command part is empty. The key name will, however, be unique among all
+** existing maps. Useful when adding keys interactively.
+*/
+CtrlKey * ctrl_key_add_unique(CtrlInfo *ctrl)
+{
+ gchar buf[KEY_NAME_SIZE], *name = NULL;
+ gint i;
+
+ for(i = 0; (name == NULL) && (i < 1000); i++) /* Um, not quite unique, since we can give up. */
+ {
+ if(i == 0)
+ g_snprintf(buf, sizeof buf, "none");
+ else
+ g_snprintf(buf, sizeof buf, "none-%d", i + 1);
+ if(g_hash_table_lookup(ctrl->keys, buf) == NULL)
+ name = buf;
+ }
+ return ctrl_key_add(ctrl, name, NULL);
+}
+
+/* 1999-03-16 - Remove the given key mapping, and also destroy it. */
+void ctrl_key_remove(CtrlInfo *ctrl, CtrlKey *key)
+{
+ if((ctrl != NULL) && (key != NULL))
+ ctrl_key_remove_by_name(ctrl, key->keyname);
+}
+
+/* 1999-03-16 - Remove a named key mapping, and destroy it. */
+void ctrl_key_remove_by_name(CtrlInfo *ctrl, const gchar *keyname)
+{
+ if((ctrl != NULL) && (keyname != NULL))
+ {
+ CtrlKey *key;
+
+ if((key = g_hash_table_lookup(ctrl->keys, keyname)) != NULL)
+ {
+ g_hash_table_remove(ctrl->keys, key->keyname);
+ key_destroy(key);
+ }
+ }
+}
+
+/* 1999-03-17 - Remove all key mappings from <ctrl>. It is a very good idea to first
+** uninstall it from (all) keyboard contexts.
+*/
+void ctrl_key_remove_all(CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ g_hash_table_foreach_remove(ctrl->keys, key_remove, NULL);
+}
+
+/* 1999-03-16 - Return the key part of given key->command mapping. */
+const gchar * ctrl_key_get_keyname(const CtrlKey *key)
+{
+ if(key != NULL)
+ return key->keyname;
+ return NULL;
+}
+
+/* 1999-03-16 - Return the command part of a key-to-command mapping. */
+const gchar * ctrl_key_get_cmdseq(const CtrlKey *key)
+{
+ if((key != NULL) && (key->cmdseq != NULL))
+ return key->cmdseq->str;
+ return NULL;
+}
+
+/* 1999-03-16 - Change the key part of the given mapping. Changes it in the
+** <ctrl> as well. Is basically equivalent to a remove followed
+** by an add, but slightly more efficient.
+*/
+void ctrl_key_set_keyname(CtrlInfo *ctrl, CtrlKey *key, const gchar *keyname)
+{
+ if((ctrl != NULL) && (key != NULL) && (keyname != NULL))
+ {
+ if(g_hash_table_lookup(ctrl->keys, key->keyname) == key)
+ {
+ g_hash_table_remove(ctrl->keys, key->keyname);
+ g_strlcpy(key->keyname, keyname, sizeof key->keyname);
+ g_hash_table_insert(ctrl->keys, key->keyname, key);
+ }
+ }
+}
+
+/* 1999-03-16 - Change command sequence part of given mapping. Equivalent to,
+** but far more efficient than, a remove+add pair.
+*/
+void ctrl_key_set_cmdseq(CtrlInfo *ctrl, CtrlKey *key, const gchar *cmdseq)
+{
+ if((ctrl != NULL) && (key != NULL))
+ {
+ if(g_hash_table_lookup(ctrl->keys, key->keyname) == key)
+ {
+ if(cmdseq != NULL)
+ {
+ if(key->cmdseq != NULL)
+ g_string_assign(key->cmdseq, cmdseq);
+ else
+ key->cmdseq = g_string_new(cmdseq);
+ }
+ else
+ {
+ if(key->cmdseq != NULL)
+ g_string_free(key->cmdseq, TRUE);
+ key->cmdseq = NULL;
+ }
+ }
+ }
+}
+
+/* 1999-05-08 - Return TRUE if given <key> already has a command sequence equal to <cmdseq>.
+** If not, FALSE is returned.
+*/
+gboolean ctrl_key_has_cmdseq(CtrlInfo *ctrl, CtrlKey *key, const gchar *cmdseq)
+{
+ if((ctrl != NULL) && (key != NULL) && (cmdseq != NULL))
+ {
+ if(key->cmdseq != NULL)
+ return strcmp(key->cmdseq->str, cmdseq) ? FALSE : TRUE;
+ return FALSE;
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Just a simple hash callback to install a CtrlKey into a keyboard context. */
+static void key_install(gpointer key, gpointer value, gpointer user)
+{
+ if(((CtrlKey *) value)->cmdseq != NULL)
+ kbd_context_entry_add(user, ((CtrlKey *) value)->keyname, KET_CMDSEQ, ((CtrlKey *) value)->cmdseq->str);
+}
+
+/* 1999-03-16 - Install all <ctrl>'s key mappings as command-type keyboard commands in <ctx>.
+** Note that the set of which keyboard contexts a CtrlInfo has been installed in
+** is a retained property in the CtrlInfo.
+*/
+void ctrl_keys_install(CtrlInfo *ctrl, KbdContext *ctx)
+{
+ if((ctrl != NULL) && (ctx != NULL))
+ {
+ /* FIXME: This really assumes there is only one attachment. */
+ if(ctrl->nonumlock)
+ kbd_context_mask_set(ctx, GDK_MOD2_MASK);
+ else
+ kbd_context_mask_set(ctx, 0);
+
+ g_hash_table_foreach(ctrl->keys, key_install, ctx);
+ ctrl->keys_inst = g_slist_prepend(ctrl->keys_inst, ctx);
+ }
+}
+
+/* 1999-03-16 - Callback for ctrl_keys_uninstall() below. */
+static void key_uninstall(gpointer key, gpointer value, gpointer user)
+{
+ kbd_context_entry_remove(user, ((CtrlKey *) value)->keyname);
+}
+
+/* 1999-03-16 - Uninstall all keys defined by <ctrl> from context <ctx>. If, in fact, the
+** ctrl has never been installed in the context, nothing happens. Does not
+** (ever) affect which mappings are contained in the ctrl.
+*/
+void ctrl_keys_uninstall(CtrlInfo *ctrl, KbdContext *ctx)
+{
+ if((ctrl != NULL) && (ctx != NULL))
+ {
+ if(g_slist_find(ctrl->keys_inst, ctx) != NULL)
+ {
+ g_hash_table_foreach(ctrl->keys, key_uninstall, ctx);
+ ctrl->keys_inst = g_slist_remove(ctrl->keys_inst, ctx);
+ }
+ }
+}
+
+/* 1999-03-17 - A foreach callback for ctrl_keys_uninstall_all() below. Does not just
+** call ctrl_keys_uninstall(), since that modofies the list which is a bad
+** idea when iterating it...
+*/
+static void keys_uninstall(gpointer data, gpointer user)
+{
+ g_hash_table_foreach(((CtrlInfo *) user)->keys, key_uninstall, data);
+}
+
+/* 1999-03-17 - Uninstall given ctrlinfo from all of its keyboard contexts. Does not alter
+** the actual collection of key mappings in the ctrlinfo.
+*/
+void ctrl_keys_uninstall_all(CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ {
+ g_slist_foreach(ctrl->keys_inst, keys_uninstall, ctrl);
+ g_slist_free(ctrl->keys_inst);
+ ctrl->keys_inst = NULL;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint cmp_string(gconstpointer a, gconstpointer b)
+{
+ return strcmp(a, b);
+}
+
+static void key_insert(gpointer key, gpointer value, gpointer user)
+{
+ GSList **list = user;
+
+ *list = g_slist_insert_sorted(*list, value, cmp_string);
+}
+
+/* 1999-03-16 - Return a list of all <ctrl>'s key mappings, sorted on the key names. */
+GSList * ctrl_keys_get_list(CtrlInfo *ctrl)
+{
+ GSList *list = NULL;
+
+ if(ctrl != NULL)
+ g_hash_table_foreach(ctrl->keys, key_insert, &list);
+
+ return list;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-12 - Create a new mouse command mapping. Empty. */
+static CtrlMouse * mouse_new(void)
+{
+ CtrlMouse *cm;
+
+ cm = g_malloc(sizeof *cm);
+
+ cm->button = cm->state = 0U;
+ cm->cmdseq = NULL;
+
+ return cm;
+}
+
+/* 1999-06-12 - Destroy a mouse mapping which is no longer needed (or used). */
+static void mouse_destroy(CtrlMouse *cm)
+{
+ if(cm != NULL)
+ {
+ if(cm->cmdseq != NULL)
+ g_string_free(cm->cmdseq, TRUE);
+ g_free(cm);
+ }
+}
+
+/* 1999-06-12 - Compare two mouse command definitions, ordering them in mouse button order. */
+static gint mouse_cmp(gconstpointer a, gconstpointer b)
+{
+ const CtrlMouse *ma = a, *mb = b;
+
+ if(ma->button == mb->button)
+ return ma->state - mb->state;
+ return ma->button - mb->button;
+}
+
+/* 1999-06-12 - Add a command mapping for a mouse button. Note that this will not prevent the
+** creation of multiple identical mappings, something that is silly at best, and
+** dangerous at worst. Beware.
+*/
+CtrlMouse * ctrl_mouse_add(CtrlInfo *ctrl, guint button, guint state, const gchar *cmdseq)
+{
+ CtrlMouse *cm = NULL;
+
+ if(ctrl != NULL)
+ {
+ cm = mouse_new();
+
+ cm->button = button;
+ cm->state = state;
+ cm->cmdseq = g_string_new(cmdseq);
+
+ ctrl->mouse = g_list_insert_sorted(ctrl->mouse, cm, mouse_cmp);
+ }
+ return cm;
+}
+
+/* 1999-06-13 - Set a new button for a mapping. */
+void ctrl_mouse_set_button(CtrlMouse *mouse, guint button)
+{
+ if(mouse != NULL)
+ mouse->button = button;
+}
+
+/* 1999-06-13 - Set a new modifier state for a mapping. */
+void ctrl_mouse_set_state(CtrlMouse *mouse, guint state)
+{
+ if(mouse != NULL)
+ mouse->state = state;
+}
+
+/* 1999-06-13 - Set a new command sequence for the given mapping. */
+void ctrl_mouse_set_cmdseq(CtrlMouse *mouse, const gchar *cmdseq)
+{
+ if(mouse != NULL)
+ g_string_assign(mouse->cmdseq, cmdseq);
+}
+
+/* 1999-06-13 - Access the button part of a mouse command mapping. */
+guint ctrl_mouse_get_button(const CtrlMouse *mouse)
+{
+ if(mouse != NULL)
+ return mouse->button;
+ return 0;
+}
+
+/* 1999-06-13 - Get the state bits for a mouse button command mapping. */
+guint ctrl_mouse_get_state(const CtrlMouse *mouse)
+{
+ if(mouse != NULL)
+ return mouse->state;
+ return 0;
+}
+
+/* 1999-06-13 - Get the command sequence for a mouse mapping. */
+const gchar * ctrl_mouse_get_cmdseq(const CtrlMouse *mouse)
+{
+ if(mouse != NULL)
+ return mouse->cmdseq->str;
+ return NULL;
+}
+
+/* 1999-06-20 - Remove the mouse mapping <mouse> from <ctrl>. */
+void ctrl_mouse_remove(CtrlInfo *ctrl, CtrlMouse *mouse)
+{
+ if((ctrl != NULL) && (mouse != NULL))
+ ctrl->mouse = g_list_remove(ctrl->mouse, mouse);
+}
+
+/* 1999-06-20 - Clear away all mouse mappings from <ctrl>. */
+void ctrl_mouse_remove_all(CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ {
+ GList *iter;
+
+ for(iter = ctrl->mouse; iter != NULL; iter = g_list_next(iter))
+ mouse_destroy(iter->data);
+ g_list_free(ctrl->mouse);
+ ctrl->mouse = NULL;
+ }
+}
+
+/* 1999-06-12 - Check if we have a mapping for the mouse button event described by <evt>, and if we
+** do, return a pointer to the command definition for the caller to execute. Else
+** returns NULL.
+*/
+const gchar * ctrl_mouse_map(CtrlInfo *ctrl, GdkEventButton *evt)
+{
+ if((ctrl != NULL) && (evt != NULL))
+ {
+ GList *iter;
+ CtrlMouse *cm;
+ guint state;
+
+ state = evt->state;
+ /* Allow only the modifiers known to be configurable for mouse buttons. */
+ state &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK);
+
+ for(iter = ctrl->mouse; iter != NULL; iter = g_list_next(iter))
+ {
+ cm = iter->data;
+ if((cm->button == evt->button) && (cm->state == state))
+ return cm->cmdseq->str;
+ }
+ }
+ return NULL;
+}
+
+/* 1999-06-13 - Get a list of all CtrlMouse mouse button command mappings. When done with the
+** list, the caller must call g_slist_free() on it.
+*/
+GSList * ctrl_mouse_get_list(CtrlInfo *ctrl)
+{
+ GSList *list = NULL;
+
+ if(ctrl != NULL)
+ {
+ GList *iter;
+
+ for(iter = ctrl->mouse; iter != NULL; iter = g_list_next(iter))
+ list = g_slist_append(list, iter->data);
+ }
+
+ return list;
+}
+
+/* 1999-06-20 - This (borderline silly) function answers whether there exists a "collision" in the
+** mouse command mappings, i.e. if the same button+state combo is used more than once.
+** Ultimately, it shouldn't be possible to create such a situation, but in the current
+** GUI it is. So this function can be used to at least warn the user.
+*/
+gboolean ctrl_mouse_ambiguity_exists(const CtrlInfo *ctrl)
+{
+ if(ctrl != NULL)
+ {
+ GList *i, *j;
+
+ for(i = ctrl->mouse; i != NULL; i = g_list_next(i))
+ {
+ for(j = ctrl->mouse; j != NULL; j = g_list_next(j))
+ {
+ if(j == i)
+ continue;
+ if(mouse_cmp(i->data, j->data) == 0)
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void ctrl_clickmclick_set_cmdseq(CtrlInfo *ctrl, const gchar *cmdseq)
+{
+ if(cmdseq)
+ {
+ if(ctrl->clickmclick.cmdseq)
+ g_string_assign(ctrl->clickmclick.cmdseq, cmdseq);
+ else
+ ctrl->clickmclick.cmdseq = g_string_new(cmdseq);
+ }
+ else if(ctrl->clickmclick.cmdseq)
+ {
+ g_string_free(ctrl->clickmclick.cmdseq, TRUE);
+ ctrl->clickmclick.cmdseq = NULL;
+ }
+}
+
+const gchar * ctrl_clickmclick_get_cmdseq(const CtrlInfo *ctrl)
+{
+ return ctrl ? ctrl->clickmclick.cmdseq ? ctrl->clickmclick.cmdseq->str : 0 : 0;
+}
+
+void ctrl_clickmclick_set_delay(CtrlInfo *ctrl, gfloat delay)
+{
+ ctrl->clickmclick.delay = delay;
+}
+
+gfloat ctrl_clickmclick_get_delay(const CtrlInfo *ctrl)
+{
+ return ctrl ? ctrl->clickmclick.delay : 0.0f;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2004-04-26 - Clear away all general command definitions. */
+void ctrl_general_clear(CtrlInfo *ctrl)
+{
+ if(ctrl == NULL || ctrl->general == NULL)
+ return;
+ g_hash_table_foreach_remove(ctrl->general, general_remove, NULL);
+}
+
+/* 2004-04-19 - Store a new general command sequence. */
+void ctrl_general_set_cmdseq(CtrlInfo *ctrl, const gchar *context, const gchar *cmdseq)
+{
+ CtrlGen *cg;
+
+ if(ctrl == NULL)
+ return;
+ if(ctrl->general == NULL)
+ ctrl->general = g_hash_table_new(g_str_hash, g_str_equal);
+ cg = g_hash_table_lookup(ctrl->general, context);
+ if(cg == NULL)
+ {
+ cg = g_malloc(sizeof *cg);
+ g_snprintf(cg->context, sizeof cg->context, "%s", context);
+ cg->cmdseq = g_string_new("");
+ g_hash_table_insert(ctrl->general, cg->context, cg);
+ }
+ if(cmdseq != NULL)
+ g_string_assign(cg->cmdseq, cmdseq);
+ else
+ general_remove(cg->context, cg, ctrl);
+}
+
+static void general_prepend(gpointer key, gpointer data, gpointer user)
+{
+ GSList **list = user;
+
+ *list = g_slist_prepend(*list, key);
+}
+
+/* 2004-04-25 - Return list of contexts, i.e. char pointers. They are constants. */
+GSList * ctrl_general_get_contexts(const CtrlInfo *ctrl)
+{
+ GSList *list = NULL;
+
+ if(ctrl != NULL && ctrl->general != NULL)
+ g_hash_table_foreach(ctrl->general, general_prepend, &list);
+ return list;
+}
+
+/* 2004-04-19 - Retrieve general command sequence. */
+const gchar * ctrl_general_get_cmdseq(const CtrlInfo *ctrl, const gchar *context)
+{
+ const CtrlGen *cg;
+
+ if(ctrl == NULL || ctrl->general == NULL)
+ return NULL;
+ cg = g_hash_table_lookup(ctrl->general, context);
+ if(cg == NULL)
+ return NULL;
+ return cg->cmdseq != NULL ? cg->cmdseq->str : NULL;
+}
diff --git a/src/controls.h b/src/controls.h
new file mode 100644
index 0000000..6f92a4c
--- /dev/null
+++ b/src/controls.h
@@ -0,0 +1,71 @@
+/*
+** 1999-03-16 - Header for the controls module. The use of opaque object-like data structures
+** is spreading rapidly across gentoo, and old proponents of a centralized-data
+** architecture are simply being rolled over. Or something.
+*/
+
+#if !defined CONTROLS_H
+#define CONTROLS_H
+
+typedef struct CtrlInfo CtrlInfo;
+typedef struct CtrlKey CtrlKey;
+typedef struct CtrlMouse CtrlMouse;
+
+/* Functions for creating, copying, and destroying CtrlInfos. */
+CtrlInfo * ctrl_new(MainInfo *min);
+CtrlInfo * ctrl_new_default(MainInfo *min);
+CtrlInfo * ctrl_copy(CtrlInfo *ctrl);
+void ctrl_destroy(CtrlInfo *ctrl);
+
+/* Functions to allow/disallow numlock's influence on bound commands.
+** Does not change the actual binding, only controls if the numlock
+** part of an eventual binding is respected or not.
+*/
+void ctrl_numlock_ignore_set(CtrlInfo *ctrl, gboolean ignore);
+gboolean ctrl_numlock_ignore_get(CtrlInfo *ctrl);
+
+/* Functions for working with individual keyboard bindings. */
+CtrlKey * ctrl_key_add(CtrlInfo *ctrl, const gchar *keyname, const gchar *cmdseq);
+CtrlKey * ctrl_key_add_unique(CtrlInfo *ctrl);
+void ctrl_key_remove(CtrlInfo *ctrl, CtrlKey *key);
+void ctrl_key_remove_by_name(CtrlInfo *ctrl, const gchar *keyname);
+void ctrl_key_remove_all(CtrlInfo *ctrl);
+const gchar * ctrl_key_get_keyname(const CtrlKey *key);
+const gchar * ctrl_key_get_cmdseq(const CtrlKey *key);
+void ctrl_key_set_keyname(CtrlInfo *ctrl, CtrlKey *key, const gchar *keyname);
+void ctrl_key_set_cmdseq(CtrlInfo *ctrl, CtrlKey *key, const gchar *cmdseq);
+gboolean ctrl_key_has_cmdseq(CtrlInfo *ctrl, CtrlKey *key, const gchar *cmdseq);
+
+/* These functions work on *all* key bindings. */
+void ctrl_keys_install(CtrlInfo *ctrl, KbdContext *ctx);
+void ctrl_keys_uninstall(CtrlInfo *ctrl, KbdContext *ctx);
+void ctrl_keys_uninstall_all(CtrlInfo *ctrl);
+GSList * ctrl_keys_get_list(CtrlInfo *ctrl);
+
+/* Functions to add, remove, and manipulate mouse button bindings. */
+CtrlMouse * ctrl_mouse_add(CtrlInfo *ctrl, guint button, guint state, const gchar *cmdseq);
+void ctrl_mouse_set_button(CtrlMouse *mouse, guint state);
+void ctrl_mouse_set_state(CtrlMouse *mouse, guint state);
+void ctrl_mouse_set_cmdseq(CtrlMouse *mouse, const gchar *cmdseq);
+guint ctrl_mouse_get_button(const CtrlMouse *mouse);
+guint ctrl_mouse_get_state(const CtrlMouse *mouse);
+const gchar * ctrl_mouse_get_cmdseq(const CtrlMouse *mouse);
+void ctrl_mouse_remove(CtrlInfo *ctrl, CtrlMouse *mouse);
+void ctrl_mouse_remove_all(CtrlInfo *ctrl);
+const gchar * ctrl_mouse_map(CtrlInfo *ctrl, GdkEventButton *evt);
+GSList * ctrl_mouse_get_list(CtrlInfo *ctrl);
+gboolean ctrl_mouse_ambiguity_exists(const CtrlInfo *ctrl);
+
+/* Functions for assigning a command to Click-M-Click, which is kind of a simple gesture. */
+void ctrl_clickmclick_set_cmdseq(CtrlInfo *ctrl, const gchar *cmdseq);
+const gchar * ctrl_clickmclick_get_cmdseq(const CtrlInfo *ctrl);
+void ctrl_clickmclick_set_delay(CtrlInfo *ctrl, gfloat delay);
+gfloat ctrl_clickmclick_get_delay(const CtrlInfo *ctrl);
+
+/* Functions for general commands, associated with some context. */
+void ctrl_general_clear(CtrlInfo *ctrl);
+void ctrl_general_set_cmdseq(CtrlInfo *ctrl, const gchar *context, const gchar *cmdseq);
+const gchar * ctrl_general_get_cmdseq(const CtrlInfo *ctrl, const gchar *context);
+GSList * ctrl_general_get_contexts(const CtrlInfo *ctrl);
+
+#endif /* CONTROLS_H */
diff --git a/src/convstream.c b/src/convstream.c
new file mode 100644
index 0000000..d226c93
--- /dev/null
+++ b/src/convstream.c
@@ -0,0 +1,150 @@
+/*
+** 2010-07-09 - A wrapper on top of glib's iconv wrapper (!) to make it easier to deal with reading
+** streams of text, in an initially unknown encoding.
+*/
+
+#include "gentoo.h"
+
+#include "convstream.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct ConvStream
+{
+ gchar *buffer; /* Base pointer, constant. */
+ gsize size; /* Allocated size, from constructor. */
+ gsize used; /* Currently occupied bytes, at beginning. */
+
+ gchar *out;
+ gsize outsize;
+
+ gchar *encoding; /* Debugging hang-around. */
+ gboolean pass_through; /* If the input encoding is UTF-8, do less work. */
+ GIConv iconv;
+
+ ConvSink sink;
+ gpointer user;
+
+ gboolean failed;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+const gchar * convstream_get_default_encoding(void)
+{
+ const gchar *enc;
+
+ g_get_charset(&enc);
+
+ return enc;
+}
+
+const gchar * convstream_get_target_encoding(void)
+{
+ return "UTF-8";
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+ConvStream * convstream_new(const gchar *encoding, gsize buffer, ConvSink sink, gpointer user)
+{
+ ConvStream *cs;
+ gsize len;
+
+ if(sink == NULL)
+ return NULL;
+
+ /* If nobody gave us an encoding, use the system's default. */
+ if(encoding == NULL)
+ encoding = convstream_get_default_encoding();
+
+ len = strlen(encoding);
+
+ cs = g_malloc(sizeof *cs + (2 * buffer) + (len + 1));
+
+ cs->buffer = (gchar *) (cs + 1);
+ cs->size = buffer;
+ cs->used = 0;
+ cs->out = (gchar *) (cs->buffer + cs->size);
+ cs->outsize = cs->size;
+
+ cs->encoding = (cs->out + cs->outsize);
+ strcpy(cs->encoding, encoding);
+ cs->pass_through = strcmp(cs->encoding, convstream_get_target_encoding()) == 0;
+
+ if(!cs->pass_through)
+ {
+ cs->iconv = g_iconv_open(convstream_get_target_encoding(), cs->encoding);
+ if(cs->iconv == (GIConv) -1)
+ {
+ fprintf(stderr, "**Failed to create GIConv for encoding '%s', can't convert text\n", cs->encoding);
+ g_free(cs);
+ return NULL;
+ }
+ }
+ else
+ cs->iconv = (GIConv) -1;
+
+ cs->sink = sink;
+ cs->user = user;
+ cs->failed = FALSE;
+
+ return cs;
+}
+
+void convstream_source(ConvStream *cs, const gchar *text, gsize length)
+{
+ if(cs == NULL || text == NULL || length == 0)
+ return;
+
+ while(!cs->failed && (length > 0 || cs->used != 0))
+ {
+ gsize max = cs->size - cs->used;
+ gsize chunk = length > max ? max : length, count;
+ gchar *in, *out;
+
+ /* Copy the chunk into the buffer, concatening it with any existing content. */
+ memcpy(cs->buffer + cs->used, text, chunk);
+ text += chunk;
+ cs->used += chunk;
+ length -= chunk;
+
+ /* In pass-through mode (input is already UTF-8), validate to handle chunking. */
+ if(cs->pass_through)
+ {
+ g_utf8_validate(cs->buffer, cs->used, (const gchar **) &in);
+ count = in - cs->buffer;
+ if(count == 0)
+ {
+ cs->sink(cs->encoding, 0, cs->user);
+ cs->failed = TRUE;
+ break;
+ }
+ cs->sink(cs->buffer, count, cs->user);
+ cs->used -= count;
+ }
+ else
+ {
+ /* Try to convert the resulting bunch of bytes. */
+ in = cs->buffer;
+ out = cs->out;
+ count = cs->outsize;
+ g_iconv(cs->iconv, &in, &cs->used, &out, &count);
+ /* If we got some output bytes, sink them. */
+ if(count < cs->outsize)
+ cs->sink(cs->out, cs->outsize - count, cs->user);
+ }
+ /* Copy any remaining input bytes back down to the start of the buffer. */
+ if(cs->used != 0)
+ memmove(cs->buffer, in, cs->used);
+ }
+}
+
+void convstream_destroy(ConvStream *cs)
+{
+ if(cs == NULL)
+ return;
+ if(cs->iconv != (GIConv) - 1)
+ g_iconv_close(cs->iconv);
+ g_free(cs);
+}
diff --git a/src/convstream.h b/src/convstream.h
new file mode 100644
index 0000000..39cb25b
--- /dev/null
+++ b/src/convstream.h
@@ -0,0 +1,20 @@
+/*
+** 2010-07-09 - Convert a stream of text from a given encoding, into UTF-8. The idea is to make it easier to
+** implement support for various encodings in the text reader, by letting the user specify. To
+** auto-detect encodings is deemed Too Hard to be in gentoo's scope.
+*/
+
+/* Fashionably opaque. */
+typedef struct ConvStream ConvStream;
+
+/* Magical semantics:
+** If length == 0, conversion has failed and text will be the name of the expected input encoding.
+*/
+typedef void (*ConvSink)(const gchar *text, gsize length, gpointer user);
+
+extern const gchar * convstream_get_default_encoding(void);
+extern const gchar * convstream_get_target_encoding(void);
+
+extern ConvStream * convstream_new(const gchar *encoding, gsize buffer, ConvSink sink, gpointer user);
+extern void convstream_source(ConvStream *cs, const gchar *source, gsize length);
+extern void convstream_destroy(ConvStream *cs);
diff --git a/src/dialog.c b/src/dialog.c
new file mode 100644
index 0000000..15cd786
--- /dev/null
+++ b/src/dialog.c
@@ -0,0 +1,321 @@
+/*
+** 1999-03-13 - A (new) module for dealing with user dialogs. The old one was written during
+** my first week of GTK+ programming (back in May 1998, if you really care), and
+** that had started to show a little too much. Hopefully, this is cleaner.
+** 1999-06-19 - Since the initial cleanliness quickly wore down due to (I guess) bad design,
+** I did a complete rewrite and redesign. This new shiny version features clear
+** separation of dialogs into synchronous and asynchronous versions. The former
+** are way (way) more useful.
+** 2002-02-08 - Added window grouping. Very nice, keeps the number of icons in Window Maker
+** down. :)
+*/
+
+#include "gentoo.h"
+
+#include <stdio.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "dialog.h"
+#include "window.h"
+
+struct Dialog {
+ GtkWidget *dlg; /* The GtkDialog widget used to display the dialog. */
+ gint last_button;
+ gint button;
+ DlgAsyncFunc func; /* Used in asynchronous dialogs only. */
+ gpointer user; /* This, too. */
+ gboolean stay_open; /* This, on the other hand, only for synchronous ones. */
+};
+
+static struct {
+ GtkWindow *main_window;
+ GdkWindow *group_window;
+ GtkWindowPosition window_pos;
+} the_state;
+
+#define DLG_BUTTON_SIZE (32) /* Max length of a single button label. */
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-02-08 - Set the module's internal group pointer. All dialogs have their windows
+** set as being part of the group defined by that window. Very handy.
+*/
+void dlg_group_set(GdkWindow *group_window)
+{
+ the_state.group_window = group_window;
+}
+
+void dlg_position_set(GtkWindowPosition pos)
+{
+ the_state.window_pos = pos;
+}
+
+/* 2009-03-25 - Sets the main window, all dialogs are then made transient to this window.
+** I think this replaces the "group" concept used with GDK windows.
+*/
+void dlg_main_window_set(GtkWindow *win)
+{
+ the_state.main_window = win;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2004-11-22 - Add buttons by splitting <buttons> on vertical bar (pipe) character. Far simpler
+ * than when using GTK+ 1.2, keyboard acceleration now done by GtkDialog.
+*/
+static gint add_buttons(GtkWidget *dlg, const char *buttons)
+{
+ gchar label[DLG_BUTTON_SIZE], *ptr;
+ gint response = 0;
+
+ while(*buttons)
+ {
+ for(ptr = label; (ptr - label) < (sizeof label - 1) && *buttons && *buttons != '|';)
+ *ptr++ = *buttons++;
+ *ptr = '\0';
+ if(*buttons == '|')
+ buttons++;
+ gtk_dialog_add_button(GTK_DIALOG(dlg), label, response++);
+ }
+ return response - 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-19 - Close dialog down in response to some event, and report it as if button <button> was clicked. */
+static void sync_close(Dialog *dlg, gint button)
+{
+ dlg->button = button;
+ if(!dlg->stay_open)
+ gtk_widget_hide(dlg->dlg);
+}
+
+/* 2004-11-22 - Response-handler for synchronous dialog. */
+static void evt_sync_response(GtkWidget *wid, gint response, void *user)
+{
+ sync_close(user, response >= 0 ? response : -1);
+}
+
+/* 2004-11-22 - Keyboard handler, so we can cancel through Escape. */
+static gboolean evt_sync_key_pressed(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ Dialog *dlg = user;
+
+ if(evt->keyval == GDK_KEY_Escape)
+ gtk_dialog_response(GTK_DIALOG(dlg->dlg), dlg->last_button);
+ else
+ return FALSE;
+ return TRUE;
+}
+
+/* 1999-06-19 - Create a new, synchronous dialog box. Creates and initializes the auxilary data as well as the
+** actual dialog window, with action buttons and stuff. Note that this window, when displayed by
+** dlg_dialog_sync_wait(), will be modal, and hang around (at least in memory) until you call
+** dlg_dialog_sync_destroy().
+*/
+Dialog * dlg_dialog_sync_new(GtkWidget *body, const gchar *title, const gchar *buttons)
+{
+ Dialog *dlg;
+
+ if(buttons == NULL)
+ buttons = _("_OK|_Cancel");
+
+ dlg = g_malloc(sizeof *dlg);
+ dlg->dlg = win_dialog_open(GTK_WIDGET(the_state.main_window));
+ gtk_window_set_position(GTK_WINDOW(dlg->dlg), the_state.window_pos);
+ g_signal_connect(G_OBJECT(dlg->dlg), "key_press_event", G_CALLBACK(evt_sync_key_pressed), dlg);
+ g_signal_connect(G_OBJECT(dlg->dlg), "response", G_CALLBACK(evt_sync_response), dlg);
+ dlg->stay_open = FALSE;
+ if(title != NULL)
+ win_window_set_title(GTK_WIDGET(dlg->dlg), title);
+
+ if(body != NULL)
+ {
+ GtkWidget *vbox;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
+ gtk_box_pack_start(GTK_BOX(vbox), body, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg->dlg))), vbox, TRUE, TRUE, 0);
+ }
+ dlg->last_button = add_buttons(dlg->dlg, buttons);
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg->dlg), 0);
+
+ return dlg;
+}
+
+/* 1999-06-19 - Create a synchronous dialog whose body is a plain text label. Extremely sugary. */
+Dialog * dlg_dialog_sync_new_simple(const gchar *body, const gchar *title, const gchar *buttons)
+{
+ return dlg_dialog_sync_new(gtk_label_new(body), title, buttons);
+}
+
+/* 1999-06-19 - This (bulkily-named) function is very handy for simple confirm dialogs. */
+gint dlg_dialog_sync_new_simple_wait(const gchar *body, const gchar *title, const gchar *buttons)
+{
+ Dialog *dlg;
+ gint ret;
+
+ dlg = dlg_dialog_sync_new_simple(body, title, buttons);
+ ret = dlg_dialog_sync_wait(dlg);
+ dlg_dialog_sync_destroy(dlg);
+
+ return ret;
+}
+
+/* 2002-08-20 - Make the dialog stay open until destroyed. Used only by the generic command module,
+** but on the other hand that module is kind of important.
+*/
+void dlg_dialog_sync_stay_open(Dialog *dlg)
+{
+ dlg->stay_open = TRUE;
+}
+
+/* 1999-06-19 - Display a previously created dialog, and wait for the user to click one of its buttons. Then
+** return the index (counting from zero which is the leftmost button) of the button that was
+** clicked.
+*/
+gint dlg_dialog_sync_wait(Dialog *dlg)
+{
+ if(dlg != NULL)
+ {
+ gtk_widget_show_all(dlg->dlg);
+ gtk_dialog_run(GTK_DIALOG(dlg->dlg));
+ return dlg->button;
+ }
+ return -1;
+}
+
+/* 1999-06-19 - Close a synchronous dialog as if <button> was clicked. */
+void dlg_dialog_sync_close(Dialog *dlg, gint button)
+{
+ if(dlg != NULL)
+ sync_close(dlg, button);
+}
+
+/* 1999-06-19 - Destroy a synchronous dialog. Don't expect to be able to access body widgets after calling this. */
+void dlg_dialog_sync_destroy(Dialog *dlg)
+{
+ gtk_widget_destroy(dlg->dlg);
+
+ g_free(dlg);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-19 - Execute the close-down policy of the asynchronous dialog. */
+static void async_close(Dialog *dlg, gint button)
+{
+ dlg->button = button;
+ if((dlg->button > -2 ) && (dlg->func != NULL))
+ dlg->func(dlg->button, dlg->user);
+ gtk_widget_destroy(dlg->dlg);
+ g_free(dlg);
+}
+
+/* 1999-06-19 - User pressed a key in an asynchronous dialog. */
+static gboolean evt_async_key_pressed(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ Dialog *dlg = user;
+
+ if(evt->keyval == GDK_KEY_Escape)
+ {
+ async_close(dlg, dlg->last_button);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1999-06-19 - User clicked one of the action buttons in an asynchronous dialog. */
+static void evt_async_response(GtkWidget *wid, gint response, gpointer user)
+{
+ async_close(user, response > 0 ? response : -1);
+}
+
+/* 1999-06-19 - Create, and immediately display, an asynchronous dialog. The supplied callback will be called
+** as the user clicks a button (or closes the window). At that point, the dialog (and any user-
+** supplied body widgets) are still around.
+*/
+Dialog * dlg_dialog_async_new(GtkWidget *body, const gchar *title, const gchar *buttons, DlgAsyncFunc func, gpointer user)
+{
+ Dialog *dlg;
+ GtkBox *carea;
+
+ if(buttons == NULL)
+ buttons = _("_OK|_Cancel");
+
+ dlg = g_malloc(sizeof *dlg);
+ dlg->func = func;
+ dlg->user = user;
+ dlg->dlg = win_dialog_open(GTK_WIDGET(the_state.main_window));
+ gtk_window_set_position(&GTK_DIALOG(dlg->dlg)->window, the_state.window_pos);
+ g_signal_connect(G_OBJECT(dlg->dlg), "key_press_event", G_CALLBACK(evt_async_key_pressed), dlg);
+ g_signal_connect(G_OBJECT(dlg->dlg), "response", G_CALLBACK(evt_async_response), dlg);
+ if(title != NULL)
+ win_window_set_title(GTK_WIDGET(&GTK_DIALOG(dlg->dlg)->window), title);
+ carea = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dlg->dlg)));
+ gtk_container_set_border_width(GTK_CONTAINER(carea), 5);
+ gtk_box_pack_start(carea, body, TRUE, TRUE, 0);
+ dlg->last_button = add_buttons(dlg->dlg, buttons);
+ gtk_widget_show_all(dlg->dlg);
+
+ return dlg;
+}
+
+/* 1999-06-19 - A simple sugary wrapper for text-only dialogs. */
+Dialog * dlg_dialog_async_new_simple(const gchar *body, const gchar *title, const gchar *buttons, DlgAsyncFunc func, gpointer user)
+{
+ return dlg_dialog_async_new(gtk_label_new(body), title, buttons, func, user);
+}
+
+/* 1999-06-19 - Provide a simple error reporting dialog. */
+Dialog * dlg_dialog_async_new_error(const gchar *body)
+{
+ return dlg_dialog_async_new_simple(body, _("Error"), _("OK"), NULL, NULL);
+}
+
+/* 1999-06-19 - Close an asynchronous dialog, as if button <button> was clicked. */
+void dlg_dialog_async_close(Dialog *dlg, gint button)
+{
+ async_close(dlg, button);
+}
+
+/* 1999-06-19 - Close an asynchronous dialog, but do not call the user's callback. */
+void dlg_dialog_async_close_silent(Dialog *dlg)
+{
+ async_close(dlg, -2);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-09-28 - Return the GtkDialog, which can be useful sometimes. */
+GtkDialog * dlg_dialog_get_dialog(const Dialog *dlg)
+{
+ return dlg != NULL ? GTK_DIALOG(dlg->dlg) : NULL;
+}
+
+static void evt_entry_changed(GtkWidget *entry, gpointer user)
+{
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
+
+ dlg_dialog_set_positive_enabled(user, *text != '\0');
+}
+
+/* 2010-06-13 - Make the dialog track the state of a GtkEntry, and only enable the "OK" button if entry is non-empty. */
+void dlg_dialog_track_entry(Dialog *dlg, GtkWidget *entry)
+{
+ if(dlg == NULL)
+ return;
+ g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(evt_entry_changed), dlg);
+ /* Make sure it's synchronized initially, too. */
+ evt_entry_changed(entry, dlg);
+}
+
+/* 2010-09-05 - Happy birthday, me! Enable/disable the "positive" (=OK) button on the fly. */
+void dlg_dialog_set_positive_enabled(Dialog *dlg, gboolean enabled)
+{
+ if(dlg == NULL)
+ return;
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(dlg->dlg), DLG_POSITIVE, enabled);
+}
diff --git a/src/dialog.h b/src/dialog.h
new file mode 100644
index 0000000..0b35346
--- /dev/null
+++ b/src/dialog.h
@@ -0,0 +1,45 @@
+/*
+** 1999-06-19 - Dialog module header. Lean & mean, hopefully.
+*/
+
+#if !defined DIALOG_H
+#define DIALOG_H
+
+#include "config.h"
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define DLG_POSITIVE (0)
+
+typedef struct Dialog Dialog;
+
+typedef void (*DlgAsyncFunc)(gint button, gpointer user);
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern void dlg_group_set(GdkWindow *group_window);
+extern void dlg_main_window_set(GtkWindow *win);
+extern void dlg_position_set(GtkWindowPosition pos);
+
+extern Dialog * dlg_dialog_sync_new(GtkWidget *body, const gchar *title, const gchar *buttons);
+extern Dialog * dlg_dialog_sync_new_simple(const gchar *body, const gchar *title, const gchar *buttons);
+extern gint dlg_dialog_sync_new_simple_wait(const gchar *body, const gchar *title, const gchar *buttons);
+extern void dlg_dialog_sync_stay_open(Dialog *dlg);
+extern gint dlg_dialog_sync_wait(Dialog *dlg);
+extern void dlg_dialog_sync_close(Dialog *dlg, gint button);
+extern void dlg_dialog_sync_destroy(Dialog *dlg);
+
+extern Dialog * dlg_dialog_async_new(GtkWidget *body, const gchar *title, const gchar *buttons, DlgAsyncFunc func, gpointer user);
+extern Dialog * dlg_dialog_async_new_simple(const gchar *body, const gchar *title, const gchar *buttons, DlgAsyncFunc func, gpointer user);
+extern Dialog * dlg_dialog_async_new_error(const gchar *body);
+extern void dlg_dialog_async_close(Dialog *dlg, gint button);
+extern void dlg_dialog_async_close_silent(Dialog *dlg);
+
+extern GtkDialog* dlg_dialog_get_dialog(const Dialog *dlg);
+extern void dlg_dialog_track_entry(Dialog *dlg, GtkWidget *entry);
+extern void dlg_dialog_set_positive_enabled(Dialog *dlg, gboolean enabled);
+
+#endif /* DIALOG_H */
diff --git a/src/dirhistory.c b/src/dirhistory.c
new file mode 100644
index 0000000..f11e9d0
--- /dev/null
+++ b/src/dirhistory.c
@@ -0,0 +1,488 @@
+/*
+** 1998-11-26 - A neat little module to manage directory histories in the panes. Initially, this
+** will just remember the actual paths, but future versions might include storing
+** info about selected files, sizes, and so on...
+** 1998-12-06 - Rewritten after a suggestion from J. Hanson (<johan@tiq.com>), to simply hash on
+** the inode numbers rather than the file names. Should reduce time and memory complex-
+** ities by a whole lot.
+** 1998-12-15 - Now stores the vertical position in a relative way, rather than using absolute pixel
+** coordinates. Not good, but better.
+** 1998-12-23 - Eh. Inode numbers are _not_ unique across devices (which might be why there's
+** a st_dev field in the stat structure). This of course makes them a bad choice
+** for unique file identifiers - when buffering a directory containing inodes from
+** various devices (such as / typically does), things went really haywire. To fix
+** this, we now store the device identifier too. The pair (device,inode) really should
+** be unique.
+** 1999-09-05 - Cut away the fancy browser-esque history system implemented for 0.11.8, since it wasn't
+** complete, and I didn't like it much. Going back to a simple combo as before.
+** 1999-11-13 - Prettied up handling of vertical position remembering somewhat, exported it separately.
+** 2002-08-09 - DHEntries can't be keyed on inode, since that can be fooled by deleting a directory,
+** and then creating a new (differently named) one. The filesystem can re-use the inode.
+** 2008-01-26 - Adapted to keep a separate UTF-8 copy of the path names, for GTK+ 2. Ugly, needs to
+** be way better. Later? Heh.
+** 2010-02-09 - Again, adapted to work with GIO. Assume less, use thicker gloves. Smooth.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "cmdseq.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "strutil.h"
+#include "xmlutil.h"
+
+#include "dirhistory.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define HISTORY_SIZE (16) /* Maximum number of items in history. Should this be dynamic? */
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* This is used to store the selected files in a pane, and nothing else. */
+struct DHSel {
+ GHashTable *hash; /* It's a hash of display file names, for fast apply(). */
+ GStringChunk *chunk; /* All keys in the hash are stored here. */
+};
+
+/* Info about a single remembered directory. The 'hist' field of dirpanes stores a list of these. */
+typedef struct {
+ gchar *parse_name; /* The (VFs-friendly) "parse name" of the remembered directory. */
+ gfloat vpos; /* Vertical position. */
+ DHSel sel; /* Selection, inlined but empty by default. */
+} DHEntry;
+
+struct DirHistory {
+ GList *history; /* Visited directories. Recent are close to head. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* This is just a ballpark, for the average name of a GIO "parse name". Not critical. */
+static const gsize NAME_LENGTH_AVERAGE = 64;
+
+static void dirsel_new_in_place(DHSel *sel);
+static void dirsel_set(DHSel *sel, const DirPane *dp);
+static void dirsel_clear(DHSel *sel);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-08 - Create a new dirpane history structure. */
+DirHistory * dph_dirhistory_new(void)
+{
+ DirHistory *dh;
+
+ dh = g_malloc(sizeof *dh);
+ dh->history = NULL;
+
+ return dh;
+}
+
+/* 2004-02-25 - Get the entry with the given <index>, where 0 is the index of the most recent one. */
+const gchar * dph_dirhistory_get_entry(const DirHistory *dh, guint index)
+{
+ if(dh != NULL)
+ {
+ const DHEntry *dhe = g_list_nth_data(dh->history, index);
+ if(dhe != NULL)
+ return dhe->parse_name;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-05 - Create a new empty DHEntry structure. */
+static DHEntry * dhentry_new(void)
+{
+ DHEntry *data;
+
+ data = g_malloc(sizeof *data);
+ data->parse_name = NULL;
+ data->vpos = 0.f;
+ /* Lazily assume there will be no actual selection to store. */
+ data->sel.hash = NULL;
+ data->sel.chunk = NULL;
+
+ return data;
+}
+
+static void dhentry_root_set(DHEntry *dhe, GFile *root)
+{
+ if(dhe == NULL || root == NULL)
+ return;
+ if(dhe->parse_name != NULL)
+ g_free(dhe->parse_name);
+ dhe->parse_name = g_file_get_parse_name(root);
+}
+
+/* 1999-06-09 - Update <dhe> to mimic state of <dp>. */
+static void dhentry_update(DHEntry *dhe, const DirPane *dp)
+{
+ if(dp->main->cfg.dp_history.select)
+ {
+ if(dhe->sel.hash == NULL)
+ dirsel_new_in_place(&dhe->sel);
+ dirsel_set(&dhe->sel, dp);
+ }
+ else
+ dirsel_clear(&dhe->sel);
+ dhe->vpos = dph_vpos_get(dp);
+}
+
+/* 1999-06-09 - Apply state conserved in <dhe> to the rows of <dp>. */
+static void dhentry_apply(const DHEntry *dhe, DirPane *dp)
+{
+ dph_dirsel_apply(dp, &dhe->sel);
+ dph_vpos_set(dp, dhe->vpos);
+}
+
+/* 1999-06-06 - Destroy a directory history entry. */
+static void dhentry_destroy(DHEntry *dh)
+{
+ if(dh->sel.hash != NULL)
+ {
+ g_hash_table_destroy(dh->sel.hash);
+ g_string_chunk_free(dh->sel.chunk);
+ }
+ g_free(dh);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-05 - Create a new empty selection. */
+static void dirsel_new_in_place(DHSel *sel)
+{
+ if(sel == NULL)
+ return;
+
+ sel->hash = g_hash_table_new(g_str_hash, g_str_equal);
+ sel->chunk = g_string_chunk_new(NAME_LENGTH_AVERAGE);
+}
+
+static void dirsel_clear(DHSel *sel)
+{
+ if((sel == NULL) || (sel->hash == NULL))
+ return;
+ g_hash_table_remove_all(sel->hash);
+ g_string_chunk_clear(sel->chunk);
+}
+
+/* 1999-03-05 - Given an <sel> structure, replace selection with that of <dp>.
+** 2010-02-09 - Significant edits for GIO-adapted data structures.
+*/
+static void dirsel_set(DHSel *sel, const DirPane *dp)
+{
+ GSList *slist;
+
+ /* Always clear; if there is no selection clearing is what we want. */
+ dirsel_clear(sel);
+ if((slist = dp_get_selection_full(dp)) != NULL)
+ {
+ const GSList *iter;
+ GtkTreeModel *model = dp_get_tree_model(dp);
+ gsize count = 0, length = 0;
+
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ const gchar *name = dp_row_get_name_display(model, iter->data);
+ gchar *key;
+
+ key = g_string_chunk_insert(sel->chunk, name);
+ g_hash_table_insert(sel->hash, key, key); /* *Value* is returned on lookup!! */
+ length += strlen(key);
+ count++;
+ }
+ dp_free_selection(slist);
+ }
+}
+
+/* 1999-03-05 - This returns an opaque representation of all selected rows of <dp>. The
+** selection is not related to the order in which these rows are displayed
+** in the pane, so it's handy to use before e.g. resorting the pane.
+** 2010-02-09 - Changed around a bit to match the new definition of DHSel. No longer OK
+** to return NULL to represent "no selection".
+*/
+DHSel * dph_dirsel_new(DirPane *dp)
+{
+ DHSel *sel;
+
+ sel = g_malloc(sizeof *sel);
+ dirsel_new_in_place(sel);
+ dirsel_set(sel, dp);
+
+ return sel;
+}
+
+/* 1999-03-05 - Apply given given <sel> selection to <dp>, making those rows selected
+** again. <dp> need not be the same as when the selection was created,
+** and it need not have the same contents. This is not terribly efficient,
+** but I think it'll be OK.
+*/
+void dph_dirsel_apply(DirPane *dp, const DHSel *sel)
+{
+ GtkTreeModel *model;
+ DirRow2 iter;
+
+ if((sel == NULL) || (sel->hash == NULL))
+ return;
+
+ model = dp_get_tree_model(dp);
+ if(gtk_tree_model_get_iter_first(model, &iter))
+ {
+ do
+ {
+ const gchar *name;
+
+ name = dp_row_get_name(model, &iter);
+ if(g_hash_table_lookup(sel->hash, name) != NULL)
+ dp_select(dp, &iter);
+ } while(gtk_tree_model_iter_next(model, &iter));
+ }
+}
+
+/* 1999-03-05 - Destroy a selection, this is handy when you're done with it (like after
+** having applied it).
+*/
+void dph_dirsel_destroy(DHSel *sel)
+{
+ if(sel == NULL)
+ return;
+
+ if(sel->hash != NULL)
+ {
+ g_hash_table_destroy(sel->hash);
+ g_string_chunk_free(sel->chunk);
+ }
+ g_free(sel);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-11-13 - Return a floating-point number that somehow encodes the vertical position of
+** the given pane. The only use for that number is to pass it to dph_vpos_set().
+*/
+gfloat dph_vpos_get(const DirPane *dp)
+{
+ GtkAdjustment *adj;
+
+ if((adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(dp->scwin))) != NULL)
+ return gtk_adjustment_get_value(adj);
+ return -1.0f;
+}
+
+/* 1999-11-13 - Set the given pane's vertical position to resemble what is was when <vpos>
+** was returned by dph_vpos_get().
+*/
+void dph_vpos_set(DirPane *dp, gfloat vpos)
+{
+ GtkAdjustment *adj;
+
+ if((vpos >= 0.0f) && (adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(dp->scwin))) != NULL)
+ gtk_adjustment_set_value(adj, vpos);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-06-13 - A new way to look at history handling. For the, like, third time or so. Anyway,
+** this should just save the state of <dp>. This means the pane should already be
+** displaying a directory.
+*/
+void dph_state_save(DirPane *dp)
+{
+ gchar *name;
+
+ if(dp->dir.root == NULL)
+ return;
+
+ name = g_file_get_parse_name(dp->dir.root);
+ if(name == NULL)
+ return;
+
+ if((dp->hist->history == NULL) || strcmp(name, ((DHEntry *) dp->hist->history->data)->parse_name))
+ {
+ dp->hist->history = g_list_prepend(dp->hist->history, dhentry_new());
+ dhentry_root_set(dp->hist->history->data, dp->dir.root);
+ }
+ dhentry_update(dp->hist->history->data, dp);
+ g_free(name);
+}
+
+/* 2002-06-13 - Other half of the third-generation history interface. This restores any saved
+** state for the directory currently shown by <dp>.
+*/
+void dph_state_restore(DirPane *dp)
+{
+ GList *iter;
+ gchar *name;
+ DHEntry *entry;
+
+ /* Search for key matching current dir in history. */
+ if((name = g_file_get_parse_name(dp->dir.root)) == NULL)
+ return;
+ for(iter = dp->hist->history, entry = NULL; iter != NULL; iter = g_list_next(iter))
+ {
+ entry = iter->data;
+ if(strcmp(name, entry->parse_name) == 0)
+ break;
+ }
+ g_free(name);
+
+ if(iter != NULL)
+ {
+ dhentry_apply(entry, dp);
+ if(g_list_previous(iter) != NULL)
+ {
+ dp->hist->history = g_list_remove_link(dp->hist->history, iter);
+ g_list_free_1(iter);
+ dp->hist->history = g_list_prepend(dp->hist->history, entry);
+ }
+ }
+ else
+ {
+ dp->hist->history = g_list_prepend(dp->hist->history, dhentry_new());
+ dhentry_root_set(dp->hist->history->data, dp->dir.root);
+ dhentry_apply(dp->hist->history->data, dp);
+ /* Prune history list, if it has grown too long. */
+ if(g_list_length(dp->hist->history) > HISTORY_SIZE)
+ {
+ GList *tail, *next;
+
+ tail = g_list_nth(dp->hist->history, HISTORY_SIZE);
+ for(; tail != NULL; tail = next)
+ {
+ next = g_list_next(tail);
+ dp->hist->history = g_list_remove_link(dp->hist->history, tail);
+ dhentry_destroy(tail->data);
+ g_list_free_1(tail);
+ }
+ }
+ }
+ /* Update path history widgets. Relies on <parse_name> member being first in DHEntry. */
+ dp_history_set(dp, dp->hist->history);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-02-09 - Gets the parse name from an indirect pointer, such as those handed (in a
+** list) to dp_history_set(), above.
+*/
+const gchar * dph_entry_get_parse_name(const void *entry)
+{
+ const DHEntry * e = entry;
+
+ if(e == NULL)
+ return NULL;
+ return e->parse_name;
+}
+
+/* 2002-02-15 - Return first path from history for <dp>. */
+const gchar * dph_history_get_first(const DirPane *dp)
+{
+ if(dp->hist->history != NULL)
+ return dp->hist->history->data;
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static const gchar * history_filename(MainInfo *min)
+{
+ static gchar buffer[PATH_MAX];
+ const gchar *confdir;
+
+ if((confdir = g_get_user_config_dir()) != NULL)
+ {
+ g_snprintf(buffer, sizeof buffer, "%s" G_DIR_SEPARATOR_S PACKAGE G_DIR_SEPARATOR_S "dirhistory", confdir);
+ return buffer;
+ }
+ return NULL;
+}
+
+/* 2002-02-15 - Save contents of history lists for <num> panes, arrayed at <dp>. Weird inter-
+** face, good code. In a blatant case of code reuse, we use our trusted XML module.
+** We do not, however, reuse the main config file, but keep the histories separate.
+*/
+void dph_history_save(MainInfo *min, const DirPane *dp, gsize num)
+{
+ FILE *out;
+ gsize i;
+ GList *iter;
+
+ if((out = xml_put_open(history_filename(min))) == NULL)
+ return;
+
+ xml_put_node_open(out, "DirHistory");
+ xml_put_node_open(out, "Panes");
+ for(i = 0; i < num; i++)
+ {
+ xml_put_node_open(out, "Pane");
+ xml_put_uinteger(out, "index", i);
+ xml_put_node_open(out, "History");
+ for(iter = dp[i].hist->history; iter != NULL; iter = g_list_next(iter))
+ {
+ const DHEntry *entry = iter->data;
+
+ if(entry->parse_name[0] == '\0')
+ continue;
+ xml_put_text(out, "root", entry->parse_name);
+ }
+ xml_put_node_close(out, "History");
+ xml_put_node_close(out, "Pane");
+ }
+ xml_put_node_close(out, "Panes");
+ xml_put_node_close(out, "DirHistory");
+
+ xml_put_close(out);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void load_dir(const XmlNode *node, gpointer user)
+{
+ DirPane *dp = user;
+ const gchar *text;
+ DHEntry *ent;
+
+ if(!xml_get_text(node, "root", &text))
+ return;
+ if(text && *text == '\0')
+ return;
+ ent = dhentry_new();
+ ent->parse_name = g_strdup(text);
+ dp->hist->history = g_list_append(dp->hist->history, ent);
+}
+
+static void load_pane(const XmlNode *node, gpointer user)
+{
+ MainInfo *min = user;
+ guint index;
+
+ if(!xml_get_uinteger(node, "index", &index))
+ return;
+ if((node = xml_tree_search(node, "History")) == NULL)
+ return;
+ xml_node_visit_children(node, load_dir, min->gui->pane + index);
+}
+
+void dph_history_load(MainInfo *min, DirPane *dp, gsize num)
+{
+ XmlNode *tree;
+ const XmlNode *node;
+
+ if((tree = xml_tree_load(history_filename(min))) == NULL)
+ return;
+
+ if((node = xml_tree_search(tree, "DirHistory")) == NULL)
+ return;
+ if((node = xml_tree_search(node, "Panes")) == NULL)
+ return;
+
+ xml_node_visit_children(node, load_pane, min);
+ xml_tree_destroy(tree);
+}
diff --git a/src/dirhistory.h b/src/dirhistory.h
new file mode 100644
index 0000000..86564ab
--- /dev/null
+++ b/src/dirhistory.h
@@ -0,0 +1,36 @@
+/*
+** 1998-11-26 - Header for the directory history handling module. Mainly called from the dirpane module.
+*/
+
+#if !defined DIRHISTORY_H
+#define DIRHISTORY_H
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct DHSel DHSel;
+typedef struct DirHistory DirHistory;
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern DirHistory * dph_dirhistory_new(void);
+
+extern const gchar * dph_dirhistory_get_entry(const DirHistory *dh, guint index);
+
+extern DHSel * dph_dirsel_new(DirPane *dp);
+extern void dph_dirsel_apply(DirPane *dp, const DHSel *sel);
+extern void dph_dirsel_destroy(DHSel *sel);
+
+extern gfloat dph_vpos_get(const DirPane *dp);
+extern void dph_vpos_set(DirPane *dp, gfloat vpos);
+
+extern void dph_state_save(DirPane *dp);
+extern void dph_state_restore(DirPane *dp);
+
+extern const gchar * dph_entry_get_parse_name(const void *entry);
+
+extern const gchar * dph_history_get_first(const DirPane *dp);
+
+extern void dph_history_save(MainInfo *min, const DirPane *dp, gsize num);
+extern void dph_history_load(MainInfo *min, DirPane *dp, gsize num);
+
+#endif /* DIRHISTORY_H */
diff --git a/src/dirpane.c b/src/dirpane.c
new file mode 100644
index 0000000..10c9b48
--- /dev/null
+++ b/src/dirpane.c
@@ -0,0 +1,2154 @@
+/*
+** 1998-05-25 - The amount of code in the main module dealing with dirpanes simply got too big. Dike, dike.
+** 1998-06-08 - Redesigned sorting somewhat. Now, the information used to determine how to sort resides
+** in the configuration structure, not the individual dir pane.
+** 1998-08-02 - Fixed big performance mishap; when changing the sort mode, a full dir reread was done,
+** rather than just a (relatively quick) redisplay.
+** 1998-08-08 - Now finally supports high-speed dragging without losing lines. Great.
+** 1999-03-05 - Massive changes since we now rely on GTK+'s CList widget to handle all selection details.
+** Gives dragging, scrolling, and stuff.
+** 1999-03-14 - Opaque-ified the access to DirRow fields.
+** 1999-05-29 - Added support for symlinks. More controlled and more memory efficient than the old code.
+** 2000-04-16 - Simplified sorting code somewhat, implemented actual comparison functions for {u,g}name.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <glob.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "children.h"
+#include "cmdseq.h"
+#include "configure.h"
+#include "controls.h"
+#include "dirhistory.h"
+#include "dpformat.h"
+#include "errors.h"
+#include "events.h"
+#include "fileutil.h"
+#include "gfam.h"
+#include "guiutil.h"
+#include "sizeutil.h"
+#include "strutil.h"
+#include "styles.h"
+#include "types.h"
+#include "userinfo.h"
+
+#include "cmd_dpfocus.h"
+
+#include "dirpane.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef gint (*StrCmpFunc)(const gchar *a, const gchar *b);
+
+static DPSort the_sort; /* Used to get state across to qsort() callback. */
+
+static GtkStyle *pane_selected = NULL, /* The style used on selected pane's column buttons. */
+ *focus_style = NULL; /* For focusing. */
+
+static gboolean no_repeat = FALSE; /* Ugly hack to prevent repeat on focused row to go into infinity. Ugly. Ugly. */
+
+/* This is used by dp_activate_queued() to keep track of state. */
+static struct {
+ guint handler;
+ DirPane *old_cur;
+} the_activate_queue_info = { 0, NULL };
+
+static GSList *pathwidgetry_builders = NULL;
+
+enum { COL_FILE = 0, COL_INFO, COL_FTYPE, COL_FILENAME_COLLATE_KEY, COL_LINK_TARGET_INFO, COL_FLAGS,
+ COL_NUMBER_OF_COLUMNS };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void clear_total_stats(DirPane *dp);
+static void clear_selection_stats(SelInfo *si);
+
+static void dp_activate_queued(DirPane *dp);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-11-21 - Rewritten. Just initialize some of the string data fields of all panes. */
+void dp_initialize(DirPane *dp, size_t num)
+{
+ size_t i;
+
+ /* Clear the path settings. */
+ for(i = 0; i < num; i++)
+ {
+ dp[i].dir.path[0] = '\0';
+ dp[i].dir.pathd = NULL;
+ dp[i].dir.root = NULL;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-06-02 - Encapsulate this tiny porting/compatibility issue to spare us from #ifdef:s all over. */
+gboolean dp_realized(const MainInfo *min)
+{
+ return gtk_widget_get_realized(min->gui->panes);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-08-02 - Rewrote this classic, to be a bit shorter and take const-ant time, too. Whoo. */
+DirPane * dp_mirror(const MainInfo *min, const DirPane *dp)
+{
+ return &min->gui->pane[1 - dp->index];
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-05 - Get the full name, with path, for row number <row> of <dp>. Trivial, but
+** saves a couple of lines here and there elsewhere in the program.
+** 1999-01-20 - Now tries to avoid starting the name with two slashes for root entries.
+** 2002-02-25 - Generalized to never produce double slashes, removed special case for root.
+*/
+const gchar * dp_full_name(const DirPane *dp, const DirRow2 *row)
+{
+ static gchar buf[PATH_MAX];
+
+ g_snprintf(buf, sizeof buf, "%s/%s", g_file_get_path(dp->dir.root), dp_row_get_name(dp_get_tree_model(dp), row));
+ return buf;
+}
+
+/* 1999-02-23 - Get the name of a row, but quoted and with any embedded quotes
+** escaped by backslashes. Very handy when evaluating {f}-codes...
+** If <path> is TRUE, the path is included as well. Doesn't nest.
+*/
+const gchar * dp_name_quoted(const DirPane *dp, const DirRow2 *row, gboolean path)
+{
+ static gchar buf[2 * PATH_MAX];
+ const gchar *fn, *ptr;
+ gchar *put = buf;
+
+ fn = path ? dp_full_name(dp, row) : dp_row_get_name(dp_get_tree_model(dp), row);
+ *put++ = '"';
+ for(ptr = fn; *ptr; ptr++)
+ {
+ if(*ptr == '"' || *ptr == '\\')
+ *put++ = '\\';
+ *put++ = *ptr;
+ }
+ *put++ = '"';
+ *put = '\0';
+
+ return buf;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-09-20 - Clear the completion cache. */
+static void completion_clear(DirPane *dp)
+{
+ GtkListStore *cm;
+
+ cm = GTK_LIST_STORE(gtk_entry_completion_get_model(dp->complete.compl));
+ if(cm == NULL)
+ return;
+ gtk_list_store_clear(cm);
+}
+
+/* 2008-09-20 - Update the completion for the given pane, considering that 'prefix' is the
+ * current directory root. If this is the same as the cached, do nothing.
+*/
+static void completion_update(DirPane *dp, const gchar *prefix)
+{
+ GtkListStore *cm;
+ GFile *dir;
+ GFileEnumerator *fen;
+
+ if(strcmp(dp->complete.prefix, prefix) == 0)
+ return;
+ cm = GTK_LIST_STORE(gtk_entry_completion_get_model(dp->complete.compl));
+ if(cm == NULL)
+ return;
+ /* We're about to check on-disk, so clear the cache in the GtkEntryCompletion. */
+ gtk_list_store_clear(cm);
+ dir = g_file_parse_name(prefix);
+ if((fen = g_file_enumerate_children(dir, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL)) != NULL)
+ {
+ GFileInfo *child;
+ GtkTreeIter iter;
+
+ while((child = g_file_enumerator_next_file(fen, NULL, NULL)) != NULL)
+ {
+ if(g_file_info_get_file_type(child) == G_FILE_TYPE_DIRECTORY)
+ {
+ gchar buf[4 * PATH_MAX];
+
+ /* Assumes prefix ends with slash. Slightly Unix-centric. */
+ g_snprintf(buf, sizeof buf, "%s%s", prefix, g_file_info_get_name(child));
+ gtk_list_store_insert_with_values(cm, &iter, -1, 0, buf, -1);
+ }
+ g_object_unref(G_OBJECT(child));
+ }
+ g_strlcpy(dp->complete.prefix, prefix, sizeof dp->complete.prefix);
+ g_object_unref(fen);
+ }
+ g_object_unref(G_OBJECT(dir));
+}
+
+static gboolean completion_match_function(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user)
+{
+ gchar *mv;
+
+ gtk_tree_model_get(gtk_entry_completion_get_model(completion), iter, 0, &mv, -1);
+ if(mv != NULL)
+ {
+ gsize klen = strlen(key); /* NOTE: This is in *bytes*, not UTF-8 chars. */
+ gboolean eq = memcmp(key, mv, klen) == 0;
+
+ g_free(mv);
+ return eq;
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-02-03 - Here's the handler for the optional "huge parent" button, in the pane margin. */
+static void evt_hugeparent_clicked(GtkWidget *wid, gpointer user)
+{
+ DirPane *dp = user;
+
+ csq_execute(dp->main, dp->index == 0 ? "ActivateLeft" : "ActivateRight");
+ csq_execute(dp->main, "DirParent");
+}
+
+/* 1998-09-15 - This handler gets run when user clicks the "up" button next to path entry. */
+static void evt_parent_clicked(GtkWidget *wid, gpointer user)
+{
+ DirPane *dp = user;
+
+ csq_execute(dp->main, dp->index == 0 ? "ActivateLeft" : "ActivateRight");
+ csq_execute(dp->main, "DirParent");
+}
+
+/* 2008-09-13 - A simple rewrite of the older code, considering the switch to a GtkComboBoxEntry
+ * widget for the path entry/history tasks.
+*/
+static void evt_path_new(GtkWidget *wid, gpointer user)
+{
+ DirPane *dp = user;
+
+ dp_activate(dp);
+ csq_execute_format(dp->main, "DirEnter 'dir=%s'", stu_escape(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dp->path))))));
+ dp_path_unfocus(dp);
+}
+
+static void evt_path_changed(GtkWidget *wid, gpointer user)
+{
+ gint index;
+ const gchar *now;
+
+ now = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(wid))));
+ index = gtk_combo_box_get_active(GTK_COMBO_BOX(wid));
+ if(index < 0)
+ {
+ gchar *ptr;
+
+ /* Build "prefix" version of the current path. The prefix is defined, for completion
+ * purposes, as the text up to and including the right-most directory separator. We
+ * do this in non-dynamic storage, for speed.
+ */
+ ptr = g_utf8_strrchr(now, -1, G_DIR_SEPARATOR);
+ if(ptr != NULL)
+ {
+ gchar buf[1024];
+ size_t plen = ptr - now + 1;
+ if(plen < sizeof buf)
+ {
+ memcpy(buf, now, plen);
+ buf[plen] = '\0';
+ /* Now, we have a UTF-8 prefix in buf, which is perfect. */
+ completion_update(user, buf);
+ }
+ }
+ }
+ else
+ evt_path_new(wid, user);
+}
+
+/* 2008-09-20 - Cut away Tab handling, we now use the slower but more modern complete-as-you type style. */
+static gboolean evt_path_key_press(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ DirPane *dp = user;
+
+ if(evt->keyval == GDK_KEY_Escape)
+ dp_path_unfocus(dp);
+ return FALSE;
+}
+
+/* 1998-05-27 - I had forgotten about the possibility for users to click in the path entry widget, and
+** by doing so circumventing my clever (hairy) flag system. This remedies that.
+** 1998-05-29 - Changed polarity of operation. Was broken. Sloppy me.
+*/
+static gboolean evt_path_focus(GtkWidget *wid, GdkEventFocus *ev, gpointer user)
+{
+ DirPane *dp = user;
+
+ kbd_context_detach(dp->main->gui->kbd_ctx, GTK_WINDOW(dp->main->gui->window));
+ dp_activate(dp);
+
+ g_signal_connect(G_OBJECT(wid), "key_press_event", G_CALLBACK(evt_path_key_press), dp);
+
+ return FALSE;
+}
+
+static gboolean evt_path_unfocus(GtkWidget *wid, GdkEventFocus *ev, gpointer user)
+{
+ DirPane *dp = user;
+
+ kbd_context_attach(dp->main->gui->kbd_ctx, GTK_WINDOW(dp->main->gui->window));
+
+ g_signal_handlers_disconnect_by_func(G_OBJECT(wid), G_CALLBACK(evt_path_key_press), dp);
+
+ return FALSE;
+}
+
+/* 1998-12-19 - The tiny little "hide" button was clicked. Act. */
+static void evt_hide_clicked(GtkWidget *wid, gpointer user)
+{
+ DirPane *dp = user;
+
+ dp_activate(dp);
+ dp->main->cfg.dp_format[dp->index].hide_allowed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ csq_execute(dp->main, "DirRescan");
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-06 - The given <dp> has been double-clicked. Time to execute some fun action,
+** namely the Default for the style of the clicked row.
+*/
+static void doubleclick(DirPane *dp)
+{
+ csq_execute(dp->main, "FileAction");
+ if(chd_get_running(NULL) == NULL) /* If command sequence finished, reset. Else keep around. */
+ dp->dbclk_row = -1;
+}
+
+/* 1999-05-13 - Simulate a double click on <row> in <dp>. Handy for use by the focusing
+** module.
+*/
+void dp_dbclk_row(DirPane *dp, gint row)
+{
+ if(row != -1)
+ {
+ dp->dbclk_row = row;
+ doubleclick(dp);
+ }
+}
+
+/* 1999-03-04 - Rewritten. Now very much simpler. :) */
+void dp_select(DirPane *dp, const DirRow2 *row)
+{
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), (GtkTreeIter *) row);
+}
+
+/* 1999-03-04 - Select all rows. Handy for the SelectAll command. Since selection management
+** is now largely done by the GtkCList widget for us, this is not rocket science.
+** 2000-09-16 - Noticed that using gtk_clist_select_all() reset the vertical scroll of the list
+** to zero, which annoyed me. This happens regardless of callback. Did a work around.
+*/
+void dp_select_all(DirPane *dp)
+{
+ gtk_tree_selection_select_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)));
+}
+
+/* 1999-03-04 - Rewritten in a lot simpler way. */
+void dp_unselect(DirPane *dp, const DirRow2 *row)
+{
+ gtk_tree_selection_unselect_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), (GtkTreeIter *) row);
+ /* FIXME: Doesn't handle double-click specifically, might be bad. */
+}
+
+/* 1999-03-04 - Unselect all rows. Real simple. */
+void dp_unselect_all(DirPane *dp)
+{
+ dp->dbclk_row = -1;
+ gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)));
+}
+
+/* 2000-03-18 - Since the select/unselect functions no longer return success or failure, the check
+** is done explicitly here instead. Much better, really.
+*/
+void dp_toggle(DirPane *dp, const DirRow2 *row)
+{
+ if(gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), (GtkTreeIter *) row))
+ dp_unselect(dp, row);
+ else
+ dp_select(dp, row);
+}
+
+/* 1998-06-18 - This handles the situation when a user clicks on a row in a directory pane. Might envoke
+** action on files/dirs.
+** 1998-06-04 - Added support for a little menu popping up when the right button is pressed. First it changes
+** to the given pane.
+** 1998-06-17 - Added shift-sensing to extend the current selection. Not so crucial in my mind, since dragging
+** is so supported. But, nice never the less (and somewhat standard, so people might expect it).
+** 1998-06-17 - Added control-sensing to "extend" the current UNselection. Cool?
+** 1999-03-05 - Simplified since we now use GTK+'s built-in CList selection.
+** 2003-10-08 - Implemented Click-M-Click recognition.
+** 2009-11-07 - Simplified for GTK+ 2.0 implementation of the main dirpane list widget. Dropped customized selection
+** support (i.e. click and drag to multi-select); now it's always "system default" mode.
+*/
+static gboolean evt_dirpane_button_press(GtkWidget *wid, GdkEventButton *event, gpointer user)
+{
+ static DirPane *last_dp = NULL;
+ static GTimeVal last_time;
+ const gchar *mcmd;
+ DirPane *dp = user;
+ const gboolean change = last_dp && dp != last_dp;
+ GTimeVal now;
+
+ /* Handle commands mapped to mouse buttons. This includes the RMB menu, typically. */
+ if((event->type == GDK_BUTTON_PRESS) && (mcmd = ctrl_mouse_map(dp->main->cfg.ctrlinfo, event)) != NULL)
+ {
+ dp_activate_queued(dp);
+ last_dp = dp;
+ evt_event_set((GdkEvent *) event);
+ csq_execute(dp->main, mcmd);
+ evt_event_clear(event->type);
+ return TRUE;
+ }
+
+ /* Look for click-m-click, i.e. a rapid click in opposite pane after a selection. */
+ g_get_current_time(&now);
+ if(change)
+ {
+ const gchar *cmd = ctrl_clickmclick_get_cmdseq(dp->main->cfg.ctrlinfo);
+ if(cmd && *cmd)
+ {
+ const gfloat elapsed = 1E-6f * (now.tv_usec - last_time.tv_usec) + (now.tv_sec - last_time.tv_sec);
+
+ if(elapsed < ctrl_clickmclick_get_delay(dp->main->cfg.ctrlinfo))
+ {
+ csq_execute(dp->main, cmd);
+ return TRUE;
+ }
+ }
+ }
+
+ dp_activate_queued(dp);
+ last_dp = dp;
+ last_time = now;
+ return FALSE;
+}
+
+/* 2009-11-07 - User clicked a column; update sorting data. Much easier now with GTK+ 2. */
+static void evt_pane_sort_column_clicked(GtkTreeSortable *sortable, gpointer user)
+{
+ DirPane *dp = user;
+ DPSort *sort;
+ gint column;
+ GtkSortType type;
+
+ dp_activate(dp);
+ gtk_tree_sortable_get_sort_column_id(sortable, &column, &type);
+
+ sort = &dp->main->cfg.dp_format[dp->index].sort;
+ sort->content = column;
+ sort->invert = (type == GTK_SORT_DESCENDING);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-27 - Redisplay given pane. Will totally clear the GtkCList widget, and reformat
+** all row data into it. Does *not* resort the pane's contents; use (the new)
+** dp_resort() function for that. Also does *not* preserve the set of selected
+** rows or the vertical position; use dp_redisplay_preserve() for that.
+*/
+void dp_redisplay(DirPane *dp)
+{
+ g_warning("dp_redisplay() totally non-implemented");
+}
+
+/* 1999-04-27 - Redisplay given pane, keeping both the selected set and the vertical position.
+** This is the one to use in most cases.
+*/
+void dp_redisplay_preserve(DirPane *dp)
+{
+ DHSel *sel;
+ gfloat vpos;
+
+ sel = dph_dirsel_new(dp);
+ vpos = dph_vpos_get(dp);
+ dp_redisplay(dp);
+ dph_vpos_set(dp, vpos);
+ dph_dirsel_apply(dp, sel);
+ dph_dirsel_destroy(sel);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-25 - Moved this old workhorse into the new dirpane module, and discovered that
+** it wasn't commented. Lazy me. Also modified its prototype, to take the
+** DirPane to display rather than figuring it out from MainInfo.
+*/
+void dp_show_stats(DirPane *dp)
+{
+ MainInfo *min;
+
+ if((min = dp->main) != NULL)
+ {
+ gchar buf[256], selbuf[32] = "", totbuf[32] = "", *ptr = buf;
+ const SelInfo *sel = &dp->dir.sel;
+
+ ptr += g_snprintf(ptr, sizeof buf, _("%u/%u dirs, %u/%u files"),
+ sel->num_dirs, dp->dir.tot_dirs,
+ sel->num_files, dp->dir.tot_files);
+ sze_put_offset(selbuf, sizeof selbuf, sel->num_bytes, SZE_AUTO, 1, ',');
+ sze_put_offset(totbuf, sizeof totbuf, dp->dir.tot_bytes, SZE_AUTO, 1, ',');
+ ptr += sprintf(ptr, _(" (%s/%s)"), selbuf, totbuf);
+ if(dp->dir.fs.valid)
+ {
+ gchar dbuf[32], pbuf[32];
+
+ sze_put_offset(dbuf, sizeof dbuf, dp->dir.fs.fs_size - dp->dir.fs.fs_free, SZE_AUTO, 1, ',');
+ g_snprintf(pbuf, sizeof pbuf, "%.1f%%",
+ 100.0 *
+ ((gdouble) (dp->dir.fs.fs_size - dp->dir.fs.fs_free)
+ /
+ (gdouble) dp->dir.fs.fs_size));
+ ptr += sprintf(ptr, _(", %s (%s) used"), dbuf, pbuf);
+ sze_put_offset(dbuf, sizeof dbuf, dp->dir.fs.fs_free, SZE_AUTO, 3, ',');
+ ptr += sprintf(ptr, _(", %s free"), dbuf);
+ }
+ if(min->cfg.errors.display != ERR_DISPLAY_TITLEBAR)
+ gtk_label_set_text(GTK_LABEL(min->gui->top), buf);
+ else
+ gui_set_main_title(dp->main, buf);
+ }
+}
+
+/* 2010-08-03 - Set the activate-status of the given pane's columns (that's what "col" refers to). Slighly hackish. */
+static void dp_set_col_active(DirPane *dp, gboolean active)
+{
+ if(dp != NULL)
+ {
+ GtkTreeViewColumn *column;
+ guint i;
+
+ for(i = 0; (column = gtk_tree_view_get_column(GTK_TREE_VIEW(dp->view), i)) != NULL; i++)
+ {
+ GtkWidget *header = gtk_tree_view_column_get_button(column);
+
+ if(header != NULL)
+ gtk_widget_set_sensitive(header, active);
+ }
+ gtk_widget_set_name(dp->view, active ? "pane-current" : "pane");
+ }
+}
+
+/* 2002-07-14 - Do the pane rendering necessary to change active pane from <from> into <to>. */
+static void activate_render(DirPane *from, DirPane *to)
+{
+ if(from != NULL)
+ dp_set_col_active(from, FALSE);
+ if(to != NULL)
+ {
+ dp_set_col_active(to, TRUE);
+ gtk_widget_grab_focus(to->view);
+ dp_show_stats(to);
+ }
+}
+
+/* 1999-06-09 - Activate <dp>, making it the source pane for all operations. Returns TRUE if the activation
+** meant that another pane was deactivated, FALSE if <dp> was already the activate pane.
+*/
+gboolean dp_activate(DirPane *dp)
+{
+ if(dp != NULL && dp->main->gui->cur_pane != dp)
+ {
+ gchar *name;
+
+ activate_render(dp->main->gui->cur_pane, dp);
+ dp->main->gui->cur_pane = dp;
+ if(dp->dir.root != NULL && (name = g_file_get_parse_name(dp->dir.root)) != NULL)
+ {
+ gchar tbuf[256];
+
+ g_snprintf(tbuf, sizeof tbuf, "%s - gentoo", name);
+ win_window_set_title(dp->main->gui->window, tbuf);
+ g_free(name);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 2002-07-13 - This runs when GTK+ is idle, and does the pane activation rendering, once. */
+static gint idle_activate(gpointer data)
+{
+ activate_render(the_activate_queue_info.old_cur, ((MainInfo *) data)->gui->cur_pane);
+ g_source_remove(the_activate_queue_info.handler);
+ the_activate_queue_info.handler = 0U;
+ return 0;
+}
+
+/* 2002-07-13 - Activate a pane, but queue the rendering until GTK+ is idle. This works around
+** a very annoying bug/misfeature which causes "ghost" pane scrolling to occur.
+** We only queue the rendering, since that seems to suffice, and we need to really
+** change gentoo's idea of "active pane" immediately or things break.
+*/
+static void dp_activate_queued(DirPane *dp)
+{
+ if(the_activate_queue_info.handler)
+ g_source_remove(the_activate_queue_info.handler);
+ the_activate_queue_info.handler = g_idle_add(idle_activate, dp->main);
+ the_activate_queue_info.old_cur = dp->main->gui->cur_pane;
+ dp->main->gui->cur_pane = dp;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-05 - Answer whether given pane has one or more rows selected or not. */
+gboolean dp_has_selection(DirPane *dp)
+{
+ if(dp->dbclk_row != -1)
+ return TRUE;
+ return gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view))) > 0 && !no_repeat;
+}
+
+/* 2011-01-03 - Determine whether the given pane has a single selected row. */
+gboolean dp_has_single_selection(const DirPane *dp)
+{
+ return gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view))) == 1;
+}
+
+/* 1999-03-06 - Answer whether given <row> is currently selected. A bit more efficient
+** than getting the entire list through dp_get_selection(), but only if
+** you're not going to iterate the selection anyway.
+*/
+gboolean dp_is_selected(DirPane *dp, const DirRow2 *row)
+{
+ if(dp == NULL || row == NULL)
+ return FALSE;
+ return gtk_tree_selection_iter_is_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), (GtkTreeIter *) row);
+}
+
+static GSList * append_row(GSList *list, DirPane *dp, gint index)
+{
+ gchar buf[16];
+ GtkTreeIter *iter;
+
+ if((iter = g_malloc(sizeof *iter)) != NULL)
+ {
+ g_snprintf(buf, sizeof buf, "%d", index);
+ if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(dp->dir.store), iter, buf))
+ return g_slist_prepend(list, iter);
+ else
+ g_warning("**Unable to get iter for selection");
+ }
+ return list;
+}
+
+static void cb_append_row(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user)
+{
+ GSList **sel = user;
+ GtkTreeIter *di;
+
+ if((di = g_malloc(sizeof *di)) != NULL)
+ {
+ *di = *iter;
+ *sel = g_slist_prepend(*sel, di);
+ }
+}
+
+/* 1999-03-04 - Return a GSList of selected rows. Each item's data member is a DirRow.
+** Knows how to deal with a double click, too. This is going to be the new
+** interface for all commands.
+** 1999-03-15 - Now sorts the rows in address order, since otherwise the selection retains
+** the order in which it was done by the user, and that is simply confusing.
+*/
+GSList * dp_get_selection(DirPane *dp)
+{
+ GSList *sel = NULL;
+
+ no_repeat = FALSE;
+
+ if(dp->dbclk_row != -1)
+ sel = append_row(sel, dp, dp->dbclk_row);
+ else
+ gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), cb_append_row, &sel);
+
+ if(sel)
+ fam_rescan_block();
+ sel = g_slist_reverse(sel);
+
+ return sel;
+}
+
+/* 1999-03-06 - Get the "full" selection, regardless of whether there's a double clicked row or not.
+** This should only be used if you really know what you're doing, and never by actual
+** commands (which need the double-click support).
+*/
+GSList * dp_get_selection_full(const DirPane *dp)
+{
+ GSList *sel = NULL;
+
+ gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), cb_append_row, &sel);
+ if(sel)
+ fam_rescan_block();
+ return sel;
+}
+
+/* 1999-03-04 - Free a selection list, handy when you're done traversing it. */
+void dp_free_selection(GSList *sel)
+{
+ if(sel != NULL)
+ {
+ GSList *iter;
+
+ for(iter = sel; iter != NULL; iter = g_slist_next(iter))
+ g_free(iter->data);
+ g_slist_free(sel);
+ fam_rescan_unblock();
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-10-01 - Count entries as they are read in. */
+static void statistics_add_row(DirPane *dp, const GFileInfo *fi)
+{
+ if(g_file_info_get_file_type((GFileInfo *) fi) == G_FILE_TYPE_DIRECTORY)
+ dp->dir.tot_dirs++;
+ else
+ dp->dir.tot_files++;
+ dp->dir.tot_bytes += g_file_info_get_size((GFileInfo *) fi);
+}
+
+/* 2009-10-16 - Add given row to the selection. */
+static void selection_add_row(DirPane *dp, const GFileInfo *fi)
+{
+ if(g_file_info_get_file_type((GFileInfo *) fi) == G_FILE_TYPE_DIRECTORY)
+ dp->dir.sel.num_dirs++;
+ else
+ dp->dir.sel.num_files++;
+ dp->dir.sel.num_bytes += g_file_info_get_size((GFileInfo *) fi);
+}
+
+/* 1999-04-08 - Clear the selected statistics. */
+static void clear_selection_stats(SelInfo *sel)
+{
+ if(sel != NULL)
+ {
+ sel->num_dirs = 0;
+ sel->num_files = 0;
+ sel->num_bytes = 0;
+ }
+}
+
+/* 1999-04-09 - Clear the total statistics fields for <dp>. */
+static void clear_total_stats(DirPane *dp)
+{
+ dp->dir.tot_files = dp->dir.tot_dirs = 0;
+ dp->dir.tot_bytes = 0;
+ dp->dir.fs.valid = FALSE;
+}
+
+/* 1999-01-03 - Clear the statistics for <dp>. Useful when the pane's path is about to change. */
+static void clear_stats(DirPane *dp)
+{
+ clear_total_stats(dp);
+ clear_selection_stats(&dp->dir.sel);
+ dp->last_row = dp->last_row2 = -1;
+}
+
+/* 1999-04-08 - Update the selection statistics for <dp>, by simply flushing them and recomputing from
+** scratch. Does NOT use dp_get_selection(), for performance reasons (this is run on every
+** unselection).
+*/
+static void update_selection_stats(DirPane *dp)
+{
+ GtkTreeModel *model = dp_get_tree_model(dp);
+ GtkTreeIter iter;
+ SelInfo *sel = &dp->dir.sel;
+
+ clear_selection_stats(sel);
+ if(gtk_tree_model_get_iter_first(model, &iter))
+ {
+ GtkTreeSelection *ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view));
+
+ /* Don't use gtk_tree_selection_get_selected_rows(), it's kind of costly. */
+ do
+ {
+ if(gtk_tree_selection_iter_is_selected(ts, &iter))
+ {
+ GFileInfo *fi;
+
+ gtk_tree_model_get(model, &iter, COL_INFO, &fi, -1);
+ selection_add_row(dp, fi);
+ }
+ } while(gtk_tree_model_iter_next(model, &iter));
+ }
+}
+
+/* 1999-04-09 - Update the tot_XXX fields in <dp>'s directory statistics. Handy after a (Get|Clear)Size. */
+void dp_update_stats(DirPane *dp)
+{
+ GtkTreeModel *model = dp_get_tree_model(dp);
+ GtkTreeIter iter;
+
+ clear_total_stats(dp);
+ clear_selection_stats(&dp->dir.sel);
+ if(gtk_tree_model_get_iter_first(model, &iter))
+ {
+ GtkTreeSelection *ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view));
+
+ do
+ {
+ GFileInfo *fi;
+
+ gtk_tree_model_get(model, &iter, COL_INFO, &fi, -1);
+ statistics_add_row(dp, fi);
+ if(gtk_tree_selection_iter_is_selected(ts, &iter))
+ selection_add_row(dp, fi);
+ } while(gtk_tree_model_iter_next(model, &iter));
+ }
+}
+
+/* 1999-03-30 - Update information about filesystem for given <dp>. */
+static void update_fs_info(DirPane *dp)
+{
+ GFileInfo *fi;
+
+ if((fi = g_file_query_filesystem_info(dp->dir.root, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "," G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, NULL)) != NULL)
+ {
+ dp->dir.fs.fs_size = g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE);
+ dp->dir.fs.fs_free = g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_FILESYSTEM_FREE);
+ }
+ dp->dir.fs.valid = (fi != NULL) && dp->dir.fs.fs_size > 0;
+}
+
+void dp_path_clear(DirPane *dp)
+{
+ GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dp->path)));
+
+ gtk_list_store_clear(store);
+}
+
+void dp_path_focus(DirPane *dp)
+{
+ gtk_widget_grab_focus(dp->path);
+}
+
+void dp_path_unfocus(DirPane *dp)
+{
+ gtk_widget_grab_focus(dp->view);
+}
+
+/* 2013-07-09 - Clear the FType column. This is useful when re-scanning panes after editing the
+ * FType definitions in the configuration window. It prevents crashes due to stale
+ * pointers being followed.
+*/
+static void untype_rows(DirPane *dp)
+{
+ GtkTreeModel *model = dp_get_tree_model(dp);
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_first(model, &iter))
+ {
+ do
+ {
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_FTYPE, NULL, -1);
+ } while(gtk_tree_model_iter_next(model, &iter));
+ }
+}
+
+/* 2010-06-05 - Internal "do it" routine to enter a new directory. Uses GIO error handling for all I/O. */
+static gboolean do_enter_dir(DirPane *dp, const gchar *path, GError **err)
+{
+ GFile *here;
+ GFileEnumerator *fe;
+
+ if((here = g_vfs_parse_name(dp->main->vfs.vfs, path)) == NULL)
+ return FALSE;
+
+ if((fe = g_file_enumerate_children(here, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, err)) != NULL)
+ {
+ GFileInfo *fi, *tfi;
+ GtkTreeIter iter;
+
+ if(dp->dir.root != NULL)
+ g_object_unref(dp->dir.root);
+ dp->dir.root = here;
+ untype_rows(dp); /* Clearing is not atomic, and can cause redraws. */
+ gtk_list_store_clear(dp->dir.store);
+ g_strlcpy(dp->dir.path, path, sizeof dp->dir.path);
+
+ /* Decide whether the current directory is "local". */
+ if((fi = g_file_query_filesystem_info(here, G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW, NULL, err)) != NULL)
+ {
+ dp->dir.is_local = g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW) != G_FILESYSTEM_PREVIEW_TYPE_NEVER;
+ g_object_unref(fi);
+ }
+ else
+ dp->dir.is_local = TRUE;
+
+ while((fi = g_file_enumerator_next_file(fe, NULL, err)) != NULL)
+ {
+ const gchar *name = g_file_info_get_name(fi), *fn, *tname;
+ guint32 flags;
+ gchar *ck;
+ gunichar initial;
+
+ /* Apply classic Hide filtering rule. Nice. */
+ if(!(dp->main->cfg.dir_filter(name) && fut_check_hide(dp, name)))
+ {
+ g_object_unref(fi);
+ continue;
+ }
+ flags = (g_file_info_get_file_type(fi) != G_FILE_TYPE_DIRECTORY) ? DPRF_HAS_SIZE : 0;
+ fn = g_file_info_get_display_name(fi);
+ initial = g_utf8_get_char(fn);
+ ck = g_utf8_collate_key_for_filename(fn, -1);
+ /* The modern default is to be case-insensitive, glib's collation keys always are.
+ * For us bearded old-sk00l folks, let's implement a kinda-sorta case-sensitive
+ * collation key, based on the initial only. I think this will be Good Enough.
+ *
+ * It is a bit limited (@test and @TEST won't sort as you'd expect), but short.
+ */
+ if(!dp->main->cfg.dp_format[dp->index].sort.nocase)
+ {
+ const gchar ORDER_PUNCTUATION = '\1';
+ const gchar ORDER_UPPERCASE = '\2';
+ const gchar ORDER_LOWERCASE = '\3';
+
+ const size_t out = strlen(ck) + 2;
+ gchar *csck, *put;
+
+ if((csck = g_malloc(out)) != NULL)
+ {
+ put = csck;
+ if(g_unichar_ispunct(initial))
+ *put++ = ORDER_PUNCTUATION;
+ else if(g_unichar_isupper(initial))
+ *put++ = ORDER_UPPERCASE;
+ else if(g_unichar_islower(initial))
+ *put++ = ORDER_LOWERCASE;
+ memcpy(put, ck, out - 1);
+ g_free(ck);
+ ck = csck;
+ }
+ }
+ /* If the local object looks like a symbolic link, chase down the link target too.
+ * This is not exactly Captain Slim on the memory side, but very handy especially
+ * since we want to do things like style links to directories like directories.
+ * Pre-GIO versions of gentoo did this too, by storing extra struct stats for links.
+ */
+ if((tname = g_file_info_get_symlink_target(fi)) != NULL)
+ {
+ GFile *target;
+
+ /* Try to be clever and figure out how to interpret the link target text. */
+ if(strstr(tname, "://") != NULL) /* Does it look like an URI? */
+ {
+ target = g_vfs_get_file_for_uri(dp->main->vfs.vfs, tname);
+ } /* No, does it look like a relative path, then? */
+ else if(strncmp(tname, "./", 2) == 0 || strncmp(tname, "..", 2) == 0)
+ {
+ target = g_file_resolve_relative_path(here, tname);
+ }
+ else /* Assume just bare name, meaning link to child with same root. */
+ {
+ target = g_file_get_child(here, tname);
+ }
+ if(target != NULL)
+ {
+ GError *terr = NULL;
+
+ /* If we got something, try to query the info for it. */
+ tfi = g_file_query_info(target, "standard::*", G_FILE_QUERY_INFO_NONE, NULL, &terr);
+ g_object_unref(G_OBJECT(target));
+ if(tfi != NULL && terr == NULL)
+ {
+ flags |= DPRF_LINK_EXISTS;
+ if(g_file_info_get_file_type(tfi) == G_FILE_TYPE_DIRECTORY)
+ flags |= DPRF_LINK_TO_DIR;
+ }
+ g_clear_error(&terr);
+ }
+ else
+ tfi = NULL;
+ }
+ else
+ tfi = NULL;
+
+ gtk_list_store_insert_with_values(dp->dir.store, &iter, -1,
+ COL_FILE, NULL,
+ COL_INFO, fi,
+ COL_FLAGS, flags,
+ COL_FILENAME_COLLATE_KEY, ck,
+ (tfi != NULL) ? COL_LINK_TARGET_INFO : -1, tfi, /* Not too clever, I hope. */
+ -1);
+ statistics_add_row(dp, fi);
+ g_free(ck);
+ if(tfi)
+ g_object_unref(G_OBJECT(tfi));
+ g_object_unref(G_OBJECT(fi));
+ }
+ g_object_unref(fe);
+ }
+ if(fe != NULL)
+ {
+ GtkTreeIter iter;
+
+ typ_identify_begin(dp);
+ if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(dp->dir.store), &iter))
+ {
+ do
+ {
+ typ_identify(dp, &iter);
+ } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(dp->dir.store), &iter));
+ }
+ if(!typ_identify_end(dp))
+ fe = NULL;
+ }
+ return fe != NULL;
+}
+
+/* 2003-11-14 - Brand new version of this very old workhorse. Now reads in the directory in a single
+** pass, using realloc() to grow various buffers on the fly. Slightly more wasteful of
+** memory than the old two-pass version, but less code, more robust, and possibly a
+** little bit faster. Returns TRUE on success.
+*/
+gboolean dp_enter_dir(DirPane *dp, const gchar *path)
+{
+ GError *err = NULL;
+ gboolean ok;
+
+ clear_stats(dp);
+
+ completion_clear(dp);
+
+ the_sort = dp->main->cfg.dp_format[dp->index].sort; /* Must be accessible by qsort() callbacks. */
+
+ if((ok = do_enter_dir(dp, path, &err)) == TRUE)
+ {
+ const gboolean has_parent = g_file_has_parent(dp->dir.root, NULL);
+
+ update_fs_info(dp);
+ gtk_widget_set_sensitive(dp->parent, has_parent);
+ if(dp->hparent != NULL)
+ gtk_widget_set_sensitive(dp->hparent, has_parent);
+ }
+ else if(err)
+ err_set_gerror(dp->main, &err, path, NULL);
+
+ return ok;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-07-20 - Rescan contents of given pane.
+** NOTE NOTE This routine does NOT change the error status, i.e. it does not call anything
+** in the error module. This is important, since it's used in the exiting code
+** of generic commands, for instance.
+** 2003-09-26 - Don't activate <dp> for refresh, just do it anyway. Faster, hopefully safe.
+*/
+void dp_rescan(DirPane *dp)
+{
+ dph_state_save(dp);
+ dp_enter_dir(dp, dp->dir.path);
+ dph_state_restore(dp);
+}
+
+/* 2002-07-23 - Special "weaker" version of dp_rescan(), with the added semantic difference that
+** this is only ever called as part of the "clean-up" *after* a command has finished.
+** The intent is to catch any changes to the pane done by the command, such as a
+** deleted, renamed, moved or otherwise changed file. The reason it has a separate
+** entrypoint is that with FAM, this needs to be stopped.
+** 2009-11-15 - Rewritten, now that "FAM" is actually just an alias for GIO monitoring.
+*/
+void dp_rescan_post_cmd(DirPane *dp)
+{
+ if(!fam_is_monitored(dp))
+ dp_rescan(dp);
+}
+
+/* 2009-10-16 - Rescans a single row of a pane. Handy for ClearSize, for instance. Not to be used for bulk reading. */
+gboolean dp_rescan_row(DirPane *dp, const DirRow2 *row, GError **error)
+{
+ GFile *file;
+ GFileInfo *fi = NULL;
+
+ if(dp == NULL || row == NULL)
+ return FALSE;
+ if((file = dp_get_file_from_row(dp, row)) != NULL)
+ {
+ GtkTreeModel *m = dp_get_tree_model(dp);
+
+ if((fi = g_file_query_info(file, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error)) != NULL)
+ {
+ guint32 flags;
+
+ /* Computes new flags value; clears HAS_SIZE for directories. */
+ gtk_tree_model_get(m, (GtkTreeIter *) row, COL_FLAGS, &flags, -1);
+ flags &= ~DPRF_HAS_SIZE;
+ flags |= (g_file_info_get_file_type(fi) != G_FILE_TYPE_DIRECTORY) ? DPRF_HAS_SIZE : 0;
+ gtk_list_store_set(GTK_LIST_STORE(m), (GtkTreeIter *) row, COL_INFO, fi, COL_FLAGS, flags, -1);
+ }
+ g_object_unref(file);
+ }
+ return fi != NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-09-20 - Sets the history strings, available in the combo box. This is to prevent
+** other modules (dirhistory, I'm looking at you!) from poking the widgets
+** directly. Abstract, hide, and so on.
+** 2010-02-09 - Converted to assume too much about dirhistory's internals. The list is now
+** supposed to point at structures, that begin with a gchar * URI. Yes.
+*/
+void dp_history_set(DirPane *dp, const GList *locations)
+{
+ GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dp->path)));
+ GtkTreeIter iter;
+ guint i;
+
+ gtk_list_store_clear(store);
+ for(i = 0; locations != NULL; locations = g_list_next(locations))
+ {
+ const gchar *name = dph_entry_get_parse_name(locations->data);
+
+ if(*name)
+ {
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, name, -1);
+ ++i;
+ }
+ }
+ if(i > 0)
+ {
+ /* Was there any history set? If so, also jump to the first entry. */
+ g_signal_handler_block(G_OBJECT(gtk_bin_get_child(GTK_BIN(dp->path))), dp->sig_path_activate);
+ g_signal_handler_block(G_OBJECT(dp->path), dp->sig_path_changed);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(dp->path), 0);
+ g_signal_handler_unblock(G_OBJECT(dp->path), dp->sig_path_changed);
+ g_signal_handler_unblock(G_OBJECT(gtk_bin_get_child(GTK_BIN(dp->path))), dp->sig_path_activate);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-07-04 - Refreshes the split, making sure it's correctly sized according to current settings. */
+void dp_split_refresh(MainInfo *min)
+{
+ GdkWindow *pwin;
+ gint np, pos = -1;
+
+ if(min == NULL || min->gui == NULL || min->gui->panes == NULL)
+ return;
+ if(!dp_realized(min))
+ return;
+
+ /* Inspect the size of the GtkPaned that holds the panes; the window's size
+ ** doesn't work for vertical due to buttons. This is slightly hackish.
+ */
+ pwin = gtk_widget_get_window(min->gui->panes);
+ np = min->cfg.dp_paning.orientation == DPORIENT_HORIZ ? gdk_window_get_width(pwin) : gdk_window_get_height(pwin);
+
+ /* Compute the proper new position, depending on the active paning mode. */
+ switch(min->cfg.dp_paning.mode)
+ {
+ case DPSPLIT_FREE:
+ return;
+ case DPSPLIT_RATIO:
+ pos = np * min->cfg.dp_paning.value;
+ break;
+ case DPSPLIT_ABS_LEFT:
+ pos = min->cfg.dp_paning.value;
+ break;
+ case DPSPLIT_ABS_RIGHT:
+ pos = np - min->cfg.dp_paning.value;
+ break;
+ }
+ if(pos >= 0)
+ {
+ g_signal_handler_block(G_OBJECT(min->gui->window), min->gui->sig_main_configure);
+ g_signal_handler_block(G_OBJECT(min->gui->panes), min->gui->sig_pane_notify);
+ gtk_paned_set_position(GTK_PANED(min->gui->panes), pos);
+ g_signal_handler_unblock(G_OBJECT(min->gui->panes), min->gui->sig_pane_notify);
+ g_signal_handler_unblock(G_OBJECT(min->gui->window), min->gui->sig_main_configure);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-08 - Add a pathwidgtry user. Indirect, just adds a function that is later called
+** (in dp_build()) to construct the widgetry. Returns key to use with show().
+*/
+guint dp_pathwidgetry_add(PageBuilder func)
+{
+ if(func && !g_slist_find(pathwidgetry_builders, func))
+ {
+ pathwidgetry_builders = g_slist_append(pathwidgetry_builders, func);
+ return g_slist_length(pathwidgetry_builders);
+ }
+ return 0;
+}
+
+/* 2003-11-08 - Change to a new page of dirpane path widgetry. Returns page. */
+GtkWidget ** dp_pathwidgetry_show(DirPane *dp, guint key)
+{
+ GtkWidget *page;
+
+ if((page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(dp->notebook), key)) != NULL)
+ {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(dp->notebook), key);
+ return g_object_get_data(G_OBJECT(page), "dp-pathwidgetry");
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+GtkTreeModel * dp_get_tree_model(const DirPane *dp)
+{
+ return (dp != NULL) ? GTK_TREE_MODEL(dp->dir.store) : NULL;
+}
+
+GFile * dp_get_file_from_row(const DirPane *dp, const DirRow2 *row)
+{
+ if(dp == NULL || row == NULL)
+ return NULL;
+ return g_file_get_child(dp->dir.root, dp_row_get_name(GTK_TREE_MODEL(dp->dir.store), row));
+}
+
+GFile * dp_get_file_from_name(const DirPane *dp, const gchar *name)
+{
+ if(dp == NULL || name == NULL)
+ return NULL;
+ return g_file_get_child(dp->dir.root, name);
+}
+
+GFile * dp_get_file_from_name_display(const DirPane *dp, const gchar *name)
+{
+ if(dp == NULL || name == NULL)
+ return NULL;
+ return g_file_get_child_for_display_name(dp->dir.root, name, NULL);
+}
+
+static void row_emit_changed(GtkTreeModel *model, const DirRow2 *row)
+{
+ GtkTreePath *path;
+
+ if((path = gtk_tree_model_get_path(model, (GtkTreeIter *) row)) != NULL)
+ {
+ gtk_tree_model_row_changed(model, path, (GtkTreeIter *) row);
+ gtk_tree_path_free(path);
+ }
+}
+
+void dp_row_set_ftype(GtkTreeModel *model, const DirRow2 *row, FType *ft)
+{
+ gtk_list_store_set(GTK_LIST_STORE(model), (GtkTreeIter *) row, COL_FTYPE, ft, -1);
+ row_emit_changed(model, row);
+}
+
+void dp_row_set_size(GtkTreeModel *model, const DirRow2 *row, guint64 size)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get(model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ g_file_info_set_size(fi, size);
+ /* Notify the owning GtkTreeModel that the data has changed; refreshes TreeViews. */
+ row_emit_changed(model, row);
+}
+
+void dp_row_set_flag(GtkTreeModel *model, const DirRow2 *row, guint32 mask)
+{
+ guint32 old;
+
+ gtk_tree_model_get(model, (GtkTreeIter *) row, COL_FLAGS, &old, -1);
+ gtk_list_store_set(GTK_LIST_STORE(model), (GtkTreeIter *) row, COL_FLAGS, old | mask, -1);
+}
+
+const gchar * dp_row_get_name(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_name(fi);
+}
+
+const gchar * dp_row_get_name_display(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_display_name(fi);
+}
+
+const gchar * dp_row_get_name_edit(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_edit_name(fi);
+}
+
+FType * dp_row_get_ftype(const GtkTreeModel *model, const DirRow2 *row)
+{
+ FType *ft = NULL;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_FTYPE, &ft, -1);
+ return ft;
+}
+
+/* 2010-11-23 - Returns the type of the object in the indicated row, or its target if it's a symlink
+ * and target is true. If it's a broken symlink, G_FILE_TYPE_UNKNOWN is returned.
+*/
+GFileType dp_row_get_file_type(const GtkTreeModel *model, const DirRow2 *row, gboolean target)
+{
+ guint32 flags;
+ GFileInfo *fi, *tfi;
+
+ /* On the assumption that this call is somewhat expensive, grab data for both if-branches. */
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_FLAGS, &flags, COL_INFO, &fi, COL_LINK_TARGET_INFO, &tfi, -1);
+ if(target && g_file_info_get_file_type(fi) == G_FILE_TYPE_SYMBOLIC_LINK)
+ {
+ if((flags & DPRF_LINK_EXISTS) && tfi != NULL)
+ return g_file_info_get_file_type(tfi);
+ return G_FILE_TYPE_UNKNOWN;
+ }
+ return g_file_info_get_file_type(fi);
+}
+
+goffset dp_row_get_size(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_size(fi);
+}
+
+guint64 dp_row_get_blocks(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_UNIX_BLOCKS);
+}
+
+guint64 dp_row_get_blocksize(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_UNIX_BLOCKS) * g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE);
+}
+
+guint32 dp_row_get_mode(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_MODE);
+}
+
+guint64 dp_row_get_time_accessed(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_TIME_ACCESS);
+}
+
+guint64 dp_row_get_time_changed(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_TIME_CHANGED);
+}
+
+guint64 dp_row_get_time_created(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_TIME_CREATED);
+}
+
+guint64 dp_row_get_time_modified(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint64(fi, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+}
+
+guint32 dp_row_get_device(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_RDEV);
+}
+
+guint32 dp_row_get_gid(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_GID);
+}
+
+guint32 dp_row_get_uid(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_UID);
+}
+
+guint32 dp_row_get_nlink(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_uint32(fi, G_FILE_ATTRIBUTE_UNIX_NLINK);
+}
+
+const gchar * dp_row_get_link_target(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_byte_string(fi, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET);
+}
+
+gboolean dp_row_get_flags(const GtkTreeModel *model, const DirRow2 *row, guint32 mask)
+{
+ guint32 flags;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_FLAGS, &flags, -1);
+ return (flags & mask) == mask;
+}
+
+gboolean dp_row_get_can_read(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_boolean(fi, G_FILE_ATTRIBUTE_ACCESS_CAN_READ);
+}
+
+gboolean dp_row_get_can_write(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_boolean(fi, G_FILE_ATTRIBUTE_ACCESS_CAN_READ);
+}
+
+gboolean dp_row_get_can_execute(const GtkTreeModel *model, const DirRow2 *row)
+{
+ GFileInfo *fi;
+
+ gtk_tree_model_get((GtkTreeModel *) model, (GtkTreeIter *) row, COL_INFO, &fi, -1);
+ return g_file_info_get_attribute_boolean(fi, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-11-02 - Porting of the old qsort_result() function, adjusts comparison result to implement directory/file-grouping. */
+static gint sort_result(gint r, GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, const GFileInfo *fia, const GFileInfo *fib)
+{
+ guint32 flags;
+ gboolean da, db;
+
+ /* Did the two rows compare equal? Then resolve by checking the names. */
+ if(r == 0)
+ {
+ gchar *cka, *ckb;
+
+ /* Read out the previously created collation keys, and just compare them. */
+ gtk_tree_model_get(model, a, COL_FILENAME_COLLATE_KEY, &cka, -1);
+ gtk_tree_model_get(model, b, COL_FILENAME_COLLATE_KEY, &ckb, -1);
+ r = strcmp(cka, ckb);
+ /* FIXME: This feels highly inefficient ... To work around, column must be G_TYPE_POINTER. */
+ g_free(ckb);
+ g_free(cka);
+ }
+
+ /* Resolve type of the row. If not immediate directory, it might be a symlink to one. */
+ da = g_file_info_get_file_type((GFileInfo *) fia) == G_FILE_TYPE_DIRECTORY;
+ if(!da)
+ {
+ gtk_tree_model_get(model, a, COL_FLAGS, &flags, -1);
+ da = (flags & DPRF_LINK_TO_DIR) != 0;
+ }
+ db = g_file_info_get_file_type((GFileInfo *) fib) == G_FILE_TYPE_DIRECTORY;
+ if(!db)
+ {
+ gtk_tree_model_get(model, b, COL_FLAGS, &flags, -1);
+ db = (flags & DPRF_LINK_TO_DIR) != 0;
+ }
+
+ switch(the_sort.mode)
+ {
+ case DPS_DIRS_FIRST:
+ if(da == db)
+ return r;
+ else if(da)
+ return -1;
+ return 1;
+ case DPS_DIRS_LAST:
+ if(da == db)
+ return r;
+ else if(db)
+ return -1;
+ return 1;
+ case DPS_DIRS_MIXED:
+ return r;
+ }
+ return r; /* I bet this doesn't ever run. Gcc doesn't. */
+}
+
+/* 2009-11-04 - Return sort result, generating initial value by comparing <va> and <vb>. */
+static gint sort_result_uint32(guint32 va, guint32 vb, GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, const GFileInfo *fia, const GFileInfo *fib)
+{
+ if(va < vb)
+ return sort_result(-1, model, a, b, fia, fib);
+ else if(va > vb)
+ return sort_result(1, model, a, b, fia, fib);
+ return sort_result(0, model, a, b, fia, fib);
+}
+
+/* 2009-11-04 - Return sort result, generating initial value by comparing <va> and <vb>. */
+static gint sort_result_uint64(guint64 va, guint64 vb, GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, const GFileInfo *fia, const GFileInfo *fib)
+{
+ if(va < vb)
+ return sort_result(-1, model, a, b, fia, fib);
+ else if(va > vb)
+ return sort_result(1, model, a, b, fia, fib);
+ return sort_result(0, model, a, b, fia, fib);
+}
+
+/* 2009-11-02 - Compare by name. This is assumed to be the most common case, so it should be quick. */
+static gint cmp_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ r = sort_result(0, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+/* 2009-11-04 - Compare by size. */
+static gint cmp_size(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint64 sa, sb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ sa = g_file_info_get_size(fia);
+ sb = g_file_info_get_size(fib);
+ r = sort_result_uint64(sa, sb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+/* 2009-11-04 - Compare access times. */
+static gint cmp_atime(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint64 ta, tb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ta = g_file_info_get_attribute_uint64(fia, G_FILE_ATTRIBUTE_TIME_ACCESS);
+ tb = g_file_info_get_attribute_uint64(fib, G_FILE_ATTRIBUTE_TIME_ACCESS);
+ r = sort_result_uint64(ta, tb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+/* 2009-11-04 - Compare creation times. */
+static gint cmp_crtime(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint64 ta, tb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ta = g_file_info_get_attribute_uint64(fia, G_FILE_ATTRIBUTE_TIME_CREATED);
+ tb = g_file_info_get_attribute_uint64(fib, G_FILE_ATTRIBUTE_TIME_CREATED);
+ r = sort_result_uint64(ta, tb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+/* 2009-11-04 - Compare modification times. */
+static gint cmp_mtime(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint64 ta, tb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ta = g_file_info_get_attribute_uint64(fia, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ tb = g_file_info_get_attribute_uint64(fib, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ r = sort_result_uint64(ta, tb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+/* 2010-10-19 - Compare changed times. */
+static gint cmp_chtime(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint64 ta, tb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ta = g_file_info_get_attribute_uint64(fia, G_FILE_ATTRIBUTE_TIME_CHANGED);
+ tb = g_file_info_get_attribute_uint64(fib, G_FILE_ATTRIBUTE_TIME_CHANGED);
+ r = sort_result_uint64(ta, tb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_device(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 da, db;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ da = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ db = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ r = sort_result_uint32(da, db, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_device_major(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 da, db;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ da = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ db = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ r = sort_result_uint32(da >> 8, db >> 8, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_device_minor(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 da, db;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ da = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ db = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_RDEV);
+ r = sort_result_uint32(da & 255, db & 255, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_gid_num(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 ga, gb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ ga = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_GID);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ gb = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_GID);
+ r = sort_result_uint32(ga, gb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_gid_str(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 ga, gb;
+ const gchar *gas, *gbs;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ ga = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_GID);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ gb = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_GID);
+ if((gas = usr_lookup_gname(ga)) != NULL && (gbs = usr_lookup_gname(gb)) != NULL)
+ r = sort_result(strcmp(gas, gbs), model, a, b, fia, fib);
+ else
+ r = sort_result_uint32(ga, gb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_uid_num(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 ua, ub;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ ua = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_UID);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ub = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_UID);
+ r = sort_result_uint32(ua, ub, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_uid_str(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 ua, ub;
+ const gchar *uas, *ubs;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ ua = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_UID);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ ub = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_UID);
+ if((uas = usr_lookup_uname(ua)) != NULL && (ubs = usr_lookup_gname(ub)) != NULL)
+ r = sort_result(strcmp(uas, ubs), model, a, b, fia, fib);
+ else
+ r = sort_result_uint32(ua, ub, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_mode_num(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 ma, mb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ ma = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_MODE);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ mb = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_MODE);
+ r = sort_result_uint32(ma, mb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_mode_str(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ gint r;
+ char mab[16], mbb[16];
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ stu_mode_to_text(mab, sizeof mab, g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_MODE));
+ stu_mode_to_text(mbb, sizeof mbb, g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_MODE));
+ r = sort_result(strcmp(mab, mbb), model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_nlink(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ guint32 na, nb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ na = g_file_info_get_attribute_uint32(fia, G_FILE_ATTRIBUTE_UNIX_NLINK);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ nb = g_file_info_get_attribute_uint32(fib, G_FILE_ATTRIBUTE_UNIX_NLINK);
+ r = sort_result_uint32(na, nb, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_type(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ GFileInfo *fia, *fib;
+ FType *ta, *tb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, COL_FTYPE, &ta, -1);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, COL_FTYPE, &tb, -1);
+ if(ta != NULL && tb != NULL)
+ r = sort_result(strcmp(ta->name, tb->name), model, a, b, fia, fib);
+ else
+ r = sort_result(0, model, a, b, fia, fib);
+ g_object_unref(fib);
+ g_object_unref(fia);
+
+ return r;
+}
+
+static gint cmp_uri(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user)
+{
+ DirPane *dp = user;
+ GFileInfo *fia, *fib;
+ GFile *fa, *fb;
+ gint r;
+
+ gtk_tree_model_get(model, a, COL_INFO, &fia, -1);
+ fa = dp_get_file_from_row(dp, a);
+ gtk_tree_model_get(model, b, COL_INFO, &fib, -1);
+ fb = dp_get_file_from_row(dp, b);
+ if(fa != NULL && fb != NULL)
+ {
+ gchar *ua, *ub;
+
+ ua = g_file_get_uri(fa);
+ ub = g_file_get_uri(fb);
+ r = sort_result(strcmp(ua, ub), model, a, b, fia, fib);
+ g_free(ub);
+ g_free(ua);
+ }
+ else
+ r = sort_result(0, model, a, b, fia, fib);
+ g_object_unref(fb);
+ g_object_unref(fib);
+ g_object_unref(fa);
+ g_object_unref(fia);
+
+ return r;
+
+}
+
+static void evt_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user)
+{
+ dp_dbclk_row(user, gtk_tree_path_get_indices(path)[0]);
+}
+
+/* 2009-10-01 - The selection has somehow changed -- so recompute statistics display. */
+static void evt_selection_changed(GtkTreeSelection *ts, gpointer user)
+{
+ update_selection_stats(user);
+ dp_show_stats(user);
+}
+
+static void dp_build_list(DirPane *dp, const DPFormat *fmt)
+{
+ const struct {
+ DPContent content;
+ GtkTreeIterCompareFunc func;
+ } sorters[] = {
+ { DPC_NAME, cmp_name },
+ { DPC_SIZE, cmp_size }, { DPC_BLOCKS, cmp_size }, { DPC_BLOCKSIZE, cmp_size },
+ { DPC_ATIME, cmp_atime },
+ { DPC_CRTIME, cmp_crtime },
+ { DPC_MTIME, cmp_mtime },
+ { DPC_CHTIME, cmp_chtime },
+ { DPC_DEVICE, cmp_device }, { DPC_DEVMAJ, cmp_device_major}, { DPC_DEVMIN, cmp_device_minor },
+ { DPC_GIDNUM, cmp_gid_num }, { DPC_GIDSTR, cmp_gid_str },
+ { DPC_UIDNUM, cmp_uid_num }, { DPC_UIDSTR, cmp_uid_str },
+ { DPC_MODENUM, cmp_mode_num }, { DPC_MODESTR, cmp_mode_str },
+ { DPC_NLINK, cmp_nlink },
+ { DPC_ICON, cmp_type } /* This might be unexpected? */,
+ { DPC_TYPE, cmp_type },
+ { DPC_URI_NOFILE, cmp_uri },
+ };
+ gint i;
+
+ dp->dir.store = gtk_list_store_new(COL_NUMBER_OF_COLUMNS, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_OBJECT, G_TYPE_UINT );
+ for(i = 0; i < sizeof sorters / sizeof *sorters; i++)
+ gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(dp->dir.store), sorters[i].content, sorters[i].func, dp, NULL);
+
+ dp->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dp->dir.store));
+ gtk_tree_view_set_search_column(GTK_TREE_VIEW(dp->view), -1);
+ gtk_tree_view_set_enable_search(GTK_TREE_VIEW(dp->view), FALSE);
+
+ /* Connect signals. */
+ g_signal_connect(G_OBJECT(dp->view), "button_press_event", G_CALLBACK(evt_dirpane_button_press), dp);
+ g_signal_connect(G_OBJECT(dp->view), "row_activated", G_CALLBACK(evt_row_activated), dp);
+ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view)), GTK_SELECTION_MULTIPLE);
+ gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(dp->view), fmt->rubber_banding);
+ dp->sig_sel_changed = g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(dp->view))), "changed", G_CALLBACK(evt_selection_changed), dp);
+
+ for(i = 0; i < fmt->num_columns; i++)
+ {
+ GtkCellRenderer *cr;
+ GtkTreeCellDataFunc cdf;
+ gpointer user;
+ GtkWidget *lab;
+
+ /* Ask the formatting module for a cell data function. */
+ cdf = dpf_get_cell_data_func(dp, i, &user);
+ if(cdf != NULL)
+ {
+ GtkTreeViewColumn *tc;
+ gfloat xa;
+
+ switch(fmt->format[i].content)
+ {
+ case DPC_NAME:
+ case DPC_SIZE:
+ case DPC_BLOCKS:
+ case DPC_ATIME:
+ case DPC_CRTIME:
+ case DPC_MTIME:
+ case DPC_CHTIME:
+ case DPC_MODESTR:
+ case DPC_MODENUM:
+ case DPC_UIDNUM:
+ case DPC_UIDSTR:
+ case DPC_GIDNUM:
+ case DPC_GIDSTR:
+ case DPC_NLINK:
+ case DPC_DEVICE:
+ case DPC_DEVMIN:
+ case DPC_DEVMAJ:
+ case DPC_TYPE:
+ case DPC_URI_NOFILE:
+ cr = gtk_cell_renderer_text_new();
+ break;
+ case DPC_ICON:
+ cr = gtk_cell_renderer_pixbuf_new();
+ break;
+ default:
+ g_warning("Unsupported dirpane content type %d detected", fmt->format[i].content);
+ continue;
+ }
+
+ tc = gtk_tree_view_column_new();
+ lab = gtk_label_new(fmt->format[i].title);
+ gtk_widget_show_all(lab);
+ gtk_tree_view_column_set_widget(tc, lab);
+ /* Compute legacy justification into alignment, and set for both header and content. */
+ switch(fmt->format[i].just)
+ {
+ case GTK_JUSTIFY_LEFT:
+ xa = 0.f;
+ break;
+ case GTK_JUSTIFY_CENTER:
+ xa = 0.5f;
+ break;
+ case GTK_JUSTIFY_RIGHT:
+ xa = 1.0f;
+ break;
+ default:
+ xa = 0.5f;
+ }
+ gtk_tree_view_column_set_alignment(tc, xa); /* Header. */
+ g_object_set(cr, "xalign", xa, NULL); /* Content. */
+ g_object_set_data(G_OBJECT(cr), "main", dp->main); /* Always handy. */
+ /* Set the content ID as the sort ID; they're unique and all. */
+ gtk_tree_view_column_set_sort_column_id(tc, fmt->format[i].content);
+ /* Set the size, which we try to control ourselves. */
+ gtk_tree_view_column_set_min_width(tc, fmt->format[i].width);
+ gtk_tree_view_column_set_sizing(tc, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_resizable(tc, FALSE);
+ gtk_tree_view_column_set_expand(tc, FALSE);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(dp->view), tc);
+ gtk_tree_view_column_pack_start(tc, cr, TRUE);
+ /* Expose the column index. */
+ g_object_set_data(G_OBJECT(tc), "index", GINT_TO_POINTER(i));
+ /* This must be done after column is appended. */
+ gtk_tree_view_column_set_cell_data_func(tc, cr, cdf, user, NULL);
+ }
+ }
+ /* Set the user's preferred sorting column and order. */
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(dp->dir.store), fmt->sort.content, fmt->sort.invert ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING);
+ g_signal_connect(G_OBJECT(GTK_TREE_SORTABLE(dp->dir.store)), "sort_column_changed", G_CALLBACK(evt_pane_sort_column_clicked), dp);
+ gtk_container_add(GTK_CONTAINER(dp->scwin), dp->view);
+}
+
+/* 1998-05-23 - Rewrote this one, now encloses stuff in a frame, which provides a fairly nice way to
+** indicate current directory. Now also uses the new dirpane formatting/config stuff.
+** 1998-06-26 - Cut away the code above (dp_build_list), making this function a lot leaner.
+** 1998-09-06 - Frame removed, since I've become cool enough to use styles to just change the
+** background color of the pane's column buttons. Looks great!
+** 1998-10-26 - Now supports configuring the position of the path entry (above or below).
+*/
+GtkWidget * dp_build(MainInfo *min, DPFormat *fmt, DirPane *dp)
+{
+ GtkWidget *hbox, *ihbox;
+ GtkListStore *model;
+ GSList *iter;
+
+ if(pane_selected != NULL)
+ {
+ g_object_unref(pane_selected);
+ pane_selected = NULL;
+ }
+ if(focus_style != NULL)
+ {
+ g_object_unref(focus_style);
+ focus_style = NULL;
+ }
+ if(dp == NULL)
+ return NULL;
+
+ dp->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ /* "Internal" hbox, holds the scrolled window of the pane and the optional
+ ** "huge" parent button. If the latter is disabled, it's redundant, but hey.
+ */
+ ihbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+
+ dp->scwin = gtk_scrolled_window_new(NULL, NULL);
+ if(fmt->sbar_pos == SBP_LEFT)
+ gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(dp->scwin), GTK_CORNER_TOP_RIGHT);
+ else if(fmt->sbar_pos == SBP_RIGHT)
+ gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(dp->scwin), GTK_CORNER_TOP_LEFT);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dp->scwin), GTK_POLICY_AUTOMATIC, fmt->scrollbar_always ? GTK_POLICY_ALWAYS : GTK_POLICY_AUTOMATIC);
+
+ dp_build_list(dp, fmt);
+
+ dp->notebook = gtk_notebook_new();
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(dp->notebook), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(dp->notebook), FALSE);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ dp->parent = gtk_button_new_from_icon_name("go-up", GTK_ICON_SIZE_MENU);
+ gtk_widget_set_can_focus(dp->parent, FALSE);
+ g_signal_connect(G_OBJECT(dp->parent), "clicked", G_CALLBACK(evt_parent_clicked), dp);
+ gtk_box_pack_start(GTK_BOX(hbox), dp->parent, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text(dp->parent, _("Move up to the parent directory"));
+ dp->menu_top = NULL;
+ dp->menu_action = NULL;
+ dp->mitem_action = NULL;
+
+ model = gtk_list_store_new(1, G_TYPE_STRING);
+ dp->path = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(model));
+ gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(dp->path), 0);
+
+ dp->complete.compl = gtk_entry_completion_new();
+ model = gtk_list_store_new(1, G_TYPE_STRING);
+ gtk_entry_completion_set_model(dp->complete.compl, GTK_TREE_MODEL(model));
+ gtk_entry_completion_set_text_column(dp->complete.compl, 0);
+ gtk_entry_completion_set_inline_completion(dp->complete.compl, TRUE);
+ gtk_entry_completion_set_popup_single_match(dp->complete.compl, FALSE);
+ gtk_entry_completion_set_match_func(dp->complete.compl, completion_match_function, dp, NULL);
+ gtk_entry_set_completion(DP_ENTRY(dp), dp->complete.compl);
+ g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(dp->path))), "focus_in_event", G_CALLBACK(evt_path_focus), dp);
+ g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(dp->path))), "focus_out_event", G_CALLBACK(evt_path_unfocus), dp);
+ dp->sig_path_activate = g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(dp->path))), "activate", G_CALLBACK(evt_path_new), dp);
+ dp->sig_path_changed = g_signal_connect(G_OBJECT(dp->path), "changed", G_CALLBACK(evt_path_changed), dp);
+
+ gtk_box_pack_start(GTK_BOX(hbox), dp->path, TRUE, TRUE, 0);
+ gtk_widget_set_tooltip_text(dp->path, _("Enter path, then press Return to go there"));
+ dp->hide = gtk_toggle_button_new_with_label(_("H"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dp->hide), fmt->hide_allowed);
+ g_signal_connect(G_OBJECT(dp->hide), "clicked", G_CALLBACK(evt_hide_clicked), dp);
+ gtk_box_pack_start(GTK_BOX(hbox), dp->hide, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text(dp->hide, _("Click to enable/disable Hide rule (When pressed in, the hide rule is active, and matching entries are hidden)"));
+ gtk_notebook_append_page(GTK_NOTEBOOK(dp->notebook), hbox, NULL);
+
+ /* If we have any registered pathwidgetry builders, go through and add their output to notebook. */
+ for(iter = pathwidgetry_builders; iter != NULL; iter = g_slist_next(iter))
+ {
+ PageBuilder func = iter->data;
+ GtkWidget **page;
+
+ if(func && (page = func(min)) != NULL)
+ {
+ g_object_set_data(G_OBJECT(*page), "dp-pathwidgetry", page);
+ gtk_notebook_append_page(GTK_NOTEBOOK(dp->notebook), *page, NULL);
+ }
+ }
+ if(fmt->huge_parent)
+ {
+ dp->hparent = gtk_button_new();
+ gtk_button_set_relief(GTK_BUTTON(dp->hparent), GTK_RELIEF_NONE);
+ g_signal_connect(G_OBJECT(dp->hparent), "clicked", G_CALLBACK(evt_hugeparent_clicked), dp);
+ gtk_widget_set_tooltip_text(dp->hparent, _("Move up to the parent directory"));
+ gtk_widget_set_can_focus(dp->hparent, FALSE);
+ if(dp->index == 0)
+ {
+ gtk_box_pack_start(GTK_BOX(ihbox), dp->hparent, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(ihbox), dp->scwin, TRUE, TRUE, 0);
+ }
+ else
+ {
+ gtk_box_pack_start(GTK_BOX(ihbox), dp->scwin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(ihbox), dp->hparent, FALSE, FALSE, 0);
+ }
+ }
+ else
+ {
+ gtk_box_pack_start(GTK_BOX(ihbox), dp->scwin, TRUE, TRUE, 0);
+ dp->hparent = NULL;
+ }
+
+ if(fmt->path_above)
+ {
+ gtk_box_pack_start(GTK_BOX(dp->vbox), dp->notebook, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(dp->vbox), ihbox, TRUE, TRUE, 0);
+ }
+ else
+ {
+ gtk_box_pack_start(GTK_BOX(dp->vbox), ihbox, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(dp->vbox), dp->notebook, FALSE, FALSE, 0);
+ }
+
+ if(fmt->set_font)
+ {
+ PangoFontDescription *fdesc;
+
+ if((fdesc = pango_font_description_from_string(fmt->font_name)) != NULL)
+ {
+ gtk_widget_override_font(dp->view, fdesc);
+ pango_font_description_free(fdesc);
+ }
+ }
+
+ gtk_widget_show_all(dp->vbox);
+ dp->dbclk_row = -1;
+ clear_stats(dp);
+
+ return dp->vbox;
+}
diff --git a/src/dirpane.h b/src/dirpane.h
new file mode 100644
index 0000000..23d6ee4
--- /dev/null
+++ b/src/dirpane.h
@@ -0,0 +1,115 @@
+/*
+** 1998-05-25 - Header file for the dirpane module. Deals with all aspects of
+** directory panes. Since those are very central to this program,
+** there's quite a lot to deal with.
+*/
+
+#if !defined DIRPANE_H
+#define DIRPANE_H
+
+#define DP_ENTRY(dp) GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dp->path)))
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern void dp_initialize(DirPane *dp, size_t num);
+
+extern gboolean dp_realized(const MainInfo *min);
+
+extern DirPane * dp_mirror(const MainInfo *min, const DirPane *dp);
+extern const gchar * dp_full_name(const DirPane *dp, const DirRow2 *row);
+extern const gchar * dp_name_quoted(const DirPane *dp, const DirRow2 *row, gboolean path);
+
+extern void dp_show_stats(DirPane *dp);
+extern void dp_update_stats(DirPane *dp);
+extern gboolean dp_activate(DirPane *dp);
+
+extern void dp_resort(DirPane *dp);
+extern void dp_redisplay(DirPane *dp);
+extern void dp_redisplay_preserve(DirPane *dp);
+
+extern void dp_unfocus(DirPane *dp);
+extern void dp_focus_enter_dir(DirPane *dp);
+
+extern gboolean dp_has_selection(DirPane *dp);
+extern gboolean dp_has_single_selection(const DirPane *dp);
+extern gboolean dp_is_selected(DirPane *dp, const DirRow2 *row);
+
+extern GSList * dp_get_selection(DirPane *dp);
+extern GSList * dp_get_selection_full(const DirPane *dp);
+#if 0
+extern void dp_print_selection(DirPane *dp, const gchar *tag);
+#endif
+extern void dp_free_selection(GSList *sel);
+
+extern gboolean dp_enter_dir(DirPane *dp, const gchar *path);
+
+extern void dp_rescan(DirPane *dp);
+extern void dp_rescan_post_cmd(DirPane *dp);
+extern gboolean dp_rescan_row(DirPane *dp, const DirRow2 *row, GError **error);
+
+extern void dp_path_clear(DirPane *dp);
+extern void dp_path_focus(DirPane *dp);
+extern void dp_path_unfocus(DirPane *dp);
+
+extern void dp_history_set(DirPane *dp, const GList *paths);
+
+extern void dp_dbclk_row(DirPane *dp, gint row);
+
+extern void dp_select(DirPane *dp, const DirRow2 *row);
+extern void dp_select_all(DirPane *dp);
+extern void dp_unselect(DirPane *dp, const DirRow2 *row);
+extern void dp_unselect_all(DirPane *dp);
+extern void dp_toggle(DirPane *dp,const DirRow2 *row);
+
+extern void dp_split_refresh(MainInfo *min);
+
+/* Functionality for letting various modules create alternative widgetry that
+** can replace the ordinary parent, path, and hide widget row. ISearch first.
+*/
+typedef GtkWidget ** (*PageBuilder)(MainInfo *min);
+
+extern guint dp_pathwidgetry_add(PageBuilder func);
+extern GtkWidget ** dp_pathwidgetry_show(DirPane *dp, guint key);
+
+
+/* Data access functions. This very much exposes that we use a GtkTreeModel to store
+** the pane' data, but that is hardly a secret. This is done for performance; not
+** needing to pass a DirPane pointer frees up the 'user' pointer in CellRenderer
+** data callbacks. See also the dpformat module.
+*/
+extern GtkTreeModel * dp_get_tree_model(const DirPane *dp);
+
+extern GFile * dp_get_file_from_row(const DirPane *dp, const DirRow2 *row);
+extern GFile * dp_get_file_from_name(const DirPane *dp, const gchar *name);
+extern GFile * dp_get_file_from_name_display(const DirPane *dp, const gchar *name);
+
+extern void dp_row_set_ftype(GtkTreeModel *model, const DirRow2 *row, FType *type);
+extern void dp_row_set_size(GtkTreeModel *model, const DirRow2 *row, guint64 size);
+extern void dp_row_set_flag(GtkTreeModel *model, const DirRow2 *row, guint32 mask);
+
+extern const gchar * dp_row_get_name(const GtkTreeModel *model, const DirRow2 *row);
+extern const gchar * dp_row_get_name_display(const GtkTreeModel *model, const DirRow2 *row);
+extern const gchar * dp_row_get_name_edit(const GtkTreeModel *model, const DirRow2 *row);
+extern goffset dp_row_get_size(const GtkTreeModel *model, const DirRow2 *row);
+extern guint64 dp_row_get_blocks(const GtkTreeModel *model, const DirRow2 *row);
+extern guint64 dp_row_get_blocksize(const GtkTreeModel *model, const DirRow2 *row);
+extern guint32 dp_row_get_mode(const GtkTreeModel *model, const DirRow2 *row);
+extern FType * dp_row_get_ftype(const GtkTreeModel *model, const DirRow2 *row);
+extern GFileType dp_row_get_file_type(const GtkTreeModel *model, const DirRow2 *row, gboolean target);
+extern guint64 dp_row_get_time_accessed(const GtkTreeModel *model, const DirRow2 *row);
+extern guint64 dp_row_get_time_changed(const GtkTreeModel *model, const DirRow2 *row);
+extern guint64 dp_row_get_time_created(const GtkTreeModel *model, const DirRow2 *row);
+extern guint64 dp_row_get_time_modified(const GtkTreeModel *model, const DirRow2 *row);
+extern guint32 dp_row_get_gid(const GtkTreeModel *model, const DirRow2 *row);
+extern guint32 dp_row_get_uid(const GtkTreeModel *model, const DirRow2 *row);
+extern guint32 dp_row_get_nlink(const GtkTreeModel *model, const DirRow2 *row);
+extern guint32 dp_row_get_device(const GtkTreeModel *model, const DirRow2 *row);
+extern const gchar * dp_row_get_link_target(const GtkTreeModel *model, const DirRow2 *row);
+extern gboolean dp_row_get_flags(const GtkTreeModel *model, const DirRow2 *row, guint32 mask);
+extern gboolean dp_row_get_can_read(const GtkTreeModel *model, const DirRow2 *row);
+extern gboolean dp_row_get_can_write(const GtkTreeModel *model, const DirRow2 *row);
+extern gboolean dp_row_get_can_execute(const GtkTreeModel *model, const DirRow2 *row);
+
+extern GtkWidget * dp_build(MainInfo *min, DPFormat *fmt, DirPane *dp);
+
+#endif /* DIRPANE_H */
diff --git a/src/dpformat.c b/src/dpformat.c
new file mode 100644
index 0000000..4f136b1
--- /dev/null
+++ b/src/dpformat.c
@@ -0,0 +1,801 @@
+/*
+** 1998-05-25 - This module deals with formatting directory pane entries for display.
+** That's all it does, but since that's a fairly involved thing to do
+** (we aim for plenty of flexibility here), it deserves a module of its
+** own.
+** 1999-05-15 - Added the utility dpf_set_default_format() funtion, for cfg_dirpane.
+** 1999-05-20 - Adapted for the new ultra-flexible & dynamic styles subsystem. Now
+** does three hash-lookups rather than three vector-dittos per row. :)
+*/
+
+#include "gentoo.h"
+
+#include <time.h>
+
+#include "dpformat.h"
+#include "dirpane.h"
+#include "userinfo.h"
+#include "iconutil.h"
+#include "sizeutil.h"
+#include "strutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ DPContent id;
+ const gchar *name_full; /* Long, descriptive name. Multiple words, mixed caps. */
+ const gchar *name_short; /* Short mnemonic name, no whitespace, all lower case. */
+ const gchar *column_title; /* Single word, with caps. Handy for pane column titles. */
+} ContentInfo;
+
+/* This table is used for the various dpf_get_content_XXX() functions below. It's sorted
+** in rising content ID order, but we typically ignore that and search it sequentially
+** every time. Just keep those searches out from the inner loops, and things should be fine.
+*/
+static ContentInfo content_info[] = {
+ { DPC_NAME, N_("Name"), "name", N_("Name") },
+ { DPC_SIZE, N_("Size"), "size", N_("Size") },
+ { DPC_BLOCKS, N_("Blocks"), "blocks", N_("Blocks") },
+ { DPC_BLOCKSIZE, N_("Block Size"), "blocksize", N_("BSize") },
+ { DPC_MODENUM, N_("Mode, numerical"), "modenum", N_("Mode") },
+ { DPC_MODESTR, N_("Mode, string"), "modestr", N_("Mode") },
+ { DPC_NLINK, N_("Number of links"), "nlink", N_("Nlink") },
+ { DPC_UIDNUM, N_("Owner ID"), "uid", N_("Uid") },
+ { DPC_UIDSTR, N_("Owner Name"), "uname", N_("Uname") },
+ { DPC_GIDNUM, N_("Group ID"), "gid", N_("Gid") },
+ { DPC_GIDSTR, N_("Group Name"), "gname", N_("Gname") },
+ { DPC_DEVICE, N_("Device Number"), "device", N_("Device") },
+ { DPC_DEVMAJ, N_("Device Number, major"), "devmaj", N_("DevMaj") },
+ { DPC_DEVMIN, N_("Device Number, minor"), "devmin", N_("DevMin") },
+ { DPC_ATIME, N_("Time of Last Access"), "atime", N_("Accessed") },
+ { DPC_MTIME, N_("Time of Last Modification"),"mtime", N_("Modified") },
+ { DPC_CRTIME, N_("Time of Creation"), "ctime", N_("Created") },
+ { DPC_CHTIME, N_("Time of Last Change"), "chtime", N_("Changed") },
+ { DPC_TYPE, N_("Type Name"), "type", N_("Type") },
+ { DPC_ICON, N_("Icon"), "icon", N_("I") },
+ { DPC_URI_NOFILE, N_("URI (without file prefix)"),"urinofile", N_("URI") },
+ };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-07-02 - Initialize the dpformat module. Mainly concerned with some I18N stuff. */
+void dpf_initialize(void)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof content_info[0]; i++)
+ content_info[i].column_title = _(content_info[i].column_title);
+}
+
+/* 1999-05-15 - Get the "official" content name for column content number <content>. */
+const gchar * dpf_get_content_name(DPContent content)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof content_info[0]; i++)
+ {
+ if(content_info[i].id == content)
+ return _(content_info[i].name_full);
+ }
+ return NULL;
+}
+
+/* 1999-05-15 - Map a string to a DPContent integer. Returns an illegal index if <name> is bad. */
+DPContent dpf_get_content_from_name(const gchar *name)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof content_info[0]; i++)
+ {
+ if(strcmp(content_info[i].name_full, name) == 0) /* Compatibility: try it in English first. */
+ return content_info[i].id;
+ else if(strcmp(_(content_info[i].name_full), name) == 0)
+ return content_info[i].id;
+ }
+ return DPC_NUM_TYPES;
+}
+
+/* 2002-06-16 - Get mnemonic (short, single-word, non-translated) name for content. */
+const gchar * dpf_get_content_mnemonic(DPContent content)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof *content_info; i++)
+ {
+ if(content_info[i].id == content)
+ return content_info[i].name_short;
+ }
+ return NULL;
+}
+
+/* 1999-11-14 - Map a short, single word mnemonic content name to an integer content identifier.
+** Returns an illegal identifier if the name is unknown.
+*/
+DPContent dpf_get_content_from_mnemonic(const gchar *name)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof content_info[0]; i++)
+ {
+ if(strcmp(content_info[i].name_short, name) == 0)
+ return (DPContent) content_info[i].id;
+ }
+ return DPC_NUM_TYPES;
+}
+
+/* 1999-05-15 - Get a recommended column title for a column showing <content>. */
+const gchar * dpf_get_content_title(DPContent content)
+{
+ guint i;
+
+ for(i = 0; i < sizeof content_info / sizeof content_info[0]; i++)
+ {
+ if(content_info[i].id == content)
+ return content_info[i].column_title;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-05-12 - Returns a tree model with two columns: one is the user-friendly name of a
+** content type, and the other is the enum. Handy for building combos.
+*/
+static GtkTreeModel * get_content_model(void)
+{
+ GtkListStore *store;
+ gsize i;
+
+ store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+ for(i = 0; i < sizeof content_info / sizeof *content_info; i++)
+ {
+ GtkTreeIter iter;
+
+ gtk_list_store_insert_with_values(store, &iter,-1, 0, _(content_info[i].name_full), 1, content_info[i].id, -1);
+ }
+ return GTK_TREE_MODEL(store);
+}
+
+GtkWidget * dpf_get_content_combo_box(GCallback func, gpointer user)
+{
+ GtkTreeModel *model = get_content_model();
+ GtkWidget *wid;
+ GtkCellRenderer *cr;
+
+ wid = gtk_combo_box_new_with_model(model);
+ cr = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(wid), cr, TRUE);
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(wid), cr, "text", 0, NULL);
+ if(func != NULL)
+ g_signal_connect(G_OBJECT(wid), "changed", func, user);
+
+ return wid;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void dpf_set_default_format(DpCFmt *fmt, DPContent content)
+{
+ g_strlcpy(fmt->title, dpf_get_content_title(content), sizeof fmt->title);
+ fmt->content = content;
+ fmt->just = GTK_JUSTIFY_LEFT;
+ fmt->width = 50;
+
+ switch(fmt->content)
+ {
+ case DPC_NAME:
+ fmt->extra.name.show_type = FALSE;
+ fmt->width = 250;
+ break;
+ case DPC_SIZE:
+ fmt->extra.size.unit = SZE_BYTES;
+ fmt->extra.size.digits = 0;
+ fmt->extra.size.ticks = 0;
+ fmt->extra.size.tick = ',';
+ g_snprintf(fmt->extra.size.dformat, sizeof fmt->extra.size.dformat, "%%#.%uf", fmt->extra.size.digits);
+ fmt->extra.size.dir_show_fs_size = TRUE;
+ fmt->just = GTK_JUSTIFY_RIGHT;
+ break;
+ case DPC_BLOCKS:
+ g_strlcpy(fmt->extra.blocks.format, "%lu", sizeof fmt->extra.blocks.format);
+ break;
+ case DPC_BLOCKSIZE:
+ g_strlcpy(fmt->extra.blocksize.format, "%lu", sizeof fmt->extra.blocksize.format);
+ fmt->just = GTK_JUSTIFY_RIGHT;
+ break;
+ case DPC_MODENUM:
+ g_strlcpy(fmt->extra.mode.format, "%o", sizeof fmt->extra.mode.format);
+ break;
+ case DPC_NLINK:
+ g_strlcpy(fmt->extra.nlink.format, "%u", sizeof fmt->extra.nlink.format);
+ fmt->width = 75;
+ break;
+ case DPC_UIDNUM:
+ g_strlcpy(fmt->extra.uidnum.format, "%u", sizeof fmt->extra.uidnum.format);
+ fmt->width = 75;
+ break;
+ case DPC_GIDNUM:
+ g_strlcpy(fmt->extra.gidnum.format, "%u", sizeof fmt->extra.gidnum.format);
+ fmt->width = 75;
+ break;
+ case DPC_DEVICE:
+ g_strlcpy(fmt->extra.device.format, "%u", sizeof fmt->extra.device.format);
+ fmt->width = 75;
+ break;
+ case DPC_DEVMAJ:
+ g_strlcpy(fmt->extra.devmaj.format, "%u", sizeof fmt->extra.devmaj.format);
+ fmt->width = 75;
+ break;
+ case DPC_DEVMIN:
+ g_strlcpy(fmt->extra.devmin.format, "%u", sizeof fmt->extra.devmin.format);
+ fmt->width = 75;
+ break;
+ case DPC_ATIME:
+ g_strlcpy(fmt->extra.a_time.format, "%Y-%m-%d %H:%M:%S", sizeof fmt->extra.a_time.format);
+ fmt->width = 184;
+ break;
+ case DPC_CRTIME:
+ g_strlcpy(fmt->extra.cr_time.format, "%Y-%m-%d %H:%M:%S", sizeof fmt->extra.cr_time.format);
+ fmt->width = 184;
+ break;
+ case DPC_MTIME:
+ g_strlcpy(fmt->extra.m_time.format, "%Y-%m-%d %H:%M:%S", sizeof fmt->extra.m_time.format);
+ fmt->width = 184;
+ break;
+ case DPC_CHTIME:
+ g_strlcpy(fmt->extra.ch_time.format, "%Y-%m-%d %H:%M:%S", sizeof fmt->extra.ch_time.format);
+ fmt->width = 184;
+ break;
+ case DPC_TYPE:
+ break;
+ case DPC_ICON:
+ fmt->width = 16;
+ fmt->just = GTK_JUSTIFY_CENTER;
+ break;
+ default:
+ ;
+ }
+}
+
+/* 1998-10-15 - Moved this old code out of the main module, since it really didn't belong
+** in there.
+** 1999-05-15 - Thanks to the slightly more general routine above, this could be simplified. Great.
+** 1999-05-16 - Now also initializes the default colors.
+*/
+void dpf_init_defaults(CfgInfo *cfg)
+{
+ DPFormat *fmt = &cfg->dp_format[0];
+ guint i;
+
+ for(i = 0; i < DPC_NUM_TYPES; i++)
+ {
+ dpf_set_default_format(&fmt->format[i], (DPContent) i);
+ }
+ fmt->num_columns = i;
+ fmt->sort.content = DPC_NAME;
+ fmt->sort.invert = FALSE;
+ fmt->sort.mode = DPS_DIRS_FIRST;
+ strcpy(fmt->def_path, "file:///");
+ fmt->path_above = FALSE;
+ fmt->hide_allowed = TRUE;
+ fmt->scrollbar_always = TRUE;
+ fmt->huge_parent = FALSE;
+ fmt->set_font = FALSE;
+ fmt->rubber_banding = FALSE;
+ cfg->dp_format[1] = cfg->dp_format[0]; /* Duplicate default formats for second pane. */
+
+ cfg->dp_paning.orientation = DPORIENT_HORIZ;
+ cfg->dp_paning.mode = DPSPLIT_RATIO;
+ cfg->dp_paning.value = 0.5;
+
+ cfg->dp_history.select = TRUE;
+ cfg->dp_history.save = TRUE; /* Slightly out of place, but hey. */
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-10-02 - Gets the indicated content of a row, formatted as a string if possible. Note that this is independent
+** of the selected content types for the display; you can always get at the content this way. It does
+** cost you though. This is intended for human-speed operations, such as doing SelectRE on cell data.
+** NOTE: This uses a "natural" formatting, rather than the high-featured formatting used for pane display.
+*/
+gboolean dpf_get_content(MainInfo *min, const DirPane *dp, const DirRow2 *row, DPContent content, gchar *out, gsize max)
+{
+ GtkTreeModel *m;
+ const gchar *name;
+ gchar *root;
+ gsize offset;
+ guint64 filedate;
+ GDate date;
+
+ if(min == NULL || dp == NULL || row == NULL || out == NULL)
+ return FALSE;
+ m = dp_get_tree_model(dp);
+ switch(content)
+ {
+ case DPC_BLOCKS:
+ g_snprintf(out, max, "%" G_GUINT64_FORMAT, dp_row_get_blocks(m, row));
+ return TRUE;
+ case DPC_BLOCKSIZE:
+ g_snprintf(out, max, "%" G_GUINT64_FORMAT, dp_row_get_blocksize(m, row));
+ return TRUE;
+ case DPC_DEVICE:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_device(m, row));
+ return TRUE;
+ case DPC_DEVMAJ:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_device(m, row) >> 8);
+ return TRUE;
+ case DPC_DEVMIN:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_device(m, row) & 0xff);
+ return TRUE;
+ case DPC_GIDNUM:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_gid(m, row));
+ return TRUE;
+ case DPC_GIDSTR:
+ if((name = usr_lookup_gname(dp_row_get_gid(m, row))) != NULL)
+ g_snprintf(out, max, "%s", name);
+ else
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_gid(m, row));
+ return TRUE;
+ case DPC_ICON:
+ /* We just can't squeeze the icon into a string. */
+ return FALSE;
+ case DPC_MODENUM:
+ g_snprintf(out, max, "%o", dp_row_get_mode(m, row));
+ return TRUE;
+ case DPC_MODESTR:
+ stu_mode_to_text(out, max, dp_row_get_mode(m, row));
+ return TRUE;
+ case DPC_NAME:
+ g_snprintf(out, max, "%s", dp_row_get_name_display(m, row));
+ return TRUE;
+ case DPC_NLINK:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_nlink(m, row));
+ return TRUE;
+ case DPC_SIZE:
+ g_snprintf(out, max, "%" G_GUINT64_FORMAT, dp_row_get_size(m, row));
+ return TRUE;
+ case DPC_ATIME:
+ case DPC_CRTIME:
+ case DPC_MTIME:
+ case DPC_CHTIME:
+ {
+ filedate = (content == DPC_ATIME) ? dp_row_get_time_accessed(m, row) :
+ (content == DPC_CRTIME) ? dp_row_get_time_created(m, row) :
+ (content == DPC_MTIME) ? dp_row_get_time_modified(m, row) :
+ dp_row_get_time_changed(m, row);
+ g_date_set_time_t(&date, (time_t) filedate);
+ g_date_strftime(out, max, "%Y-%m-%d %H:%M:%S", &date);
+ return TRUE;
+ }
+ case DPC_TYPE:
+ g_snprintf(out, max, "%s", dp_row_get_ftype(m, row)->name);
+ return TRUE;
+ case DPC_UIDNUM:
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_uid(m, row));
+ return TRUE;
+ case DPC_UIDSTR:
+ if((name = usr_lookup_uname(dp_row_get_uid(m, row))) != NULL)
+ g_snprintf(out, max, "%s", name);
+ else
+ g_snprintf(out, max, "%" G_GUINT32_FORMAT, dp_row_get_uid(m, row));
+ return TRUE;
+ case DPC_URI_NOFILE:
+ if((root = g_file_get_uri(dp->dir.root)) != NULL)
+ {
+ /* Skip the "file://" scheme prefix. */
+ offset = (strncmp(root, "file://", 7) == 0) * 7; /* Too clever? */
+ g_snprintf(out, max, "%s/%s", root + offset, dp_row_get_name(m, row));
+ g_free(root);
+ return TRUE;
+ }
+ return FALSE;
+ case DPC_NUM_TYPES:
+ return FALSE; /* Fail. */
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-02-22 - Refactored this into a stand-alone function since it's not something I would like
+** seeing copied elsewhere (like, say, in the Styles config preview code).
+*/
+void dpf_cell_set_style_colors(GtkCellRenderer *r, const Style *style, gboolean do_fg, gboolean do_bg)
+{
+ const GdkColor *fg = NULL, *bg = NULL;
+
+ if(style != NULL)
+ {
+ if(do_fg)
+ fg = stl_style_property_get_color(style, SPN_COL_UNSEL_FG);
+ if(do_bg)
+ bg = stl_style_property_get_color(style, SPN_COL_UNSEL_BG);
+ }
+ if(do_fg)
+ {
+ if(fg != NULL)
+ g_object_set(G_OBJECT(r), "foreground-gdk", fg, "foreground-set", TRUE, NULL);
+ else
+ g_object_set(G_OBJECT(r), "foreground-set", FALSE, NULL);
+ }
+ if(do_bg)
+ {
+ if(bg != NULL)
+ g_object_set(G_OBJECT(r), "cell-background-gdk", bg, "cell-background-set", TRUE, NULL);
+ else
+ g_object_set(G_OBJECT(r), "cell-background-set", FALSE, NULL);
+ }
+}
+
+/* 2009-07-15 - Formats the colors, if any, for the given renderer. The foreground is optional,
+** since not all renderers (such as pixbuf) support a foreground color. This needs to be done
+** per-column, there's no way of doing it per-row in GTK+ 2.0. :/
+*/
+static void format_colors_row(GtkTreeModel *model, const DirRow2 *row, GtkCellRenderer *r, gboolean do_fg, gboolean do_bg)
+{
+ if(do_fg || do_bg)
+ {
+ FType *ft;
+ Style *st;
+
+ ft = dp_row_get_ftype(model, row);
+ if(ft != NULL)
+ st = ft->style;
+ else
+ st = NULL;
+ dpf_cell_set_style_colors(r, st, do_fg, do_bg);
+ }
+}
+
+static void cdf_name(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ const DC_Name *cfg = user;
+ const gchar *dname = dp_row_get_name_display(model, iter);
+
+ if(cfg->show_type || cfg->show_linkname)
+ {
+ gchar buf[1024];
+ const gchar *type = "", *tdname;
+
+ if(cfg->show_type)
+ {
+ const mode_t mode = dp_row_get_mode(model, iter);
+
+ if(S_ISLNK(mode))
+ type = "@";
+ else if(S_ISDIR(mode))
+ type = "/";
+ else if(S_ISREG(mode) && (mode & S_IXUSR))
+ type = "*";
+ else if(S_ISFIFO(mode))
+ type = "|";
+ else if(S_ISSOCK(mode))
+ type = "=";
+ }
+ /* \xe2\x86\x92 is UTF-8 for 'right arrow', Unicode character U+2190. */
+ if(cfg->show_linkname && (tdname = dp_row_get_link_target(model, iter)) != NULL)
+ g_snprintf(buf, sizeof buf, "%s%s \xe2\x86\x92 %s", dname, type, tdname);
+ else
+ g_snprintf(buf, sizeof buf, "%s%s", dname, type);
+
+ g_object_set(renderer, "text", buf, NULL);
+ }
+ else
+ g_object_set(renderer, "text", dname, NULL);
+
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_size(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ const DC_Size *cfg = user;
+ goffset size;
+ gchar buf[64];
+
+ if(!cfg->dir_show_fs_size && dp_row_get_file_type(model, iter, TRUE) == G_FILE_TYPE_DIRECTORY)
+ {
+ g_object_set(renderer, "text", "", NULL);
+ return;
+ }
+ size = dp_row_get_size(model, iter);
+ sze_put_offset(buf, sizeof buf, size, cfg->unit, cfg->digits, cfg->ticks ? cfg->tick : '\0');
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_blocks(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ guint64 blocks;
+ gchar buf[64];
+
+ blocks = dp_row_get_blocks(model, iter);
+ g_snprintf(buf, sizeof buf, "%" G_GUINT64_FORMAT, blocks);
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_icon(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ FType *ftype;
+
+ if((ftype = dp_row_get_ftype(model, iter)) != NULL)
+ {
+ const Style *stl = ftype->style;
+ const gchar *iname;
+
+ if((iname = stl_style_property_get_icon(stl, SPN_ICON_UNSEL)) != NULL)
+ {
+ GdkPixbuf *pbuf;
+ MainInfo *min = g_object_get_data(G_OBJECT(renderer), "main");
+
+ if((pbuf = ico_icon_get_pixbuf(min, iname)) != NULL)
+ g_object_set(renderer, "pixbuf", pbuf, NULL);
+ }
+ }
+ format_colors_row(model, iter, renderer, FALSE, FALSE);
+}
+
+static void do_cdf_time(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, const gchar *format, guint64 timestamp, gboolean do_bg)
+{
+ const time_t now = (time_t) (timestamp & 0xffffffffu);
+ struct tm local;
+
+ /* Use old-school Unix-y functions, since glib doesn't provide much until 2.26. Then we get GDateTime, w00t. :| */
+ if(localtime_r(&now, &local) != NULL)
+ {
+ gchar buf[32] = "\x1"; /* Marker char, to detect strftime() failure/success. */
+ size_t got;
+
+ got = strftime(buf, sizeof buf, format, &local);
+ if((got == 0 && buf[0] == '\x1') || got == sizeof buf) /* Try to detect (and handle!) failure. */
+ buf[0] = '\0';
+ g_object_set(renderer, "text", buf, NULL);
+ }
+ else
+ g_object_set(renderer, "text", "", NULL);
+ format_colors_row(model, iter, renderer, TRUE, do_bg);
+}
+
+static void cdf_atime(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ do_cdf_time(col, renderer, model, iter, user, dp_row_get_time_accessed(model, iter), TRUE);
+}
+
+static void cdf_crtime(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ do_cdf_time(col, renderer, model, iter, user, dp_row_get_time_created(model, iter), TRUE);
+}
+
+static void cdf_mtime(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ do_cdf_time(col, renderer, model, iter, user, dp_row_get_time_modified(model, iter), TRUE);
+}
+
+static void cdf_chtime(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ do_cdf_time(col, renderer, model, iter, user, dp_row_get_time_changed(model, iter), TRUE);
+}
+
+static void cdf_devmax(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, user, dp_row_get_device(model, iter) >> 8);
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_device(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, user, dp_row_get_device(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_devmin(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, user, dp_row_get_device(model, iter) & 255);
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_gidnum(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, user, dp_row_get_gid(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_gidstr(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ guint32 gid;
+ const gchar *group;
+
+ gid = dp_row_get_gid(model, iter);
+ if((group = usr_lookup_gname(gid)) != NULL)
+ g_object_set(renderer, "text", group, NULL);
+ else
+ {
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, user, gid);
+ g_object_set(renderer, "text", buf, NULL);
+ }
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_modenum(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[32];
+
+ g_snprintf(buf, sizeof buf, user, dp_row_get_mode(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_modestr(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ stu_mode_to_text(buf, sizeof buf, dp_row_get_mode(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_type(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ const FType *ft;
+
+ if((ft = dp_row_get_ftype(model, iter)) != NULL)
+ {
+ g_object_set(renderer, "text", ft->name, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+ }
+}
+
+static void cdf_uidnum(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, "%u", dp_row_get_uid(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_uidstr(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ guint32 uid;
+ const gchar *name;
+
+ uid = dp_row_get_uid(model, iter);
+
+ if((name = usr_lookup_uname(uid)) != NULL)
+ g_object_set(renderer, "text", name, NULL);
+ else
+ {
+ gchar buf[32];
+
+ g_snprintf(buf, sizeof buf, user, uid);
+ g_object_set(renderer, "text", buf, NULL);
+ }
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_nlink(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ gchar buf[16];
+
+ g_snprintf(buf, sizeof buf, "%u", dp_row_get_nlink(model, iter));
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+}
+
+static void cdf_uri(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user)
+{
+ DirPane *dp = user;
+ GFile *file;
+
+ if((file = dp_get_file_from_row(dp, iter)) != NULL)
+ {
+ gchar *uri, buf[512];
+
+ if((uri = g_file_get_uri(file)) != NULL)
+ {
+ if(strncmp(uri, "file://", 7) == 0)
+ g_snprintf(buf, sizeof buf, "%s", uri + 7);
+ else
+ g_snprintf(buf, sizeof buf, "%s", uri);
+ g_free(uri);
+ }
+ else
+ g_snprintf(buf, sizeof buf, "(failed)");
+ g_object_set(renderer, "text", buf, NULL);
+ format_colors_row(model, iter, renderer, TRUE, TRUE);
+ }
+}
+
+GtkTreeCellDataFunc dpf_get_cell_data_func(DirPane *dp, gint column, gpointer *user)
+{
+ DPFormat *fmt;
+ DpCFmt *col_fmt;
+
+ fmt = &dp->main->cfg.dp_format[dp->index];
+ if(column >= fmt->num_columns)
+ return NULL;
+ col_fmt = &fmt->format[column];
+
+ switch(col_fmt->content)
+ {
+ case DPC_ATIME:
+ *user = col_fmt->extra.a_time.format;
+ return cdf_atime;
+ case DPC_BLOCKS:
+ *user = col_fmt->extra.blocks.format;
+ return cdf_blocks;
+ case DPC_BLOCKSIZE:
+ return NULL;
+ case DPC_CRTIME:
+ *user = col_fmt->extra.cr_time.format;
+ return cdf_crtime;
+ case DPC_CHTIME:
+ *user = col_fmt->extra.ch_time.format;
+ return cdf_chtime;
+ case DPC_DEVICE:
+ *user = col_fmt->extra.device.format;
+ return cdf_device;
+ case DPC_DEVMAJ:
+ *user = col_fmt->extra.devmaj.format;
+ return cdf_devmax;
+ case DPC_DEVMIN:
+ *user = col_fmt->extra.devmin.format;
+ return cdf_devmin;
+ case DPC_GIDNUM:
+ *user = col_fmt->extra.gidnum.format;
+ return cdf_gidnum;
+ case DPC_GIDSTR:
+ *user = col_fmt->extra.gidnum.format;
+ return cdf_gidstr;
+ case DPC_ICON:
+ *user = NULL;
+ return cdf_icon;
+ case DPC_MODENUM:
+ *user = col_fmt->extra.mode.format;
+ return cdf_modenum;
+ case DPC_MODESTR:
+ *user = col_fmt->extra.mode.format;
+ return cdf_modestr;
+ case DPC_MTIME:
+ *user = col_fmt->extra.m_time.format;
+ return cdf_mtime;
+ case DPC_NAME:
+ *user = &col_fmt->extra.name;
+ return cdf_name;
+ case DPC_NLINK:
+ *user = col_fmt->extra.nlink.format;
+ return cdf_nlink;
+ case DPC_SIZE:
+ *user = &col_fmt->extra.size;
+ return cdf_size;
+ case DPC_TYPE:
+ return cdf_type;
+ case DPC_UIDNUM:
+ *user = col_fmt->extra.uidnum.format;
+ return cdf_uidnum;
+ case DPC_UIDSTR:
+ *user = col_fmt->extra.uidnum.format; /* Yes, numerical again. */
+ return cdf_uidstr;
+ case DPC_URI_NOFILE:
+ *user = dp;
+ return cdf_uri;
+ default:
+ *user = NULL;
+ }
+ return NULL;
+}
diff --git a/src/dpformat.h b/src/dpformat.h
new file mode 100644
index 0000000..e3d6b09
--- /dev/null
+++ b/src/dpformat.h
@@ -0,0 +1,22 @@
+/*
+** 1998-05-25 - Header for the DirPane formatting module.
+*/
+
+void dpf_initialize(void);
+
+const gchar * dpf_get_content_name(DPContent content);
+DPContent dpf_get_content_from_name(const gchar *name);
+const gchar * dpf_get_content_mnemonic(DPContent content);
+DPContent dpf_get_content_from_mnemonic(const gchar *name);
+const gchar * dpf_get_content_title(DPContent content);
+
+GtkWidget * dpf_get_content_combo_box(GCallback func, gpointer user);
+
+void dpf_set_default_format(DpCFmt *fmt, DPContent content);
+void dpf_init_defaults(CfgInfo *cfg);
+
+gboolean dpf_get_content(MainInfo *min, const DirPane *dp, const DirRow2 *row, DPContent content, gchar *out, gsize max);
+
+void dpf_cell_set_style_colors(GtkCellRenderer *r, const Style *st, gboolean do_fg, gboolean do_bg);
+
+GtkTreeCellDataFunc dpf_get_cell_data_func(DirPane *dp, gint column, gpointer *user);
diff --git a/src/errors.c b/src/errors.c
new file mode 100644
index 0000000..beea9e1
--- /dev/null
+++ b/src/errors.c
@@ -0,0 +1,112 @@
+/*
+** 1998-05-23 - A big fat error handling module. There are *so* many possible errors,
+** I think we really must get a grip on that situation. This is it.
+** As far as grips go, I consider this to be pretty loose. :(
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "dirpane.h"
+#include "dialog.h"
+#include "guiutil.h"
+#include "errors.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Description of the error. This is in UTF-8. */
+static gchar error_desc[1024] = "";
+
+/* ----------------------------------------------------------------------------------------- */
+
+void err_clear(MainInfo *min)
+{
+ error_desc[0] = '\0';
+}
+
+/* 1999-01-21 - Format an arbitrary string and print it on the status (error) line.
+** UGLY UGLY Uses a sneaky little loop to ensure that the text is displayed *NOW*.
+*/
+void err_printf(MainInfo *min, const gchar *fmt, ...)
+{
+ va_list al;
+
+ va_start(al, fmt);
+ vsnprintf(error_desc, sizeof error_desc, fmt, al);
+ va_end(al);
+ err_show(min);
+ gui_events_flush();
+}
+
+/* 1998-05-30 - Added special treatment of code == -1; this means that there is no
+** errno-compatible error information available, and the entire thing
+** is then suppressed.
+** 2010-03-07 - Assumes filenames are displayable, i.e. in UTF-8.
+*/
+gint err_set(MainInfo *min, gint code, const gchar *source, const gchar *obj)
+{
+ if(source != NULL)
+ {
+ if(code >= 0)
+ {
+ const gchar *desc;
+
+ desc = g_strerror(code);
+ if(obj != NULL)
+ g_snprintf(error_desc, sizeof error_desc, _("Couldn't %s \"%s\": %s (code %d)"), source, obj, desc, code);
+ else
+ g_snprintf(error_desc, sizeof error_desc, _("Couldn't %s \"%s\" (code %d)"), source, obj, code);
+ }
+ else
+ {
+ if(obj != NULL)
+ g_snprintf(error_desc, sizeof error_desc, _("Couldn't %s \"%s\""), source, obj);
+ else
+ g_snprintf(error_desc, sizeof error_desc, _("Couldn't %s"), source);
+ }
+ }
+ return 1;
+}
+
+/* 2009-08-06 - Sets the error report from a GError, which is what most GIO calls will generate. This frees the GError, too. The file is not freed! */
+void err_set_gerror(MainInfo *min, GError **err, const gchar *source, const GFile *file)
+{
+ if(err != NULL && *err != NULL)
+ {
+ /* If a file was supplied, extract the name and include in the displayed message. */
+ if(file != NULL)
+ {
+ gchar *pn = g_file_get_parse_name((GFile *) file);
+
+ g_snprintf(error_desc, sizeof error_desc, _("%s (%s)"), (*err)->message, pn);
+ g_free(pn);
+ }
+ else
+ g_snprintf(error_desc, sizeof error_desc, _("%s"), (*err)->message);
+ g_error_free(*err);
+ *err = NULL;
+ }
+}
+
+void err_show(MainInfo *min)
+{
+ if(error_desc[0] != '\0')
+ {
+ if(min->cfg.errors.display == ERR_DISPLAY_STATUSBAR)
+ {
+ gtk_label_set_text(GTK_LABEL(min->gui->top), error_desc);
+ gui_events_flush();
+ }
+ else if(min->cfg.errors.display == ERR_DISPLAY_TITLEBAR)
+ gui_set_main_title(min, error_desc);
+ else if(min->cfg.errors.display == ERR_DISPLAY_DIALOG)
+ dlg_dialog_async_new_simple(error_desc, "Error", "OK", NULL, NULL);
+ if(min->cfg.errors.beep)
+ gdk_beep();
+ }
+ else
+ dp_show_stats(min->gui->cur_pane);
+}
diff --git a/src/errors.h b/src/errors.h
new file mode 100644
index 0000000..aadab55
--- /dev/null
+++ b/src/errors.h
@@ -0,0 +1,9 @@
+/*
+** 1998-05-23 - Header file for the error-handling module.
+*/
+
+extern void err_clear(MainInfo *min);
+extern void err_printf(MainInfo *min, const gchar *fmt, ...);
+extern gint err_set(MainInfo *min, gint code, const gchar *source, const gchar *obj);
+extern void err_set_gerror(MainInfo *min, GError **error, const gchar *source, const GFile *file);
+extern void err_show(MainInfo *min);
diff --git a/src/events.c b/src/events.c
new file mode 100644
index 0000000..a8556ed
--- /dev/null
+++ b/src/events.c
@@ -0,0 +1,83 @@
+/*
+** 1999-06-12 - A little module to temporarily store (and give some sort of controlled
+** access to) GDK events. This is handy because some commands need data from
+** primarily mouse button events, but I don't want to pass that data down the
+** regular channels (i.e., as parameters to csq_execute()). So the commands
+** will have to go through here to get it.
+*/
+
+#include "gentoo.h"
+
+#include "events.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ gboolean valid;
+ GdkEvent event;
+} EventSlot;
+
+typedef struct {
+ EventSlot eventslot[1];
+} EventInfo;
+
+static EventInfo the_events = { { { FALSE } } };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-06-12 - Store given event in event memory, where it can be later accessed when needed.
+** Only a specific set of event types are supported.
+*/
+void evt_event_set(GdkEvent *evt)
+{
+ if(evt != NULL)
+ {
+ switch(evt->type)
+ {
+ case GDK_BUTTON_PRESS:
+ the_events.eventslot[0].valid = TRUE;
+ the_events.eventslot[0].event = *evt;
+ break;
+ default:
+ fprintf(stderr, "EVENTS: evt_event_set() called on illegal event type!\n");
+ }
+ }
+}
+
+/* 1999-06-12 - Retrieve a pointer the the last registered event of type <type>. Returns NULL
+** if there has been no registration, or the type is unsupported.
+*/
+GdkEvent * evt_event_get(GdkEventType type)
+{
+ guint index;
+
+ switch(type)
+ {
+ case GDK_BUTTON_PRESS:
+ index = 0;
+ break;
+ default:
+ fprintf(stderr, "EVENTS: evt_event_get() called on illegal event type!\n");
+ return NULL;
+ }
+ if(the_events.eventslot[index].valid)
+ return &the_events.eventslot[index].event;
+ return NULL;
+}
+
+/* 1999-06-12 - Clear the memory from events of type <type>. */
+void evt_event_clear(GdkEventType type)
+{
+ guint index;
+
+ switch(type)
+ {
+ case GDK_BUTTON_PRESS:
+ index = 0;
+ break;
+ default:
+ fprintf(stderr, "EVENTS: evt_event_clear() called on illegal event type!\n");
+ return;
+ }
+ the_events.eventslot[index].valid = FALSE;
+}
diff --git a/src/events.h b/src/events.h
new file mode 100644
index 0000000..bcb4f3a
--- /dev/null
+++ b/src/events.h
@@ -0,0 +1,7 @@
+/*
+** 1999-06-12 - Header for the little GDK event memory module.
+*/
+
+extern void evt_event_set(GdkEvent *evt);
+extern GdkEvent * evt_event_get(GdkEventType type);
+extern void evt_event_clear(GdkEventType type);
diff --git a/src/file.c b/src/file.c
new file mode 100644
index 0000000..f04a9e8
--- /dev/null
+++ b/src/file.c
@@ -0,0 +1,104 @@
+/*
+** 1998-09-18 - Maintain an instance of the 'file' external command as a child process, and
+** feed it typing requests when necessary. We will only start 'file' ONCE per
+** entire gentoo session (typically), thus amortizing its startup costs over
+** a very (?) long time. The aim of all this is hopefully to make typing using
+** the file rules cheaper.
+** 2002-01-03 - It's a while later, the file command on your system might now have the -n
+** option which causes it to flush its output, and enables this module to do
+** it's thing in the way intended. Used by cmd_info.c.
+*/
+
+#include "gentoo.h"
+
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "dialog.h"
+#include "errors.h"
+#include "children.h"
+#include "file.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static struct {
+ gint file_in; /* Writing end of pipe connected to command's stdin. */
+ gint file_out; /* Reading end of pipe connected to command's stdout. */
+} file_info = { -1, -1 };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void start_file(MainInfo *min, const gchar *cmd)
+{
+ gchar *argv[] = { "file", "file", "-n", "-f", "-", NULL };
+ GPid child;
+ GError *err = NULL;
+
+ if(g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &child, &file_info.file_in, &file_info.file_out, NULL, &err))
+ {
+ chd_register("file", child, CGF_RUNINBG, 0);
+ }
+ else
+ {
+ gchar buf[1024];
+
+ g_snprintf(buf, sizeof buf, "Couldn't run the 'file' command:\n%s", err->message);
+ dlg_dialog_async_new_error(buf);
+ g_error_free(err);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-18 - Run 'file' on the supplied file name, and return a pointer to its result line.
+** The returned string will be the result of 'file', minus the header and the
+** trailing newline. The returned string is static, and only valid up until the
+** next call to this function. If the execution fails, NULL is returned.
+*/
+const gchar * fle_file(MainInfo *min, const gchar *name)
+{
+ if(file_info.file_in < 0)
+ start_file(min, "file");
+ if(file_info.file_in > 0) /* File command running? */
+ {
+ static gchar resp[PATH_MAX + 256];
+ gchar line[PATH_MAX + 32];
+ gint len, got;
+ fd_set fds_read;
+ struct timeval to;
+
+ len = g_snprintf(line, sizeof line, "%s\n", name);
+ if(write(file_info.file_in, line, len) != len)
+ {
+ perror("Write to pipe");
+ return NULL;
+ }
+ FD_ZERO(&fds_read);
+ FD_SET(file_info.file_out, &fds_read);
+ to.tv_sec = 1U;
+ to.tv_usec = 0U;
+ if((select(file_info.file_out + 1, &fds_read, NULL, NULL, &to)) > 0)
+ {
+ if(FD_ISSET(file_info.file_out, &fds_read))
+ {
+ if((got = read(file_info.file_out, resp, sizeof resp - 1)) > 0)
+ {
+ const gchar *cp;
+
+ resp[got - 1] = '\0';
+ if((cp = strrchr(resp, ':')) != NULL)
+ {
+ cp++;
+ while(*cp && isspace((guchar) *cp))
+ cp++;
+ return cp;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/src/file.h b/src/file.h
new file mode 100644
index 0000000..c884004
--- /dev/null
+++ b/src/file.h
@@ -0,0 +1,5 @@
+/*
+** 1998-09-18 - Header file for the 'file' utility module.
+*/
+
+extern const gchar * fle_file(MainInfo *min, const gchar *name);
diff --git a/src/fileutil.c b/src/fileutil.c
new file mode 100644
index 0000000..a90ad96
--- /dev/null
+++ b/src/fileutil.c
@@ -0,0 +1,818 @@
+/*
+** 1998-05-25 - This module contains various file and directory related operations, that
+** are needed here and there in the application.
+** 1999-11-13 - Rewrote the core fut_copy() function. Shorter, simpler, better. Added
+** a complementary fut_copy_partial() function that copies just parts of files.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "errors.h"
+#include "progress.h"
+#include "strutil.h"
+#include "userinfo.h"
+
+#include "fileutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define USER_NAME_SIZE (64) /* Just an assumption, really. */
+
+#define MIN_COPY_CHUNK (1 << 17)
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-21 - Enter a directory, saving the old path for restoration later.
+** If <old> is NULL, no storing is done. Returns boolean success.
+*/
+gboolean fut_cd(const gchar *new_dir, gchar *old, gsize old_max)
+{
+ if(old != NULL)
+ {
+ if(getcwd(old, old_max) == NULL)
+ return FALSE;
+ }
+ return chdir(new_dir) == 0 ? TRUE : FALSE;
+}
+
+#if 0
+/* 2003-10-10 - Compute a directory stat chain from <path>. It's made
+** up of a list of stat(2) structures up to the root.
+*/
+GList * fut_stat_chain_new(const gchar *path)
+{
+ gchar canon[PATH_MAX];
+ GList *chain = NULL;
+ GString *dir;
+
+ if(!fut_path_canonicalize(path, canon, sizeof canon))
+ return NULL;
+
+ dir = g_string_new(canon);
+
+ while(dir->len && strcmp(dir->str, G_DIR_SEPARATOR_S) != 0)
+ {
+ struct stat stbuf;
+
+ if(stat(dir->str, &stbuf) == 0)
+ {
+ struct stat *st = g_malloc(sizeof *st);
+ const char *sep;
+
+ *st = stbuf;
+ chain = g_list_append(chain, st);
+ if((sep = strrchr(dir->str, G_DIR_SEPARATOR)) != NULL)
+ g_string_truncate(dir, sep - dir->str);
+ else
+ break;
+ }
+ else /* A stat() call failed, then path is bad and no chain exists. Fail. */
+ {
+ fut_stat_chain_free(chain);
+ return NULL;
+ }
+ }
+ return chain;
+}
+
+/* 2003-10-10 - Returns true if the second chain is a prefix of the first, which can also
+** be more clearly put as "chain1 represents a subdir of chain2". Um, at least
+** that's a different wording.
+*/
+gboolean fut_stat_chain_prefix_equal(const GList *chain1, const GList *chain2)
+{
+ if(!chain1 || !chain2)
+ return FALSE;
+
+ for(; chain1 && chain2; chain1 = g_list_next(chain1), chain2 = g_list_next(chain2))
+ {
+ const struct stat *s1 = chain1->data, *s2 = chain2->data;
+
+ if(s1->st_dev != s2->st_dev || s1->st_ino != s2->st_ino)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void fut_stat_chain_free(GList *chain)
+{
+ GList *iter;
+
+ for(iter = chain; iter != NULL; iter = g_list_next(iter))
+ g_free(iter->data);
+ g_list_free(chain);
+}
+#endif
+
+/* 2003-10-10 - Get next path part, up to (but not including) the next separator. */
+static GString * get_part(GString *in, char *out)
+{
+ const char *sep = strchr(in->str, G_DIR_SEPARATOR);
+
+ if(sep)
+ {
+ gsize len = sep - in->str;
+ strncpy(out, in->str, len);
+ out[len] = '\0';
+ g_string_erase(in, 0, len + 1);
+ return in;
+ }
+ return NULL;
+}
+
+/* 2003-10-10 - Make a path canonical, i.e. make it absolute and remove any "..", "."
+** and repeated slashes it might contain. Pure string operation.
+*/
+gboolean fut_path_canonicalize(const gchar *path, gchar *outpath, gsize maxout)
+{
+ GString *dir, *out;
+ char part[PATH_MAX];
+
+ if(!path || *path == '\0' || !outpath || maxout < 2)
+ return FALSE;
+
+ if(*path == G_DIR_SEPARATOR)
+ dir = g_string_new(path);
+ else
+ {
+ char buf[PATH_MAX];
+
+ if(getcwd(buf, sizeof buf) == NULL)
+ return FALSE;
+ if(buf[0] != G_DIR_SEPARATOR)
+ dir = g_string_new(G_DIR_SEPARATOR_S);
+ else
+ dir = g_string_new(buf);
+ g_string_append_c(dir, G_DIR_SEPARATOR);
+ g_string_append(dir, path);
+ }
+ g_string_append_c(dir, G_DIR_SEPARATOR); /* Must end in separator for get_part(). */
+
+ out = g_string_new("");
+ while(get_part(dir, part))
+ {
+ if(*part)
+ {
+ if(strcmp(part, ".") == 0)
+ continue;
+ else if(strcmp(part, "..") == 0)
+ {
+ const char *sep = strrchr(out->str, G_DIR_SEPARATOR);
+ g_string_truncate(out, sep - out->str);
+ continue;
+ }
+ g_string_append_c(out, G_DIR_SEPARATOR);
+ g_string_append(out, part);
+ }
+ }
+ g_string_free(dir, TRUE);
+ if(out->len < maxout)
+ {
+ strcpy(outpath, out->str);
+ g_string_free(out, TRUE);
+ return TRUE;
+ }
+ g_string_free(out, TRUE);
+ return FALSE;
+}
+
+/* 2003-10-10 - Check if the directory <to> is a child directory of <from>. If it is, copying <from>
+** into <to> is a genuine Bad Idea.
+*/
+gboolean fut_is_parent_of(const char *from, const char *to)
+{
+ gchar buf1[PATH_MAX], buf2[PATH_MAX];
+
+ if(fut_path_canonicalize(from, buf1, sizeof buf1) &&
+ fut_path_canonicalize(to, buf2, sizeof buf2))
+ {
+ gsize len = strlen(buf1);
+
+ if(strncmp(buf1, buf2, len) == 0)
+ return buf2[len] == G_DIR_SEPARATOR; /* If last char is /, buf1 is really a prefix. */
+ }
+ return FALSE;
+}
+
+/* 1998-09-23 - Return 1 if the named file exists, 0 otherwise. Since this is Unix
+** (I think), this matter is somewhat complex. But I choose to ignore
+** that for now, and pretend it's nice and simple. :)
+*/
+gboolean fut_exists(const gchar *name)
+{
+ return access(name, F_OK) == 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean do_size_gfile_info(MainInfo *min, const GFile *object, const GFileInfo *fi, guint64 *bytes, FUCount *fc, GError **error);
+
+static gboolean do_size_gfile_dir(MainInfo *min, const GFile *root, guint64 *bytes, FUCount *fc, GError **error)
+{
+ GFileEnumerator *fe;
+ GFileInfo *fi;
+ GFile *child;
+ gboolean ok = TRUE;
+
+ if((fe = g_file_enumerate_children((GFile *) root, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error)) == NULL)
+ return FALSE;
+ while(ok && ((fi = g_file_enumerator_next_file(fe, NULL, error)) != NULL))
+ {
+ if((child = g_file_get_child_for_display_name((GFile *) root, g_file_info_get_display_name(fi), NULL)) != NULL)
+ {
+ ok = do_size_gfile_info(min, child, fi, bytes, fc, error);
+ g_object_unref(child);
+ }
+ else
+ ok = FALSE;
+ g_object_unref(fi);
+ }
+ if(ok && fc != NULL)
+ fc->num_total = fc->num_dirs + fc->num_files + fc->num_links + fc->num_specials;
+
+ g_object_unref(fe);
+
+ return ok;
+}
+
+static gboolean do_size_gfile_info(MainInfo *min, const GFile *object, const GFileInfo *fi, guint64 *bytes, FUCount *fc, GError **error)
+{
+ gboolean ret = TRUE;
+
+ if(bytes != NULL)
+ *bytes += g_file_info_get_size((GFileInfo *) fi);
+ if(fc != NULL)
+ {
+ fc->num_bytes += g_file_info_get_size((GFileInfo *) fi);
+ fc->num_blocks += g_file_info_get_attribute_uint64((GFileInfo *) fi, G_FILE_ATTRIBUTE_UNIX_BLOCKS);
+ }
+ switch(g_file_info_get_file_type((GFileInfo *) fi))
+ {
+ case G_FILE_TYPE_REGULAR:
+ if(fc != NULL)
+ fc->num_files++;
+ break;
+ case G_FILE_TYPE_DIRECTORY:
+ if(fc != NULL)
+ fc->num_dirs++;
+ ret = do_size_gfile_dir(min, object, bytes, fc, error);
+ break;
+ case G_FILE_TYPE_SYMBOLIC_LINK:
+ if(fc != NULL)
+ fc->num_links++;
+ break;
+ case G_FILE_TYPE_SPECIAL:
+ /* FIXME: This is not supported in the GIO world ... Has to go. */
+ break;
+ default:
+ g_warning("Can't handle irregular file type in do_size_gfile_info()");
+ }
+ return ret;
+}
+
+gboolean fut_size_gfile(MainInfo *min, const GFile *file, guint64 *bytes, FUCount *fc, GError **error)
+{
+ GFileInfo *fi;
+ gboolean ret = TRUE;
+
+ if(min == NULL || file == NULL)
+ return FALSE;
+ if((fi = g_file_query_info((GFile *) file, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error)) == NULL)
+ return FALSE;
+ if(fc != NULL) /* If there is an fc present, wipe it clean. */
+ memset(fc, 0, sizeof *fc);
+ ret = do_size_gfile_info(min, file, fi, bytes, fc, error);
+ /* Adjust, don't consider a directory to contain itself. */
+ if(g_file_info_get_file_type(fi) == G_FILE_TYPE_DIRECTORY && fc != NULL)
+ fc->num_dirs--;
+ g_object_unref(fi);
+
+ return ret;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GMutex mutex; /* Lock this before accessing counts. */
+ gboolean changed; /* This is set if the data has changed. */
+ FUCount counts;
+} FUCountSafe;
+
+typedef struct {
+ GFile *root;
+ GCancellable *cancel;
+ FUCountSafe counts; /* Here's where the thread updates. */
+ guint depth;
+ SizeFunc func;
+ gpointer func_user;
+ guint timeout;
+ GThread *thread;
+} SizeGFileInfo;
+
+static void thread_recurse_directory(GFile *root, SizeGFileInfo *info)
+{
+ GFileEnumerator *fen;
+
+ if((fen = g_file_enumerate_children(root, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, info->cancel, NULL)) != NULL)
+ {
+ GFileInfo *fin;
+
+ while(!g_cancellable_is_cancelled(info->cancel) && (fin = g_file_enumerator_next_file(fen, info->cancel, NULL)) != NULL)
+ {
+ const GFileType type = g_file_info_get_file_type(fin);
+
+ /* Grab the lock, and increase the proper counter based on type. */
+ g_mutex_lock(&info->counts.mutex);
+ info->counts.counts.num_total++;
+ if(type == G_FILE_TYPE_REGULAR)
+ {
+ info->counts.counts.num_files++;
+ info->counts.counts.num_bytes += g_file_info_get_size(fin);
+ }
+ else if(type == G_FILE_TYPE_DIRECTORY)
+ info->counts.counts.num_dirs++;
+ else if(type == G_FILE_TYPE_SYMBOLIC_LINK)
+ info->counts.counts.num_links++;
+ else if(type == G_FILE_TYPE_SPECIAL)
+ info->counts.counts.num_specials++;
+ info->counts.changed = TRUE;
+ /* All done, release the lock for the rest. */
+ g_mutex_unlock(&info->counts.mutex);
+
+ /* Wait now, if that was a directory we need to enter it! */
+ if(type == G_FILE_TYPE_DIRECTORY)
+ {
+ GFile *child;
+
+ if((child = g_file_get_child(root, g_file_info_get_name(fin))) != NULL)
+ {
+ info->depth++;
+ thread_recurse_directory(child, info);
+ info->depth--;
+ g_object_unref(child);
+ }
+ }
+ }
+ g_file_enumerator_close(fen, info->cancel, NULL);
+ g_object_unref(G_OBJECT(fen));
+ }
+}
+
+static gpointer size_gfile_thread_func(gpointer data)
+{
+ SizeGFileInfo *info = data;
+
+ thread_recurse_directory(info->root, info);
+
+ return NULL;
+}
+
+static gboolean cb_size_gfile_timeout(gpointer user)
+{
+ SizeGFileInfo *info = user;
+
+ /* Has the data changed? */
+ if(info->counts.changed)
+ {
+ FUCount local;
+
+ /* Try to quickly create a local copy. */
+ g_mutex_lock(&info->counts.mutex);
+ local = info->counts.counts;
+ info->counts.changed = FALSE;
+ g_mutex_unlock(&info->counts.mutex);
+
+ /* Then call callback using the local copy, leaving the true data free to
+ * update by the thread while the GUI-building code in the callback runs.
+ */
+ info->func(&local, info->func_user);
+ }
+ return !g_cancellable_is_cancelled(info->cancel);
+}
+
+gpointer fut_dir_size_gfile_start(GFile *dir, SizeFunc func, gpointer user)
+{
+ SizeGFileInfo *info;
+
+ if(dir == NULL || func == NULL)
+ return NULL;
+
+ info = g_malloc(sizeof *info);
+ info->root = dir;
+ info->cancel = g_cancellable_new();
+ g_mutex_init(&info->counts.mutex);
+ info->counts.changed = FALSE;
+ memset(&info->counts.counts, 0, sizeof info->counts.counts);
+ info->depth = 0;
+ info->func = func;
+ info->func_user = user;
+
+ info->timeout = g_timeout_add(350, cb_size_gfile_timeout, info);
+
+ info->thread = g_thread_new("gentoo:dirsize", size_gfile_thread_func, info);
+
+ return info;
+}
+
+void fut_dir_size_gfile_stop(gpointer handle)
+{
+ SizeGFileInfo *info = handle;
+
+ if(info == NULL)
+ return;
+ /* If we remove this first, and we know we're not in it now (main thread only), we can be
+ * pretty sure it's safe to tear down the rest since the timeout function won't run again.
+ */
+ g_source_remove(info->timeout);
+
+ /* Now, stop the thread and kill everything. */
+ g_cancellable_cancel(info->cancel);
+ g_thread_join(info->thread);
+ if(info->counts.changed)
+ info->func(&info->counts.counts, info->func_user);
+
+ g_object_unref(G_OBJECT(info->cancel));
+ g_free(info);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-29 - Here's a strtok()-workalike. Almost. The arg <paths> should be either a string
+** of colon-separated path components (e.g. "/usr/local:/home/emil:/root"), or NULL.
+** The function fills in <component> with either the first component, or, when <paths>
+** is NULL, with the _next_ component (relative to the last one). If this sounds confusing,
+** read the man page for strtok(3) and associate freely from there. The main difference
+** between this and strtok(3) is that the latter modifies the string being tokenized,
+** while this function does not. The <component> buffer is assumed to have room for
+** PATH_MAX bytes. Returns 0 if no more components were found, 1 otherwise.
+*/
+int fut_path_component(const gchar *paths, gchar *component)
+{
+ static const gchar *src = NULL;
+ gchar here, *dst = component;
+
+ if(paths != NULL)
+ src = paths;
+ else if(src == NULL)
+ return 0;
+
+ /* First, find the component, if processing a full multi-directory path. */
+ while(*src == ':')
+ src++;
+ for(; (here = *src) != '\0'; src++)
+ {
+ if(here == ':' && src[1] == G_DIR_SEPARATOR) /* Colon followed by separator ends a path. */
+ {
+ src += 1; /* Leave src at final separator for next time. */
+ break;
+ }
+ *dst++ = here;
+ }
+ *dst = '\0';
+ if(here == '\0') /* End of path list reached? */
+ src = NULL; /* Makes us stop next time. */
+ if(dst > component)
+ fut_interpolate(component);
+
+ return dst > component;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-22 - Evaluate (look up) any environment variable(s) used in <component>. Replaces
+** the entire string with a new version, where all environment variable names
+** have been replaced by the corresponding variable's value. Undefined variables
+** are treated as if their value were "" (empty string). Considers anything with
+** letters, digits and underscores to be a valid variable name. You can also use
+** braces {around} any combination of characters to force a look-up on that.
+*/
+static void eval_env(gchar *component)
+{
+ GString *temp = NULL;
+ gchar *ptr, vname[256], *vptr;
+
+ for(ptr = component; *ptr != '\0'; ptr++)
+ {
+ if(*ptr == '$') /* Environment variable? */
+ {
+ const gchar *start = ptr, *vval;
+
+ ptr++;
+ if(*ptr == '{') /* Braced name? */
+ {
+ for(vptr = vname, ptr++; *ptr && *ptr != '}' &&
+ (gsize) (vptr - vname) < sizeof vname - 1;)
+ {
+ *vptr++ = *ptr++;
+ }
+ ptr++;
+ }
+ else
+ {
+ for(vptr = vname; *ptr && (isalnum((guchar) *ptr) || *ptr == '_') &&
+ (gsize) (vptr - vname) < sizeof vname - 1;)
+ {
+ *vptr++ = *ptr++;
+ }
+ }
+ *vptr = '\0';
+ if((vval = g_getenv(vname)) != NULL)
+ {
+ if(temp == NULL)
+ {
+ temp = g_string_new(component);
+ g_string_truncate(temp, start - component);
+ }
+ if(*vval == G_DIR_SEPARATOR)
+ g_string_truncate(temp, 0);
+ g_string_append(temp, vval);
+ }
+ ptr--;
+ }
+ else
+ {
+ if(temp)
+ g_string_append_c(temp, *ptr);
+ }
+ }
+ if(temp)
+ {
+ g_strlcpy(component, temp->str, PATH_MAX);
+ g_string_free(temp, TRUE);
+ }
+}
+
+static void eval_home(gchar *component)
+{
+ GString *temp;
+ gchar ubuf[USER_NAME_SIZE], *uptr;
+ const gchar *ptr, *uname = ubuf, *dir;
+
+ if((temp = g_string_new(NULL)) != NULL)
+ {
+ for(ptr = component + 1, uptr = ubuf; (*ptr && *ptr != G_DIR_SEPARATOR) &&
+ (gsize) (uptr - ubuf) < sizeof ubuf - 1;)
+ {
+ *uptr++ = *ptr++;
+ }
+ *uptr = '\0';
+ if((dir = usr_lookup_uhome(uname)) != NULL)
+ g_string_assign(temp, dir);
+ else
+ g_string_assign(temp, "");
+ g_string_append(temp, ptr);
+ if(*temp->str)
+ g_strlcpy(component, temp->str, PATH_MAX);
+ else
+ g_snprintf(component, PATH_MAX, "~%s", uname);
+ g_string_free(temp, TRUE);
+ }
+}
+
+/* 2003-11-29 - Interpolate special things (like $VARIABLES and ~homedirs) into a path. */
+void fut_interpolate(gchar *buffer)
+{
+ eval_env(buffer);
+ if(buffer[0] == '~')
+ eval_home(buffer);
+#if 0 /* FIXME: This needs to become URL-aware, in a big way. */
+ else if(buffer[0] != G_DIR_SEPARATOR && base_path[0] == G_DIR_SEPARATOR)
+ {
+ gint len = strlen(buffer);
+
+ /* Make relative path absolute, if buffer space allows it. */
+ if(len + base_len + 2 < PATH_MAX)
+ {
+ memmove(buffer + base_len + 1, buffer, len + 1);
+ memcpy(buffer, base_path, base_len);
+ buffer[base_len] = G_DIR_SEPARATOR;
+ }
+ }
+#endif
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-15 - Attempt to locate file called <name> in any of the colon-separated locations
+** specified by <paths>. When found, returns a pointer to the complete name. If
+** nothing has been found when all paths have been tried, returns a sullen NULL.
+** Very useful for loading icons.
+** 1998-08-23 - Now uses the fut_path_component() function. Feels more robust.
+** 1998-12-01 - Now uses the fut_exists() call rather than a kludgy open().
+** 1999-06-12 - Now handles absolute <name>s, too.
+** BUG BUG BUG Calls to this function DO NOT nest very well, due to the static buffer pointer
+** being returned. Beware.
+*/
+const gchar * fut_locate(const gchar *paths, const gchar *name)
+{
+ static gchar buf[PATH_MAX];
+ const gchar *ptr = paths;
+ gsize len;
+
+ if(*name == G_DIR_SEPARATOR) /* Absolute name? */
+ {
+ if(fut_exists(name))
+ return name;
+ return NULL;
+ }
+
+ while(fut_path_component(ptr, buf)) /* No, iterate paths. */
+ {
+ len = strlen(buf);
+ g_snprintf(buf + len, sizeof buf - len, "%s%s", G_DIR_SEPARATOR_S, name);
+ if(fut_exists(buf))
+ return buf;
+ ptr = NULL;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Just free a path. */
+static gboolean kill_path(gpointer key, gpointer data, gpointer user)
+{
+ g_free(key);
+
+ return TRUE;
+}
+
+/* 1998-08-23 - Scan through a list of colon-separated paths, and return a (possibly HUGE)
+** sorted list of all _files_ found. Very useful for selecting icon pixmaps... The
+** scan is non-recursive; we don't want to go nuts here.
+** 1998-09-05 - Now actually sorts the list, too. That bit had been mysteriously forgotten.
+** 1998-12-23 - Now ignores directories already visited. Uses a string comparison rather than a
+** file-system level check, so you can still fool it. It's a bit harder, though.
+*/
+GList * fut_scan_path(const gchar *paths, gint (*filter)(const gchar *path, const gchar *name))
+{
+ gchar buf[PATH_MAX], *item;
+ const gchar *ptr = paths;
+ DIR *dir;
+ struct dirent *de;
+ GList *list = NULL;
+ GHashTable *set;
+ GString *temp;
+
+ if((paths == NULL) || (filter == NULL))
+ return NULL;
+
+ if((temp = g_string_new("")) == NULL)
+ return NULL;
+
+ if((set = g_hash_table_new(g_str_hash, g_str_equal)) == NULL)
+ {
+ g_string_free(temp, TRUE);
+ return NULL;
+ }
+
+ for(ptr = paths; fut_path_component(ptr, buf); ptr = NULL)
+ {
+ if(g_hash_table_lookup(set, buf))
+ continue;
+ g_hash_table_insert(set, g_strdup(buf), GINT_TO_POINTER(TRUE));
+ if((dir = opendir(buf)) != NULL)
+ {
+ while((de = readdir(dir)) != NULL)
+ {
+ if(filter(buf, de->d_name))
+ {
+ item = g_strdup(de->d_name);
+ list = g_list_insert_sorted(list, item, (GCompareFunc) strcmp);
+ }
+ }
+ closedir(dir);
+ }
+ }
+ g_hash_table_foreach_remove(set, kill_path, NULL);
+ g_hash_table_destroy(set);
+ g_string_free(temp, TRUE);
+
+ return list;
+}
+
+/* 1998-08-23 - Free the list created during a previous call to fut_scan_paths(). */
+void fut_free_path(GList *list)
+{
+ GList *head = list;
+
+ if(list != NULL)
+ {
+ for(; list != NULL; list = g_list_next(list))
+ {
+ if(list->data != NULL)
+ g_free(list->data); /* Free the file name. */
+ }
+ g_list_free(head); /* Free all list items. */
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-07 - Check if the user described by (<uid>,<gid>), which is the user currently running
+** gentoo, is allowed to READ from a file described by <stat>. Note that this is a
+** complex check.
+** 1998-09-22 - Moved this function (and friends) into the fileutil module.
+*/
+gboolean fut_can_read(const struct stat *stat, uid_t uid, gid_t gid)
+{
+ if(uid == 0) /* Root rules! */
+ return TRUE;
+
+ if(stat->st_uid == uid) /* Current user's file? */
+ return (stat->st_mode & S_IRUSR) ? TRUE : FALSE;
+ if(stat->st_gid == gid) /* User belongs to file's group? */
+ return (stat->st_mode & S_IRGRP) ? TRUE : FALSE;
+
+ /* User doesn't own file or belong to file owner's group. Check others. */
+ return (stat->st_mode & S_IROTH) ? TRUE : FALSE;
+}
+
+/* 1998-09-23 - Just a convenience interface for the above. Name must be absolute, or you
+** must be very lucky (the current dir while running gentoo is a highly
+** stochastic variable).
+*/
+gboolean fut_can_read_named(const gchar *name)
+{
+ struct stat s;
+
+ if(stat(name, &s) == 0)
+ return fut_can_read(&s, geteuid(), getegid());
+ return FALSE;
+}
+
+/* 1998-09-07 - Do complex WRITE permission check. */
+gboolean fut_can_write(const struct stat *stat, uid_t uid, gid_t gid)
+{
+ if(uid == 0)
+ return TRUE;
+
+ if(stat->st_uid == uid)
+ return (stat->st_mode & S_IWUSR) ? TRUE : FALSE;
+ if(stat->st_gid == gid)
+ return (stat->st_mode & S_IWGRP) ? TRUE : FALSE;
+
+ return (stat->st_mode & S_IWOTH) ? TRUE : FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-10-26 - Check if the user doesn't want to see <name>. Returns TRUE if the file is
+** NOT hidden, FALSE if it is. If <name> is NULL, we free any allocated resources
+** and then return TRUE. This is very useful when the RE source is changing.
+** 1998-12-14 - The check is now done with respect to pane <dp>. This has relevance, since
+** hiding can now be enabled/disabled on a per-pane basis. If <name> is NULL,
+** any pane can be used (but it must not be NULL!).
+*/
+gboolean fut_check_hide(DirPane *dp, const gchar *name)
+{
+ MainInfo *min = dp->main;
+ HideInfo *hi = &min->cfg.path.hideinfo;
+ guint cflags = REG_EXTENDED | REG_NOSUB;
+
+ if(name == NULL) /* The NULL-name special case is pane-independant. */
+ {
+ if(hi->hide_re != NULL)
+ {
+ g_free(hi->hide_re);
+ hi->hide_re = NULL;
+ }
+ return TRUE;
+ }
+ if(!(min->cfg.dp_format[dp->index].hide_allowed)) /* Hiding disabled? */
+ return TRUE;
+ switch(hi->mode)
+ {
+ case HIDE_NONE:
+ return TRUE;
+ case HIDE_DOT:
+ return name[0] != '.';
+ case HIDE_REGEXP:
+ if(hi->hide_re == NULL) /* RE not compiled yet? */
+ {
+ if((hi->hide_re = g_malloc(sizeof *hi->hide_re)) != NULL)
+ {
+ if(hi->no_case)
+ cflags |= REG_ICASE;
+ if(regcomp(hi->hide_re, hi->hide_re_src, cflags) != 0)
+ {
+ g_free(hi->hide_re);
+ hi->hide_re = NULL;
+ }
+ }
+ }
+ if(hi->hide_re != NULL)
+ return regexec(hi->hide_re, name, 0, NULL, 0) == REG_NOMATCH;
+ break;
+ }
+ return TRUE; /* When in doubt, hide nothing. */
+}
diff --git a/src/fileutil.h b/src/fileutil.h
new file mode 100644
index 0000000..57a2b00
--- /dev/null
+++ b/src/fileutil.h
@@ -0,0 +1,59 @@
+/*
+** 1998-05-25 - Header file for the collection of miscellaneous file utilities.
+*/
+
+/* This is filled-in by a call to fut_dir_size(). Very informative. */
+typedef struct {
+ guint num_dirs;
+ guint num_files;
+ guint num_links;
+ guint num_specials;
+
+ guint num_total; /* Sum of the above. */
+
+ guint64 num_bytes; /* For completeness. */
+ guint64 num_blocks;
+} FUCount;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Directory size computation, the next generation. */
+gboolean fut_size_gfile(MainInfo *min, const GFile *dir, guint64 *bytes, FUCount *fc, GError **error);
+
+/* Asynchronous directory size computation. Calls <func> with a const FUCount *
+** every now and then, then with NULL when done.
+*/
+typedef void (*SizeFunc)(const FUCount *count, gpointer user);
+gpointer fut_dir_size_start(const gchar *path, SizeFunc func, gpointer user);
+void fut_dir_size_stop(gpointer handle);
+
+/* Asynchronous (in fact, multi-threaded) directory size computation. */
+gpointer fut_dir_size_gfile_start(GFile *dir, SizeFunc func, gpointer user);
+void fut_dir_size_gfile_stop(gpointer handle);
+
+const gchar * fut_locate(const gchar *paths, const gchar *name);
+GList * fut_scan_path(const gchar *paths, gint (*filter)(const gchar *path, const gchar *name));
+void fut_free_path(GList *list);
+gint fut_path_component(const gchar *paths, gchar *component);
+
+void fut_interpolate(gchar *buffer);
+
+gboolean fut_cd(const gchar *new_dir, gchar *old, gsize old_max);
+
+#if 0
+GList * fut_stat_chain_new(const gchar *path);
+gboolean fut_stat_chain_prefix_equal(const GList *chain1, const GList *chain2);
+void fut_stat_chain_free(GList *chain);
+#endif
+
+gboolean fut_path_canonicalize(const gchar *path, gchar *outbuf, gsize outmax);
+
+gboolean fut_is_parent_of(const char *from, const char *to);
+
+gboolean fut_exists(const gchar *name);
+
+gboolean fut_can_read(const struct stat *stat, uid_t uid, gid_t gid);
+gboolean fut_can_read_named(const gchar *name);
+gboolean fut_can_write(const struct stat *stat, uid_t uid, gid_t gid);
+
+gboolean fut_check_hide(DirPane *dp, const gchar *name);
diff --git a/src/gentoo.c b/src/gentoo.c
new file mode 100644
index 0000000..de247b3
--- /dev/null
+++ b/src/gentoo.c
@@ -0,0 +1,638 @@
+/*
+** 1998-05-17 - I just have to build an Opus-look-alike GTK GUI! :)
+** 1998-09-11 - Er, it like, grew, or something.
+*/
+
+#include "gentoo.h"
+
+#include <dlfcn.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/wait.h>
+
+#if defined ENABLE_NLS
+#include <locale.h>
+#endif
+
+#include "errors.h"
+#include "configure.h"
+#include "dirpane.h"
+#include "dialog.h"
+#include "userinfo.h"
+#include "file.h"
+#include "fileutil.h"
+#include "gfam.h"
+#include "guiutil.h"
+#include "xmlutil.h"
+#include "strutil.h"
+#include "types.h"
+#include "styles.h"
+#include "sizeutil.h"
+#include "buttons.h"
+#include "buttonlayout.h"
+#include "queue.h"
+#include "cmdseq.h"
+#include "children.h"
+#include "dpformat.h"
+#include "keyboard.h"
+#include "controls.h"
+#include "iconutil.h"
+#include "cmdseq_config.h"
+#include "menus.h"
+#include "nag_dialog.h"
+
+#include "cfg_module.h"
+#include "cfg_nag.h"
+#include "cfg_windows.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-18 - Filter out files the user really doesn't want to see, and that recursive
+** directory traversing code really, really, REALLY, doesn't.
+*/
+static gboolean dir_filter(const gchar *name)
+{
+ if((strcmp(name, ".") == 0) || (strcmp(name, "..") == 0))
+ return FALSE;
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-03-18 - User clicked close button on window. Just react as if the Quit command was run. */
+static gboolean evt_main_delete(GtkWidget *wid, GdkEventAny *evt, gpointer user)
+{
+ csq_execute(user, "Quit");
+
+ return TRUE;
+}
+
+/* 1998-10-26 - Initialize some fields in the dp structure. */
+static void init_pane(DirPane *dp, gint index)
+{
+ dp->index = index;
+ dp->complete.prefix[0] = '\0';
+ dp->dir.stat = NULL;
+ dp->dir.stat_alloc = 0;
+ dp->dir.stat_use = 0;
+ dp->hist = dph_dirhistory_new();
+ dp->dir.path[0] = '\0';
+}
+
+static void evt_paned_notify_position(GObject *obj, GParamSpec *spec, gpointer user)
+{
+ MainInfo *min = user;
+ GdkWindow *pwin;
+ gint pos, np;
+
+ if(!dp_realized(min))
+ return;
+
+ pos = gtk_paned_get_position(GTK_PANED(obj));
+ pwin = gtk_widget_get_window(min->gui->panes);
+ np = min->cfg.dp_paning.orientation == DPORIENT_HORIZ ? gdk_window_get_width(pwin) : gdk_window_get_height(pwin);
+ switch(min->cfg.dp_paning.mode)
+ {
+ case DPSPLIT_FREE:
+ break;
+ case DPSPLIT_RATIO:
+ min->cfg.dp_paning.value = (gdouble) pos / np;
+ break;
+ case DPSPLIT_ABS_LEFT:
+ min->cfg.dp_paning.value = pos;
+ break;
+ case DPSPLIT_ABS_RIGHT:
+ min->cfg.dp_paning.value = np - pos;
+ break;
+ }
+}
+
+/* 1998-05-17 - Build a couple of dir-panes.
+** 1998-05-18 - Now also puts the panes in a horizontally paned window, for extra Opusity. ;^)
+** 1998-08-02 - Fixed *huge* bug where pane 1 (the right) was built using pane 0's format!!
+*/
+static GtkWidget * build_dirpanes(MainInfo *min)
+{
+ GtkWidget *pane;
+ GuiInfo *gui;
+
+ gui = min->gui;
+
+ gui->panes = gtk_paned_new(min->cfg.dp_paning.orientation == DPORIENT_HORIZ ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
+ init_pane(&gui->pane[0], 0);
+ pane = dp_build(min, &min->cfg.dp_format[0], &gui->pane[0]);
+ gtk_paned_add1(GTK_PANED(gui->panes), pane);
+ init_pane(&gui->pane[1], 1);
+ pane = dp_build(min, &min->cfg.dp_format[1], &gui->pane[1]);
+ gtk_paned_add2(GTK_PANED(gui->panes), pane);
+ gui->sig_pane_notify = g_signal_connect(G_OBJECT(gui->panes), "notify::position", G_CALLBACK(evt_paned_notify_position), min);
+ gtk_widget_show(gui->panes);
+
+ gtk_widget_grab_focus(min->gui->pane[0].view);
+
+ return gui->panes;
+}
+
+static void evt_top_button_press_event(GtkWidget *top, GdkEventButton *evt, gpointer user)
+{
+ if(evt->button == 1 && evt->type == GDK_2BUTTON_PRESS)
+ csq_execute(user, "About");
+}
+
+/* 1998-05-19 - Create the top widgetry, returning something the caller can just add to a box. Sets the
+** <label> pointer to a GtkLabel which can be used later to display funny messages and stuff.
+** The label is internally wrapped in a GtkEventbox, which makes updating it possible without
+** causing instant epilepsy in everyone watching. GTK+ really is smooth.
+** 1998-11-26 - Made the label focusable (?), in order to *finally* have somewhere safe to put the focus
+** when I don't want it on path entry widgets. Nice.
+** 2010-10-03 - Added sneaky click-listener, so that we can run About on double-click.
+*/
+static GtkWidget * build_top(MainInfo *min)
+{
+ GtkLabel **label = (GtkLabel **) &min->gui->top;
+ GtkWidget *top, *lab;
+
+ if(min->cfg.errors.display == ERR_DISPLAY_TITLEBAR)
+ {
+ if(*label != NULL)
+ gtk_widget_destroy(GTK_WIDGET(*label));
+ *label = NULL;
+ return NULL;
+ }
+
+ top = gtk_event_box_new();
+ lab = gtk_label_new("");
+ gtk_container_add(GTK_CONTAINER(top), lab);
+ gtk_widget_show_all(top);
+ if(label != NULL)
+ *label = GTK_LABEL(lab);
+ g_signal_connect(G_OBJECT(top), "button_press_event", G_CALLBACK(evt_top_button_press_event), min);
+
+ return top;
+}
+
+/* 2002-05-31 - Rewritten yet again, now using the first weak version of a specialized button layout module. */
+static GtkWidget * build_bottom(MainInfo *min)
+{
+ GtkWidget *hbox, *sb, *cb;
+
+ if((sb = btn_buttonsheet_build(min, &min->cfg.buttons, "Shortcuts", FALSE, NULL, NULL)) != NULL)
+ btn_buttonsheet_built_add_keys(min, GTK_CONTAINER(sb), NULL);
+ if((cb = btn_buttonsheet_build(min, &min->cfg.buttons, NULL, FALSE, NULL, min)) != NULL)
+ btn_buttonsheet_built_add_keys(min, GTK_CONTAINER(cb), NULL);
+ if((hbox = btl_buttonlayout_pack(min->cfg.buttonlayout, cb, sb)) != NULL)
+ gtk_widget_show_all(hbox);
+
+ return hbox;
+}
+
+void rebuild_top(MainInfo *min)
+{
+ GtkWidget *top;
+
+ if(min->gui->top != NULL)
+ {
+ gtk_widget_destroy(min->gui->top);
+ min->gui->top = NULL;
+ }
+ top = build_top(min);
+ if(top != NULL)
+ {
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), top, FALSE, FALSE, 0);
+ gtk_box_reorder_child(GTK_BOX(min->gui->vbox), top, 0);
+ }
+ dp_show_stats(min->gui->cur_pane);
+ gui_set_main_title(min, NULL);
+}
+
+/* 1998-10-26 - Rebuild the middle part of the GUI, i.e. the panes. */
+void rebuild_middle(MainInfo *min)
+{
+ GtkWidget *left, *right;
+
+ gtk_container_remove(GTK_CONTAINER(min->gui->panes), min->gui->pane[0].vbox);
+ gtk_container_remove(GTK_CONTAINER(min->gui->panes), min->gui->pane[1].vbox);
+ gtk_widget_destroy(min->gui->panes);
+ min->gui->panes = gtk_paned_new(min->cfg.dp_paning.orientation == DPORIENT_HORIZ ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), min->gui->panes, TRUE, TRUE, 0);
+ gtk_box_reorder_child(GTK_BOX(min->gui->vbox), min->gui->panes, 1);
+ if((left = dp_build(min, &min->cfg.dp_format[0], &min->gui->pane[0])) != NULL)
+ gtk_paned_add1(GTK_PANED(min->gui->panes), left);
+ if((right = dp_build(min, &min->cfg.dp_format[1], &min->gui->pane[1])) != NULL)
+ gtk_paned_add2(GTK_PANED(min->gui->panes), right);
+ min->gui->sig_pane_notify = g_signal_connect(G_OBJECT(min->gui->panes), "notify::position", G_CALLBACK(evt_paned_notify_position), min);
+ gtk_widget_show(min->gui->panes);
+ dp_split_refresh(min);
+}
+
+/* 1998-07-14 - Rebuild the bottom part of the GUI, whose main responsibility is to contain
+** the button bank(s).
+*/
+void rebuild_bottom(MainInfo *min)
+{
+ gtk_widget_destroy(min->gui->bottom);
+ if((min->gui->bottom = build_bottom(min)) != NULL)
+ {
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), min->gui->bottom, FALSE, FALSE, 0);
+ gtk_widget_show(min->gui->bottom);
+ }
+}
+
+/* 2008-04-20 - Replaced old size_allocation-tracking code with new, using configure events instead. */
+static gboolean evt_main_configure(GtkWidget *wid, GdkEventConfigure *req, gpointer user)
+{
+ dp_split_refresh(user);
+
+ return FALSE; /* Keep propagating. */
+}
+
+static GtkWidget * build_gui(MainInfo *min)
+{
+ GtkWidget *top, *panes, *bottom;
+
+ min->gui = g_malloc(sizeof *min->gui);
+ min->gui->window = NULL;
+ min->gui->window = win_window_open(min->cfg.wininfo, WIN_MAIN);
+ gtk_widget_set_name(min->gui->window, "gentoo");
+ g_object_set_data(G_OBJECT(min->gui->window), "user", min);
+ min->gui->sig_main_configure = g_signal_connect(G_OBJECT(min->gui->window), "configure_event", G_CALLBACK(evt_main_configure), min);
+ min->gui->sig_main_delete = g_signal_connect(G_OBJECT(min->gui->window), "delete_event", G_CALLBACK(evt_main_delete), min);
+ min->gui->pane[0].main = min->gui->pane[1].main = min;
+ min->gui->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ min->gui->kbd_ctx = kbd_context_new(min);
+
+ top = build_top(min);
+ if((panes = build_dirpanes(min)) != NULL)
+ {
+ bottom = build_bottom(min);
+ if(top != NULL)
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), top, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), panes, TRUE, TRUE, 0);
+ if(bottom != NULL)
+ gtk_box_pack_start(GTK_BOX(min->gui->vbox), bottom, FALSE, FALSE, 0);
+ gtk_widget_show_all(min->gui->vbox);
+ min->gui->middle = panes;
+ min->gui->bottom = bottom;
+ min->gui->cur_pane = &min->gui->pane[0];
+ kbd_context_attach(min->gui->kbd_ctx, GTK_WINDOW(min->gui->window));
+ ctrl_keys_install(min->cfg.ctrlinfo, min->gui->kbd_ctx);
+ return min->gui->vbox;
+ }
+ gtk_widget_destroy(top);
+ gtk_widget_destroy(min->gui->vbox);
+
+ return NULL;
+}
+
+/* 1998-08-23 - Initialize the paths config data. */
+static void init_paths(CfgInfo *cfg)
+{
+ const gchar *confdir;
+
+ cfg->path.path[PTID_ICON] = g_string_new(PATH_ICN);
+ if((confdir = g_get_user_config_dir()) != NULL)
+ {
+ cfg->path.path[PTID_GTKRC] = g_string_new(confdir);
+ g_string_append(cfg->path.path[PTID_GTKRC], G_DIR_SEPARATOR_S PACKAGE);
+ }
+ else
+ cfg->path.path[PTID_GTKRC] = g_string_new(PATH_GRC);
+ cfg->path.path[PTID_FSTAB] = g_string_new("/etc/fstab");
+ cfg->path.path[PTID_MTAB] = g_string_new("/proc/mounts");
+
+ cfg->path.hideinfo.mode = HIDE_NONE;
+ cfg->path.hideinfo.hide_re_src[0] = '\0';
+ cfg->path.hideinfo.hide_re = NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-11-29 - Load the GTK+ RC file, allowing users to configure gentoo's looks. The
+** file is always named ".gentoogtkrc" (too long, I know) but you can put
+** it anywhere as long as you given gentoo the path (in the config).
+** 2001-08-12 - The dot is now optional, but is given priority if found.
+** 2011-07-24 - Now we even prefer "gtkrc", without "gentoo", to match .config/gentoo location.
+** 2012-05-02 - Ported to use GtkCssProvider API, for GTK+ 3.0.
+*/
+static void load_gtk_rc(MainInfo *min)
+{
+ const gchar *names[] = { "gtkrc", "gentoogtkrc", ".gentoogtkrc" };
+ const gchar *name;
+ gsize i;
+
+ for(i = 0; i < sizeof names / sizeof *names; i++)
+ {
+ if((name = fut_locate(min->cfg.path.path[PTID_GTKRC]->str, names[i])) != NULL)
+ {
+ GtkCssProvider *prov;
+
+ if((prov = gtk_css_provider_new()) != NULL)
+ {
+ if(gtk_css_provider_load_from_path(prov, name, NULL))
+ {
+ GdkScreen *scr = gtk_widget_get_screen(min->gui->window);
+
+ gtk_style_context_add_provider_for_screen(scr, GTK_STYLE_PROVIDER(prov), GTK_STYLE_PROVIDER_PRIORITY_THEME);
+ break;
+ }
+ }
+ }
+ }
+}
+
+/* 1999-04-04 - Initialize default (er, and non-configurable) command options. I'll
+** build a GUI for this stuff real soon now.
+*/
+static void init_cmd_options(CfgInfo *cfg)
+{
+ cfg->opt_overwrite.show_info = TRUE;
+ g_strlcpy(cfg->opt_overwrite.datefmt, "%Y-%m-%d %H:%M.%S", sizeof cfg->opt_overwrite.datefmt);
+}
+
+#if 0
+/* 1999-05-10 - This is for temporary key checks during development. Simpler to get a trigger this way
+** than to hack the controls and/or keyboard modules. Is that a sign of bad code there? Naah. :)
+*/
+#include <gdk/gdkkeysyms.h>
+static void evt_key_press(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ MainInfo *min = user;
+
+ printf("Someone pressed %d ('%c'), state=%04X\n", evt->keyval, evt->keyval, evt->state);
+
+ if(evt->keyval == GDK_v)
+ {
+ GtkAdjustment *adj;
+
+ if((adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(min->gui->cur_pane->scwin))) != NULL)
+ printf("Adj: lower=%g upper=%g value=%g\n", adj->lower, adj->upper, adj->value);
+ }
+ else if(evt->keyval == GDK_z)
+ dp_unfocus(min->gui->cur_pane);
+ else if(evt->keyval == GDK_d)
+ {
+ Dialog *dlg;
+ gint ret;
+
+ dlg = dlg_dialog_sync_new(NULL, "Hello", "_A|_B");
+ ret = dlg_dialog_sync_wait(dlg);
+ dlg_dialog_sync_destroy(dlg);
+ }
+ else if(evt->keyval == GDK_1)
+ {
+ min->cfg.dp_paning.mode++;
+ if(min->cfg.dp_paning.mode > DPSPLIT_ABS_RIGHT)
+ min->cfg.dp_paning.mode = DPSPLIT_FREE;
+ }
+ else if(evt->keyval == GDK_0)
+ gtk_widget_hide(min->gui->pane[0].scwin);
+ else if(evt->keyval == GDK_plus)
+ gtk_widget_show(min->gui->pane[0].scwin);
+}
+#endif
+
+/* 2002-02-19 - Resolve what the initial directory is going to be, and go there. */
+static gboolean enter_initial_dirs(MainInfo *min, const gchar *dirleft, const gchar *dirright)
+{
+ const gchar *dir;
+ const gchar *odir[2];
+ const gchar *cmd[] = { "ActivateLeft", "ActivateRight" };
+ gint i;
+ gboolean ok = TRUE;
+
+ odir[0] = dirleft;
+ odir[1] = dirright;
+ for(i = sizeof cmd / sizeof *cmd - 1; i >= 0; i--)
+ {
+ if((dir = odir[i]) == NULL)
+ {
+ dir = min->cfg.dp_format[i].def_path;
+ if(!dir[0])
+ dir = dph_history_get_first(&min->gui->pane[i]);
+ }
+ if(dir == NULL)
+ dir = usr_get_home();
+ csq_execute(min, cmd[i]);
+ ok &= csq_execute_format(min, "DirEnter 'dir=%s'", stu_escape(dir)) != 0;
+ }
+
+ return ok;
+}
+
+/* 2003-11-25 - An idle handler that should only trigger once, to run commands from command line. */
+static gint evt_idle_run(gpointer user)
+{
+ MainInfo *min = user;
+
+ if(min->run_commands != NULL)
+ {
+ gsize i;
+
+ for(i = 0; min->run_commands[i] != NULL; i++)
+ csq_execute(min, min->run_commands[i]);
+ }
+
+ return FALSE; /* Causes the handler to be removed, once really is enough. */
+}
+
+static gint cmp_list_commands(gconstpointer a, gconstpointer b)
+{
+ return strcmp(a, b);
+}
+
+static void cb_list_commands(gpointer key, gpointer value, gpointer user)
+{
+ GList **head = user;
+
+ *head = g_list_insert_sorted(*head, key, cmp_list_commands);
+}
+
+static void do_list_commands(MainInfo *min)
+{
+ GList *cmdseq = NULL, *iter;
+
+ g_hash_table_foreach(min->cfg.commands.builtin, cb_list_commands, &cmdseq);
+ for(iter = cmdseq; iter != NULL; iter = g_list_next(iter))
+ printf("%s\n", (const gchar *) iter->data);
+}
+
+int main(int argc, char *argv[])
+{
+ static MainInfo min = { NULL };
+
+ gboolean show_version = FALSE;
+ gboolean root_ok = FALSE;
+ gboolean no_rc = FALSE, no_gtk_rc = FALSE, no_dir_history = FALSE, list_commands = FALSE;
+ gchar *dir_left = NULL;
+ gchar *dir_right = NULL;
+#if defined ENABLE_NLS
+ gboolean show_locale_info = FALSE;
+ gint i;
+#endif
+ GOptionEntry option_entries[] = {
+ { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Report the version to standard output, and exit"), NULL },
+#if defined ENABLE_NLS
+ { "locale-info", 0, 0, G_OPTION_ARG_NONE, &show_locale_info, N_("Report internal locale details, and exit"), NULL },
+#endif
+ { "root-ok", 0, 0, G_OPTION_ARG_NONE, &root_ok, N_("Allows gentoo to be run by the root user. Could be dangerous!"), NULL },
+ { "no-rc", 0, 0, G_OPTION_ARG_NONE, &no_rc, N_("Do not load the ~/.config/gentoo/gentoorc configuration file; instead, use default values"), NULL },
+ { "no-gtk-rc", 0, 0, G_OPTION_ARG_NONE, &no_gtk_rc, N_("Do not load the ~/.config/gentoo/gtkrc GTK+ configuration file; instead, use system defaults"), NULL },
+ { "no-dir-history", 0, 0, G_OPTION_ARG_NONE, &no_dir_history, N_("Do not load the ~/.config/gentoo/dirhistory file; instead, start with empty history"), NULL },
+ { "run", 'r', 0, G_OPTION_ARG_STRING_ARRAY, &min.run_commands, N_("Run COMMAND, a gentoo command. Done before user interaction allowed, but after configuration "
+ "file has been read in. Can be used many times to run several commands in sequence"), N_("COMMAND") },
+ { "left", '1', 0, G_OPTION_ARG_STRING, &dir_left, N_("Use DIR as path for the left directory pane. Overrides default (and history)"), N_("DIR") },
+ { "right", '2', 0, G_OPTION_ARG_STRING, &dir_right, N_("Use DIR as path for the right directory pane. Overrides default (and history)"), N_("DIR") },
+ { "list-commands", 0, 0, G_OPTION_ARG_NONE, &list_commands, N_("Print a list of all built-in commands, and exit"), NULL },
+ { NULL }
+ };
+ GtkWidget *box;
+ GOptionContext *context;
+ GError *err = NULL;
+
+#if defined ENABLE_NLS
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+ /* Translate help texts for command line options. */
+ for(i = 0; option_entries[i].long_name != NULL; i++)
+ {
+ option_entries[i].description = _(option_entries[i].description);
+ option_entries[i].arg_description = _(option_entries[i].arg_description);
+ }
+#endif
+
+ /* Use glib's option parser, for consistency, features and just less code in general. Nice. */
+ context = g_option_context_new(_("- a graphical file manager using GTK+"));
+ g_option_context_add_main_entries(context, option_entries, PACKAGE);
+ g_option_context_add_group(context, gtk_get_option_group(TRUE)); /* Import GTK+'s options. */
+ if(!g_option_context_parse(context, &argc, &argv, &err))
+ {
+ g_print(_("Failed to parse command line options: %s\n"), err->message);
+ return EXIT_FAILURE;
+ }
+
+ /* Must be run before application-level options parsing. */
+ gtk_init(&argc, &argv);
+
+ min.vfs.vfs = g_vfs_get_default();
+
+ if(show_version)
+ {
+ puts(VERSION);
+ return EXIT_SUCCESS;
+ }
+#if defined ENABLE_NLS
+ if(show_locale_info)
+ {
+ const gchar *enc, *cset, **fenc;
+
+ printf("PACKAGE=\"%s\"\n", PACKAGE);
+ printf("LOCALEDIR=\"%s\"\n", LOCALEDIR);
+
+ enc = g_getenv("G_FILENAME_ENCODING");
+ if(enc == NULL)
+ enc = "(not set)";
+ printf("G_FILENAME_ENCODING=\"%s\"\n", enc);
+
+ g_get_filename_charsets(&fenc);
+ printf("Filename encoding: \"%s\"\n", (fenc != NULL && *fenc != NULL) ? *fenc : "(unknown)");
+
+ g_get_charset(&cset);
+ if(cset == NULL)
+ cset = "(unknown)";
+ printf("Native charset: \"%s\"\n", cset);
+ return EXIT_SUCCESS;
+ }
+#endif
+
+ if(geteuid() == 0 && !root_ok)
+ {
+ fprintf(stderr, _("%s: To allow running as root, use the '--root-ok' option\n"), argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ dpf_initialize();
+ mnu_initialize();
+
+ min.cfg.flags = 0;
+ dpf_init_defaults(&min.cfg);
+ csq_init_commands(&min);
+
+ if(list_commands)
+ {
+ do_list_commands(&min);
+ return EXIT_SUCCESS;
+ }
+
+ min.cfg.menus = mnu_menuinfo_new_default(&min);
+ btn_buttoninfo_new_default(&min, &min.cfg.buttons);
+ min.cfg.buttonlayout = btl_buttonlayout_new();
+ init_paths(&min.cfg);
+ min.cfg.style = stl_styleinfo_default();
+ typ_init(&min.cfg);
+ min.cfg.wininfo = win_wininfo_new_default(&min);
+ min.cfg.ctrlinfo = ctrl_new_default(&min);
+ min.cfg.errors.display = ERR_DISPLAY_STATUSBAR;
+ cng_initialize(&min.cfg.nag);
+ min.cfg.dir_filter = dir_filter;
+ chd_initialize(&min);
+ min.que = que_initialize();
+
+ min.ico = ico_initialize(&min);
+
+ min.cfg.flags = 0;
+ if(!no_rc)
+ cfg_load_config(&min);
+ if(!usr_init())
+ g_warning(_("Couldn't initialize userinfo module - username resolving won't work"));
+
+ if((box = build_gui(&min)) != NULL)
+ {
+ dp_initialize(min.gui->pane, sizeof min.gui->pane / sizeof *min.gui->pane);
+
+ if(!no_gtk_rc)
+ load_gtk_rc(&min);
+
+ fam_initialize(&min);
+
+ dlg_main_window_set(GTK_WINDOW(min.gui->window));
+ dlg_position_set(min.cfg.dialogs.pos);
+#if 0
+ g_signal_connect(G_OBJECT(min.gui->window), "key_press_event", G_CALLBACK(evt_key_press), &min);
+#endif
+ init_cmd_options(&min.cfg);
+
+ gtk_container_add(GTK_CONTAINER(min.gui->window), box);
+
+ if(!no_dir_history)
+ dph_history_load(&min, min.gui->pane, sizeof min.gui->pane / sizeof *min.gui->pane);
+
+ gtk_window_set_resizable(GTK_WINDOW(min.gui->window), TRUE);
+
+ win_window_show(min.gui->window);
+
+ err_clear(&min);
+ if(enter_initial_dirs(&min, dir_left, dir_right))
+ {
+ if(min.gui->top != NULL)
+ {
+ gchar buf[128];
+
+ g_snprintf(buf, sizeof buf, _("gentoo v%s by Emil Brink <emil@obsession.se>"), VERSION);
+ gtk_label_set_text(GTK_LABEL(min.gui->top), buf);
+ }
+ }
+ else
+ err_show(&min);
+
+ ndl_dialog_sync_new_wait(&min, "gio-warning", _("Development Version Warning"), _("This version of gentoo is considered somewhat new and untested.\nThere have been major changes to almost all parts of the program since the previous version.\nPlease be a bit careful, and make sure you report any problem to the author. Thanks."));
+
+ g_idle_add(evt_idle_run, &min);
+ gtk_main();
+ }
+ chd_kill_children();
+ fam_shutdown(&min);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/gentoo.h b/src/gentoo.h
new file mode 100644
index 0000000..9fc3cd2
--- /dev/null
+++ b/src/gentoo.h
@@ -0,0 +1,509 @@
+/*
+** This is the main header file for gentoo. Most source files will include this header,
+** since it declares many of the data types that are used. When including this header,
+** it should always be the first included file. The preferred order of inclusion is:
+** #include "gentoo.h"
+** #include <system stuff> (e.g. <stdio.h>, <stdlib.h>, ...)
+** #include "more gentoo stuff" (e.g. "fileutil.h", "xmlutil.h", ...)
+** #include "me.h" (for a module named "me.c", that is).
+**
+** The reason why this file should be the first included one is that it fixes some
+** system-dependent things which need to go before any system headers are included.
+*/
+
+#include "config.h"
+
+#if !(defined __osf__ && defined __alpha__) && !defined __NetBSD__ && !defined __FreeBSD__ && !defined __sgi
+ #if !defined __EXTENSIONS__
+ #define __EXTENSIONS__
+ #endif
+ #if !defined _POSIX_C_SOURCE
+ #define _POSIX_C_SOURCE 3 /* This is for Solaris. */
+ #endif
+ #define POSIX_C_SOURCE 3
+#endif /* !__osf__ && !__alpha */
+
+#if defined __osf__ && defined __alpha__ /* On Tru64, this should bring in mknod(). */
+ #define _XOPEN_SOURCE_EXTENDED
+ #define _OSF_SOURCE /* For MAXNAMLEN on Tru64. */
+#endif
+
+#if !defined _BSD_SOURCE
+ #define _BSD_SOURCE /* For MAXNAMLEN on Linux. */
+#endif
+
+#include <dirent.h>
+#include <errno.h>
+#include <glob.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <regex.h>
+#include <time.h>
+#include <unistd.h>
+
+/* The various BSDs seem to have a lot in common. Let's try and use that,
+** and save some typing in various tests below. This should probably all
+** be replaced by proper Autoconfed stuff at some point.
+*/
+#if defined __OpenBSD__ || defined __FreeBSD__ || defined __NetBSD__
+#define GENTOO_ON_BSD
+#endif
+
+/* BSD-specific mounting stuff. */
+#if defined GENTOO_ON_BSD
+#include <sys/param.h>
+#include <sys/mount.h>
+#endif
+
+#undef GTK_ENABLE_BROKEN /* We can't use autoconf to undefine symbols. */
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+/* Fix for < Glib 2.20. */
+#ifndef G_GOFFSET_FORMAT
+#define G_GOFFSET_FORMAT G_GINT64_FORMAT
+#endif
+
+/* Not all systems' <mman.h> seem to define this. */
+#if !defined MAP_FAILED
+#define MAP_FAILED ((void *) -1)
+#endif
+
+#if !defined MAXNAMLEN /* Still no MAXNAMLEN? Then make one up. */
+#define MAXNAMLEN 255
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define RCNAME "gentoorc"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Sometimes, this does good stuff. I hope. That's about all you can do with GNU tools,
+** since actually understanding them requires way more time than I'm willing to spend.
+*/
+#include "gnu-gettext.h"
+
+#if defined ENABLE_NLS
+/* This provides the _() and N_() macros used to mark strings for translation. */
+#include <glib/gi18n.h>
+#else
+/* Provide transparent definitions if NLS is disabled. */
+#define _(str) str
+#define N_(str) str
+#endif /* ENABLE_NLS */
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct MainInfo MainInfo;
+typedef struct DirPane DirPane;
+typedef struct CmdSeq CmdSeq;
+
+/* These are various subsystems whose includes we need here, since they define datatypes
+** that are needed below. This is a good point to include them, since MainInfo has been
+** introduced (above).
+*/
+#include "buttonlayout.h"
+#include "keyboard.h"
+#include "controls.h"
+#include "iconutil.h"
+#include "queue.h"
+#include "cmdarg.h"
+#include "styles.h"
+#include "dirhistory.h"
+#include "window.h"
+#include "menus.h"
+#include "sizeutil.h"
+
+#define KEY_NAME_SIZE (32)
+
+#define CSQ_NAME_SIZE (32)
+
+/* FileType-related constants. */
+enum {
+ FT_NAME_SIZE = (32),
+ FT_SUFFIX_SIZE = (32),
+ FT_NAMERE_SIZE = (64),
+ FT_FILERE_SIZE = (64),
+
+ FTFL_REQPERM = (1<<0),
+ FTFL_REQSUFFIX = (1<<1),
+ FTFL_NAMEMATCH = (1<<2),
+ FTFL_NAMEGLOB = (1<<3),
+ FTFL_FILEMATCH = (1<<4),
+ FTFL_FILEGLOB = (1<<5),
+ FTFL_NAMENOCASE = (1<<6),
+ FTFL_FILENOCASE = (1<<7),
+
+ FTPM_SETUID = (1<<0),
+ FTPM_SETGID = (1<<1),
+ FTPM_STICKY = (1<<2),
+ FTPM_READ = (1<<3),
+ FTPM_WRITE = (1<<4),
+ FTPM_EXECUTE = (1<<5),
+};
+
+typedef struct { /* Used to map stat() info onto names. */
+ gchar name[FT_NAME_SIZE]; /* Human-readable name of filetype (e.g. "GIF image", "MP3 song"). */
+ mode_t mode; /* Type flags, matched against stat()'s mode info. */
+ guint32 flags; /* Various flags. */
+ guint32 perm; /* Permissions to require. Not orthogonal with mode. */
+ gchar suffix[FT_SUFFIX_SIZE]; /* Suffix to require (if FTFL_REQSUFFIX is set). */
+ gchar name_re_src[FT_NAMERE_SIZE]; /* Regular expression to match against the name (if FTFL_MATCHNAME). */
+ regex_t *name_re; /* Compiled version of the regular expression. */
+ gchar file_re_src[FT_FILERE_SIZE]; /* RE to match against output of 'file' command (if FTFL_MATCHFILE). */
+ regex_t *file_re; /* Again, a compiled version of the regular expression. */
+ Style *style; /* Style to use for items matching this type. */
+} FType;
+
+#define DP_TITLE_SIZE (32)
+#define DP_FORMAT_SIZE (16)
+#define DP_DATEFMT_SIZE (32)
+#define DP_MAX_COLUMNS (32)
+
+typedef enum { DPC_NAME, DPC_SIZE, DPC_BLOCKS, DPC_BLOCKSIZE, DPC_MODENUM, DPC_MODESTR,
+ DPC_NLINK, DPC_UIDNUM, DPC_UIDSTR, DPC_GIDNUM, DPC_GIDSTR, DPC_DEVICE, DPC_DEVMAJ, DPC_DEVMIN,
+ DPC_ATIME, DPC_MTIME, DPC_CRTIME, DPC_CHTIME,
+ DPC_TYPE, DPC_ICON,
+ DPC_URI_NOFILE,
+ DPC_NUM_TYPES } DPContent;
+
+typedef struct {
+ guint show_type : 1; /* Append type-character (from "@ / * | =") to names? */
+ guint show_linkname : 1; /* Append " -> destination" on symbolic links? */
+} DC_Name;
+
+typedef struct {
+ SzUnit unit;
+ guint ticks : 1;
+ gchar tick;
+ gint digits;
+ gchar dformat[DP_FORMAT_SIZE]; /* Hidden from user, not saved, built by config code. */
+ guint dir_show_fs_size : 1; /* Show filesystem size for directories? */
+} DC_Size;
+
+typedef struct {
+ gchar format[DP_FORMAT_SIZE]; /* General numerical formatter (for size, mode, uid, etc). */
+} DC_Fmt;
+
+typedef struct {
+ gchar format[DP_DATEFMT_SIZE]; /* A strftime() format specifier. */
+} DC_Time;
+
+typedef union {
+ DC_Name name;
+ DC_Size size;
+ DC_Fmt blocks, blocksize;
+ DC_Fmt mode, nlink, uidnum, gidnum, device, devmaj, devmin;
+ DC_Time a_time, m_time, cr_time, ch_time;
+} DpCExtra;
+
+typedef struct {
+ gchar title[DP_TITLE_SIZE];
+ DPContent content;
+ DpCExtra extra; /* Content-specific flags. */
+ GtkJustification just;
+ gint width;
+} DpCFmt;
+
+typedef enum { DPS_DIRS_FIRST = 0, DPS_DIRS_LAST, DPS_DIRS_MIXED } SortMode;
+
+typedef struct {
+ DPContent content; /* The content type we wish to sort on. */
+ SortMode mode; /* Controls placement of directories. */
+ gboolean invert; /* If set, we sort backwards (Z-A). */
+ gboolean nocase; /* Set for case-insensitive string comparisons. Lame! */
+} DPSort;
+
+typedef enum { SBP_IGNORE = 0, SBP_LEFT, SBP_RIGHT } SBarPos;
+
+#define FONT_MAX 128
+
+typedef struct {
+ guint num_columns;
+ DpCFmt format[DP_MAX_COLUMNS];
+ DPSort sort;
+ gchar def_path[PATH_MAX];
+ gboolean path_above; /* Set to get the path entry above the actual pane. */
+ gboolean hide_allowed; /* Set to enable hiding (default). */
+ gboolean scrollbar_always; /* Set to always show scrollbar, regardless of # of entries. */
+ gboolean huge_parent; /* Set to enable huge, tall, Opus-like parent button. */
+ SBarPos sbar_pos; /* Position of scrollbar. */
+ gboolean set_font; /* Set to override GTK+'s default font. */
+ gchar font_name[FONT_MAX]; /* Last-set font name, remains valid even when set_font == FALSE. */
+ gboolean rubber_banding; /* Set to enable GTK+'s "rubberbanding" selection. */
+} DPFormat;
+
+typedef enum { DPORIENT_HORIZ = 0, DPORIENT_VERT } DpOrient;
+typedef enum { DPSPLIT_FREE = 0, DPSPLIT_RATIO, DPSPLIT_ABS_LEFT, DPSPLIT_ABS_RIGHT } DpSplit;
+
+/* Allow user to control how gentoo should allocate window space between the panes. */
+typedef struct {
+ DpOrient orientation;
+ DpSplit mode;
+ gdouble value; /* Parameter interpreted depending on mode. */
+} DPPaning;
+
+typedef struct {
+ gboolean select; /* Remember selections? */
+ gboolean save; /* Save history lists on exit? */
+} DPHistory;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* General command row flags. */
+enum {
+ CGF_RUNINBG = (1<<0), /* Run in command in background? */
+ CGF_KILLPREV = (1<<1), /* Kill previous instance of program (only background)? */
+ CGF_GRABOUTPUT = (1<<2), /* Capture the output into a special window? */
+ CGF_SURVIVE = (1<<3) /* Survive when gentoo quits (only background)? */
+};
+
+/* These flags are for the before- and after-flag fields. */
+enum {
+ CBAF_RESCAN_SOURCE = (1<<0), /* Rescan the source dir pane? */
+ CBAF_RESCAN_DEST = (1<<1),
+ CBAF_CD_SOURCE = (1<<2), /* These save some config work. */
+ CBAF_CD_DEST = (1<<3),
+ CBAF_REQSEL_SOURCE = (1<<4), /* Command won't run if there's no source selection when invoked. */
+ CBAF_REQSEL_DEST = (1<<5) /* Command won't run if there's no destination selection when invoked. */
+};
+
+typedef struct { /* Extra info for external commands. */
+ guint32 gflags; /* General flags. */
+ guint32 baflags[2]; /* Before and after flags. */
+} CX_Ext;
+
+typedef enum { CRTP_BUILTIN, CRTP_EXTERNAL,
+ CRTP_NUM_TYPES } CRType;
+
+
+typedef struct { /* A command "row". */
+ CRType type; /* The type of the row. */
+ GString *def; /* The row definition string. */
+ guint32 flags; /* Flags common to all types. */
+ union { /* Type-specific row info. */
+ CX_Ext external; /* Extra info for external commands. */
+ } extra;
+} CmdRow;
+
+#define CSFLG_REPEAT (1<<0) /* Repeat sequence until no selection? */
+
+struct CmdSeq {
+ gchar name[CSQ_NAME_SIZE]; /* Name of this command sequence, really. */
+ guint32 flags; /* Flags for this sequence. */
+ GList *rows; /* List of CmdRow definition rows. */
+};
+
+typedef struct { /* Information about commands lives here. */
+ GHashTable *builtin; /* Built-in commands (actually CmdDesc structs -- see cmdseq.c). */
+ GHashTable *cmdseq; /* Command sequences. */
+} CmdInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define BTN_LABEL_SIZE (32)
+#define BTN_TOOLTIP_SIZE (64) /* Arbitrary, as always. */
+
+typedef struct {
+ GList *sheets; /* List of button sheets. */
+} ButtonInfo;
+
+typedef struct { /* Options for overwrite-confirmation dialog module. */
+ guint show_info : 1; /* Show info (sizes & dates) for conflicting files? */
+ gchar datefmt[DP_DATEFMT_SIZE]; /* How to format dates? */
+} OptOverwrite;
+
+typedef enum { HIDE_NONE, HIDE_DOT, HIDE_REGEXP } HMode;
+
+typedef struct { /* Info about files hidden from user. Not ignored, just hidden. */
+ HMode mode;
+ gchar hide_re_src[MAXNAMLEN]; /* Regular expression; matches are hidden if mode == HIDE_REGEXP. */
+ regex_t *hide_re; /* Compiled version of the RE. */
+ guint no_case : 1; /* Ignore case in the RE? */
+} HideInfo;
+
+typedef enum { PTID_ICON = 0, PTID_GTKRC, PTID_FSTAB, PTID_MTAB,
+ PTID_NUM_PATHS } PathID;
+
+typedef struct { /* Miscellanous paths. */
+ GString *path[PTID_NUM_PATHS]; /* Just one GString per path, that's all. */
+ HideInfo hideinfo; /* Info about which files should be hidden. */
+} PathInfo;
+
+typedef struct { /* Configuration information for dialogs. */
+ GtkWindowPosition pos; /* How should dialogs be positioned? */
+} DialogInfo;
+
+typedef enum {
+ ERR_DISPLAY_STATUSBAR,
+ ERR_DISPLAY_TITLEBAR,
+ ERR_DISPLAY_DIALOG
+} ErrDisplay;
+
+typedef struct {
+ ErrDisplay display; /* How should error (and status messages) be shown? */
+ gboolean beep; /* Do a gdk_beep() on error? */
+} ErrInfo;
+
+typedef struct {
+ GHashTable *ignored; /* Keyed on 'tag', if present ignore the dialog. */
+} NagInfo;
+
+#define CFLG_CHANGED (1<<0) /* Config has changed. Set on "OK", cleared by cfg_save_all(). */
+
+typedef struct { /* Holds all configuration info. */
+ guint32 flags;
+ GList *type; /* List of types (FType structures). */
+ StyleInfo *style; /* Opaque style container. */
+ DPFormat dp_format[2];
+ DPPaning dp_paning; /* Controls how the paned view acts. */
+ DPHistory dp_history; /* History list option. */
+ OptOverwrite opt_overwrite;
+ MenuInfo *menus;
+ ButtonInfo buttons;
+ ButtonLayout *buttonlayout;
+ CmdInfo commands;
+ PathInfo path;
+ WinInfo *wininfo;
+ DialogInfo dialogs;
+ CtrlInfo *ctrlinfo;
+ ErrInfo errors;
+ gboolean (*dir_filter)(const gchar *name);
+ NagInfo nag;
+} CfgInfo;
+
+typedef struct GuiInfo GuiInfo;
+
+typedef struct {
+ GVfs *vfs;
+} VfsInfo;
+
+struct MainInfo { /* gentoo's single most central data structure. */
+ gchar **run_commands; /* From the command line --run option, kept first for initializer in main(). */
+ VfsInfo vfs;
+ CfgInfo cfg;
+ GuiInfo *gui;
+ IconInfo *ico;
+ QueueInfo *que;
+};
+
+/* -- Directory content data structures -- */
+
+/* This is used for complete-as-you-type of paths. */
+typedef struct {
+ gchar prefix[PATH_MAX]; /* The path prefix that the GtkCompletion holds strings for. */
+ guint change_sig; /* Signal for change handler on path entry widget. */
+ GtkEntryCompletion *compl; /* A GTK+ 2.0 completion object, attached to the pane's path entry. */
+} PathComplete;
+
+enum { DPRF_HAS_SIZE = 1 << 0, /* Set when a row has a "real" size (not set for directories unless GetSize:d). */
+ DPRF_LINK_EXISTS = 1 << 1, /* Set when a symlink's target exists. */
+ DPRF_LINK_TO_DIR = 1 << 2 /* Set when symlink points at (valid) directory. Implies DPRF_LINK_EXISTS. */
+};
+
+typedef struct { /* A filename, in both on-disk and display formats. */
+ const gchar *disk; /* On-disk name, as read during directory scanning. */
+ const gchar *display; /* Display, as returned by glib (generally, this will be UTF-8). */
+} DRName;
+
+typedef struct { /* Representation of a single line in a directory (a file, typically). */
+ DRName dr_names; /* Actual filename, in two representations. */
+ DRName dr_linknames; /* Link name, again in two representations. */
+ struct stat dr_lstat; /* From a call to lstat(). */
+ struct stat *dr_stat; /* If link, this holds link target stats. Else, it points at dr_lstat. */
+ guint32 dr_flags; /* Misc. flags. */
+ const FType *dr_type; /* Type information. */
+} DirRow;
+
+typedef GtkTreeIter DirRow2;
+
+typedef struct {
+ guint num_dirs, num_files;
+ guint64 num_bytes;
+} SelInfo;
+
+typedef struct { /* Some trivial file system information. Updated on rescan. */
+ gboolean valid; /* Set if the structure's contents are valid. */
+ guint64 fs_size; /* Size of filesystem, in bytes. */
+ guint64 fs_free; /* Free bytes in this filesystem. */
+} FsInfo;
+
+#define URI_MAX (2000) /* This should only rarely be used, and hopefully ease out once GIO gets more mature. */
+
+typedef struct {
+ gchar path[URI_MAX]; /* Contents apply to this path. */
+ gchar *pathd; /* Dynamically allocated display version of the path. Beware! */
+ GtkListStore *store; /* Actual ListStore holding the pane's contents. Insert and clear here. */
+ GFile *root; /* A GFile representing the current location shown. */
+ gboolean is_local; /* Is the root considered local? Used to control 'file' etc. */
+ guint num_rows; /* Number of valid rows. */
+ guint tot_dirs, tot_files; /* Total number of entries in directory. */
+ guint64 tot_bytes; /* Sum of all sizes, in bytes. */
+ struct stat *stat; /* Info about link targets. */
+ gsize stat_alloc, stat_use; /* Allocated and used link stat structs. */
+ SelInfo sel;
+ FsInfo fs;
+} DirContents;
+
+/* -- Main DirPane structure --------------------------------------------------------------- */
+
+struct DirPane {
+ MainInfo *main; /* Handy to have around. */
+ guint index; /* Index of *this* pane, in the grand scheme of things. */
+ GtkWidget *vbox;
+ GtkWidget *notebook; /* Notebook holding (normally) path widgetry. */
+ GtkWidget *parent; /* The common parent button. */
+ GtkWidget *hparent; /* The "huge" parent button, if enabled in config. */
+ GtkWidget *path; /* GTK+ 2.0 GtkComboBox showing path and path history. */
+ PathComplete complete; /* Information for completing the path. */
+ GtkWidget *hide; /* A toggle button showing (and controlling) hide status. Focus target! */
+ GtkWidget *scwin; /* Scrolling window for clist to live in. */
+ GtkWidget *view; /* GtkTreeView for viewing the pane. */
+ GtkWidget *menu_top; /* The top-level menu, typically shown by right-clicking. */
+ GtkWidget *mitem_action; /* The item in the top-level menu that contains the actions submenu. */
+ GtkWidget *menu_action; /* The menu containing the intersection of all available actions on the selection. */
+ DirContents dir; /* Contents of directory (list of names etc). */
+ DirHistory *hist; /* Historic data about previously visited directories. */
+ gint last_row; /* The last clicked row. */
+ gint last_row2; /* The second last clicked row. */
+ gint dbclk_row; /* The row that was double clicked, or -1. */
+ guint sig_sel_changed; /* Signal for the "changed" event on the view's GtkTreeSelection. */
+ guint sig_path_activate; /* Signal for the "activate" event on path entry combo box. */
+ guint sig_path_changed; /* Signal for the "changed" event on the path entry combo box. */
+};
+
+/* -- Graphic user interface stuff --------------------------------------------------------- */
+
+struct GuiInfo {
+ GtkWidget *window;
+ guint sig_main_configure;
+ guint sig_main_delete;
+ KbdContext *kbd_ctx; /* Keyboard context, for shortcuts. */
+ GtkWidget *vbox; /* Vbox that contains entire GUI. */
+ GtkWidget *top; /* A label showing status (selections, free space, etc). */
+ GtkWidget *panes; /* GtkPaned widget holding DirPanes. */
+ guint sig_pane_notify; /* Signal handler ID for notify::position. */
+ GtkWidget *middle; /* A box holding entire middle part. */
+ GtkWidget *bottom; /* Bottom part of GUI. */
+ DirPane pane[2];
+ DirPane *cur_pane;
+
+ gboolean evt_button_valid;
+ GdkEventButton evt_button;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* These are defined in the main "gentoo.c" module, but really shouldn't be. Until they
+** get a module of their own, they need to be prototyped like this. :(
+*/
+extern void rebuild_top(MainInfo *min);
+extern void rebuild_middle(MainInfo *min);
+extern void rebuild_bottom(MainInfo *min);
diff --git a/src/gfam.c b/src/gfam.c
new file mode 100644
index 0000000..d03d4b8
--- /dev/null
+++ b/src/gfam.c
@@ -0,0 +1,190 @@
+/*
+** 2002-07-22 - Finally, gentoo has learned to use FAM (File Alteration Monitor) if available. FAM,
+** from SGI, provides an application with the ability to be notified when a file or
+** directory changes. We use this to trigger pane reloads, so gentoo knows what's going
+** on in the filesystem.
+**
+** FAM support is entierly optional: if you don't want it, or you system doesn't have it,
+** it will be built as stubs that do nothing. Use --disable-fam to manually turn it off.
+**
+** Btw, this module is named "gfam" because plain "fam.h" collided with <fam.h>. Weird.
+** 2009-11-10 - Totally rewritten (and I do mean *totally*), now simply wraps GIO's monitoring. For
+** the usual dried up grapes' sake, I left the name of the module alone. Later ...
+*/
+
+#include "gentoo.h"
+
+#include "dialog.h"
+#include "dirpane.h"
+#include "miscutil.h"
+
+#include "gfam.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static const guint RESCAN_INTERVAL = 50; /* Milliseconds. */
+
+static struct {
+ struct {
+ DirPane *dp;
+ GFileMonitor *monitor;
+ gulong sig_changed;
+ } pane[2];
+ gulong block_count;
+ guint rescan_mask;
+ guint timeout;
+} monitor_info;
+
+/* ----------------------------------------------------------------------------------------- */
+
+gboolean fam_initialize(MainInfo *min)
+{
+ guint i;
+
+ for(i = 0; i < sizeof monitor_info.pane / sizeof *monitor_info.pane; i++)
+ {
+ monitor_info.pane[i].dp = &min->gui->pane[i];
+ monitor_info.pane[i].monitor = NULL;
+ monitor_info.pane[i].sig_changed = 0;
+ }
+ monitor_info.block_count = 0;
+ monitor_info.rescan_mask = 0;
+ monitor_info.timeout = 0;
+
+ return TRUE;
+}
+
+gboolean fam_is_active(void)
+{
+ return TRUE;
+}
+
+static gboolean evt_timeout(gpointer data)
+{
+ guint i, mask;
+
+ if(monitor_info.block_count > 0)
+ goto remove_and_exit; /* It's not often, but here's one! */
+ mask = monitor_info.rescan_mask;
+ for(i = 0; i < sizeof monitor_info.pane / sizeof *monitor_info.pane; i++)
+ {
+ if(mask & (1U << i))
+ {
+ GTimer *timer;
+
+ timer = g_timer_new();
+ dp_rescan(monitor_info.pane[i].dp);
+ if(timer != NULL)
+ {
+ gint limit;
+
+ g_timer_stop(timer);
+ limit = g_timer_elapsed(timer, NULL);
+ g_timer_destroy(timer);
+ if(limit < 50)
+ limit = 50;
+ else if(limit > 10000)
+ limit = 10000;
+ g_file_monitor_set_rate_limit(monitor_info.pane[i].monitor, limit);
+ }
+ }
+ }
+ monitor_info.rescan_mask = 0;
+
+remove_and_exit:
+ /* The timeout is always a one-shot; clear handle and ask glib to delete. */
+ monitor_info.timeout = 0;
+ return FALSE;
+}
+
+static void queue_rescan(guint pane)
+{
+ monitor_info.rescan_mask |= (1U << pane);
+ if(monitor_info.block_count == 0)
+ {
+ if(monitor_info.timeout == 0)
+ monitor_info.timeout = g_timeout_add(RESCAN_INTERVAL, evt_timeout, NULL);
+ }
+}
+
+static void evt_monitor_changed(GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event, gpointer user)
+{
+ DirPane *dp = user;
+
+ if(event == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT || event == G_FILE_MONITOR_EVENT_CREATED || event == G_FILE_MONITOR_EVENT_DELETED)
+ queue_rescan(dp->index);
+}
+
+gboolean fam_monitor(const DirPane *dp)
+{
+ if(dp == NULL)
+ return FALSE;
+ if(dp->index >= sizeof monitor_info.pane / sizeof *monitor_info.pane)
+ {
+ g_error("Too many panes, can't monitor pane with index %u", dp->index);
+ return FALSE;
+ }
+ if(monitor_info.pane[dp->index].monitor != NULL)
+ {
+ g_object_unref(monitor_info.pane[dp->index].monitor);
+ monitor_info.pane[dp->index].sig_changed = 0;
+ }
+ if(dp->dir.root == NULL)
+ {
+ g_error("No root GFile, failing to monitor pane with index %u\n", dp->index);
+ return FALSE;
+ }
+ if((monitor_info.pane[dp->index].monitor = g_file_monitor(dp->dir.root, G_FILE_MONITOR_WATCH_MOUNTS, NULL, NULL)) != NULL)
+ monitor_info.pane[dp->index].sig_changed = g_signal_connect(G_OBJECT(monitor_info.pane[dp->index].monitor), "changed", G_CALLBACK(evt_monitor_changed), (gpointer) dp);
+ else
+ g_warning("GIO failed to attach monitor to '%s'", dp->dir.path);
+ return monitor_info.pane[dp->index].monitor != NULL;
+}
+
+gboolean fam_is_monitored(const DirPane *dp)
+{
+ if(dp == NULL)
+ return FALSE;
+ if(dp->index >= sizeof monitor_info.pane / sizeof *monitor_info.pane)
+ return FALSE;
+ return monitor_info.pane[dp->index].monitor != NULL;
+}
+
+void fam_rescan_block(void)
+{
+ monitor_info.block_count++;
+}
+
+void fam_rescan_unblock(void)
+{
+ guint i;
+
+ if(--monitor_info.block_count == 0)
+ {
+ for(i = 0; i < sizeof monitor_info.pane / sizeof *monitor_info.pane; i++)
+ {
+ if(monitor_info.rescan_mask & (1U << i))
+ {
+ queue_rescan(i);
+ monitor_info.rescan_mask &= ~(1U << i);
+ }
+ }
+ }
+}
+
+void fam_shutdown(MainInfo *min)
+{
+ guint i;
+
+ if(monitor_info.timeout != 0)
+ g_source_remove(monitor_info.timeout);
+
+ for(i = 0; i < sizeof monitor_info.pane / sizeof *monitor_info.pane; i++)
+ {
+ if(monitor_info.pane[i].monitor != NULL && monitor_info.pane[i].sig_changed != 0)
+ {
+ g_object_unref(monitor_info.pane[i].monitor);
+ monitor_info.pane[i].sig_changed = 0;
+ }
+ }
+}
diff --git a/src/gfam.h b/src/gfam.h
new file mode 100644
index 0000000..572e170
--- /dev/null
+++ b/src/gfam.h
@@ -0,0 +1,13 @@
+/*
+** 2002-07-22 - Interface to the FAM module. This always gets built, it's the contents of
+** the calls that varies if FAM is disabled or not supported.
+** 2009-11-10 - Internally remodelled, now simply uses GIO's monitoring services.
+*/
+
+extern gboolean fam_initialize(MainInfo *min);
+extern gboolean fam_is_active(void);
+extern gboolean fam_monitor(const DirPane *dp);
+extern gboolean fam_is_monitored(const DirPane *dp);
+extern void fam_rescan_block(void);
+extern void fam_rescan_unblock(void);
+extern void fam_shutdown(MainInfo *min);
diff --git a/src/gnu-gettext.h b/src/gnu-gettext.h
new file mode 100644
index 0000000..8b262f4
--- /dev/null
+++ b/src/gnu-gettext.h
@@ -0,0 +1,69 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+
+ This program 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, 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ USA. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option. */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+ chokes if dcgettext is defined as a macro. So include it now, to make
+ later inclusions of <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Disabled NLS.
+ The casts to 'const char *' serve the purpose of producing warnings
+ for invalid uses of the value returned from these functions.
+ On pre-ANSI systems without 'const', the config.h file is supposed to
+ contain "#define const". */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
+# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code.
+ The argument, String, should be a literal string. Concatenated strings
+ and other string expressions won't work.
+ The macro's expansion is not parenthesized, so that it is suitable as
+ initializer for static 'char[]' or 'const char[]' variables. */
+#define gettext_noop(String) String
+
+#endif /* _LIBGETTEXT_H */
diff --git a/src/graphics/.xvpics/icon_gentoo-small.xpm b/src/graphics/.xvpics/icon_gentoo-small.xpm
new file mode 100644
index 0000000..4f1d1c3
--- /dev/null
+++ b/src/graphics/.xvpics/icon_gentoo-small.xpm
Binary files differ
diff --git a/src/graphics/.xvpics/icon_iconify.xpm b/src/graphics/.xvpics/icon_iconify.xpm
new file mode 100644
index 0000000..2dd61ec
--- /dev/null
+++ b/src/graphics/.xvpics/icon_iconify.xpm
Binary files differ
diff --git a/src/graphics/README b/src/graphics/README
new file mode 100644
index 0000000..fc1d4a3
--- /dev/null
+++ b/src/graphics/README
@@ -0,0 +1,11 @@
+This directory contains various graphics (in XPM format) that is
+compiled into the program, as opposed to loaded at runtime.
+
+These used to be among the source files, but I got tired of seeing
+them there and moved them into a dir of their own for 0.9.22. :)
+
+Except for the big gentoo icon ("icon_gentoo.xpm") by Ulf
+Pettersson, it was all created by Johan Hanson.
+
+
+/Emil
diff --git a/src/graphics/icon_empty.xpm b/src/graphics/icon_empty.xpm
new file mode 100644
index 0000000..c1624d4
--- /dev/null
+++ b/src/graphics/icon_empty.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * icon_empty_xpm[] = {
+"16 15 1 1",
+" c None",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/src/graphics/icon_failed.xpm b/src/graphics/icon_failed.xpm
new file mode 100644
index 0000000..4867255
--- /dev/null
+++ b/src/graphics/icon_failed.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char * icon_failed_xpm[] = {
+"16 15 2 1",
+". c None",
+"# c #000000",
+".##############.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".#............#.",
+".##############."};
diff --git a/src/graphics/icon_gentoo.c b/src/graphics/icon_gentoo.c
new file mode 100644
index 0000000..303a03c
--- /dev/null
+++ b/src/graphics/icon_gentoo.c
@@ -0,0 +1,336 @@
+/* icon_gentoo (from graphics/icon_gentoo.png, 4326 bytes) */
+static const unsigned char icon_gentoo_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49,
+ 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x40, 0x08, 0x06,
+ 0x00, 0x00, 0x00, 0x56, 0x50, 0x98, 0x51, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00,
+ 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49,
+ 0x4d, 0x45, 0x07, 0xdc, 0x05, 0x0d, 0x12, 0x39, 0x2f, 0x29, 0x55, 0xe6, 0xa4,
+ 0x00, 0x00, 0x10, 0x66, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x5d, 0x2d,
+ 0x70, 0xea, 0x4e, 0xbf, 0x7e, 0xd2, 0xfb, 0x17, 0x39, 0x2e, 0xb8, 0x44, 0xee,
+ 0x75, 0xa9, 0xa3, 0x0e, 0x64, 0x70, 0xad, 0x03, 0x07, 0x32, 0x9d, 0xb9, 0x82,
+ 0xba, 0xe0, 0x40, 0xdc, 0x3b, 0xd3, 0x8a, 0x3b, 0x93, 0x3a, 0x70, 0x20, 0xc1,
+ 0x51, 0x47, 0x5d, 0x90, 0xd4, 0x81, 0x23, 0xee, 0x44, 0x06, 0xf1, 0xce, 0x10,
+ 0x71, 0x66, 0x1a, 0xf1, 0xce, 0xec, 0x15, 0x10, 0x0e, 0x1f, 0xd9, 0xcd, 0x86,
+ 0xaf, 0xd3, 0x9e, 0x9b, 0x67, 0x26, 0x53, 0x0a, 0xc9, 0x26, 0x9b, 0xec, 0xb3,
+ 0xbf, 0xef, 0x8d, 0x84, 0x2b, 0xa0, 0xdf, 0xef, 0xd3, 0xf9, 0x7c, 0x0e, 0xcf,
+ 0xf3, 0xe0, 0x79, 0x1e, 0x16, 0x8b, 0x05, 0x7c, 0xdf, 0x47, 0x18, 0x86, 0x00,
+ 0x00, 0x59, 0x96, 0xa1, 0x69, 0x1a, 0x54, 0x55, 0x05, 0x21, 0x04, 0x84, 0x10,
+ 0xdc, 0xde, 0xde, 0xa2, 0x56, 0xab, 0x49, 0xc8, 0x90, 0xe1, 0x6f, 0xc7, 0x68,
+ 0x34, 0xa2, 0x96, 0x65, 0xd1, 0x42, 0xa1, 0x40, 0x01, 0x9c, 0xb4, 0x15, 0x0a,
+ 0x05, 0x6a, 0x59, 0x16, 0x1d, 0x8d, 0x46, 0x34, 0xbb, 0xb3, 0x19, 0xfe, 0x2a,
+ 0xd8, 0xb6, 0x7d, 0x16, 0x92, 0xf0, 0xc8, 0x63, 0xdb, 0x76, 0x46, 0x9c, 0x0c,
+ 0xdf, 0x1b, 0xcd, 0x66, 0x93, 0x12, 0x42, 0x2e, 0x46, 0x94, 0xfd, 0x8d, 0x10,
+ 0x42, 0x9b, 0xcd, 0x66, 0x46, 0x9c, 0x0c, 0xdf, 0x4f, 0xa2, 0xe8, 0xba, 0x7e,
+ 0x35, 0xa2, 0xec, 0x6f, 0xba, 0xae, 0x67, 0x12, 0x27, 0xc3, 0xd7, 0x87, 0xe3,
+ 0x38, 0xb4, 0x5c, 0x2e, 0xff, 0x31, 0xa2, 0xec, 0x6f, 0xe5, 0x72, 0x99, 0x3a,
+ 0x8e, 0x93, 0x11, 0x27, 0xc3, 0xd7, 0x43, 0xbb, 0xdd, 0xbe, 0xaa, 0xfa, 0x95,
+ 0x46, 0x4d, 0x6b, 0xb7, 0xdb, 0x19, 0x69, 0x32, 0x7c, 0x0d, 0xfc, 0xfc, 0xf9,
+ 0x93, 0x5a, 0x96, 0x75, 0xda, 0xc0, 0x96, 0x41, 0xa1, 0x80, 0x82, 0x80, 0x42,
+ 0x07, 0x95, 0xf3, 0xeb, 0x4d, 0x5f, 0xfd, 0x0f, 0xb2, 0xfe, 0xfd, 0x84, 0x73,
+ 0xac, 0xaf, 0x31, 0x43, 0x86, 0x3f, 0x0b, 0xd3, 0x34, 0x8f, 0x1e, 0xc4, 0x72,
+ 0x55, 0xa6, 0xea, 0x48, 0xa5, 0xfa, 0x92, 0x50, 0xfd, 0x93, 0x50, 0x9d, 0x6e,
+ 0x6f, 0x3a, 0x25, 0x53, 0x95, 0x2a, 0x75, 0x79, 0x45, 0x1a, 0xf9, 0x74, 0x69,
+ 0xb3, 0xbe, 0xd6, 0x0c, 0x19, 0xbe, 0x0f, 0x59, 0x64, 0x43, 0xa6, 0xc4, 0x51,
+ 0xf7, 0xc8, 0xf1, 0x9b, 0x24, 0xea, 0x48, 0xa5, 0x72, 0x59, 0xbe, 0x98, 0x8a,
+ 0x96, 0x91, 0x26, 0xc3, 0xb7, 0x20, 0x8b, 0x7c, 0x2f, 0x53, 0xf2, 0x93, 0x30,
+ 0x88, 0x42, 0x28, 0x99, 0xa8, 0x27, 0xab, 0x5d, 0x19, 0x69, 0x32, 0x7c, 0x49,
+ 0xa4, 0xb2, 0x59, 0x54, 0x50, 0x32, 0x51, 0x99, 0x44, 0xd1, 0x29, 0x59, 0xd9,
+ 0x28, 0x57, 0x76, 0x06, 0x64, 0x36, 0x4d, 0x86, 0xab, 0x79, 0xc3, 0x44, 0x07,
+ 0xa5, 0x52, 0x95, 0x63, 0x6c, 0x93, 0xdf, 0x9b, 0x3a, 0x54, 0xcf, 0x62, 0x9b,
+ 0x1c, 0xbb, 0x65, 0xde, 0xb3, 0x0c, 0x17, 0x85, 0xe3, 0x38, 0xc2, 0xae, 0x63,
+ 0xd5, 0x56, 0xb8, 0x52, 0x45, 0xb5, 0x95, 0x2f, 0xe1, 0x72, 0xce, 0xe2, 0x34,
+ 0x19, 0xce, 0x81, 0xff, 0x88, 0xfb, 0xf2, 0xd7, 0xaf, 0x5f, 0xff, 0xfd, 0xf1,
+ 0xf1, 0x91, 0x78, 0xb0, 0xda, 0x57, 0x90, 0xfb, 0xaf, 0x1c, 0xf3, 0x77, 0xff,
+ 0xd1, 0xc7, 0xbf, 0xfe, 0xf7, 0x97, 0xf8, 0xd5, 0x28, 0x80, 0x52, 0x93, 0x21,
+ 0xdf, 0xfd, 0x03, 0xe0, 0x1f, 0xfc, 0x7b, 0xf1, 0xef, 0xb3, 0x74, 0x32, 0x08,
+ 0x02, 0xfc, 0xfa, 0xf5, 0x0b, 0xae, 0xeb, 0xfe, 0x4f, 0xf6, 0xc8, 0x33, 0x9c,
+ 0x15, 0xeb, 0x54, 0x93, 0x64, 0xc9, 0xd2, 0xe7, 0x4b, 0x16, 0xa5, 0x2a, 0xe8,
+ 0x01, 0x53, 0x40, 0xd5, 0xbe, 0xba, 0x56, 0xe9, 0xf4, 0x43, 0x97, 0xf3, 0x5c,
+ 0xa5, 0x8a, 0x79, 0x1e, 0x6f, 0x5a, 0x96, 0x46, 0x93, 0xe1, 0x54, 0x1c, 0xd4,
+ 0x9b, 0xe8, 0xba, 0x4e, 0x5d, 0xd7, 0xe5, 0x0b, 0x02, 0x5b, 0x81, 0x66, 0xb1,
+ 0x25, 0xcb, 0xf2, 0x75, 0x89, 0x45, 0x23, 0x48, 0x3c, 0xb9, 0x6c, 0xc8, 0x20,
+ 0x0e, 0x01, 0x10, 0x72, 0xf7, 0x5b, 0x0e, 0x3e, 0xb1, 0xa8, 0x2d, 0x4e, 0xee,
+ 0xac, 0xae, 0xeb, 0x70, 0x5d, 0x37, 0xab, 0xb1, 0xb9, 0xa2, 0x6a, 0x1f, 0x04,
+ 0x01, 0x3c, 0xcf, 0x03, 0x00, 0x34, 0x1a, 0x8d, 0xbf, 0xeb, 0xde, 0xaf, 0x33,
+ 0x80, 0xf9, 0x6e, 0xe3, 0xb2, 0xcc, 0xb7, 0x59, 0x86, 0xaa, 0x98, 0x84, 0x6a,
+ 0xf3, 0x25, 0xd4, 0x8e, 0xb4, 0xb2, 0xc4, 0xec, 0x20, 0xb9, 0x2c, 0x27, 0x3a,
+ 0x17, 0xb2, 0x2c, 0xe7, 0x3f, 0xa7, 0xa5, 0xfc, 0x0d, 0x76, 0xe4, 0xcd, 0xf6,
+ 0x3f, 0x83, 0xc1, 0x20, 0xd1, 0xc6, 0x20, 0x7d, 0x8d, 0xfd, 0x7b, 0x08, 0x2c,
+ 0x2a, 0xc9, 0x92, 0x40, 0xb1, 0x15, 0xe4, 0xea, 0x39, 0x71, 0x1b, 0xe4, 0x3d,
+ 0x10, 0xda, 0x4f, 0x6b, 0x28, 0x50, 0x2c, 0x85, 0xbb, 0x4f, 0x62, 0x1f, 0x33,
+ 0x64, 0x10, 0x21, 0x8c, 0x6d, 0xdb, 0x34, 0x12, 0x9d, 0x6c, 0x23, 0x5f, 0x05,
+ 0x64, 0xf6, 0xef, 0x2e, 0xf1, 0x92, 0xd5, 0xb0, 0xaa, 0xcc, 0x55, 0xe7, 0x62,
+ 0x8e, 0x00, 0x5c, 0xc1, 0x3d, 0x0b, 0x3f, 0xa0, 0x3d, 0xe7, 0x00, 0xc2, 0xde,
+ 0xc7, 0xf3, 0x3c, 0x64, 0xb6, 0x4c, 0x86, 0x63, 0xf1, 0x4f, 0xf4, 0x61, 0x38,
+ 0x1c, 0xf2, 0x07, 0x63, 0x1e, 0xc8, 0xdd, 0xff, 0x60, 0xfe, 0xee, 0xbf, 0x2c,
+ 0x81, 0x24, 0xe1, 0xa2, 0x00, 0xa4, 0xa7, 0xa5, 0xbb, 0xc2, 0x20, 0x14, 0xdb,
+ 0x4f, 0xdd, 0xfa, 0xd8, 0x55, 0xb1, 0x28, 0xb1, 0x2f, 0x26, 0xa9, 0xaf, 0xe7,
+ 0xd6, 0xe3, 0x07, 0x83, 0x01, 0xc6, 0xe3, 0xf1, 0x46, 0x97, 0x57, 0x14, 0x05,
+ 0x86, 0x61, 0xe0, 0xfe, 0xfe, 0x1e, 0x8f, 0x8f, 0x8f, 0xd2, 0x9e, 0x2a, 0xb3,
+ 0x03, 0x9e, 0xde, 0xdf, 0xed, 0x76, 0xe9, 0xfb, 0xfb, 0x3b, 0x66, 0xb3, 0x19,
+ 0xb6, 0x27, 0x3b, 0xc3, 0x30, 0x90, 0xcf, 0xe7, 0xf1, 0xfa, 0xfa, 0x2a, 0x09,
+ 0xa8, 0x4e, 0xbb, 0x8f, 0x48, 0x51, 0x76, 0xae, 0x09, 0x58, 0x05, 0xb0, 0xc7,
+ 0xe3, 0x31, 0x66, 0xb3, 0x19, 0x00, 0x80, 0x10, 0x82, 0x72, 0xb9, 0x7c, 0xd0,
+ 0x7e, 0xd4, 0xde, 0xfb, 0xfb, 0x3b, 0x53, 0xba, 0x6f, 0x9f, 0x33, 0xee, 0x5c,
+ 0xfb, 0xf7, 0x2e, 0xea, 0xdf, 0x74, 0x3a, 0x45, 0x10, 0x04, 0x3b, 0x7d, 0x24,
+ 0x84, 0xa0, 0x50, 0x28, 0x70, 0xdb, 0xb8, 0x48, 0x9b, 0xeb, 0x7a, 0x79, 0x7e,
+ 0x2c, 0x63, 0xca, 0x8e, 0xe2, 0x13, 0x5f, 0x2c, 0x66, 0xc3, 0x6b, 0x83, 0x69,
+ 0xbf, 0x08, 0xc6, 0x71, 0xe4, 0x82, 0x9c, 0x2a, 0xab, 0xe0, 0x1a, 0x6b, 0x04,
+ 0x88, 0xd4, 0x0c, 0xe5, 0xf3, 0x79, 0xca, 0xd3, 0xfb, 0x59, 0x03, 0x5d, 0x51,
+ 0x94, 0x73, 0x78, 0x06, 0x0f, 0xf6, 0x37, 0x0c, 0x83, 0x6e, 0x13, 0x85, 0xd7,
+ 0xb6, 0xa2, 0x28, 0x74, 0x38, 0x1c, 0x52, 0x5e, 0x7b, 0xbc, 0x6d, 0xfb, 0x5c,
+ 0xfb, 0x83, 0x3a, 0x4d, 0x09, 0x89, 0xa2, 0x28, 0x89, 0x1e, 0xd0, 0xb3, 0xb6,
+ 0x99, 0x98, 0x02, 0xa3, 0x83, 0x3b, 0xa8, 0x45, 0x92, 0x28, 0xf7, 0x07, 0xb4,
+ 0xe8, 0x06, 0x55, 0xb0, 0x83, 0xa6, 0x9c, 0xca, 0xf9, 0x70, 0xe9, 0x94, 0x99,
+ 0x35, 0x11, 0x84, 0x1f, 0x0e, 0xe7, 0x61, 0xee, 0xe0, 0x98, 0x44, 0x58, 0x4e,
+ 0x4e, 0x1d, 0x73, 0x10, 0xa7, 0x3c, 0xcf, 0xd9, 0x08, 0x23, 0x1a, 0xd6, 0x00,
+ 0xa3, 0x90, 0x30, 0x8d, 0x13, 0xe2, 0xe8, 0x36, 0x93, 0x16, 0xae, 0xe0, 0x7a,
+ 0xb4, 0x96, 0x82, 0x19, 0x01, 0xa3, 0x23, 0xa4, 0x4b, 0x55, 0x3c, 0xfe, 0xa2,
+ 0xf6, 0xd5, 0x54, 0x64, 0x5b, 0xf7, 0xf9, 0x22, 0x58, 0x0f, 0x04, 0xa6, 0x44,
+ 0xb1, 0x6d, 0x9b, 0xda, 0xb6, 0x4d, 0x05, 0x49, 0x95, 0x38, 0xb1, 0x29, 0x8a,
+ 0x42, 0x4d, 0xd3, 0xe4, 0xb6, 0xc9, 0x98, 0x2d, 0x63, 0x07, 0x71, 0xda, 0xba,
+ 0xa7, 0xad, 0x41, 0x75, 0x12, 0x61, 0x78, 0x03, 0x7b, 0xfb, 0xbe, 0xf1, 0x24,
+ 0xf7, 0xfe, 0x00, 0xbf, 0x44, 0x9b, 0x89, 0x1d, 0xe5, 0x4a, 0x97, 0xbc, 0x58,
+ 0x70, 0xf2, 0x30, 0x28, 0xc9, 0xdf, 0xd4, 0x91, 0x9a, 0x2e, 0xfd, 0xc5, 0x8f,
+ 0xb9, 0xb6, 0x64, 0xc2, 0x9d, 0x1d, 0xdd, 0x6e, 0x97, 0x79, 0xbe, 0xf5, 0x6f,
+ 0xfb, 0xf6, 0x54, 0x92, 0x7a, 0xb5, 0x51, 0x29, 0x58, 0x64, 0x11, 0x91, 0x42,
+ 0x71, 0xfb, 0x71, 0xda, 0xdb, 0x49, 0x2b, 0xb2, 0x2c, 0x8b, 0x5a, 0x96, 0x25,
+ 0x74, 0x9d, 0x27, 0xba, 0x95, 0x85, 0xc9, 0xee, 0x38, 0x0e, 0xf3, 0x7a, 0xf6,
+ 0xf6, 0x3f, 0x6f, 0x9b, 0xfd, 0x7e, 0xff, 0x68, 0x55, 0x8a, 0xfc, 0x14, 0x1b,
+ 0xd4, 0xec, 0xba, 0x18, 0x8e, 0x2a, 0x96, 0x72, 0xb6, 0xca, 0xc7, 0x10, 0x52,
+ 0x75, 0xf8, 0xd7, 0xb7, 0xee, 0xfb, 0x59, 0xc1, 0x52, 0xad, 0x92, 0x54, 0x40,
+ 0xce, 0x60, 0xe4, 0x4a, 0xad, 0x38, 0x12, 0xb2, 0x06, 0x4a, 0xcc, 0x20, 0xe1,
+ 0xaa, 0x89, 0x71, 0x6d, 0xb3, 0xae, 0x73, 0x9b, 0x0c, 0xc7, 0x10, 0x86, 0xd5,
+ 0x3f, 0x5e, 0x89, 0x06, 0x6b, 0x72, 0x8a, 0x26, 0x87, 0x4b, 0xb4, 0x79, 0x33,
+ 0x9f, 0xcf, 0xf9, 0xde, 0x31, 0x83, 0xed, 0x47, 0xf6, 0x05, 0xa2, 0xf9, 0x90,
+ 0x01, 0xf9, 0xee, 0x47, 0xaa, 0x41, 0xe7, 0xdd, 0xf9, 0xa9, 0xf6, 0x97, 0x0b,
+ 0x72, 0x6c, 0xae, 0x40, 0xce, 0xe0, 0x9f, 0x37, 0xa9, 0xef, 0xc7, 0x78, 0xc4,
+ 0x58, 0xae, 0xf9, 0x24, 0x8f, 0xd5, 0xdd, 0xdd, 0x1d, 0xb7, 0xed, 0xf1, 0x78,
+ 0x0c, 0x11, 0x8f, 0xd6, 0xb6, 0xc7, 0x67, 0x1f, 0x93, 0xc9, 0x44, 0xa8, 0x1f,
+ 0x8a, 0xa2, 0x20, 0x08, 0x02, 0x29, 0xae, 0xed, 0x4a, 0xa5, 0x72, 0x11, 0x35,
+ 0x36, 0xae, 0x7f, 0x00, 0xd0, 0xeb, 0xf5, 0x98, 0xf7, 0xed, 0xf1, 0xf1, 0x51,
+ 0x22, 0xe4, 0x30, 0x86, 0x10, 0x04, 0x01, 0x9a, 0xcd, 0x26, 0x3d, 0x77, 0x9b,
+ 0xdd, 0x6e, 0x97, 0xde, 0x24, 0xc5, 0x5e, 0xe4, 0x22, 0x9b, 0x30, 0xe1, 0x9b,
+ 0x80, 0xcb, 0x97, 0xac, 0xdc, 0xc9, 0xa2, 0xf0, 0x5b, 0x4b, 0x84, 0xb3, 0x30,
+ 0x1d, 0x61, 0x0c, 0x19, 0xf1, 0xe9, 0x35, 0x72, 0x62, 0x4c, 0xe6, 0x9c, 0x60,
+ 0xb9, 0x53, 0xcb, 0xe5, 0xf2, 0x49, 0xed, 0xb2, 0xa4, 0x13, 0x8f, 0x64, 0xf7,
+ 0xf7, 0xf7, 0xc2, 0x83, 0x32, 0xc6, 0x48, 0x66, 0xfe, 0xa6, 0xeb, 0xfa, 0xd9,
+ 0xc9, 0xc2, 0xf2, 0x46, 0xc5, 0x91, 0x7e, 0x1f, 0xf5, 0x7a, 0x9d, 0xe9, 0xc2,
+ 0xbe, 0x44, 0x9b, 0x89, 0x84, 0xf9, 0xc1, 0xb8, 0x3f, 0xcb, 0xd7, 0xa5, 0x58,
+ 0x78, 0xc4, 0x56, 0x85, 0x6f, 0x5c, 0x38, 0xfe, 0x44, 0xf0, 0x12, 0xa4, 0xbe,
+ 0xe1, 0x39, 0xa6, 0x14, 0x0c, 0x21, 0xe7, 0xe5, 0xab, 0x11, 0x26, 0x8a, 0x53,
+ 0xec, 0xa3, 0x58, 0x2c, 0x5e, 0xa4, 0xdd, 0x38, 0x52, 0x70, 0x43, 0x5a, 0x41,
+ 0xf2, 0xbd, 0xcd, 0xe7, 0xf3, 0xa9, 0xe2, 0x1a, 0x97, 0x9c, 0x68, 0x44, 0xfa,
+ 0x97, 0xcf, 0xe7, 0x53, 0x3d, 0xdb, 0x53, 0xda, 0x1c, 0x8f, 0xc7, 0xb8, 0x59,
+ 0x2c, 0xf8, 0xd1, 0x46, 0x59, 0x8b, 0x57, 0x6b, 0x82, 0x77, 0x31, 0x29, 0xc0,
+ 0x0b, 0x76, 0x1e, 0x74, 0xb2, 0x74, 0x64, 0x82, 0x25, 0x61, 0x9f, 0x43, 0x26,
+ 0x6c, 0xc2, 0x24, 0xf5, 0x3d, 0x2d, 0xa6, 0xd3, 0x69, 0xaa, 0x07, 0x70, 0x6a,
+ 0xbb, 0x8d, 0x46, 0x83, 0x69, 0x87, 0xac, 0x7f, 0x8b, 0x55, 0x1b, 0xb9, 0xcf,
+ 0x2b, 0x97, 0xc3, 0xb5, 0xc1, 0xea, 0x5f, 0x9c, 0x6a, 0xb4, 0x8f, 0x52, 0xa9,
+ 0x94, 0x8a, 0xdc, 0xa7, 0xb6, 0x79, 0xe3, 0xfb, 0x7e, 0xa2, 0x0d, 0x12, 0xf7,
+ 0x65, 0x38, 0x16, 0x20, 0x8c, 0xa8, 0xf4, 0x0e, 0x01, 0x57, 0x3b, 0x72, 0xb6,
+ 0x97, 0x01, 0x99, 0x93, 0x3c, 0x20, 0x73, 0xee, 0x4f, 0x62, 0xdf, 0x53, 0x42,
+ 0x64, 0x06, 0xff, 0x4a, 0xed, 0x7e, 0x15, 0xb0, 0xfa, 0xa7, 0x28, 0xca, 0xd9,
+ 0xcf, 0x75, 0x6a, 0x9b, 0x37, 0xd1, 0x2b, 0x27, 0xd2, 0x30, 0x26, 0x9c, 0x89,
+ 0xa9, 0x63, 0x0a, 0x47, 0x1d, 0xda, 0x86, 0x7b, 0xeb, 0x1d, 0xa6, 0xd5, 0xa8,
+ 0xe2, 0x84, 0xe1, 0xe5, 0xb7, 0x81, 0x33, 0x61, 0x26, 0xf7, 0x3d, 0x43, 0x86,
+ 0x5d, 0xfc, 0x73, 0xcc, 0x41, 0xcb, 0x9e, 0xe0, 0x8c, 0x47, 0x92, 0x09, 0xe3,
+ 0x55, 0x7c, 0xc0, 0x3b, 0x24, 0x81, 0x62, 0x2a, 0x42, 0xf6, 0x8c, 0x52, 0x53,
+ 0xfe, 0xdf, 0x3e, 0x3c, 0xd3, 0x34, 0x51, 0xad, 0x56, 0x53, 0x1d, 0x93, 0x56,
+ 0x85, 0xc9, 0xb0, 0x47, 0x18, 0x59, 0x96, 0x13, 0x66, 0xda, 0x30, 0xc6, 0x38,
+ 0x17, 0x9b, 0x99, 0xe5, 0x5b, 0x3e, 0x61, 0xfc, 0xa7, 0x65, 0xac, 0xa7, 0x8d,
+ 0x78, 0x04, 0x9e, 0x21, 0xa6, 0xa2, 0xe5, 0x6a, 0x09, 0xa4, 0xe4, 0x08, 0xc3,
+ 0xe4, 0xbe, 0xa7, 0x34, 0xa5, 0x08, 0x89, 0x35, 0x36, 0x59, 0x46, 0xbb, 0x28,
+ 0x0c, 0xc3, 0x88, 0xf5, 0x70, 0x2d, 0x97, 0xcb, 0xbf, 0x82, 0x00, 0xf9, 0x7c,
+ 0x3e, 0xf6, 0x1e, 0x9d, 0x7a, 0xdf, 0xd2, 0x38, 0x50, 0x84, 0x55, 0x32, 0x4d,
+ 0xd3, 0x12, 0xed, 0x8b, 0x83, 0xaf, 0x96, 0xa7, 0x5f, 0xb8, 0xdf, 0x58, 0x22,
+ 0xe8, 0x1c, 0x4a, 0x10, 0xb9, 0x2c, 0x43, 0x51, 0xd3, 0xa5, 0xf4, 0x73, 0x2f,
+ 0x9f, 0xc3, 0xbb, 0xc4, 0xbe, 0x1f, 0x41, 0x98, 0x38, 0x88, 0xc4, 0x3f, 0x58,
+ 0x86, 0x6f, 0x92, 0xd7, 0xe6, 0x6f, 0x00, 0xcb, 0x3d, 0x9e, 0x54, 0xf9, 0x0b,
+ 0x6c, 0x02, 0x8d, 0xb1, 0x93, 0xe1, 0xb9, 0xdb, 0x24, 0x84, 0xe0, 0x46, 0x55,
+ 0xf9, 0xc6, 0x42, 0xe8, 0x7f, 0x1e, 0x7f, 0x27, 0x3e, 0xc3, 0x18, 0x93, 0x43,
+ 0x86, 0xf7, 0xe0, 0x23, 0x78, 0x8d, 0x51, 0xb7, 0x14, 0x80, 0x0c, 0x35, 0x84,
+ 0x47, 0xa4, 0xf4, 0xb3, 0x09, 0xc3, 0x6e, 0x2b, 0xa9, 0xef, 0x69, 0xc1, 0x72,
+ 0x59, 0xbe, 0xbd, 0xbd, 0x25, 0xcd, 0xb0, 0x94, 0x67, 0xd8, 0xb3, 0xdc, 0xd2,
+ 0x51, 0x30, 0xed, 0xbb, 0x13, 0xa6, 0x50, 0x28, 0x1c, 0x3d, 0x21, 0xb0, 0x16,
+ 0x6b, 0x39, 0x65, 0x92, 0x61, 0xb5, 0x69, 0x18, 0x06, 0x6e, 0x92, 0xdc, 0x6c,
+ 0x9f, 0x27, 0x84, 0x2a, 0x56, 0xae, 0x67, 0x79, 0x43, 0x95, 0x70, 0xf6, 0x89,
+ 0x59, 0xce, 0x45, 0xc8, 0x70, 0x49, 0xab, 0x3d, 0x75, 0x6d, 0x23, 0x89, 0x89,
+ 0xb0, 0x24, 0x95, 0x6f, 0x75, 0xce, 0x30, 0xb5, 0x44, 0x38, 0x16, 0xbc, 0xda,
+ 0x95, 0x28, 0x8d, 0x3f, 0xee, 0xfb, 0x24, 0x35, 0xa1, 0x52, 0xa9, 0x48, 0xac,
+ 0x6b, 0x65, 0xb9, 0x8f, 0xbf, 0x22, 0x58, 0xfd, 0x7c, 0x7c, 0x7c, 0x94, 0xe2,
+ 0xbc, 0x57, 0x9e, 0xe7, 0x25, 0x4e, 0x08, 0xbd, 0x5e, 0x8f, 0x35, 0xe8, 0xcf,
+ 0xde, 0x66, 0xaf, 0xd7, 0x93, 0x12, 0x09, 0x23, 0x6a, 0xaf, 0xc4, 0x1e, 0xfb,
+ 0x16, 0xc2, 0xfd, 0xe1, 0xc2, 0x7f, 0x5a, 0xc2, 0xfd, 0x4f, 0x17, 0xde, 0xdd,
+ 0x02, 0x60, 0x4c, 0xa4, 0x4a, 0x55, 0x46, 0xae, 0x9c, 0xdb, 0x22, 0x9a, 0x00,
+ 0x61, 0x12, 0xdd, 0xd6, 0xe1, 0xa1, 0x43, 0xe1, 0x82, 0x84, 0x89, 0x66, 0x21,
+ 0xd6, 0x60, 0x51, 0x14, 0x85, 0x5a, 0x96, 0xb5, 0x93, 0x1d, 0x1b, 0x0d, 0xa2,
+ 0x24, 0x77, 0x67, 0xb3, 0xd9, 0x64, 0x4a, 0x19, 0x45, 0x51, 0x84, 0xea, 0xe5,
+ 0xf7, 0x6a, 0x57, 0x2e, 0x06, 0xd6, 0x7d, 0xed, 0x74, 0x3a, 0xcc, 0x63, 0x5a,
+ 0xad, 0x56, 0xec, 0xf7, 0x2f, 0x2f, 0x2f, 0xcc, 0x63, 0x58, 0xe9, 0xfc, 0xd1,
+ 0x33, 0xb8, 0x44, 0x9b, 0x47, 0x25, 0x5f, 0x8a, 0xd6, 0xa8, 0x08, 0x6f, 0x0a,
+ 0x76, 0x56, 0xce, 0x14, 0x5d, 0x52, 0x56, 0x1d, 0xf2, 0x93, 0x3a, 0xc9, 0x1f,
+ 0x48, 0xbe, 0x64, 0x65, 0x15, 0x23, 0x21, 0x3d, 0x9e, 0x53, 0x12, 0xb0, 0xfd,
+ 0xd0, 0x12, 0x8b, 0xd1, 0x22, 0x42, 0x46, 0x9b, 0x61, 0x18, 0x3b, 0x29, 0xff,
+ 0x7b, 0xc4, 0x12, 0x2e, 0xea, 0x8a, 0x90, 0x22, 0xb1, 0x92, 0x99, 0xc4, 0xb8,
+ 0x7d, 0x8d, 0x31, 0x52, 0x38, 0x76, 0x21, 0xc6, 0x7d, 0xb2, 0xb3, 0xee, 0xc5,
+ 0x7e, 0x56, 0xf6, 0x25, 0xda, 0x04, 0x52, 0xa6, 0xf7, 0xcb, 0xfa, 0x99, 0x5f,
+ 0xbd, 0xb7, 0xdc, 0x6a, 0xff, 0x93, 0x08, 0x2f, 0x56, 0x1e, 0x97, 0xd2, 0xbf,
+ 0x53, 0x4f, 0x63, 0x5e, 0x3f, 0xbd, 0x9f, 0x37, 0xa8, 0xc0, 0xa9, 0xb8, 0x14,
+ 0x21, 0x0c, 0x6f, 0x00, 0x88, 0x6e, 0xd7, 0x22, 0x4c, 0x12, 0xb9, 0x59, 0xc7,
+ 0x89, 0x56, 0x92, 0xb2, 0xb6, 0x38, 0x29, 0x7a, 0xce, 0x36, 0x6f, 0x78, 0x46,
+ 0xd7, 0xc6, 0x7d, 0xd9, 0xdb, 0x35, 0xfc, 0x95, 0xfa, 0xf9, 0x62, 0x1f, 0xc4,
+ 0x51, 0x77, 0x93, 0x33, 0x43, 0x30, 0xd5, 0xb6, 0x83, 0x1b, 0xa1, 0xf2, 0x6d,
+ 0x98, 0x60, 0x14, 0xa6, 0x36, 0x34, 0xcf, 0x65, 0xcb, 0x74, 0xbb, 0xdd, 0x44,
+ 0x35, 0xcb, 0x30, 0x0c, 0xcc, 0x66, 0x33, 0xa6, 0xdd, 0x13, 0x77, 0xfc, 0x6c,
+ 0x36, 0x93, 0x4e, 0x4d, 0xe6, 0xbc, 0x06, 0xc6, 0xe3, 0xb1, 0x74, 0x4c, 0x4a,
+ 0x50, 0x10, 0x04, 0x92, 0x48, 0x82, 0x24, 0x43, 0x0d, 0x94, 0x2a, 0x95, 0x8a,
+ 0x74, 0xc9, 0x36, 0x6f, 0x78, 0x5e, 0x98, 0xcd, 0x09, 0x5f, 0x77, 0xc3, 0xf0,
+ 0x69, 0x96, 0x48, 0xe2, 0xd8, 0xe3, 0x20, 0x3f, 0x55, 0xc8, 0x7b, 0x29, 0xf8,
+ 0xe1, 0x54, 0xcc, 0x2b, 0xb7, 0x4a, 0xe9, 0x67, 0x13, 0x62, 0xf9, 0xfe, 0xc9,
+ 0x5d, 0x94, 0xe3, 0xd4, 0x84, 0xc8, 0x24, 0x3c, 0x3e, 0x3e, 0x4a, 0x41, 0x10,
+ 0x48, 0x96, 0x65, 0xed, 0x78, 0x6c, 0x14, 0x45, 0x41, 0xb9, 0x5c, 0x46, 0xb7,
+ 0xdb, 0xc5, 0x78, 0x3c, 0x3e, 0x2a, 0xe5, 0xff, 0xed, 0xed, 0x4d, 0x72, 0x1c,
+ 0x07, 0xa6, 0x69, 0xa6, 0x7a, 0xf8, 0xe5, 0x72, 0xf9, 0xaa, 0x71, 0x9b, 0xd9,
+ 0x6c, 0x26, 0xa5, 0xb9, 0xc6, 0x6d, 0xb2, 0x75, 0xbb, 0x5d, 0xa1, 0xcc, 0x62,
+ 0x42, 0x08, 0x6c, 0xdb, 0x86, 0xe7, 0x79, 0xd2, 0x35, 0xda, 0x94, 0x80, 0xd5,
+ 0x22, 0x18, 0x0f, 0x0f, 0x0f, 0xfc, 0x46, 0xe6, 0x2a, 0x64, 0xfd, 0xf7, 0xe0,
+ 0xf6, 0x1b, 0xcb, 0x78, 0xd7, 0xb0, 0xd0, 0xd3, 0x03, 0xf4, 0x9f, 0xf1, 0x86,
+ 0xa1, 0x57, 0xf1, 0x85, 0xca, 0x06, 0xd4, 0xae, 0x82, 0x9c, 0xc9, 0x26, 0xae,
+ 0x7b, 0xeb, 0x71, 0x63, 0x39, 0xa3, 0xd1, 0x08, 0x0f, 0x0f, 0x0f, 0x5f, 0x29,
+ 0xe8, 0x47, 0x63, 0x0c, 0x50, 0xbc, 0xbd, 0xbd, 0x25, 0x5e, 0x63, 0x54, 0x87,
+ 0xb3, 0xef, 0x9a, 0x8e, 0x88, 0xfa, 0x15, 0x82, 0x9b, 0x8e, 0xe3, 0xec, 0x78,
+ 0x03, 0x93, 0x56, 0x8c, 0xe1, 0x1d, 0x1b, 0xf5, 0xed, 0x94, 0x7e, 0x9d, 0xdc,
+ 0x66, 0x52, 0x5d, 0xff, 0xa1, 0xf1, 0xaf, 0x1f, 0xf5, 0x62, 0x24, 0xc5, 0x92,
+ 0x39, 0xe5, 0xca, 0xba, 0xf0, 0x6b, 0x31, 0xc8, 0x5c, 0x3d, 0xda, 0xd8, 0xbf,
+ 0x64, 0x3d, 0xff, 0x39, 0x1d, 0x05, 0xd9, 0xfa, 0x69, 0x5f, 0x0f, 0x9b, 0x85,
+ 0xfc, 0x92, 0x2a, 0xe9, 0xc2, 0x8f, 0x70, 0xa5, 0xe6, 0x6c, 0x19, 0x1b, 0xba,
+ 0x47, 0xc4, 0x8b, 0xc3, 0x74, 0x80, 0xf8, 0x04, 0x9a, 0xad, 0x81, 0xbd, 0x96,
+ 0x72, 0x98, 0xb4, 0xcc, 0xf2, 0x6f, 0x95, 0x4c, 0x63, 0x47, 0xf8, 0xbd, 0x27,
+ 0x7e, 0xda, 0xfe, 0xa5, 0xaa, 0x06, 0x4f, 0xb0, 0x79, 0x98, 0xb6, 0x50, 0x36,
+ 0x44, 0xbf, 0x28, 0x61, 0x1a, 0x8d, 0x86, 0x94, 0x14, 0x97, 0x58, 0x98, 0x7b,
+ 0x03, 0x51, 0x01, 0xf4, 0xa5, 0x0e, 0xe5, 0x59, 0x89, 0xaf, 0x6c, 0x54, 0x57,
+ 0xa9, 0x2e, 0x64, 0xa2, 0x42, 0x9f, 0xeb, 0x90, 0x13, 0x02, 0xeb, 0xe1, 0x87,
+ 0x60, 0x56, 0x81, 0x02, 0x26, 0x51, 0xfd, 0xd6, 0x92, 0xab, 0x8a, 0x11, 0x42,
+ 0x2e, 0x3e, 0x10, 0x2d, 0xcb, 0xda, 0x2c, 0x1e, 0xc1, 0x8b, 0x8f, 0x0c, 0x87,
+ 0x43, 0xca, 0x0a, 0x5c, 0x5e, 0x22, 0x46, 0x94, 0xe1, 0x74, 0xec, 0x0c, 0x9c,
+ 0x66, 0xb3, 0x49, 0x79, 0x41, 0x1d, 0x60, 0x15, 0x60, 0xd4, 0xfa, 0xda, 0x45,
+ 0x2e, 0x66, 0xd9, 0x59, 0x62, 0xf1, 0x94, 0x6c, 0x17, 0xa9, 0x7d, 0x15, 0xb9,
+ 0xea, 0xa1, 0x84, 0x09, 0x67, 0x9f, 0xf0, 0x8a, 0x0b, 0xae, 0x94, 0x6a, 0x36,
+ 0x9b, 0x78, 0x79, 0x79, 0xb9, 0x28, 0x61, 0x0c, 0xc3, 0x38, 0xa8, 0x27, 0x27,
+ 0x84, 0xec, 0x90, 0x20, 0x29, 0x45, 0xc3, 0x71, 0x9c, 0x2c, 0xb3, 0xf8, 0xab,
+ 0x13, 0x06, 0x10, 0x7b, 0xdd, 0x85, 0xda, 0x56, 0xce, 0xe3, 0x29, 0xdb, 0x57,
+ 0xa5, 0x4a, 0xbe, 0x50, 0x66, 0x81, 0x4e, 0x63, 0x66, 0xdf, 0x60, 0x5d, 0x84,
+ 0xc6, 0x39, 0xfc, 0x5a, 0xaf, 0xbb, 0x10, 0x49, 0x77, 0xe1, 0xa1, 0xdb, 0xed,
+ 0x5e, 0xbd, 0x4c, 0x38, 0x43, 0x4a, 0x95, 0x2c, 0x82, 0x88, 0x1b, 0x70, 0xf1,
+ 0x14, 0x60, 0xf9, 0xf6, 0x79, 0xd6, 0x0b, 0x09, 0x03, 0xb1, 0x34, 0x1c, 0xd6,
+ 0x2a, 0x36, 0x5e, 0xd1, 0x4b, 0xb4, 0x7f, 0x8e, 0x71, 0x71, 0x1e, 0x83, 0x63,
+ 0x2b, 0x24, 0xd7, 0x5e, 0x2d, 0x29, 0x23, 0xcb, 0x37, 0x92, 0x30, 0xc0, 0x2a,
+ 0x9f, 0x26, 0x29, 0xc3, 0x16, 0x00, 0xd4, 0x91, 0x9a, 0xaa, 0x66, 0x9f, 0x2b,
+ 0x5d, 0xee, 0x3c, 0x84, 0x02, 0x93, 0xf2, 0x81, 0x74, 0x0b, 0x01, 0xcf, 0xf0,
+ 0x11, 0x7e, 0xf0, 0xd9, 0x22, 0xea, 0xa2, 0x3d, 0x27, 0x6c, 0xdb, 0xa6, 0xef,
+ 0xef, 0xef, 0x07, 0x8b, 0x5e, 0xef, 0xab, 0x6a, 0x86, 0x61, 0xa0, 0x5a, 0xad,
+ 0xa6, 0x56, 0xc1, 0xa6, 0xd3, 0x29, 0x9d, 0x4c, 0x26, 0x78, 0x7a, 0x7a, 0x8a,
+ 0x3d, 0xee, 0xf9, 0xf9, 0x99, 0x46, 0x65, 0xd8, 0x86, 0x61, 0xc0, 0xf7, 0x7d,
+ 0x4c, 0x26, 0x13, 0x0c, 0x06, 0x03, 0xa9, 0xdd, 0x6e, 0x53, 0xd7, 0x75, 0xd1,
+ 0xe9, 0x74, 0x76, 0x8e, 0xed, 0xf7, 0xfb, 0x74, 0x32, 0x99, 0x1c, 0x7c, 0x1f,
+ 0x67, 0x7f, 0xad, 0x1d, 0x28, 0xc2, 0xd7, 0x3c, 0x1c, 0x0e, 0x77, 0x54, 0xd5,
+ 0x62, 0xb1, 0x88, 0xc9, 0x64, 0x02, 0x5d, 0xd7, 0xa1, 0x69, 0x1a, 0x3a, 0x9d,
+ 0x4e, 0x62, 0x6c, 0xea, 0x4f, 0x23, 0xb6, 0xe2, 0xb2, 0x5e, 0xaf, 0x1f, 0xac,
+ 0x08, 0x1f, 0x2b, 0x69, 0x1e, 0x16, 0x40, 0x42, 0x3c, 0x44, 0x48, 0xba, 0x8c,
+ 0x3f, 0x85, 0xc8, 0x02, 0xec, 0x05, 0x4d, 0x83, 0x95, 0x64, 0x09, 0x13, 0x4a,
+ 0x1c, 0x08, 0x21, 0xa8, 0xd7, 0xeb, 0x10, 0x99, 0x04, 0xce, 0x89, 0x7d, 0xe7,
+ 0xc2, 0xbe, 0x03, 0xa0, 0x54, 0x2a, 0x49, 0x9e, 0xe7, 0xa1, 0xd7, 0xeb, 0x31,
+ 0x33, 0x64, 0x79, 0x78, 0x7f, 0x7f, 0x47, 0xbb, 0xdd, 0x8e, 0x25, 0x92, 0x69,
+ 0x9a, 0x20, 0x84, 0xa0, 0xd5, 0x6a, 0x49, 0xfd, 0x7e, 0x9f, 0x0e, 0x87, 0x43,
+ 0x3c, 0x3c, 0x3c, 0x6c, 0xea, 0x41, 0x78, 0xb5, 0x40, 0x22, 0xf5, 0x3b, 0xfd,
+ 0x7e, 0x3f, 0xf5, 0xf5, 0xae, 0xc9, 0x45, 0xa3, 0x89, 0x5a, 0xd3, 0x34, 0x1a,
+ 0x91, 0x65, 0xeb, 0x37, 0x7c, 0x3b, 0xc2, 0x94, 0x4a, 0x25, 0xa9, 0xdd, 0x6e,
+ 0xd3, 0xa7, 0xa7, 0xa7, 0x64, 0xf5, 0xec, 0x31, 0x40, 0x38, 0x03, 0x34, 0x3b,
+ 0xc7, 0xaf, 0xad, 0x67, 0x91, 0x65, 0xf6, 0x29, 0xbc, 0x5a, 0x8c, 0xda, 0xfd,
+ 0xed, 0x1a, 0x0b, 0x3f, 0x3e, 0xe1, 0xdd, 0x2f, 0x84, 0xd2, 0x68, 0x2c, 0xcb,
+ 0xfa, 0x12, 0x06, 0xf4, 0xb9, 0xaf, 0xc1, 0xf7, 0x7d, 0xdc, 0xde, 0xde, 0xe2,
+ 0xe9, 0xe9, 0x89, 0xb6, 0x5a, 0x2d, 0x69, 0x6b, 0x26, 0x87, 0xae, 0xeb, 0xa8,
+ 0xd5, 0x6a, 0x12, 0x00, 0xd4, 0x6a, 0x35, 0xc9, 0x71, 0x1c, 0xba, 0xbd, 0x4a,
+ 0x4e, 0x24, 0x6d, 0x22, 0xa9, 0x32, 0x9f, 0xcf, 0x0f, 0xa4, 0x60, 0xbd, 0x5e,
+ 0xa7, 0x71, 0xd9, 0x01, 0x8e, 0xe3, 0xd0, 0x8f, 0x8f, 0x0f, 0x3c, 0x3f, 0x3f,
+ 0xc3, 0x71, 0x1c, 0x5a, 0x2a, 0x95, 0xa4, 0x7e, 0xbf, 0x4f, 0x47, 0xa3, 0x11,
+ 0x00, 0x60, 0x30, 0x18, 0x48, 0xd5, 0x6a, 0x95, 0xe6, 0x72, 0x39, 0xe8, 0xba,
+ 0x7e, 0x20, 0x01, 0x23, 0x29, 0x76, 0x7f, 0x7f, 0x8f, 0xe1, 0x70, 0x78, 0x70,
+ 0xde, 0xe9, 0x74, 0x4a, 0x7b, 0xbd, 0x1e, 0x7c, 0xdf, 0x47, 0xad, 0x56, 0x43,
+ 0x18, 0x86, 0x88, 0xda, 0x06, 0x80, 0xdb, 0xdb, 0x5b, 0x8c, 0xc7, 0xe3, 0xcd,
+ 0xfa, 0x69, 0xc3, 0xe1, 0x10, 0x1f, 0x1f, 0x1f, 0xb0, 0x6d, 0x1b, 0xae, 0xeb,
+ 0x6e, 0xf6, 0x5d, 0x2c, 0x16, 0xb1, 0xfb, 0xac, 0xa5, 0x2f, 0x82, 0x20, 0x80,
+ 0xae, 0xeb, 0x30, 0x4d, 0x13, 0x93, 0xc9, 0x04, 0xae, 0xeb, 0x62, 0xb9, 0x5c,
+ 0xa2, 0xd1, 0x68, 0xa0, 0xd7, 0xeb, 0x41, 0xd3, 0x34, 0xcc, 0xe7, 0x73, 0x0c,
+ 0x06, 0x03, 0x89, 0x69, 0xc3, 0x44, 0x78, 0x7a, 0x7a, 0x92, 0x2c, 0xcb, 0x12,
+ 0xd3, 0xd9, 0x3b, 0x01, 0xdc, 0x9c, 0x87, 0xe5, 0x20, 0x85, 0x5d, 0x13, 0xae,
+ 0xb2, 0x05, 0xbc, 0x3b, 0xc1, 0xa5, 0x8e, 0x14, 0xac, 0x24, 0x59, 0xb8, 0x2a,
+ 0x6d, 0xf6, 0x8a, 0xe2, 0x64, 0x61, 0xa9, 0x2c, 0xdf, 0x19, 0xfd, 0x7e, 0x9f,
+ 0x16, 0x8b, 0x45, 0x94, 0xcb, 0xe5, 0x83, 0xf7, 0xdd, 0x04, 0x41, 0x70, 0xb0,
+ 0x5c, 0xd2, 0xfe, 0xa0, 0xcf, 0xe5, 0x72, 0x70, 0x5d, 0x17, 0x8e, 0xe3, 0x50,
+ 0xdb, 0xb6, 0xf1, 0xf2, 0xf2, 0xb2, 0xc9, 0x51, 0x0b, 0xc3, 0x10, 0xf5, 0x7a,
+ 0x9d, 0x9a, 0xa6, 0x89, 0x52, 0xa9, 0x24, 0x3d, 0x3f, 0x3f, 0xd3, 0x7a, 0xbd,
+ 0xbe, 0xc9, 0xee, 0x1e, 0x8f, 0xc7, 0xb8, 0xbf, 0xbf, 0x8f, 0xd4, 0xdc, 0x48,
+ 0xfd, 0x04, 0x21, 0x04, 0xc5, 0x62, 0x11, 0xfd, 0x7e, 0x9f, 0xba, 0xae, 0xbb,
+ 0x51, 0xb5, 0x58, 0x64, 0xbf, 0xbb, 0xbb, 0x93, 0x82, 0x20, 0x38, 0x58, 0xbd,
+ 0xa7, 0xd1, 0x68, 0x40, 0x51, 0x14, 0xe8, 0xba, 0x8e, 0xe7, 0xe7, 0x67, 0x00,
+ 0xab, 0xf2, 0x88, 0x46, 0xa3, 0x81, 0xc1, 0x60, 0x80, 0xfb, 0xfb, 0x7b, 0xf8,
+ 0xbe, 0xbf, 0x91, 0x96, 0x95, 0x4a, 0x65, 0xe7, 0xff, 0xd9, 0x6c, 0x86, 0xc1,
+ 0x60, 0x20, 0xb1, 0xf6, 0x89, 0xc8, 0x10, 0x2d, 0x4a, 0xe8, 0x79, 0x1e, 0x3a,
+ 0x9d, 0x0e, 0x8a, 0xc5, 0x22, 0x66, 0xb3, 0x19, 0x5c, 0xd7, 0xc5, 0x64, 0x32,
+ 0x81, 0xef, 0xfb, 0xd8, 0xcf, 0x80, 0xe1, 0x2e, 0x82, 0xf1, 0xfa, 0xfa, 0x2a,
+ 0x99, 0xa6, 0x49, 0x85, 0xd4, 0x85, 0x10, 0x58, 0xd4, 0x16, 0x58, 0xd4, 0xb0,
+ 0x8a, 0xbf, 0x68, 0x00, 0x72, 0x32, 0x64, 0x5d, 0xde, 0x91, 0x3c, 0xe1, 0x2c,
+ 0x44, 0xe8, 0x87, 0xc2, 0x25, 0xc8, 0x1b, 0x0f, 0xd7, 0x92, 0x60, 0xf9, 0xf6,
+ 0xb9, 0x8a, 0x05, 0x09, 0xda, 0xd4, 0xa6, 0x69, 0x26, 0x2e, 0xd1, 0xfa, 0x5d,
+ 0x31, 0x1a, 0x8d, 0x36, 0xa4, 0xf0, 0x7d, 0x1f, 0xc3, 0xe1, 0x90, 0x46, 0xf6,
+ 0x84, 0x61, 0x18, 0xa8, 0xd7, 0xeb, 0x98, 0x4e, 0xa7, 0xf4, 0xee, 0xee, 0x8e,
+ 0xdb, 0xff, 0xc5, 0x62, 0xb1, 0x59, 0xd7, 0x20, 0x92, 0x14, 0x11, 0x29, 0xa2,
+ 0xe4, 0xcf, 0x68, 0x40, 0x47, 0x15, 0xaa, 0x1f, 0x1f, 0x1f, 0x1b, 0x52, 0x46,
+ 0x63, 0xa3, 0xd1, 0x68, 0x60, 0x32, 0x99, 0xa0, 0xd7, 0xeb, 0xa1, 0xd5, 0x6a,
+ 0xa1, 0x52, 0xa9, 0x60, 0x3c, 0x1e, 0xc7, 0xda, 0x6e, 0x91, 0xe4, 0x63, 0x61,
+ 0xb9, 0x5c, 0x22, 0x08, 0x02, 0x14, 0x8b, 0x45, 0x54, 0x2a, 0x15, 0xb8, 0xae,
+ 0x0b, 0x59, 0x96, 0xb1, 0xee, 0x0b, 0xbd, 0xbb, 0xbb, 0x93, 0xb6, 0xde, 0xab,
+ 0x83, 0xdb, 0xdb, 0xdb, 0x9d, 0x92, 0xe4, 0xe8, 0x73, 0xf4, 0x77, 0x7f, 0x9f,
+ 0x62, 0xb1, 0x08, 0xdb, 0xb6, 0xa1, 0xeb, 0x3a, 0x1a, 0x8d, 0xc6, 0x46, 0xb2,
+ 0x44, 0x92, 0xa7, 0x52, 0xa9, 0x48, 0xf9, 0x7c, 0x9e, 0x16, 0x8b, 0x45, 0xd4,
+ 0x6a, 0x35, 0x69, 0xfb, 0xde, 0xde, 0x24, 0x3d, 0x98, 0x5e, 0xaf, 0x97, 0x3e,
+ 0x81, 0x6e, 0x01, 0x84, 0xb3, 0x95, 0xd7, 0x2b, 0xe8, 0x04, 0x08, 0x5e, 0x7f,
+ 0x6f, 0xe1, 0x38, 0x3d, 0x59, 0xe4, 0xb2, 0x0c, 0x57, 0xf3, 0x56, 0xef, 0xcf,
+ 0x4c, 0x41, 0x16, 0xde, 0x1a, 0xba, 0xdf, 0x5d, 0xba, 0x84, 0x61, 0x88, 0x4e,
+ 0xa7, 0x23, 0x75, 0x3a, 0x1d, 0xa9, 0x58, 0x2c, 0xa2, 0xd3, 0xe9, 0x60, 0x3a,
+ 0x9d, 0x6e, 0x0c, 0xf1, 0x56, 0xab, 0x05, 0xd3, 0x34, 0x51, 0xaf, 0xd7, 0x37,
+ 0xd2, 0x61, 0x3e, 0x9f, 0x23, 0x0c, 0x43, 0x4c, 0xa7, 0xd3, 0xcd, 0x67, 0x5d,
+ 0xd7, 0x21, 0xcb, 0x32, 0x0c, 0xc3, 0xa0, 0xfd, 0x7e, 0x7f, 0xb3, 0x36, 0x74,
+ 0xbb, 0xdd, 0xc6, 0xeb, 0xeb, 0x2b, 0x9e, 0x9f, 0x9f, 0x69, 0x74, 0x9e, 0x52,
+ 0xa9, 0x24, 0xd5, 0xeb, 0x75, 0x6a, 0x18, 0x06, 0x3a, 0x9d, 0x8e, 0x14, 0xd9,
+ 0x49, 0xf5, 0x7a, 0x9d, 0x46, 0xea, 0x9d, 0x61, 0x18, 0xc8, 0xe5, 0x72, 0x98,
+ 0xcf, 0xe7, 0xd0, 0x34, 0x6d, 0x27, 0xd9, 0x31, 0x72, 0x14, 0x44, 0x7f, 0xa7,
+ 0xd3, 0x29, 0xf5, 0x7d, 0x7f, 0x43, 0xf8, 0x48, 0xdd, 0x6b, 0xb5, 0x5a, 0x18,
+ 0x0e, 0x87, 0x1b, 0x35, 0xc9, 0xf3, 0x3c, 0x84, 0x61, 0xb8, 0xb3, 0x4f, 0x24,
+ 0x19, 0x16, 0x8b, 0x05, 0xc6, 0xe3, 0x31, 0x7c, 0xdf, 0x87, 0xe7, 0x79, 0x9b,
+ 0x7d, 0xa3, 0x7b, 0x11, 0xb7, 0x4f, 0xd4, 0x77, 0xd7, 0x75, 0x61, 0x9a, 0x26,
+ 0x54, 0x55, 0x45, 0xb1, 0x58, 0x44, 0xaf, 0xd7, 0xc3, 0x74, 0x3a, 0x85, 0xe3,
+ 0x38, 0x34, 0x0c, 0x43, 0xcc, 0xe7, 0x73, 0x0c, 0x87, 0x43, 0x5a, 0xab, 0xd5,
+ 0xd2, 0x3f, 0xa4, 0x63, 0x5e, 0xe4, 0xf3, 0xa7, 0x36, 0xde, 0xea, 0xec, 0x19,
+ 0x32, 0x54, 0xab, 0x55, 0x1a, 0x11, 0x4a, 0xd7, 0x75, 0x7a, 0xb1, 0x4a, 0xd4,
+ 0xb4, 0x2f, 0xda, 0xf9, 0x13, 0xdb, 0xa5, 0xdf, 0x2c, 0x96, 0xe1, 0xfb, 0xa3,
+ 0xd9, 0x6c, 0xd2, 0x72, 0xb9, 0x4c, 0xab, 0xd5, 0x2a, 0xad, 0x56, 0xab, 0x97,
+ 0x1d, 0x2f, 0xed, 0x76, 0x3b, 0xd5, 0xbb, 0x02, 0xaf, 0xb5, 0x11, 0x42, 0x68,
+ 0xbb, 0xdd, 0xce, 0xc8, 0x92, 0xe1, 0xeb, 0xc1, 0x71, 0x1c, 0x2a, 0xf2, 0xc2,
+ 0xd3, 0x6b, 0x6d, 0xe5, 0x72, 0x59, 0x68, 0x11, 0x88, 0x0c, 0x19, 0xfe, 0x28,
+ 0x6c, 0xdb, 0xa6, 0xba, 0xae, 0xff, 0x31, 0xa2, 0xe8, 0xba, 0x9e, 0xd5, 0x8c,
+ 0x64, 0xf8, 0x9e, 0x3a, 0xe1, 0x35, 0xd5, 0x34, 0x42, 0x08, 0x6d, 0x36, 0x9b,
+ 0x19, 0x51, 0x32, 0x7c, 0x7f, 0x89, 0x93, 0x54, 0xb9, 0x79, 0xca, 0x56, 0x28,
+ 0x14, 0x32, 0x89, 0x92, 0xe1, 0xef, 0xc3, 0x68, 0x34, 0xa2, 0x96, 0x65, 0x9d,
+ 0x85, 0x3c, 0x85, 0x42, 0x81, 0x5a, 0x96, 0x45, 0x47, 0xa3, 0x51, 0x46, 0x94,
+ 0x0c, 0x7f, 0x1c, 0x57, 0x09, 0xec, 0x45, 0x41, 0xb3, 0x28, 0xb0, 0xb4, 0x58,
+ 0x2c, 0xe0, 0xfb, 0xfe, 0x26, 0xc2, 0x2c, 0xcb, 0x32, 0x34, 0x4d, 0x83, 0xaa,
+ 0xaa, 0x9b, 0x42, 0xab, 0xdb, 0xdb, 0xdb, 0xc4, 0x88, 0x70, 0x86, 0x0c, 0xd7,
+ 0xc6, 0xff, 0x01, 0xee, 0x86, 0x1c, 0x3d, 0xac, 0xfa, 0xbf, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
+};
diff --git a/src/graphics/icon_gentoo.png b/src/graphics/icon_gentoo.png
new file mode 100644
index 0000000..4045f02
--- /dev/null
+++ b/src/graphics/icon_gentoo.png
Binary files differ
diff --git a/src/graphics/icon_gentoo.xpm b/src/graphics/icon_gentoo.xpm
new file mode 100644
index 0000000..f233ee0
--- /dev/null
+++ b/src/graphics/icon_gentoo.xpm
@@ -0,0 +1,187 @@
+/* XPM */
+static char * icon_gentoo_xpm[] = {
+"257 113 71 1",
+" c None",
+". c #080808",
+"+ c #101010",
+"@ c #181818",
+"# c #212121",
+"$ c #292929",
+"% c #313131",
+"& c #393939",
+"* c #424242",
+"= c #525252",
+"- c #5A5A5A",
+"; c #636363",
+"> c #6B6B6B",
+", c #737373",
+"' c #7B7B7B",
+") c #848484",
+"! c #8C8C8C",
+"~ c #949494",
+"{ c #9C9C9C",
+"] c #A5A5A5",
+"^ c #ADADAD",
+"/ c #B5B5B5",
+"( c #BDBDBD",
+"_ c #CECECE",
+": c #D7D7D7",
+"< c #DEDEDE",
+"[ c #082900",
+"} c #083100",
+"| c #105A08",
+"1 c #106308",
+"2 c #106B08",
+"3 c #188C10",
+"4 c #189410",
+"5 c #189C10",
+"6 c #107308",
+"7 c #31FF29",
+"8 c #29EF21",
+"9 c #29F721",
+"0 c #29FF21",
+"a c #21BD18",
+"b c #21C618",
+"c c #21CE18",
+"d c #21D618",
+"e c #21DE18",
+"f c #18A510",
+"g c #083108",
+"h c #29FF29",
+"i c #189C18",
+"j c #106B10",
+"k c #21DE21",
+"l c #18A518",
+"m c #21E721",
+"n c #083908",
+"o c #107310",
+"p c #18AD18",
+"q c #21EF21",
+"r c #107B10",
+"s c #18B518",
+"t c #18BD18",
+"u c #084208",
+"v c #108410",
+"w c #108C10",
+"x c #084A08",
+"y c #085208",
+"z c #085A08",
+"A c #000800",
+"B c #001000",
+"C c #001800",
+"D c #002100",
+"E c #002900",
+"F c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ]'-&#.FF.#&-'] ",
+" /,&FFFFFFFFFFFFFFFF&,/ ",
+" !&FFFFFFFFFFFFFFFFFFFFFF&! ",
+" '#FFFFFFFFFFFFFFFFFFFFFFFFFF#' ",
+" !$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF$! ",
+" (=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF=( ",
+" ~#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF#~ ",
+" <,FFFFFFFFFFFFFFFABDE}}[EDBFFFFFFFFFFFFFFF, ",
+" ;FFFFFFFFFFFFFFzs89000hc2EAFFFFFFFFFFFFFFFF; ",
+" ;FFFFFFFFFFFFua00000hsyFFFFFFFFFFFFFFFFFFFFFF; ",
+" ;FFFFFFFFFFFxk000000bBFFFFFFFFFFFFFFFFFFFFFFFFF; ",
+" ,FFFFFFFFFFCb0000000DFFFFFFFFFFFFFFFFFFFFFFFFFFFF, ",
+" ~FFFFFFFFFF|9000000pAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF~ ",
+" (#FFFFFFFFF300000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF#( ",
+" =FFFFFFFFFf00000001FFFFFFFFFFFB11gFFFFFFFFFFFFFFFFFFF= ",
+" !FFFFFFFFFf0000000|FFFFFFFFFBl9h000hd1FFFFFFFFFFFFFFFFF! ",
+" $FFFFFFFFw00000003FFFFFFFFFuh00000000lFFFFFFFFFFFFFFFFF$ (^!! ",
+" 'FFFFFFFFy0000000pFFFFFFFFF40000000000oFFFFFFFFFyAFFFFFFF' !FFFFF( ",
+" #FFFFFFFB90000009FFFFFFFFFw00000000000EFFFFFFFFFbrFFFFFFF# !FFFFF( ",
+" !FFFFFFFFs0000000CFFFFFFFFz00000000000hFFFFFFFFFF00DFFFFFFF! !FFFFF( ",
+" &FFFFFFF}0000000vFFFFFFFFB9000000000008FFFFFFFFFC00tFFFFFFF& (;#FF+={ !!!!! {=#FFF*, !!!!!{ ,%FF#, !!*FFFFF;!!!{ (,*+FFF*;{ (,*+FFF*;{ ",
+" /FFFFFFFFc000000mFFFFFFFFFc000000000000wFFFFFFFFFn000DFFFFFFF/ =FFFFFFFF% !FFFFF !+FFFFFFFFF! FFFFF* ,FFFFFFF+^ FFFFFFFFFFFF* (#FFFFFFFFFF+! (#FFFFFFFFFF+! ",
+" ,FFFFFFFE0000000yFFFFFFFFn0000000000000CFFFFFFFFF1000pFFFFFFF, %FFFFFFFFFF+#FFFFF ;FFFFFFFFFFFF; FFFFF* ;FFFFFFFFFF FFFFFFFFFFFF* !FFFFFFFFFFFFFF= !FFFFFFFFFFFFFF= ",
+" &FFFFFFF40000008FFFFFFFFFs000000000000|FFFFFFFFFFl0000CFFFFFF& *FFFFFF%!!%FFFFFFFF ,FFFFF+;!%FFFFF! FFFFF*,FFFFFFFFFFF= FFFFFFFFFFFF* !FFFFFF%!!=FFFFFF= !FFFFFF%!!=FFFFFF= ",
+" FFFFFFFF0000000}FFFFFFFFBh00000000000sFFFFFFFFFFFm0000zFFFFFFF {FFFFFF{ ^+FFFFFF (FFFFF+ ;FFFF+ FFFFF+FFF#,,+FFFFFF !FFFFF( FFFFFF! (+FFFFF! FFFFFF! (+FFFFF! ",
+" ]FFFFFFFn000000eFFFFFFFFFa000000000000FFFFFFFFFFFF70000tFFFFFFF] #FFFFF, +FFFFF *FFFFF{ FFFFF! FFFFFFF+{ +FFFFF( !FFFFF( *FFFFF; {FFFFF+ *FFFFF; {FFFFF+ ",
+" 'FFFFFFFr000000yFFFFFFFFA800000000000gFFFFFFFFFFFnh00000FFFFFFF' (FFFFFF *FFFFF FFFFF+ *FFFF= FFFFFF+ ;FFFFF( !FFFFF( FFFFFF #FFFFF'FFFFFF #FFFFF{ ",
+" -FFFFFFFs000000FFFFFFFFFE00000000000rFFFFFFFFFFFFr00000hDFFFFFF- ,FFFFF= *FFFFF ,FFFFF* !FFFF+ FFFFFF{ !FFFFF( !FFFFF( !FFFFF* !FFFFF#FFFFF* !FFFFF* ",
+" &FFFFFFFe000003FFFFFFFFFs0000000000aFFFFFFFFFFFFFa000000yFFFFFF& *FFFFF! *FFFFF *FFFFF! !FFFFF FFFFF% !FFFFF( !FFFFF( *FFFFF! (FFFFFFFFFFF! (FFFFFF ",
+" #FFFFFFF900000uFFFFFFFFF00000000000FFFFFFFFFFFFFFk000000oFFFFFF# +FFFFF( *FFFFF +FFFFFFFFFFFFFFFFFF( FFFFF* !FFFFF( !FFFFF( +FFFFF^ FFFFFFFFFFF^ FFFFFF ",
+" .FFFFFFF00000hFFFFFFFFFE0000000009CFFFFFFFFFFFFFA90000004FFFFFF. FFFFFF( *FFFFF FFFFFFFFFFFFFFFFFFF( FFFFF* !FFFFF( !FFFFF( FFFFFF( FFFFFFFFFFF( FFFFFF( ",
+" FFFFFFFFh0000cFFFFFFFFF|000000000DFFFFCFFFFFFFFFB0000000fFFFFFFF FFFFFF( *FFFFF FFFFFFFFFFFFFFFFFFF( FFFFF* !FFFFF( !FFFFF( FFFFFF( FFFFFFFFFFF( FFFFFF( ",
+" FFFFFFFFh00002FFFFFFFFFr00000000yFFFFArFFFFFFFFFj0000000fFFFFFFF FFFFFF( *FFFFF FFFFFF;(((((((((((( FFFFF* !FFFFF( !FFFFF( FFFFFF( FFFFFFFFFFF( FFFFFF( ",
+" .FFFFFFF00000[FFFFFFFFFl0000000jFFFFFmEFFFFFFFFFb00000004FFFFFF. #FFFFF! *FFFFF *FFFFF= FFFFF* !FFFFF( !FFFFF( %FFFFF! FFFFFFFFFFF! FFFFFF ",
+" #FFFFFFF90000CFFFFFFFFFl000000oFFFFFy7FFFFFFFFFF00000000oFFFFFF# *FFFFF= +FFFFF ,FFFFF+ FFFFF* !FFFFF( !FFFFF( ;FFFFF; {FFFFF.FFFFF; {FFFFF# ",
+" &FFFFFFFe0000CFFFFFFFFF500007xFFFFFB08FFFFFFFFFC00000000yFFFFFF& !FFFFFF %FFFFFF ^FFFFFF{ FFFFF* !FFFFF( !FFFFF( {FFFFF# ;FFFFF&FFFFF# ;FFFFF; ",
+" -FFFFFFFt0000CFFFFFFFFFyh0hcBFFFFFFp03FFFFFFFFFu0000000hDFFFFFF- FFFFFF% %FFFFFFF #FFFFF+ FFFFF* !FFFFF( !FFFFF! +FFFFF{ FFFFFF +FFFFF{ FFFFFF ",
+" 'FFFFFFFr0000CFFFFFFFFFFAjDFFFFFFF|h0uFFFFFFFFF200000000FFFFFFF' *FFFFFF+,!=FFF+FFFFF {FFFFFF+( ^ FFFFF* !FFFFF( ^FFFFF# !FFFFF# =FFFFF* !FFFFF# =FFFFF* ",
+" ]FFFFFFFn0000CFFFFFFFFFFFFFFFFFFFB900DFFFFFFFFFp0000000aFFFFFFF] (FFFFFFFFFFFF=*FFFFF *FFFFFFF%,!!!*%FF( FFFFF* !FFFFF( FFFFFF+,!! %FFFFF#^ *FFFFF+ %FFFFF#^ *FFFFF+ ",
+" FFFFFFFF0000[FFFFFFFFFFFFFFFFFFF8009BFFFFFFFFFm00000001FFFFFFF !FFFFFFFFFF% *FFFFF %FFFFFFFFFFFFFFF( FFFFF* !FFFFF( *FFFFFFFFF( +FFFFFFFFFFFFFFF^ +FFFFFFFFFFFFFFF^ ",
+" &FFFFFFFi0004FFFFFFFFFFFFFFFFFFa0008FFFFFFFFFF70000000CFFFFFF& {+FFFFFFF* *FFFF+ =FFFFFFFFFFFFFF( FFFFF* !FFFFF( %FFFFFFFF( *FFFFFFFFFFFF# *FFFFFFFFFFFF# ",
+" ,FFFFFFF[0000FFFFFFFFFFFFFFFFAe0000aFFFFFFFFFn0000000sFFFFFFF, ,%FF+={ *FFFF* (;FFFFFFFFFF#= FFFFF* !FFFFF( ;FFFFFFF( {*FFFFFFFF#! {*FFFFFFFF#! ",
+" /FFFFFFFFd000oFFFFFFFFFFFFFFD000000yFFFFFFFFF50000000EFFFFFFF/ FFFFF= ({!!!!(( (!!!{ (!!!!( (!!!!( ",
+" &FFFFFFFn000hBFFFFFFFFFFFF6h00000hAFFFFFFFFFd000000aFFFFFFF& (FFFFF! ",
+" !FFFFFFFFs0008BFFFFFFFFFEm00000000FFFFFFFFFF8000000EFFFFFFF! %FFFFF ",
+" #FFFFFFFC0000hvDFFFFCybh00000000bFFFFFFFFFB000000rFFFFFFF# ,#,( ^%FFFFF# ",
+" 'FFFFFFFF|00000000000000000000004FFFFFFFFFl00000cAFFFFFFF' *FFFF#***FFFFFFFF( ",
+" $FFFFFFFF4000000000000000000000uFFFFFFFFF000008AFFFFFFF$ %FFFFFFFFFFFFFFF{ ",
+" !FFFFFFFFFp0000000000000000000qFFFFFFFFFu00000[FFFFFFFF! #FFFFFFFFFFFFF% ",
+" =FFFFFFFFFs000000000000000000}FFFFFFFFF40009nFFFFFFFF= !*+FFFFFF#;( _~ )>>^~- ~> ]> ^^ ^>>>]>~^* ",
+" (#FFFFFFFFF50000000000000000aFFFFFFFFFF0008[FFFFFFFF#( (((( )@ _%] ]-]% ^~ ]% == F )~^ F ",
+" ~FFFFFFFFFFj90000000000000cFFFFFFFFFF500bBFFFFFFFFF~ >*) '- (]% ~- ]'>]% >( ().( ]-- ->~ F]>_') F _>=^]---)*__'*_]--*__'*__=*>_~>-_>)- ",
+" ,FFFFFFFFFFAl00000000009oFFFFFFFFFFB09jFFFFFFFFFF, ]]~% >> ]% ]%(% (]$>_ )>] '_-> %'~]%~^ F]= >> F *''%]$_F_$]__$]]$ $]__$]>>>>^$]$]%>] ",
+" ;FFFFFFFFFFFFC}ujooouEFFFFFFFFFFFF0pBFFFFFFFFFF; ->>@^ ^@_ ]% ]%]$ ]$$' >>( *>>. ]>@~)=* F >> F %>]_]% F %]-)%]]% %]-)%]]%-_]@]^ %] ^ ",
+" ;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFyCFFFFFFFFFFF; ]= =*_ ~%>>]'$_'$_%*])$(.) >) _$>>>-]->) ^F^ _==^F(^@>])$^F(%)**@))$_%)**@)'$%%(=*'($'^. ",
+" ;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; -_ $^ ",
+" ,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, '=-- ",
+" ~#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF#~ ",
+" (=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF=( ",
+" !$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF$! ",
+" '#FFFFFFFFFFFFFFFFFFFFFFFFFF#' ",
+" !&FFFFFFFFFFFFFFFFFFFFFF&! ",
+" /,&FFFFFFFFFFFFFFFF&,/ ",
+" ]'-&#.FF.#&-'] ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/src/graphics/icon_gentoo_small.xpm b/src/graphics/icon_gentoo_small.xpm
new file mode 100644
index 0000000..5d16642
--- /dev/null
+++ b/src/graphics/icon_gentoo_small.xpm
@@ -0,0 +1,155 @@
+/* XPM */
+static const char * icon_gentoo_small_xpm[] = {
+"32 32 120 2",
+" c None",
+". c #000000",
+"+ c #010200",
+"@ c #152208",
+"# c #1E310B",
+"$ c #142108",
+"% c #000100",
+"& c #040601",
+"* c #325213",
+"= c #49761B",
+"- c #6EB329",
+"; c #7FCF30",
+"> c #51831E",
+", c #263E0E",
+"' c #010100",
+") c #020301",
+"! c #121D07",
+"~ c #5E9923",
+"{ c #7BC82E",
+"] c #80D030",
+"^ c #77C12C",
+"/ c #48751B",
+"( c #050902",
+"_ c #253C0E",
+": c #6FB52A",
+"< c #7CC92E",
+"[ c #273F0E",
+"} c #28420F",
+"| c #1A2B0A",
+"1 c #6DB229",
+"2 c #78C32D",
+"3 c #2B4510",
+"4 c #030501",
+"5 c #101A06",
+"6 c #68AA27",
+"7 c #78C22D",
+"8 c #68A927",
+"9 c #1B2B0A",
+"0 c #7DCB2F",
+"a c #385C15",
+"b c #345413",
+"c c #74BD2C",
+"d c #365914",
+"e c #1D300B",
+"f c #0B1304",
+"g c #4D7D1D",
+"h c #080D03",
+"i c #0C1304",
+"j c #77C12D",
+"k c #71B82B",
+"l c #3F6617",
+"m c #67A726",
+"n c #101906",
+"o c #0A1104",
+"p c #629F25",
+"q c #050802",
+"r c #4D7C1D",
+"s c #79C42D",
+"t c #2D4A11",
+"u c #7DCC2F",
+"v c #131F07",
+"w c #619E25",
+"x c #73BB2B",
+"y c #060902",
+"z c #68A827",
+"A c #49771C",
+"B c #030401",
+"C c #162308",
+"D c #4E7F1D",
+"E c #273F0F",
+"F c #63A125",
+"G c #0F1805",
+"H c #172509",
+"I c #335213",
+"J c #436C19",
+"K c #416A19",
+"L c #5F9B24",
+"M c #0F1806",
+"N c #253D0E",
+"O c #5A9222",
+"P c #3A5F16",
+"Q c #0B1204",
+"R c #5C9522",
+"S c #6DB129",
+"T c #416A18",
+"U c #4A781C",
+"V c #385B15",
+"W c #7CCA2F",
+"X c #76C02C",
+"Y c #070C03",
+"Z c #72BA2B",
+"` c #142007",
+" . c #53871F",
+".. c #599021",
+"+. c #040702",
+"@. c #446F1A",
+"#. c #7FCE30",
+"$. c #4B7B1C",
+"%. c #1B2C0A",
+"&. c #47731B",
+"*. c #66A526",
+"=. c #355614",
+"-. c #0C1405",
+";. c #5F9A24",
+">. c #243A0D",
+",. c #72B92B",
+"'. c #23380D",
+"). c #75BE2C",
+"!. c #578D21",
+"~. c #010201",
+"{. c #5C9623",
+"]. c #406718",
+"^. c #5D9723",
+"/. c #70B52A",
+"(. c #6FB42A",
+"_. c #355714",
+":. c #080E03",
+"<. c #192909",
+"[. c #568C20",
+"}. c #192809",
+" . . . . . . ",
+" . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . + @ # # $ % . . . . . . . . . ",
+" . . . . . . & * = - ; > , ' . . . . . . . . . . ",
+" . . . . . ) ! ~ { ] ^ / ( . . . . . . . . . . . . . ",
+" . . . . . . _ : ] ] < [ . . . . } | . . . . . . . . . . ",
+" . . . . ) _ 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 ] ] ] ] g . . . q r { * . . . . ",
+" . . . + = ] ] s 3 . . . t { ] ] ] u v . . . i w ] = + . . . ",
+". . . . @ - ] ] x @ . . y z ] ] ] ] A B . . . C ] ] - @ . . . . ",
+". . . . # ] ] ] D . . . E ] ] ] ] F G . . . . H ] ] ] # . . . . ",
+". . . . # ] ] ] I . . . J ] ] ] F ) . . . . . K ] ] ] # . . . . ",
+". . . . # ] ] ] C . . . L ] ] F M . . . . . . ~ ] ] ] # . . . . ",
+". . . . # ] ] ] C . . . N O P ) . Q R h . . . S ] ] ] # . . . . ",
+". . . . @ - ] ] C . . . . . . . . T ] h . . @ x ] ] - @ . . . . ",
+" . . . + = ] ] U . . . . . . y V W X Y . . 3 s ] ] = + . . . ",
+" . . . . * { ] Z ` . . . . ) .j ] ..+.. . @.] ] { * . . . . ",
+" . . . . & ~ ] #.X $.%.# &.*.] ] ] =.% . -.;.] ] ~ & . . . . ",
+" . . . . . ! : ] ] ] ] ] ] ] ] ] X >.. . @ ,.] : ! . . . . . ",
+" . . . . ) _ 1 ] ] ] ] ] ] ] ] D & . . '.] )._ ) . . . . ",
+" . . . . . . _ : ] ] ] ] ] ] !.~.. . . {.] ].. . . . . . ",
+" . . . . . ) ! ^./././.(._.:.. . . <.[.}.& . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . . . . . ",
+" . . . . . . . . . . . . . . ",
+" . . . . . . "};
diff --git a/src/graphics/icon_mouse0.xpm b/src/graphics/icon_mouse0.xpm
new file mode 100644
index 0000000..61a9c14
--- /dev/null
+++ b/src/graphics/icon_mouse0.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse0_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" .++.++.++. ",
+" .++.++.++. ",
+" .+++.++.+++. ",
+" .+++.++.+++. ",
+" ..++.++.++.. ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/graphics/icon_mouse1.xpm b/src/graphics/icon_mouse1.xpm
new file mode 100644
index 0000000..e4a5d2a
--- /dev/null
+++ b/src/graphics/icon_mouse1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse1_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" ....++.++. ",
+" ....++.++. ",
+" .....++.+++. ",
+" .....++.+++. ",
+" .....++.++.. ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/graphics/icon_mouse2.xpm b/src/graphics/icon_mouse2.xpm
new file mode 100644
index 0000000..df3925c
--- /dev/null
+++ b/src/graphics/icon_mouse2.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse2_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" .++....++. ",
+" .++....++. ",
+" .+++....+++. ",
+" .+++....+++. ",
+" ..++....++.. ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/graphics/icon_mouse3.xpm b/src/graphics/icon_mouse3.xpm
new file mode 100644
index 0000000..f7d3e5b
--- /dev/null
+++ b/src/graphics/icon_mouse3.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse3_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" .++.++.... ",
+" .++.++.... ",
+" .+++.++..... ",
+" .+++.++..... ",
+" ..++.++..... ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/graphics/icon_mouse4.xpm b/src/graphics/icon_mouse4.xpm
new file mode 100644
index 0000000..b473a13
--- /dev/null
+++ b/src/graphics/icon_mouse4.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse4_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" .++....++. ",
+" .++....++. ",
+" .+++....+++. ",
+" .+++.++.+++. ",
+" ..++.++.++.. ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/graphics/icon_mouse5.xpm b/src/graphics/icon_mouse5.xpm
new file mode 100644
index 0000000..7031af2
--- /dev/null
+++ b/src/graphics/icon_mouse5.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * icon_mouse5_xpm[] = {
+"16 16 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ........ ",
+" .++.++.++. ",
+" .++.++.++. ",
+" .+++....+++. ",
+" .+++....+++. ",
+" ..++....++.. ",
+" .+........+. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" ...... ",
+" "};
diff --git a/src/guiutil.c b/src/guiutil.c
new file mode 100644
index 0000000..a239f48
--- /dev/null
+++ b/src/guiutil.c
@@ -0,0 +1,324 @@
+/*
+** 1998-07-12 - Various little helper routines for building/managing GUIs.
+** 1999-03-13 - Adapted for new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include <string.h>
+
+#include "dialog.h"
+#include "guiutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ Dialog *dlg;
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *obj;
+ GtkWidget *bar;
+ gboolean terminate;
+} PBar;
+
+typedef struct
+{
+ GObject *object;
+ gulong handler;
+} SigHandler;
+
+struct GuiHandlerGroup
+{
+ GList *handlers;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-04-26 - Create a button with a "details" icon on it. This is typically a magnifying
+** class. This button is a graphical replacement for a button labeled "...".
+** 2009-04-23 - Happy ten year anniversary, gui_details_button_new()! W00t! Rewritten to use
+** GTK+ 2.0 stock image, GTK_STOCK_FIND is what we use. It used to be a magnifying
+** glass, but in current GTK+ it's a pair of binoculars. Oh well.
+*/
+GtkWidget * gui_details_button_new(void)
+{
+ return gtk_button_new_from_icon_name("edit-find", GTK_ICON_SIZE_MENU);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2011-07-24 - Build a regular entry widget, for use in a dialog (so with default-handling). */
+GtkWidget * gui_dialog_entry_new(void)
+{
+ GtkWidget *ent;
+
+ ent = gtk_entry_new();
+ gtk_entry_set_activates_default(GTK_ENTRY(ent), TRUE);
+
+ return ent;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-30 - Build a group of radio buttons with the given labels.
+** 1999-05-15 - Now also sets the GTK+ object user data to the index of each button.
+*/
+GSList * gui_radio_group_new(guint num, const gchar **label, GtkWidget *but[])
+{
+ GSList *list = NULL;
+ guint i;
+
+ for(i = 0; i < num; i++)
+ {
+ but[i] = gtk_radio_button_new_with_label(list, _(label[i]));
+ list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(but[i]));
+ g_object_set_data(G_OBJECT(but[i]), "user", GUINT_TO_POINTER(i));
+ }
+ return list;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-05 - This gets called by the dialog module if the user hits the button. */
+static void callback_done(gint button, gpointer user)
+{
+ PBar *pbar = user;
+
+ pbar->terminate = TRUE;
+}
+
+/* 1998-09-05 - Initialize a user-abortable progress "session". Opens up a dialog window
+** with the given <body> text and <button>, as well as a progress bar widget
+** and a "current object name" indicator (a bare label).
+** Returns an "anchor"; a pointer to some private data. You use this pointer
+** in later calls to identify the session. Progress sessions don't nest!
+** Use calls to gui_progress_update() to make the bar move, and also to learn
+** about any button actions.
+*/
+gpointer gui_progress_begin(const gchar *body, const gchar *button)
+{
+ static PBar pbar;
+
+ pbar.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ pbar.label = gtk_label_new(body);
+ gtk_box_pack_start(GTK_BOX(pbar.vbox), pbar.label, TRUE, TRUE, 0);
+ pbar.obj = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(pbar.vbox), pbar.obj, TRUE, TRUE, 0);
+ pbar.bar = gtk_progress_bar_new();
+ gtk_box_pack_start(GTK_BOX(pbar.vbox), pbar.bar, TRUE, TRUE, 5);
+ pbar.terminate = FALSE;
+
+ pbar.dlg = dlg_dialog_async_new(pbar.vbox, _("Progress"), button, callback_done, &pbar);
+
+ return &pbar;
+}
+
+/* 1998-09-05 - Update the progress bar to a new value (which should be between 0.0 and 1.0).
+** Also allows you to change the indication of the current object.
+** Returns TRUE if the user has hit the button in the window, typically indicating
+** that the entire operation should be aborted ASAP.
+*/
+gboolean gui_progress_update(gpointer anchor, gfloat value, const gchar *obj)
+{
+ PBar *pbar = anchor;
+
+ if(!pbar->terminate)
+ {
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar->bar), value);
+ if((obj != NULL) && (pbar->obj != NULL))
+ gtk_label_set_text(GTK_LABEL(pbar->obj), obj);
+ gui_events_flush();
+ }
+ return pbar->terminate;
+}
+
+/* 1998-09-05 - Close down the progress session, since the time-consuming operation has been
+** finished.
+*/
+void gui_progress_end(gpointer anchor)
+{
+ PBar *pbar = anchor;
+
+ if(!pbar->terminate)
+ dlg_dialog_async_close(pbar->dlg, -1);
+ memset(pbar, 0, sizeof *pbar); /* Makes sure we notice any foul play. */
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-06-22 - Just a utility function to help the config modules to their thing. This one
+** builds a menu from a NULL-terminated vector of item texts. Very simple, but
+** also very useful. Like so many other good things. :) Each menu item will
+** have the given <func> connected to it, which will be called with <data> as
+** the user data (as usual). Also, to make it possible for the callback to
+** determine which item was selected, each item will have its index (from 0)
+** set as object's user data. Not pretty, but still simple and useful.
+*/
+GtkWidget * gui_build_menu(const gchar *text[], GCallback func, gpointer user)
+{
+ GtkWidget *menu, *item;
+ guint i;
+
+ menu = gtk_menu_new();
+ for(i = 0; text[i] != NULL; i++)
+ {
+ item = gtk_menu_item_new_with_label(_(text[i]));
+ if(func != NULL)
+ {
+ g_object_set_data(G_OBJECT(item), "user", GUINT_TO_POINTER(i));
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(func), user);
+ }
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+ }
+ return menu;
+}
+
+
+/* 2010-05-10 - Trampoline for the gui_build_combo_box()-constructed widgets. Computes the
+** index that was selected, and hands that to the user-supplied callback.
+*/
+static void evt_combo_changed(GtkWidget *wid, gpointer user)
+{
+ const gint item = gtk_combo_box_get_active(GTK_COMBO_BOX(wid));
+
+ if(item >= 0)
+ {
+ GCallback func = g_object_get_data(G_OBJECT(wid), "callback");
+
+ if(func != NULL)
+ ((void(*)(GtkWidget*, guint, gpointer))func)(wid, item, user);
+ }
+}
+
+/* 2010-05-09 - Merry birthday, me! :D This is a replacement for the old gui_build_menu().
+** It builds a text-based GtkComboBox, and calls the given function like so:
+** void callback(GtkWidget *combo, guint index, gpointer user);
+** Simple, and friendly.
+*/
+GtkWidget * gui_build_combo_box(const gchar *text[], GCallback func, gpointer user)
+{
+ GtkWidget *cbox;
+ gulong handler;
+
+ cbox = gtk_combo_box_text_new();
+ g_object_set_data(G_OBJECT(cbox), "callback", func);
+ for(; *text != NULL; text++)
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbox), _(*text));
+ handler = g_signal_connect(G_OBJECT(cbox), "changed", G_CALLBACK(evt_combo_changed), user);
+ g_object_set_data(G_OBJECT(cbox), "handler", GINT_TO_POINTER(handler));
+
+ return cbox;
+}
+
+/* 2010-11-02 - Block the signal handler. Since it's a bit encapsulated, a function here is needed. */
+void gui_combo_box_set_blocked(GtkWidget *widget, gboolean blocked)
+{
+ const gulong handler = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "handler"));
+
+ if(blocked)
+ g_signal_handler_block(G_OBJECT(widget), handler);
+ else
+ g_signal_handler_unblock(G_OBJECT(widget), handler);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+GuiHandlerGroup * gui_handler_group_new(void)
+{
+ GuiHandlerGroup *g;
+
+ g = g_slice_new(GuiHandlerGroup);
+ if(g != NULL)
+ {
+ g->handlers = NULL;
+ }
+ return g;
+}
+
+gulong gui_handler_group_connect(GuiHandlerGroup *g, GObject *obj, const gchar *signal, GCallback cb, gpointer user)
+{
+ SigHandler *sh;
+
+ if(g == NULL || obj == NULL || signal == NULL || cb == NULL)
+ return 0ul;
+
+ if((sh = g_slice_new(SigHandler)) == NULL)
+ return 0ul;
+ sh->object = obj;
+ sh->handler = g_signal_connect(obj, signal, cb, user);
+ /* Prepend, for O(1) performance; order doesn't really matter. */
+ g->handlers = g_list_prepend(g->handlers, sh);
+
+ /* Return handler ID, if user code wants to play with it. */
+ return sh->handler;
+}
+
+void gui_handler_group_block(const GuiHandlerGroup *g)
+{
+ const GList *iter;
+
+ if(g == NULL)
+ return;
+ for(iter = g->handlers; iter != NULL; iter = g_list_next(iter))
+ {
+ const SigHandler *sh = iter->data;
+ g_signal_handler_block(sh->object, sh->handler);
+ }
+}
+
+void gui_handler_group_unblock(const GuiHandlerGroup *g)
+{
+ const GList *iter;
+
+ if(g == NULL)
+ return;
+ for(iter = g->handlers; iter != NULL; iter = g_list_next(iter))
+ {
+ const SigHandler *sh = iter->data;
+ g_signal_handler_unblock(sh->object, sh->handler);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void gui_set_main_title(MainInfo *min, const gchar *title)
+{
+ gchar buf[256];
+
+ if(title != NULL && *title != '\0')
+ {
+ g_snprintf(buf, sizeof buf, "gentoo - %s", title);
+ win_window_set_title(min->gui->window, buf);
+ }
+ else
+ win_window_set_title(min->gui->window, "gentoo");
+}
+
+/* 2013-06-15 - Converts a modern RGBA color to an old-school one. */
+void gui_color_from_rgba(GdkColor *color, const GdkRGBA *rgba)
+{
+ color->red = 65535.0f * rgba->red;
+ color->green = 65535.0f * rgba->green;
+ color->blue = 65535.0f * rgba->blue;
+ color->pixel = 0;
+}
+
+void gui_rgba_from_color(GdkRGBA *rgba, const GdkColor *color)
+{
+ rgba->red = color->red / 65535.;
+ rgba->green = color->green / 65535.;
+ rgba->blue = color->blue / 65535.;
+ rgba->alpha = 1.0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-07-04 - Flush pending GTK+ events.
+** 2010-03-04 - Comments trimmed, legacy code removed. Just the events, thanks.
+*/
+void gui_events_flush(void)
+{
+ while(gtk_events_pending())
+ gtk_main_iteration();
+}
diff --git a/src/guiutil.h b/src/guiutil.h
new file mode 100644
index 0000000..5984f46
--- /dev/null
+++ b/src/guiutil.h
@@ -0,0 +1,29 @@
+/*
+** 1998-07-12 - Header for the new GUI utility module, that implements a few utility
+** functions which are handy when building various kinds of GUIs.
+*/
+
+extern GtkWidget * gui_details_button_new(void);
+extern GtkWidget * gui_dialog_entry_new(void);
+extern GSList * gui_radio_group_new(guint num, const gchar **label, GtkWidget *but[]);
+
+extern gpointer gui_progress_begin(const gchar *body, const gchar *button);
+extern gboolean gui_progress_update(gpointer anchor, gfloat value, const gchar *obj);
+extern void gui_progress_end(gpointer anchor);
+
+extern GtkWidget * gui_build_menu(const gchar *text[], GCallback func, gpointer data);
+extern GtkWidget * gui_build_combo_box(const gchar *text[], GCallback func, gpointer user);
+extern void gui_combo_box_set_blocked(GtkWidget *widget, gboolean blocked);
+
+typedef struct GuiHandlerGroup GuiHandlerGroup;
+
+extern GuiHandlerGroup* gui_handler_group_new(void);
+extern gulong gui_handler_group_connect(GuiHandlerGroup *g, GObject *obj, const gchar *signal, GCallback cb, gpointer user);
+extern void gui_handler_group_block(const GuiHandlerGroup *g);
+extern void gui_handler_group_unblock(const GuiHandlerGroup *g);
+
+extern void gui_set_main_title(MainInfo *min, const gchar *title);
+extern void gui_color_from_rgba(GdkColor *color, const GdkRGBA *rgba);
+extern void gui_rgba_from_color(GdkRGBA *rgba, const GdkColor *color);
+
+extern void gui_events_flush(void);
diff --git a/src/hash_dialog.c b/src/hash_dialog.c
new file mode 100644
index 0000000..37e7f4c
--- /dev/null
+++ b/src/hash_dialog.c
@@ -0,0 +1,102 @@
+/*
+** 1998-07-13 - A more or less general helper module. Uses the dialog module to provide
+** a clist showing the contents of a hash table. Very useful for selecting
+** a command (native or user); originally written for the cfg_buttons module.
+** 1998-08-01 - Discovered (and fixed) a weird bug; the clist's selection event handler was
+** being called as the list was being populated, which caused a read-out of
+** row data not yet installed. Seg-fault. Can't understand why it just popped
+** up today... Fixed it with an ugly little flag (open).
+** 1998-08-04 - Now handles immediate closing, without user clicking in list first. :)
+** 1999-03-13 - Adapted for new dialog module, and generally touched up a little.
+** 1999-06-19 - Changes due to rewritten dialog support module (again). Also changed the
+** semantics: this is now a synchronous dialog.
+** 2008-07-28 - Rewritten to use GtkTreeView and friends rather than GtkCList, which is
+** deprecated in GTK+ 2.0. Feel the future.
+*/
+
+#include "gentoo.h"
+#include "dialog.h"
+#include "hash_dialog.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ Dialog *dlg;
+ GtkListStore *model;
+ GtkWidget *view;
+} HDlgInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-07-28 - This gets called when the user double-clicks a row. Close the dialog. */
+static void evt_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user)
+{
+ HDlgInfo *hdl = user;
+
+ dlg_dialog_sync_close(hdl->dlg, 0);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-07-28 - This is a g_hash_table_foreach() callback, that populates a list store. */
+static void populate_model(gpointer key, gpointer value, gpointer user)
+{
+ GtkListStore *store = user;
+ GtkTreeIter iter;
+
+ /* FIXME: Here, we assume that the KEY is a string. */
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, key, 1, value, 2, key, -1);
+}
+
+/* 1999-06-19 - Main has dialog entry point. */
+const gchar * hdl_dialog_sync_new_wait(GHashTable *hash, const gchar *title)
+{
+ static HDlgInfo hdl;
+ GtkWidget *scwin;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreeModel *sm;
+
+ /* Throw each hashed object (value) into the list store. Our store has
+ * three columns: one is a pointer to each KEY in the given hash, the
+ * next is the key's VALUE, and the third is a string made from the two.
+ * Currently, we assume that the KEY is also a string.
+ */
+ hdl.model = gtk_list_store_new(3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_STRING);
+ g_hash_table_foreach(hash, populate_model, hdl.model);
+
+ /* Now, wrap the list model in a sortable model, and sort on that string column. */
+ sm = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(hdl.model));
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(sm), 2, GTK_SORT_ASCENDING);
+
+ hdl.view = gtk_tree_view_new_with_model(sm);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(title)", cr, "text", 2, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(hdl.view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(hdl.view), FALSE);
+ g_signal_connect(G_OBJECT(hdl.view), "row_activated", G_CALLBACK(evt_row_activated), &hdl);
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), hdl.view);
+
+ hdl.dlg = dlg_dialog_sync_new(scwin, title, NULL);
+ gtk_window_set_default_size(GTK_WINDOW(dlg_dialog_get_dialog(hdl.dlg)), 320, 544);
+ if(dlg_dialog_sync_wait(hdl.dlg) == DLG_POSITIVE)
+ {
+ GtkTreeSelection *sel;
+ GtkTreeIter iter;
+
+ /* Fish out the selection, and the selected row. */
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(hdl.view));
+ if(gtk_tree_selection_get_selected(sel, NULL, &iter))
+ {
+ gchar *str;
+
+ /* We have a string column, and need to return a string. Guess the next step. */
+ gtk_tree_model_get(sm, &iter, 2, &str, -1);
+ return str;
+ }
+ }
+ return NULL;
+}
diff --git a/src/hash_dialog.h b/src/hash_dialog.h
new file mode 100644
index 0000000..a46247c
--- /dev/null
+++ b/src/hash_dialog.h
@@ -0,0 +1,5 @@
+/*
+** 1999-06-19 - New header for the rewritten hash dialog module. Now synchronous.
+*/
+
+extern const gchar * hdl_dialog_sync_new_wait(GHashTable *hash, const gchar *title);
diff --git a/src/icon_dialog.c b/src/icon_dialog.c
new file mode 100644
index 0000000..4c67bae
--- /dev/null
+++ b/src/icon_dialog.c
@@ -0,0 +1,133 @@
+/*
+** 1999-05-24 - Broke this functionality out from the style configuration module since, er,
+** I felt like it. Rewrote it in the process, too. :) Uses the sligtly more
+** modern dialog module interface, thus returns directly the name of the icon
+** that was selected (or NULL if user cancels).
+** 1999-06-19 - Changes for the new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include "iconutil.h"
+#include "guiutil.h"
+#include "strutil.h"
+
+#include "dialog.h"
+#include "icon_dialog.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Column indices in our list model. */
+enum {
+ COLUMN_ICON = 0,
+ COLUMN_NAME
+};
+
+/* 2008-07-29 - User double-clicked a row in the tree. Close the dialog. */
+static void evt_row_activated(GtkWidget *wid, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user)
+{
+ Dialog *dlg = user;
+
+ dlg_dialog_sync_close(dlg, 0);
+}
+
+const gchar * idl_dialog_sync_new_wait(MainInfo *min, const gchar *path, const gchar *title, const gchar *current, gboolean show_progress)
+{
+ static gchar retsel[1024];
+ GList *icons, *here;
+ gboolean terminate = FALSE;
+ gpointer progress = NULL;
+ guint position, length;
+ GtkWidget *scwin;
+ GtkListStore *store;
+ GtkWidget *view;
+ GdkPixbuf *pixbuf;
+ GtkTreeIter iter, *sel = NULL;
+ gchar *selected = NULL;
+
+ if(min == NULL)
+ return NULL;
+
+ if(title == NULL)
+ title = _("Pick Icon");
+
+ if((icons = ico_get_all(min, path)) == NULL)
+ return NULL;
+
+ if(show_progress)
+ {
+ progress = gui_progress_begin(_("Loading Icon Graphics..."), _("Cancel"));
+ length = g_list_length(icons);
+ }
+
+ /* Build a list model, to have somewhere to store the icons. */
+ store = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
+
+ /* Load all icons. */
+ for(here = icons, position = 0U; here != NULL; here = g_list_next(here), position++)
+ {
+ if(progress != NULL)
+ {
+ if((terminate = gui_progress_update(progress, (gfloat) position / length, (gchar *) here->data)))
+ break;
+ }
+ if(ico_no_icon(here->data))
+ continue;
+ pixbuf = ico_icon_get_pixbuf(min, here->data);
+ /* FIXME: Because of the way the icon-loader does caching, and how non-pixbuf loading
+ * of an icon might already have been done, thus populating the cache with a non-pixbuf
+ * entry, this doesn't filter for a NULL pixbuf. It's better to include all icons in
+ * the list, for now. This will hopefully solve itself once panes go GtkTreeView.
+ */
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, pixbuf, 1, here->data, -1);
+ if((current != NULL) && (strcmp(current, here->data) == 0) && sel == NULL)
+ sel = gtk_tree_iter_copy(&iter);
+ }
+ if(progress != NULL)
+ gui_progress_end(progress);
+
+ if(!terminate)
+ {
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreeSelection *ts;
+ GtkTreeIter seliter;
+ Dialog *dlg;
+
+ view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+ cr = gtk_cell_renderer_pixbuf_new();
+ vc = gtk_tree_view_column_new_with_attributes("(title)", cr, "pixbuf", COLUMN_ICON, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(title)", cr, "text", COLUMN_NAME, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+ ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+
+ if(sel != NULL && ts != NULL)
+ {
+ gtk_tree_selection_select_iter(ts, sel);
+ gtk_tree_iter_free(sel);
+ sel = NULL;
+ }
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), view);
+
+ dlg = dlg_dialog_sync_new(scwin, title, NULL);
+ gtk_window_set_default_size(GTK_WINDOW(dlg_dialog_get_dialog(dlg)), 320, 544);
+ g_signal_connect(G_OBJECT(view), "row_activated", G_CALLBACK(evt_row_activated), dlg);
+
+ if(dlg_dialog_sync_wait(dlg) != DLG_POSITIVE)
+ terminate = TRUE;
+ if(gtk_tree_selection_get_selected(ts, NULL, &seliter))
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &seliter, COLUMN_NAME, &selected, -1);
+ dlg_dialog_sync_destroy(dlg);
+ g_snprintf(retsel, sizeof retsel, "%s", selected);
+ g_free(selected);
+ }
+ ico_free_all(icons);
+
+ return terminate ? NULL : retsel;
+}
diff --git a/src/icon_dialog.h b/src/icon_dialog.h
new file mode 100644
index 0000000..6bbad80
--- /dev/null
+++ b/src/icon_dialog.h
@@ -0,0 +1,6 @@
+/*
+** 1999-05-24 - Another highly specialized dialog module.
+*/
+
+extern const gchar * idl_dialog_sync_new_wait(MainInfo *min, const gchar *path,
+ const gchar *title, const gchar *current, gboolean show_progress);
diff --git a/src/iconutil.c b/src/iconutil.c
new file mode 100644
index 0000000..a65be66
--- /dev/null
+++ b/src/iconutil.c
@@ -0,0 +1,196 @@
+/*
+** 1998-08-15 - A small utility module that deals with icons. Serves two main purposes:
+** 1) Provides name-to-pixmap lookups, and thus a form of caching, and
+** 2) Allows the search paths used to locate icon pixmaps to be abstracted
+** somewhat. Nice.
+** This module is mainly used by e.g. dpformat, when it needs to render
+** icon pixmaps.
+** 1998-08-30 - Added function to seek out all icons in a path. Also added a built-in
+** inline pixmap which is used when a named pixmap can't be found.
+** 1999-08-28 - Started using the gdk_pixmap_colormap_create_from_xpm_d() function (whose
+** name really kind of rolls off your tongue, doesn't it?). Simplified things.
+** 1999-11-21 - Rewrote the ico_flush() function, to use g_hash_table_foreach_remove(),
+** which made it a lot shorter and cleaner. Good.
+** 2010-02-22 - Time flies. Removed old-style pixmap+mask representations, now always uses
+** the more 2.0-y GdkPixbufs all over the place.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "fileutil.h"
+#include "strutil.h"
+#include "iconutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* This name is reserved to mean "a blank icon". It is very easy
+** to think of it as specifying that NO icon should be shown.
+*/
+#define ICON_NONE _("(None)")
+
+#include "graphics/icon_empty.xpm"
+#include "graphics/icon_failed.xpm"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct IconInfo {
+ GHashTable *icon; /* Provides name-to-pixmap lookup. */
+ const gchar *path; /* A local copy of the PTID_ICONS path. */
+ GdkPixbuf *empty;
+ GdkPixbuf *fail;
+};
+
+typedef struct {
+ gchar name[PATH_MAX]; /* This is real big. */
+ GdkPixbuf *pixbuf;
+} IconGfx;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-15 - IconGfx comparison function for hash table. */
+static gint cmp_icon(gconstpointer a, gconstpointer b)
+{
+ return strcmp(((const IconGfx *) a)->name, ((const IconGfx *) b)->name) == 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-31 - Initialize icon utility module. */
+IconInfo * ico_initialize(MainInfo *min)
+{
+ IconInfo *ico;
+
+ ico = g_malloc(sizeof *ico);
+
+ ico->icon = g_hash_table_new(g_str_hash, cmp_icon);
+
+ ico->empty = gdk_pixbuf_new_from_xpm_data((const char **) icon_empty_xpm);
+ ico->fail = gdk_pixbuf_new_from_xpm_data((const char **) icon_failed_xpm);
+
+ ico->path = min->cfg.path.path[PTID_ICON]->str;
+
+ return ico;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-30 - Filter out stuff not ending in ".xpm".
+** 1998-09-02 - Eased up the implementation, using the string utility module. I like one-liners.
+*/
+static gboolean icon_filter(const gchar *path, const gchar *name)
+{
+ return g_str_has_suffix(name, ".xpm") || g_str_has_suffix(name, ".png");
+}
+
+/* 1998-08-30 - This returns a (possibly giant) list of all icon names in the given
+** icon <path>. If <path> is NULL, the current icon path (PTID_ICON) is used.
+** All path components are scanned for files ending in ".xpm"; these are assumed
+** to be icon pixmaps. The returned list has each element's <data> pointer pointing
+** at a dynamically allocated string which is the icon name. This memory tied up
+** by these strings is reclaimed by calling ico_free_all() on the list once you're
+** done with it.
+*/
+GList * ico_get_all(MainInfo *min, const gchar *path)
+{
+ GList *list = NULL;
+ gchar *head;
+
+ if(path == NULL)
+ path = min->cfg.path.path[PTID_ICON]->str;
+
+ if(path != NULL)
+ {
+ list = fut_scan_path(path, icon_filter);
+ if((head = g_strdup(ICON_NONE)) != NULL)
+ list = g_list_prepend(list, head);
+ }
+ return list;
+}
+
+gboolean ico_no_icon(const gchar *name)
+{
+ return strcmp(name, ICON_NONE) == 0;
+}
+
+/* 1998-08-30 - Free a list of icon names as returned by ico_get_all() above. */
+void ico_free_all(GList *list)
+{
+ if(list != NULL)
+ fut_free_path(list);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static IconGfx * load_pixbuf(IconInfo *ico, const gchar *name)
+{
+ const gchar *fname;
+ IconGfx *ig;
+
+ ig = g_malloc(sizeof *ig);
+ g_strlcpy(ig->name, name, sizeof ig->name);
+ if(strcmp(name, ICON_NONE) == 0) /* Is it the special, reserved, blank icon? */
+ {
+ ig->pixbuf = ico->empty;
+ return ig;
+ }
+ if((fname = fut_locate(ico->path, name)) != NULL)
+ {
+ if((ig->pixbuf = gdk_pixbuf_new_from_file(fname, NULL)) != NULL)
+ return ig;
+ }
+ return NULL;
+}
+
+static GdkPixbuf * get_or_load_pixbuf(IconInfo *ico, const gchar *name)
+{
+ IconGfx *ig;
+
+ if(ico->icon == NULL)
+ ico->icon = g_hash_table_new(g_str_hash, cmp_icon);
+ if((ig = g_hash_table_lookup(ico->icon, name)) != NULL)
+ return ig->pixbuf;
+ if((ig = load_pixbuf(ico, name)) != NULL)
+ {
+ g_hash_table_insert(ico->icon, ig->name, ig);
+ return ig->pixbuf;
+ }
+ return ico->fail;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2008-07-29 - New interface, this returns a GDK Pixbuf which is far more useful in these
+ * times of GTK+ 2 than the old GdkPixmap/GdkBitmap combo.
+*/
+GdkPixbuf * ico_icon_get_pixbuf(MainInfo *min, const gchar *name)
+{
+ if(min == NULL || name == NULL || *name == '\0')
+ return NULL;
+ min->ico->path = min->cfg.path.path[PTID_ICON]->str;
+
+ return get_or_load_pixbuf(min->ico, name);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-11-21 - Kill given icon. This is a g_hash_table_foreach_remove() callback.
+** 2001-01-01 - Happy new year! :) Um, now frees the memory, too...
+*/
+static gboolean kill_icon(gpointer key, gpointer value, gpointer user)
+{
+ IconGfx *gfx = value;
+
+ g_object_unref(gfx->pixbuf);
+ g_free(gfx);
+
+ return TRUE; /* Tells glib to actually remove hash entry. */
+}
+
+/* 1998-09-02 - Flush all loaded icons out, thus making the next reference a load for sure. */
+void ico_flush(MainInfo *min)
+{
+ if(min->ico->icon != NULL)
+ g_hash_table_foreach_remove(min->ico->icon, kill_icon, NULL);
+}
diff --git a/src/iconutil.h b/src/iconutil.h
new file mode 100644
index 0000000..a6422bf
--- /dev/null
+++ b/src/iconutil.h
@@ -0,0 +1,20 @@
+/*
+** 1998-08-15 - Header for the icon utility module.
+*/
+
+#if !defined ICONUTIL_H
+#define ICONUTIL_H
+
+typedef struct IconInfo IconInfo;
+
+extern IconInfo * ico_initialize(MainInfo *min);
+
+extern GList * ico_get_all(MainInfo *min, const gchar *path);
+extern gboolean ico_no_icon(const gchar *name);
+extern void ico_free_all(GList *list);
+
+extern GdkPixbuf * ico_icon_get_pixbuf(MainInfo *min, const gchar *name);
+
+extern void ico_flush(MainInfo *min);
+
+#endif /* ICONUTIL_H */
diff --git a/src/keyboard.c b/src/keyboard.c
new file mode 100644
index 0000000..434bd15
--- /dev/null
+++ b/src/keyboard.c
@@ -0,0 +1,313 @@
+/*
+** 1999-03-10 - Yay, it's a keyboard accelerator support module! I guess this should've been
+** written months ago, but it's not until now that GTK+'s keyboard support seems
+** to have developed enough for me to actually use it. :^) Oh, and then I'm evil
+** enough to actually go around it. I must be insane. But because I want the ability
+** to keyboard-accelerate stuff that isn't GTK+ objects, I'll do this my way.
+** 2000-02-09 - Added support for a context-wide mask of modifiers to be ignored. Very handy for
+** e.g. masking out that pesky NumLock key.
+*/
+
+#include "gentoo.h"
+
+#include <stdarg.h>
+
+#include "cmdseq.h"
+
+#include "keyboard.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GdkEventFunc func; /* GdkEvent function handler to call. */
+ gpointer user; /* User data to pass along in call. */
+} KEGdkEvent;
+
+typedef struct {
+ GObject *obj; /* Which object to signal. */
+ gchar *signame; /* Name of signal to emit. */
+ gpointer user; /* User data passed along signal emission. */
+} KEObject;
+
+typedef struct {
+ gchar *cmdseq; /* Name of command sequence to run. */
+} KECmdSeq;
+
+typedef struct {
+ gchar *key; /* The key that activates it. */
+ KEType type; /* Type of accelerator; GTK+ object, gentoo command, etc. */
+ union {
+ KEGdkEvent gdkevent;
+ KEObject object;
+ KECmdSeq cmdseq;
+ } entry;
+} KbdEntry;
+
+struct KbdContext {
+ MainInfo *min; /* A link to the ever-present core info structure. */
+ GHashTable *hash; /* A hash of KbdEntries, hashed on key names. */
+ GdkModifierType mod_mask; /* Indicated modifiers are ignored. */
+ guint use_count; /* Counts # of attachments made. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-10 - Create a new, empty, keyboard context to which the user then can add "entries". */
+KbdContext * kbd_context_new(MainInfo *min)
+{
+ KbdContext *ctx;
+
+ ctx = g_malloc(sizeof *ctx);
+
+ ctx->min = min;
+ ctx->hash = g_hash_table_new(g_str_hash, g_str_equal);
+ ctx->mod_mask = 0U;
+ ctx->use_count = 0U;
+
+ return ctx;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-02-08 - Set a maskt to be applied against the 'state' member of keyboard events. */
+void kbd_context_mask_set(KbdContext *ctx, GdkModifierType mask)
+{
+ if(ctx != NULL)
+ ctx->mod_mask = mask;
+}
+
+/* 2000-02-08 - Return current state mask. */
+GdkModifierType kbd_context_mask_get(KbdContext *ctx)
+{
+ if(ctx != NULL)
+ return ctx->mod_mask;
+ return 0U;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-10 - Create a new entry. */
+static KbdEntry * entry_new(const gchar *key, KEType type, va_list args)
+{
+ KbdEntry *ent;
+
+ if(key == NULL)
+ return NULL;
+
+ ent = g_malloc(sizeof *ent);
+ ent->key = g_strdup(key);
+ ent->type = type;
+
+ switch(type)
+ {
+ case KET_GDKEVENT:
+ ent->entry.gdkevent.func = va_arg(args, GdkEventFunc);
+ ent->entry.gdkevent.user = va_arg(args, gpointer);
+ break;
+ case KET_GTKOBJECT:
+ ent->entry.object.obj = va_arg(args, GObject *);
+ ent->entry.object.signame = g_strdup(va_arg(args, gchar *));
+ ent->entry.object.user = va_arg(args, gpointer);
+ break;
+ case KET_CMDSEQ:
+ ent->entry.cmdseq.cmdseq = g_strdup(va_arg(args, gchar *));
+ break;
+ }
+
+ return ent;
+}
+
+/* 1999-03-10 - Destroy an entry, freeing all memory used by it. */
+static void entry_destroy(KbdEntry *ent)
+{
+ if(ent != NULL)
+ {
+ switch(ent->type)
+ {
+ case KET_GDKEVENT:
+ break;
+ case KET_GTKOBJECT:
+ g_free(ent->entry.object.signame);
+ break;
+ case KET_CMDSEQ:
+ g_free(ent->entry.cmdseq.cmdseq);
+ break;
+ }
+ g_free(ent->key);
+ g_free(ent);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-16 - Add an entry based on the va_list of arguments. The list must be destroyed by
+** the caller; we don't do va_end() on it here.
+** 2000-02-09 - Now applies the context-wide modifier mask before creating the binding, if any.
+*/
+gint kbd_context_entry_vadd(KbdContext *ctx, const gchar *key, KEType type, va_list args)
+{
+ KbdEntry *ent;
+
+ if((ctx == NULL) || (key == NULL))
+ return 0;
+
+ if(ctx->mod_mask != 0U) /* Does the context require modifiers to be filtered out? */
+ {
+ guint keysym;
+ GdkModifierType mod;
+
+ gtk_accelerator_parse(key, &keysym, &mod);
+ mod &= ~ctx->mod_mask; /* Apply the modifier mask. */
+ key = gtk_accelerator_name(keysym, mod);
+ }
+
+ if((ent = entry_new(key, type, args)) != NULL)
+ {
+ kbd_context_entry_remove(ctx, key);
+ g_hash_table_insert(ctx->hash, ent->key, ent);
+ }
+ return ent != NULL;
+}
+
+/* 1999-03-10 - Add an "entry" to a keyboard context. These entries are sort of like GTK+'s
+** accelerator entries, only a bit more general. Basically, they map a keyboard
+** event to some action. Keys are recognized by their GTK+ names (such as "<Shift>a").
+** Note that it is entierly OK to add entries even after the context has been attached
+** to a window (in fact, that is the expected usage). There can only be one entry
+** per key; any preexisting entry will be removed before the new is added.
+** Returns 1 on success, 0 on failure.
+*/
+gint kbd_context_entry_add(KbdContext *ctx, const gchar *key, KEType type, ...)
+{
+ va_list args;
+ gint ret;
+
+ va_start(args, type);
+ ret = kbd_context_entry_vadd(ctx, key, type, args);
+ va_end(args);
+ return ret;
+}
+
+/* 1999-03-10 - Remove an entry from given context. Since entries are module-private and highly
+** opaque (there is no publicly accessible entry type), the entry is also destroyed.
+*/
+void kbd_context_entry_remove(KbdContext *ctx, const gchar *key)
+{
+ if((ctx != NULL) && (key != NULL))
+ {
+ KbdEntry *ent;
+
+ if((ent = g_hash_table_lookup(ctx->hash, key)) != NULL)
+ {
+ g_hash_table_remove(ctx->hash, key);
+ entry_destroy(ent);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-10 - This gets called (by GTK+) when the user presses a key in a window to which
+** a keyboard context has been attached. Look up the key, trigger action.
+** 2000-02-09 - Now knows about, and applies, the modifier mask allowing e.g. NumLock to be
+** ignored.
+*/
+static gboolean evt_key_press(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ KbdContext *ctx = user;
+ KbdEntry *ent = NULL;
+ gchar *key;
+ gint ret;
+ GdkModifierType mod;
+
+ mod = evt->state;
+ if(ctx->mod_mask != 0U)
+ mod &= ~ctx->mod_mask;
+
+/* printf("Someone pressed %u ('%c') state=%04X\n", evt->keyval, evt->keyval, evt->state);*/
+
+ /* Here's the GTK+ function that provides the crucial mapping of (keyval,state) => ASCII name. */
+ if((key = gtk_accelerator_name(evt->keyval, mod)) != NULL)
+ {
+/* printf(" a key also known as \"%s\"\n", key);*/
+ if((ent = g_hash_table_lookup(ctx->hash, key)) != NULL)
+ {
+/* printf(" with a binding of type %d, too\n", ent->type);*/
+ switch(ent->type)
+ {
+ case KET_GDKEVENT:
+ ent->entry.gdkevent.func((GdkEvent *) evt, ent->entry.gdkevent.user);
+ break;
+ case KET_GTKOBJECT:
+ g_signal_emit_by_name(G_OBJECT(ent->entry.object.obj),
+ ent->entry.object.signame, ent->entry.object.user, &ret);
+ break;
+ case KET_CMDSEQ:
+ csq_execute(ctx->min, ent->entry.cmdseq.cmdseq);
+ break;
+ }
+ }
+ g_free(key);
+ }
+ return ent != NULL;
+}
+
+/* 1999-03-10 - Attach a keyboard context to a window. This will cause all keyboard events
+** generated in the window to be "trapped", and routed through the context, which
+** will envoke matching entries.
+*/
+gint kbd_context_attach(KbdContext *ctx, GtkWindow *win)
+{
+ if((ctx == NULL) || (win == NULL))
+ return 0;
+
+ return g_signal_connect(G_OBJECT(win), "key_press_event", G_CALLBACK(evt_key_press), ctx);
+}
+
+/* 1999-04-02 - Detach given keyboard context from given window. If it's not attached, nothing
+** happens.
+*/
+void kbd_context_detach(KbdContext *ctx, GtkWindow *win)
+{
+ gulong handler;
+
+ if((ctx == NULL) || (win == NULL))
+ return;
+
+ if((handler = g_signal_handler_find(G_OBJECT(win), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
+ 0u, 0, NULL, G_CALLBACK(evt_key_press), ctx)) != 0)
+ {
+ g_signal_handler_disconnect(G_OBJECT(win), handler);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-10 - Free an entry, with GHashTable prototype. */
+static gboolean entry_hash_free(gpointer key, gpointer value, gpointer user)
+{
+ entry_destroy(value);
+
+ return TRUE;
+}
+
+/* 1999-03-11 - Clear a context from all its entries. */
+void kbd_context_clear(KbdContext *ctx)
+{
+ if(ctx != NULL)
+ g_hash_table_foreach_remove(ctx->hash, entry_hash_free, NULL);
+}
+
+/* 1999-03-10 - Destroy a keyboard context. Will whine if it is still attached to some window. */
+void kbd_context_destroy(KbdContext *ctx)
+{
+ if(ctx != NULL)
+ {
+ if(ctx->use_count != 0)
+ fprintf(stderr, "KBD: Destroying key context with non-zero use-count!\n");
+ kbd_context_clear(ctx);
+
+ g_hash_table_destroy(ctx->hash);
+ g_free(ctx);
+ }
+}
diff --git a/src/keyboard.h b/src/keyboard.h
new file mode 100644
index 0000000..3405272
--- /dev/null
+++ b/src/keyboard.h
@@ -0,0 +1,47 @@
+/*
+** 1999-03-10 - Interface for the keyboard accelerator module. No, this does not make your
+** keyboard faster.
+*/
+
+#if !defined KEYBOARD_H
+#define KEYBOARD_H
+
+#include <stdarg.h>
+
+/* These are the various types of keyboard shortcuts supported. Each type has a comment showing
+** the tail part of the intended prototype for an entry_add() call for that type.
+*/
+typedef enum { KET_GDKEVENT = 0, /* (.., GdkEventFunc func, gpointer user); */
+ KET_GTKOBJECT, /* (.., GtkObject *obj, const gchar *signal_name, gpointer user); */
+ KET_CMDSEQ /* (.., const gchar *cmdseq_name); */
+ } KEType;
+
+/* So, for example, if you have a GtkButton called btn, and you want the key "<Shift>a" to
+** activate it, you'd do kbd_context_entry_add(context, "<Shift>a", KET_GTKOBJECT, btn, "clicked", userdata);
+*/
+
+typedef struct KbdContext KbdContext;
+
+KbdContext * kbd_context_new(MainInfo *min);
+
+/* These functions let you set a mask which is applied (binary AND:ed) to the
+** 'state' member of the keyboard event when a key is pressed. The mask is also
+** applied to the key describing The primary use for this is to mask away that
+** pesky numlock.
+*/
+void kbd_context_mask_set(KbdContext *ctx, guint mask);
+guint kbd_context_mask_get(KbdContext *ctx);
+
+gint kbd_context_entry_add(KbdContext *ctx, const gchar *key, KEType type, ...);
+gint kbd_context_entry_vadd(KbdContext *ctx, const gchar *key, KEType type, va_list args);
+void kbd_context_entry_remove(KbdContext *ctx, const gchar *key);
+
+/* To be used, the keyboard context needs to be attached to a window. */
+gint kbd_context_attach(KbdContext *ctx, GtkWindow *win);
+void kbd_context_detach(KbdContext *ctx, GtkWindow *win);
+
+void kbd_context_clear(KbdContext *ctx);
+
+void kbd_context_destroy(KbdContext *ctx);
+
+#endif /* KEYBOARD_H */
diff --git a/src/list_dialog.c b/src/list_dialog.c
new file mode 100644
index 0000000..f8ac028
--- /dev/null
+++ b/src/list_dialog.c
@@ -0,0 +1,253 @@
+/*
+** 2010-06-13 - Implementation of the list/string editor dialog.
+*/
+
+#include "gentoo.h"
+
+#include "dialog.h"
+
+#include "list_dialog.h"
+
+typedef struct {
+ Dialog *dlg;
+ GtkListStore *store;
+ GtkWidget *view;
+ GtkWidget *add;
+ GtkWidget *delete;
+ const gchar *new_text; /* Default for new adds. */
+ gchar separator;
+ LDlgItemEditor editor;
+ gpointer user;
+ gchar edit_path[64];
+} LDlgInfo;
+
+/* 2010-06-13 - Splits the given string by the separator char, and appends each string into the model. */
+static void string_to_model(GtkListStore *store, const gchar *string, gunichar separator)
+{
+ GString *sep;
+ gchar **vec;
+
+ sep = g_string_sized_new(8);
+ sep = g_string_append_unichar(sep, separator);
+ vec = g_strsplit(string, sep->str, -1);
+ if(vec != NULL)
+ {
+ guint i;
+
+ for(i = 0; vec[i] != NULL; ++i)
+ {
+ GtkTreeIter iter;
+
+ gtk_list_store_insert_with_values(store, &iter, -1, 0, vec[i], -1);
+ }
+ g_strfreev(vec);
+ }
+ g_string_free(sep, TRUE);
+}
+
+/* 2010-06-14 - Convert the contents of the tree model into a single string, using the separator. */
+static gboolean model_to_string(gchar *string, gsize max, const GtkListStore *store, gunichar separator)
+{
+ GtkTreeIter iter;
+ gboolean ret = TRUE;
+
+ if(max == 0)
+ return FALSE;
+
+ if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
+ {
+ gchar *prev = NULL, *put = string;
+
+ max--; /* T-800 has made a reservation. */
+ do
+ {
+ gchar *str = NULL;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &str, -1);
+ if(str != NULL)
+ {
+ gsize len = strlen(str);
+
+ /* Does it fit? */
+ if(len + 1 <= max) /* FIXME: Assumes separator is 1-byte. */
+ {
+ if(prev != NULL)
+ *put++ = separator & 0xff; /* FIXME: Assumes separator is 1-byte. */
+ memcpy(put, str, len);
+ put += len;
+ *put = '\0';
+ max -= len;
+ }
+ else
+ ret = FALSE;
+ prev = str;
+ g_free(str);
+ }
+ } while(ret && gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
+ *put = '\0';
+ }
+ return ret;
+}
+
+/* 2010-06-26 - Inserting text into cell renderer entry; filter out separator. */
+static void evt_cell_renderer_entry_insert_text(GtkEditable *editable, gchar *new_text, gint new_text_length, gint *position, gpointer user)
+{
+ LDlgInfo *ldi = user;
+ gchar *get = new_text, *put = get;
+
+ /* Remove any occurance of the separator character, in-place. See any Giraffes to ride? :| */
+ while(*get)
+ {
+ if(*get == ldi->separator)
+ get++;
+ else
+ *put++ = *get++;
+ }
+ *put = '\0';
+}
+
+static void evt_cell_renderer_edited(GtkCellRendererText *cr, const gchar *path, const gchar *new_text, gpointer user)
+{
+ GtkTreeIter iter;
+
+ if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(user), &iter, path))
+ {
+ gtk_list_store_set(GTK_LIST_STORE(user), &iter, 0, new_text, -1);
+ }
+}
+
+static void evt_cell_renderer_entry_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user)
+{
+ LDlgInfo *ldi = user;
+ GString *value;
+
+ /* Use a GString to allow the user's editor callback to modify the value. */
+ value = g_string_new(gtk_entry_get_text(entry));
+ if(ldi->editor(value, ldi->user))
+ {
+ /* Re-setting the entry's text doesn't help, so re-use the model-editing code. */
+ evt_cell_renderer_edited(NULL, ldi->edit_path, value->str, ldi->store);
+ }
+ g_string_free(value, TRUE);
+}
+
+/* 2010-06-26 - Editing starting, set up filtering to avoid inputing the separator. */
+static void evt_cell_renderer_editing_started(GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *path, gpointer user)
+{
+ LDlgInfo *ldi = user;
+
+ if(!GTK_IS_ENTRY(editable))
+ return;
+ if(ldi->editor != NULL)
+ {
+ gtk_entry_set_icon_from_icon_name(GTK_ENTRY(editable), GTK_ENTRY_ICON_SECONDARY, "edit-find");
+ g_signal_connect(G_OBJECT(editable), "icon_press", G_CALLBACK(evt_cell_renderer_entry_icon_press), user);
+ g_snprintf(ldi->edit_path, sizeof ldi->edit_path, "%s", path);
+ }
+ g_signal_connect(G_OBJECT(editable), "insert_text", G_CALLBACK(evt_cell_renderer_entry_insert_text), user);
+}
+
+static void evt_view_row_activated(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user)
+{
+ gtk_tree_view_set_cursor(tv, path, column, TRUE);
+}
+
+static void evt_view_selection_changed(GtkTreeSelection *sel, gpointer user)
+{
+ LDlgInfo *ldi = user;
+ const gboolean has_sel = gtk_tree_selection_count_selected_rows(sel) > 0;
+
+ gtk_widget_set_sensitive(ldi->delete, has_sel);
+}
+
+/* 2010-06-26 - Add a new item, just below the currently selected one. Make it editable. */
+static void evt_add_clicked(GtkWidget *wid, gpointer user)
+{
+ LDlgInfo *ldi = user;
+ GtkTreeIter iter, new;
+ GtkTreeModel *model;
+ GtkTreePath *path;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(ldi->view)), &model, &iter))
+ gtk_list_store_insert_after(GTK_LIST_STORE(model), &new, &iter);
+ else
+ gtk_list_store_append(GTK_LIST_STORE(model), &new);
+ gtk_list_store_set(GTK_LIST_STORE(model), &new, 0, ldi->new_text, -1);
+ if((path = gtk_tree_model_get_path(model, &new)) != NULL)
+ {
+ GtkTreeViewColumn *col = gtk_tree_view_get_column(GTK_TREE_VIEW(ldi->view), 0);
+ gtk_tree_view_set_cursor(GTK_TREE_VIEW(ldi->view), path, col, TRUE);
+ gtk_tree_path_free(path);
+ }
+}
+
+/* 2010-06-26 - Delete the currently selected item. */
+static void evt_delete_clicked(GtkWidget *wid, gpointer user)
+{
+ LDlgInfo *ldi = user;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if(!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(ldi->view)), &model, &iter))
+ return;
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+}
+
+void ldl_dialog_sync_new_wait(gchar *list, gsize max, gunichar separator, const gchar *title)
+{
+ ldl_dialog_sync_new_full_wait(list, max, separator, title, NULL, NULL);
+}
+
+void ldl_dialog_sync_new_full_wait(gchar *list, gsize max, gunichar separator, const gchar *title, LDlgItemEditor editor, gpointer user)
+{
+ LDlgInfo ldi;
+ GtkWidget *vbox, *scwin, *hbox;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+ GtkTreeSelection *sel;
+
+ ldi.store = gtk_list_store_new(1, G_TYPE_STRING);
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ ldi.view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ldi.store));
+ cr = gtk_cell_renderer_text_new();
+ g_object_set(G_OBJECT(cr), "editable", TRUE, NULL);
+ g_signal_connect(G_OBJECT(cr), "editing-started", G_CALLBACK(evt_cell_renderer_editing_started), &ldi);
+ g_signal_connect(G_OBJECT(cr), "edited", G_CALLBACK(evt_cell_renderer_edited), ldi.store);
+ vc = gtk_tree_view_column_new_with_attributes("(string)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(ldi.view), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ldi.view), FALSE);
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(ldi.view), TRUE);
+ g_signal_connect(G_OBJECT(ldi.view), "row_activated", G_CALLBACK(evt_view_row_activated), NULL);
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add(GTK_CONTAINER(scwin), ldi.view);
+ gtk_box_pack_start(GTK_BOX(vbox), scwin, TRUE, TRUE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ ldi.add = gtk_button_new_with_label(_("Add"));
+ g_signal_connect(G_OBJECT(ldi.add), "clicked", G_CALLBACK(evt_add_clicked), &ldi);
+ gtk_box_pack_start(GTK_BOX(hbox), ldi.add, TRUE, TRUE, 0);
+ ldi.delete = gtk_button_new_with_label(_("Delete"));
+ g_signal_connect(G_OBJECT(ldi.delete), "clicked", G_CALLBACK(evt_delete_clicked), &ldi);
+ gtk_box_pack_start(GTK_BOX(hbox), ldi.delete, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+ string_to_model(ldi.store, list, separator);
+
+ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(ldi.view));
+ g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(evt_view_selection_changed), &ldi);
+ gtk_tree_selection_set_mode(GTK_TREE_SELECTION(sel), GTK_SELECTION_BROWSE);
+
+ ldi.new_text = _("(New Item)");
+ ldi.separator = separator;
+
+ ldi.editor = editor;
+ ldi.user = user;
+
+ ldi.dlg = dlg_dialog_sync_new(vbox, title, _("OK|Cancel"));
+ gtk_window_set_default_size(GTK_WINDOW(dlg_dialog_get_dialog(ldi.dlg)), 320, 544);
+
+ dlg_dialog_sync_wait(ldi.dlg);
+ model_to_string(list, max, ldi.store, separator);
+ g_object_unref(ldi.store);
+}
diff --git a/src/list_dialog.h b/src/list_dialog.h
new file mode 100644
index 0000000..275b7b4
--- /dev/null
+++ b/src/list_dialog.h
@@ -0,0 +1,11 @@
+/*
+** 2010-06-13 - A new dialog, which scratches an itch: if a program uses the "string with separator" way of showing lists,
+** it ought to provide a more user-friendly way of editing the list. Visual Studio hurts, in this department,
+** and up to now gentoo has, too. One of those is fixed, now.
+*/
+
+/* Editor function, returns TRUE if the contents of 'value' are to be kept. */
+typedef gboolean (*LDlgItemEditor)(GString *value, gpointer user);
+
+extern void ldl_dialog_sync_new_wait(gchar *list, gsize max, gunichar separator, const gchar *title);
+extern void ldl_dialog_sync_new_full_wait(gchar *list, gsize max, gunichar separator, const gchar *title, LDlgItemEditor editor, gpointer user);
diff --git a/src/menus.c b/src/menus.c
new file mode 100644
index 0000000..44861a8
--- /dev/null
+++ b/src/menus.c
@@ -0,0 +1,638 @@
+/*
+** General menu handling routines. This is the stuff made editable through
+** the cfg_menus module.
+*/
+
+#include "gentoo.h"
+
+#include "cmdseq.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "strutil.h"
+
+#include "menus.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define MENU_NONE _("(None)")
+
+#define MENU_ITEM_LABEL_SIZE 32
+#define MENU_ITEM_ICON_SIZE 64
+
+typedef enum {
+ ITEM_SIMPLE,
+ ITEM_SUBMENU,
+ ITEM_SEPARATOR
+} MIType;
+
+typedef struct {
+ gchar label[MENU_ITEM_LABEL_SIZE];
+ gchar icon[MENU_ITEM_ICON_SIZE];
+} MILabel;
+
+struct item_simple {
+ MILabel label;
+ GString *cmdseq;
+};
+
+struct item_submenu {
+ MILabel label;
+ gchar menu[MNU_MENU_NAME_SIZE];
+};
+
+struct MenuItem {
+ MIType type;
+ union {
+ struct item_simple simple;
+ struct item_submenu submenu;
+ } data;
+};
+
+typedef enum {
+ MENU_NORMAL = 0,
+ MENU_BUILTIN
+} MType;
+
+struct Menu {
+ MType type;
+ gchar name[MNU_MENU_NAME_SIZE];
+ GArray *item;
+ gboolean used; /* Prevents re-use. Simplifies life. */
+};
+
+typedef struct {
+ gchar name[MNU_MENU_NAME_SIZE];
+ void (*build)(MainInfo *min, GtkWidget *menu);
+} DynMenu;
+
+struct MenuInfo {
+ MainInfo *min;
+ GHashTable *menus;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void menu_build_action(MainInfo *min, GtkWidget *wid);
+static void menu_build_time(MainInfo *min, GtkWidget *wid);
+static void menu_build_parents(MainInfo *min, GtkWidget *wid);
+
+static GHashTable *dynamic_hash = NULL;
+
+/* ----------------------------------------------------------------------------------------- */
+
+void mnu_initialize(void)
+{
+ static const DynMenu dyn_menu[] = { { "<ActionMenu>", menu_build_action },
+ { "<TimeMenu>", menu_build_time },
+ { "<ParentsMenu>", menu_build_parents }
+ };
+ guint i;
+
+ dynamic_hash = g_hash_table_new(g_str_hash, g_str_equal);
+ for(i = 0; i < sizeof dyn_menu / sizeof dyn_menu[0]; i++)
+ g_hash_table_insert(dynamic_hash, (gpointer) dyn_menu[i].name, (gpointer) &dyn_menu[i]);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+Menu * mnu_menu_new(MenuInfo *mi, const gchar *name)
+{
+ Menu *m;
+
+ /* Discourage non-unique names. Firmly. */
+ if(g_hash_table_lookup(mi->menus, name) != NULL)
+ return NULL;
+
+ m = g_malloc(sizeof *m);
+ g_strlcpy(m->name, name, sizeof m->name);
+ m->item = g_array_new(FALSE, FALSE, sizeof (MenuItem));
+ m->used = FALSE;
+
+ g_hash_table_insert(mi->menus, m->name, m);
+
+ return m;
+}
+
+/* Destroy a menu. */
+void mnu_menu_destroy(MenuInfo *mi, Menu *menu)
+{
+ g_hash_table_remove(mi->menus, menu);
+ g_array_free(menu->item, TRUE);
+ g_free(menu);
+}
+
+static void menu_append(Menu *m, MenuItem *mi)
+{
+ m->item = g_array_append_vals(m->item, mi, 1);
+}
+
+/* Create a new menu in <mi>, as an exact duplicate of <old> (which
+** _really_ should come from a different MenuInfo).
+*/
+static Menu * mnu_menu_new_copy(MenuInfo *mi, const Menu *old)
+{
+ Menu *m;
+ guint i;
+
+ if((m = mnu_menu_new(mi, old->name)) == NULL)
+ return m;
+ for(i = 0; i < old->item->len; i++)
+ menu_append(m, &g_array_index(old->item, MenuItem, i));
+ return m;
+}
+
+void mnu_menu_append_simple(Menu *m, const gchar *label, const gchar *cmdseq)
+{
+ MenuItem mi;
+
+ mi.type = ITEM_SIMPLE;
+ g_strlcpy(mi.data.simple.label.label, label, sizeof mi.data.simple.label.label);
+ mi.data.simple.label.icon[0] = '\0';
+ mi.data.simple.cmdseq = g_string_new(cmdseq);
+ menu_append(m, &mi);
+}
+
+void mnu_menu_append_separator(Menu *m)
+{
+ MenuItem mi;
+
+ mi.type = ITEM_SEPARATOR;
+ menu_append(m, &mi);
+}
+
+void mnu_menu_append_submenu(Menu *m, const gchar *label, const gchar *menu)
+{
+ MenuItem mi;
+
+ mi.type = ITEM_SUBMENU;
+ g_strlcpy(mi.data.submenu.label.label, label, sizeof mi.data.submenu.label.label);
+ mi.data.submenu.label.icon[0] = '\0';
+ g_strlcpy(mi.data.submenu.menu, menu, sizeof mi.data.submenu.menu);
+ menu_append(m, &mi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-08-26 - Just check if <action> is on the list <actions> or not. We can't use g_slist_find(),
+** since we need to do the comparison by textual content, not pointers.
+*/
+static gboolean action_on_list(GSList *actions, const gchar *action)
+{
+ GSList *iter;
+
+ for(iter = actions; iter != NULL; iter = g_slist_next(iter))
+ {
+ if(strcmp(iter->data, action) == 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1999-08-26 - Check if <action> is mentioned in each of the styles on <styles> (except <current>).
+** Returns TRUE if so, FALSE if not. This routine really makes my performance-centered
+** mind hurt. I guess I'll have to fix it someday. :)
+** 2000-12-10 - Added quicker way to check if style has a named action property, so now it hurts less.
+*/
+static gboolean action_in_intersection(GSList *styles, GSList *current, const gchar *action)
+{
+ const GSList *siter;
+
+ for(siter = styles; siter != NULL; siter = g_slist_next(siter))
+ {
+ if(siter == current)
+ continue;
+ if(!stl_style_property_has_action(siter->data, action))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* 2000-12-03 - Dedicated activate-handler for <ActionMenu> items. Call the FileAction built-in. */
+static void evt_menu_action_activate(GtkWidget *wid, gpointer user)
+{
+ MainInfo *min;
+
+ min = g_object_get_data(G_OBJECT(wid), "user");
+ csq_execute_format(min, "FileAction action='%s'", user);
+}
+
+/* 2000-12-03 - Build the Action submenu. It contains names of the actions available in
+** all currently selected files in the current pane.
+*/
+static void menu_build_action(MainInfo *min, GtkWidget *menu)
+{
+ DirPane *dp = min->gui->cur_pane;
+ GSList *slist;
+
+ if((slist = dp_get_selection(dp)) != NULL)
+ {
+ GSList *iter, *styles = NULL, *actions = NULL;
+ GList *palist, *piter;
+ GtkTreeModel *tm = dp_get_tree_model(dp);
+ Style *stl;
+
+ /* Build list of all styles used by rows in selection. */
+ for(iter = slist; iter != NULL; iter = g_slist_next(iter))
+ {
+ const FType *ftype = dp_row_get_ftype(tm, iter->data);
+
+ if(ftype != NULL)
+ {
+ stl = ftype->style;
+ if(g_slist_find(styles, stl) == NULL)
+ styles = g_slist_prepend(styles, stl);
+ }
+ }
+
+ /* Compute intersection of all styles' action properties. */
+ for(iter = styles; iter != NULL; iter = g_slist_next(iter))
+ {
+ palist = stl_style_property_get_actions(iter->data);
+ for(piter = palist; piter != NULL; piter = g_list_next(piter))
+ {
+ if(action_on_list(actions, piter->data))
+ continue;
+ if(action_in_intersection(styles, iter, piter->data))
+ actions = g_slist_insert_sorted(actions, piter->data, (GCompareFunc) strcmp);
+ }
+ g_list_free(palist);
+ }
+ g_slist_free(styles);
+
+ if(actions != NULL)
+ {
+ GtkWidget *item;
+
+ for(iter = actions; iter != NULL; iter = g_slist_next(iter))
+ {
+ item = gtk_menu_item_new_with_label(iter->data);
+ g_object_set_data(G_OBJECT(item), "user", min);
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(evt_menu_action_activate), iter->data);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+ }
+ g_slist_free(actions);
+ }
+ dp_free_selection(slist);
+ }
+ else
+ {
+ GtkWidget *item;
+
+ item = gtk_menu_item_new_with_label(_("(No Selection)"));
+ gtk_widget_set_sensitive(item, FALSE);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+ }
+}
+
+/* 2000-12-03 - Create a menu with a single item, whose label shows the current
+** local time, in 24-hour HH:MM.SS format. Initially created just to
+** test the dynamic submenu handling, but I think I'll keep it. ;)
+** Selecting the item does nothing.
+*/
+static void menu_build_time(MainInfo *min, GtkWidget *menu)
+{
+ gchar buf[16];
+ time_t now;
+ struct tm *nowf;
+ GtkWidget *item;
+
+ time(&now);
+ nowf = localtime(&now);
+ strftime(buf, sizeof buf, "%H:%M.%S", nowf);
+
+ item = gtk_menu_item_new_with_label(buf);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show(item);
+}
+
+/* 2004-04-18 - User picked an item from the <ParentsMenu> menu. Go there. */
+static void evt_menu_parents_activate(GtkWidget *wid, gpointer user)
+{
+ const gchar *text = NULL;
+
+ if(!GTK_IS_MENU_ITEM(wid))
+ return;
+ wid = gtk_bin_get_child(GTK_BIN(wid));
+ if(!GTK_IS_LABEL(wid))
+ return;
+ text = gtk_label_get_text(GTK_LABEL(wid));
+ if(text != NULL)
+ csq_execute_format(user, "DirEnter 'dir=%s'", stu_escape(text));
+}
+
+/* 2004-04-18 - Build menu containing parent directories of current pane's dir. */
+static void menu_build_parents(MainInfo *min, GtkWidget *menu)
+{
+ const DirPane *dp = min->gui->cur_pane;
+ gchar canon[PATH_MAX], *sep;
+ GtkWidget *item;
+
+ if(dp == NULL)
+ return;
+ fut_path_canonicalize(dp->dir.path, canon, sizeof canon);
+ while((sep = strrchr(canon, G_DIR_SEPARATOR)) != NULL)
+ {
+ *sep = '\0';
+ if(canon[0] == '\0')
+ break;
+ item = gtk_menu_item_new_with_label(canon);
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(evt_menu_parents_activate), min);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ }
+ /* Always append a root ("/") item, since the root has itself as its parent. Avoids empty menu, as bonus. */
+ item = gtk_menu_item_new_with_label("/");
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(evt_menu_parents_activate), min);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ gtk_widget_show_all(menu);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* The standard callback for a menu item; just run the attached command. */
+static void evt_menu_activate(GtkWidget *wid, gpointer user)
+{
+ MainInfo *min;
+
+ min = g_object_get_data(G_OBJECT(wid), "user");
+ csq_execute(min, user);
+}
+
+static void evt_menu_show(GtkWidget *wid, gpointer user)
+{
+ DynMenu *dm = user;
+ dm->build(g_object_get_data(G_OBJECT(wid), "user"), wid);
+}
+
+static void evt_menu_hide(GtkWidget *wid, gpointer user)
+{
+ GList *list, *iter;
+
+ for(iter = list = gtk_container_get_children(GTK_CONTAINER(wid)); iter != NULL; iter = g_list_next(iter))
+ gtk_container_remove(GTK_CONTAINER(wid), iter->data);
+ g_list_free(list);
+}
+
+static GtkWidget * do_menu_widget_build(const MenuInfo *mi, const gchar *name, Menu *parent)
+{
+ DynMenu *d;
+ Menu *m;
+ GtkWidget *menu, *menuitem, *smenu;
+ guint i;
+ MenuItem *mit;
+
+ if(!name)
+ return NULL;
+
+ /* Dynamic menus are empty, and filled-in on demand in the "show" signal handler.
+ ** This isn't the most pleasing solution performance-wise, but it's still rather
+ ** elegant, IMO. The "hide" handler empties the menu again.
+ */
+ if((d = g_hash_table_lookup(dynamic_hash, name)) != NULL)
+ {
+ menu = gtk_menu_new();
+ g_object_set_data(G_OBJECT(menu), "user", mi->min);
+ g_signal_connect(G_OBJECT(menu), "show", G_CALLBACK(evt_menu_show), d);
+ g_signal_connect(G_OBJECT(menu), "hide", G_CALLBACK(evt_menu_hide), d);
+ return menu;
+ }
+
+ if((m = g_hash_table_lookup(mi->menus, name)) == NULL)
+ return NULL;
+
+ menu = gtk_menu_new();
+ for(i = 0; i < m->item->len; i++)
+ {
+ mit = &g_array_index(m->item, MenuItem, i);
+ switch(mit->type)
+ {
+ case ITEM_SIMPLE:
+ menuitem = gtk_menu_item_new_with_label(mit->data.simple.label.label);
+ g_signal_connect(G_OBJECT(menuitem), "activate",
+ G_CALLBACK(evt_menu_activate), mit->data.simple.cmdseq->str);
+ g_object_set_data(G_OBJECT(menuitem), "user", mi->min);
+ break;
+ case ITEM_SEPARATOR:
+ menuitem = gtk_menu_item_new();
+ break;
+ case ITEM_SUBMENU:
+ if((smenu = do_menu_widget_build(mi, mit->data.submenu.menu, m)) != NULL)
+ {
+ menuitem = gtk_menu_item_new_with_label(mit->data.submenu.label.label);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), smenu);
+ }
+ else
+ menuitem = NULL;
+ break;
+ default:
+ menuitem = NULL;
+ }
+ if(menuitem)
+ {
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ gtk_widget_show(menuitem);
+ }
+ }
+ return menu;
+}
+
+/* Get a GTK+ menu representing the named menu. Dynamic content is not generated
+** at this point; it is set up (using the "show" and "hide" signals) to be generated
+** when (if) needed.
+*/
+GtkWidget * mnu_menu_widget_get(const MenuInfo *mi, const gchar *name)
+{
+ return do_menu_widget_build(mi, name, NULL);
+}
+
+GtkWidget * mnu_menu_use(const MenuInfo *mi, const gchar *name)
+{
+ return do_menu_widget_build(mi, name, NULL);
+}
+
+void mnu_menu_disuse(const MenuInfo *mi, const gchar *name)
+{
+ Menu *m;
+
+ if((m = g_hash_table_lookup(mi->menus, name)) == NULL)
+ return;
+ m->used = FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean evt_popup_destroy(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ gui_events_flush();
+
+ return FALSE;
+}
+
+static void evt_popup_hide(GtkWidget *wid, gpointer user)
+{
+ gboolean ret;
+
+ gui_events_flush();
+ g_signal_emit_by_name(G_OBJECT(wid), "destroy_event", NULL, &ret);
+}
+
+gboolean mnu_menu_popup(const MenuInfo *mi, const gchar *name, GtkMenuPositionFunc pos, gpointer data, guint button, guint32 activate_time)
+{
+ GtkWidget *menu;
+
+ if((menu = mnu_menu_widget_get(mi, name)) != NULL)
+ {
+ g_signal_connect_after(G_OBJECT(menu), "hide", G_CALLBACK(evt_popup_hide), NULL);
+ g_signal_connect(G_OBJECT(menu), "destroy_event", G_CALLBACK(evt_popup_destroy), NULL);
+ gtk_menu_popup(GTK_MENU(menu), NULL, NULL, pos, data, button, activate_time);
+/* fprintf(stderr, "Popping up menu at %p\n", menu);*/
+ }
+ return menu != NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+MenuInfo * mnu_menuinfo_new(MainInfo *min)
+{
+ MenuInfo *mi;
+
+ mi = g_malloc(sizeof *mi);
+
+ mi->min = min;
+ mi->menus = g_hash_table_new(g_str_hash, g_str_equal);
+
+ return mi;
+}
+
+MenuInfo * mnu_menuinfo_new_default(MainInfo *min)
+{
+ MenuInfo *mi;
+ Menu *menu;
+
+ mi = mnu_menuinfo_new(min);
+
+ menu = mnu_menu_new(mi, "SelectMenu");
+ mnu_menu_append_simple(menu, _("All"), "SelectAll");
+ mnu_menu_append_simple(menu, _("None"), "SelectNone");
+ mnu_menu_append_simple(menu, _("Toggle"), "SelectToggle");
+ mnu_menu_append_simple(menu, _("RegExp..."), "SelectRE");
+
+/* menu = mnu_menu_new(mi, "PointlessComplexityMenu");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+ mnu_menu_append_submenu(menu, "Action2", "<ActionMenu>");
+*/
+ menu = mnu_menu_new(mi, "DirPaneMenu");
+ mnu_menu_append_simple(menu, _("Parent"), "DirParent");
+ mnu_menu_append_simple(menu, _("Other"), "DirFromOther");
+ mnu_menu_append_simple(menu, _("Rescan"), "DirRescan");
+ mnu_menu_append_submenu(menu, _("Select"), "SelectMenu");
+ mnu_menu_append_separator(menu);
+ mnu_menu_append_submenu(menu, _("Action"), "<ActionMenu>");
+/* mnu_menu_append_submenu(menu, "Time", "<TimeMenu>");*/
+ mnu_menu_append_simple(menu, _("Run..."), "Run");
+ mnu_menu_append_separator(menu);
+ mnu_menu_append_simple(menu, _("Configure..."), "Configure");
+/* mnu_menu_append_submenu(menu, "Pointless", "PointlessComplexityMenu");*/
+
+/* menu = mnu_menu_new(mi, "ShortcutMenu");
+ mnu_menu_append_simple(menu, "Home", "DirEnter ~");
+ mnu_menu_append_simple(menu, "Local", "DirEnter /usr/local");
+ mnu_menu_append_simple(menu, "/", "DirEnter /");
+*/
+ return mi;
+}
+
+static void copy_menu(gpointer key, gpointer value, gpointer user)
+{
+ mnu_menu_new_copy(user, value);
+}
+
+MenuInfo * mnu_menuinfo_copy(const MenuInfo *mi)
+{
+ MenuInfo *nmi;
+
+ nmi = mnu_menuinfo_new(mi->min);
+ g_hash_table_foreach(mi->menus, copy_menu, nmi);
+
+ return nmi;
+}
+
+#if 0
+static void append_menu(gpointer key, gpointer value, gpointer user)
+{
+ GList **list = user;
+ Menu *m = value;
+
+ if(m->used)
+ return;
+ *list = g_list_insert_sorted(*list, m->name, (GCompareFunc) strcmp);
+}
+
+static void evt_select_select_row(GtkWidget *wid, gint row, gint col, GdkEventButton *evt, gpointer user)
+{
+ gchar **selected = user;
+
+ *selected = gtk_clist_get_row_data(GTK_CLIST(wid), row);
+}
+
+static void evt_select_unselect_row(GtkWidget *wid, gint row, gint col, GdkEventButton *evt, gpointer user)
+{
+ gchar **selected = user;
+
+ *selected = NULL;
+}
+
+/* 2001-01-01 - Pop up dialog, let user pick a non-used menu. */
+const gchar * mnu_menuinfo_select(const MenuInfo *mi)
+{
+ GList *list = NULL, *iter;
+ GtkWidget *scwin, *clist;
+ gchar *row[] = { NULL }, *selected = NULL;
+ gint ri, choice;
+ Dialog *dlg;
+
+ list = g_list_append(list, MENU_NONE);
+ g_hash_table_foreach(mi->menus, append_menu, &list);
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ clist = gtk_clist_new(1);
+ for(iter = list; iter != NULL; iter = g_list_next(iter))
+ {
+ row[0] = iter->data;
+ ri = gtk_clist_append(GTK_CLIST(clist), row);
+ gtk_clist_set_row_data(GTK_CLIST(clist), ri, row[0]);
+ }
+ g_signal_connect(G_OBJECT(clist), "select_row", G_CALLBACK(evt_select_select_row), &selected);
+ g_signal_connect(G_OBJECT(clist), "unselect_row", G_CALLBACK(evt_select_unselect_row), &selected);
+ gtk_container_add(GTK_CONTAINER(scwin), clist);
+ gtk_widget_set_size_request(scwin, 200, 384);
+
+ dlg = dlg_dialog_sync_new(scwin, _("Select Menu"), NULL);
+ choice = dlg_dialog_sync_wait(dlg);
+ dlg_dialog_sync_destroy(dlg);
+
+ g_list_free(list);
+
+ return choice == 0 ? (selected ? selected : MENU_NONE) : NULL;
+}
+#endif
+
+static void destroy_menu(gpointer key, gpointer value, gpointer user)
+{
+/* printf("Destroying menu \"%s\"\n", ((Menu *) value)->name);*/
+ mnu_menu_destroy(user, value);
+}
+
+void mnu_menuinfo_destroy(MenuInfo *mi)
+{
+ g_hash_table_foreach(mi->menus, destroy_menu, mi);
+ g_free(mi);
+}
diff --git a/src/menus.h b/src/menus.h
new file mode 100644
index 0000000..04e7fb4
--- /dev/null
+++ b/src/menus.h
@@ -0,0 +1,44 @@
+/*
+** Menu utility module header.
+*/
+
+#if !defined MENUS_H
+#define MENUS_H
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct MenuItem MenuItem;
+typedef struct Menu Menu;
+typedef struct MenuInfo MenuInfo;
+
+/* This is a public constant, hence the prefix. It's used by buttons.c. */
+#define MNU_MENU_NAME_SIZE 32
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern void mnu_initialize(void);
+
+extern Menu * mnu_menu_new(MenuInfo *mi, const gchar *name);
+extern void mnu_menu_destroy(MenuInfo *mi, Menu *menu);
+
+extern void mnu_menu_append_simple(Menu *m, const gchar *label, const gchar *cmd);
+extern void mnu_menu_append_separator(Menu *m);
+extern void mnu_menu_append_submenu(Menu *m, const gchar *label, const gchar *link);
+
+extern GtkWidget * mnu_menu_use(const MenuInfo *mi, const gchar *name);
+extern void mnu_menu_disuse(const MenuInfo *mi, const gchar *name);
+
+extern GtkWidget * mnu_menu_widget_get(const MenuInfo *mi, const gchar *name);
+extern gboolean mnu_menu_popup(const MenuInfo *mi, const gchar *name, GtkMenuPositionFunc pos,
+ gpointer data, guint button, guint32 activate_time);
+/* ----------------------------------------------------------------------------------------- */
+
+extern MenuInfo * mnu_menuinfo_new(MainInfo *min);
+extern MenuInfo * mnu_menuinfo_new_default(MainInfo *min);
+extern MenuInfo * mnu_menuinfo_copy(const MenuInfo *mi);
+
+extern const gchar * mnu_menuinfo_select(const MenuInfo *mi);
+
+extern void mnu_menuinfo_destroy(MenuInfo *mi);
+
+#endif /* MENUS_H */
diff --git a/src/miscutil.c b/src/miscutil.c
new file mode 100644
index 0000000..3126b7e
--- /dev/null
+++ b/src/miscutil.c
@@ -0,0 +1,16 @@
+/*
+** 2004-05-01 - Miscellanous utility functions that are needed in more than one place. A very
+** late addition, so hopefully will grow slowly.
+*/
+
+#include "gentoo.h"
+
+#include "miscutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2004-05-01 - Compute elapsed time (in seconds) from <t1> to <t2>. */
+gfloat msu_diff_timeval(const GTimeVal *t1, const GTimeVal *t2)
+{
+ return 1E-6 * (t2->tv_usec - t1->tv_usec) + (t2->tv_sec - t1->tv_sec);
+}
diff --git a/src/miscutil.h b/src/miscutil.h
new file mode 100644
index 0000000..22a3d2b
--- /dev/null
+++ b/src/miscutil.h
@@ -0,0 +1,7 @@
+/*
+** 2004-05-01 - Miscellanous utility functions that are needed in more than one place. A very
+** late addition, so hopefully will grow slowly.
+*/
+
+/* Return seconds from <t1> (start) to <t2> (end). */
+extern gfloat msu_diff_timeval(const GTimeVal *t1, const GTimeVal *t2);
diff --git a/src/mntent_wrap.c b/src/mntent_wrap.c
new file mode 100644
index 0000000..8bf1c2a
--- /dev/null
+++ b/src/mntent_wrap.c
@@ -0,0 +1,240 @@
+/*
+** 1999-01-27 - Slim wrapper for the mntent-family of API calls. Required because it
+** seems to be a very unstandardized standard (different between Linux and
+** Solaris, for example). This has been modeled after the way it works on
+** Linux, so systems doing it in some other way will have to have emulation
+** code in here... Yuck. Since we're not into writing to these databases,
+** that part of the API is not supported. For details about which operations
+** need to be implemented for a platform, see "mntent_wrap.h".
+*/
+
+#include "gentoo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mntent_wrap.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct MntEnt {
+ gchar *fsname;
+ gchar *dir;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+#if defined __CYGWIN__ || defined __linux__ || defined __sgi /* Linux and IRIX implementation. */
+
+#include <mntent.h>
+
+FILE * mne_setmntent(const gchar *filename)
+{
+ return setmntent(filename, "r");
+}
+
+const MntEnt * mne_getmntent(FILE *filep)
+{
+ static MntEnt me;
+ struct mntent *ment;
+
+ if((ment = getmntent(filep)) != NULL)
+ {
+ me.fsname = ment->mnt_fsname;
+ me.dir = ment->mnt_dir;
+ return &me;
+ }
+ return NULL;
+}
+
+gint mne_endmntent(FILE *filep)
+{
+ return endmntent(filep);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+#elif defined __svr4__ /* Very weak Solaris detection, I'm sure. */
+
+#include <sys/mnttab.h>
+
+/* 1999-01-27 - Since Solaris doesn't include the setmntent() function as a part of their
+** mount database access API, but rather just use a plain fopen(), I guess
+** the following is a pretty natural way to wrap it.
+*/
+FILE * mne_setmntent(const gchar *filename)
+{
+ return fopen(filename, "rt");
+}
+
+/* 1999-01-27 - Grab a new entry from <filep>, and package it up in our platform neutral
+** format. If all wrappers were this simple, I would write more of them. :)
+*/
+const MntEnt * mne_getmntent(FILE *filep)
+{
+ static MntEnt me;
+ struct mnttab mtab;
+
+ if((getmntent(filep, &mtab)) == 0)
+ {
+ me.fsname = mtab.mnt_special;
+ me.dir = mtab.mnt_mountp;
+ return &me;
+ }
+ return NULL;
+}
+
+/* 1999-01-27 - Close down a mount database. The natural complement to mne_setmntent(). */
+gint mne_endmntent(FILE *filep)
+{
+ if(filep != NULL)
+ return fclose(filep);
+ return -1;
+}
+
+#elif defined __OpenBSD__ || defined __FreeBSD__ || defined __NetBSD__ || (defined __osf__ && defined __alpha__)
+
+/* Here is the implementation for BSD and Alpha Tru64 systems. */
+
+#include <fstab.h>
+#include <sys/mount.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+
+/* A pointer to one of these is returned by mne_setmntent(), depending on which file
+** name is given as an input. Note that on BSD systems, the system calls themselves
+** deal with the reading of files, so gentoo will never in fact open any files. But
+** since the calls used to access currently mounted file systems is very dissimilar
+** to the one used to check _available_ file systems, we need a way of keeping track
+** of what kind of mount entries we're supposed to deal with. Since gentoo will
+** pass a FILE pointer to mne_getmntent() anyway, it seems natural to use it.
+*/
+static FILE f_fstab, f_mtab;
+
+/* These are used when we're accessing the currently mounted filesystems, using
+** a call to getmntinfo(). The mtab_pos and mtab_num integers are then used to
+** keep track of where in the returned array of statfs structs we are.
+*/
+static struct statfs *mtab = NULL;
+static guint mtab_pos = 0, mtab_num = 0;
+
+/* 1999-05-09 - An attempt at a BSD implementation, after having received input from
+** Alexander M. Tahk <tahk@MIT.EDU>, who went ahead and ported gentoo over.
+** Seems the BSD interface is even less flexible than the ones on Linux and
+** Solaris. Big deal.
+*/
+FILE * mne_setmntent(const gchar *filename)
+{
+ /* This is possibly incredibly annoying and useless, but I feel serious today. :) */
+ if((strcmp(filename, "/etc/fstab") != 0) || (strcmp(filename, "/etc/mtab") != 0))
+ g_warning("mntent_wrap.c: Ignoring filename '%s'", filename);
+
+ if(strcmp(filename, "/etc/fstab") == 0) /* Looking for available filesystems? */
+ {
+ if(setfsent() == 1)
+ return &f_fstab;
+ }
+ else if(strcmp(filename, "/proc/mtab") == 0) /* Looking for mounted filesystems? */
+ {
+ if((mtab_num = getmntinfo(&mtab, 0)) > 0)
+ {
+ mtab_pos = 0;
+ return &f_mtab;
+ }
+ }
+ return NULL;
+}
+
+/* 1999-05-09 - Get another entry of data, either about mounted (filep == &f_mtab) or available
+** (filep == &f_fstab) filesystems. Returns NULL when the respective data source
+** is exhausted.
+*/
+const MntEnt * mne_getmntent(FILE *filep)
+{
+ static MntEnt me;
+
+ if(filep == &f_fstab)
+ {
+ struct fstab *ment;
+
+ if((ment = getfsent()) != NULL)
+ {
+ me.fsname = ment->fs_spec;
+ me.dir = ment->fs_file;
+ return &me;
+ }
+ }
+ else if(filep == &f_mtab)
+ {
+ if(mtab_pos == mtab_num) /* Array exhausted? */
+ return NULL;
+ me.fsname = mtab[mtab_pos].f_mntfromname;
+ me.dir = mtab[mtab_pos].f_mntonname;
+ mtab_pos++;
+ return &me;
+ }
+ else
+ g_warning("MNTENT: Bad pointer to mnt_getmntent() (%p)", filep);
+
+ return NULL;
+}
+
+/* 1999-05-09 - Stop traversing mount/fs data. */
+gint mne_endmntent(FILE *filep)
+{
+ if(filep == &f_fstab)
+ endfsent();
+
+ return 0;
+}
+
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Functions below are platform independant. Nice. */
+
+/* 1999-01-27 - Create a copy of <src>, using dynamically allocated memory. The
+** copy is done so that a) it shares no memory with <src>, and b)
+** it is contigous, because that is nice. :)
+*/
+MntEnt * mne_copy(const MntEnt *src)
+{
+ MntEnt *ne = NULL;
+ gsize s_fs, s_dir;
+
+ if(src != NULL)
+ {
+ s_fs = strlen(src->fsname) + 1;
+ s_dir = strlen(src->dir) + 1;
+ ne = g_malloc(sizeof *ne + s_fs + s_dir);
+ ne->fsname = (gchar *) (ne + 1);
+ ne->dir = (gchar *) (ne + 1) + s_fs;
+ strcpy(ne->fsname, src->fsname);
+ strcpy(ne->dir, src->dir);
+ }
+ return ne;
+}
+
+/* 1999-01-27 - Destroy (free) a previously created mount entry descriptor. You can
+** only call this with entries created by mne_copy() above.
+*/
+void mne_destroy(MntEnt *me)
+{
+ if(me != NULL)
+ g_free(me); /* Thanks to funky g_malloc()ing, I can do this. */
+}
+
+/* 1999-01-27 - Return a pointer to a string giving the full path of the entry's mount
+** point.
+*/
+const gchar * mne_get_mountpoint(const MntEnt *me)
+{
+ return me ? me->dir : NULL;
+}
+
+/* 1999-01-27 - Return pointer to string giving the device the entry describes. */
+const gchar * mne_get_device(const MntEnt *me)
+{
+ return me ? me->fsname : NULL;
+}
diff --git a/src/mntent_wrap.h b/src/mntent_wrap.h
new file mode 100644
index 0000000..5b46898
--- /dev/null
+++ b/src/mntent_wrap.h
@@ -0,0 +1,53 @@
+/*
+** 1999-01-27 - Wrapper around the mntent API functions. These are used to parse system
+** databases holding information about filesystems that can be mounted, and
+** that are mounted. Needs to be wrapped since it seems to differ wildly
+** between various OSs (e.g. between Linux and Solaris).
+*/
+
+#if !defined GENTOO_MNTENT_H
+#define GENTOO_MNTENT_H
+
+#include <stdio.h>
+
+/* Contains (at least) one (device,mountpoint) pair. Opaque, use accessor functions
+** declared below to manipulate.
+*/
+typedef struct MntEnt MntEnt;
+
+/* The following three calls need platform-specific implementations. ----------------------- */
+
+/* Open database file. Some platforms might ignore the <filename>. If a FILE * is not
+** the most handy datatype for your platform, feel free to return some other pointer.
+** Hm, this should probably be rewritten to use a gpointer instead of a FILE pointer...
+*/
+FILE * mne_setmntent(const gchar *filename);
+
+/* Get next mount entry from file. Returns NULL if there are no more entries available.
+** The entry returned is strictly read-only, and lives in static memory, so it will change
+** with the next (successful) call. To keep it, use mne_copy() to create a copy of it.
+*/
+const MntEnt * mne_getmntent(FILE *filep);
+
+/* Call this when you're done scanning the database, to close it down properly. */
+gint mne_endmntent(FILE *filep);
+
+/* The rest of the calls are platform-neutral. --------------------------------------------- */
+
+/* Create a copy of <src>, in dynamically allocated memory. Returns a pointer to
+** the copy, or NULL on failure. The copy shares no memory with the original.
+*/
+MntEnt * mne_copy(const MntEnt *src);
+
+/* Destroy a MntEnt, freeing all memory used by it. Only valid on entries created
+** by mne_copy().
+*/
+void mne_destroy(MntEnt *me);
+
+/* Return a pointer to a string containing the mountpoint path for the given entry (e.g. "/cdrom"). */
+const gchar * mne_get_mountpoint(const MntEnt *me);
+
+/* Return pointer to a string with device name for given mount entry (e.g. "/dev/hdc"). */
+const gchar * mne_get_device(const MntEnt *me);
+
+#endif
diff --git a/src/nag_dialog.c b/src/nag_dialog.c
new file mode 100644
index 0000000..1c094b2
--- /dev/null
+++ b/src/nag_dialog.c
@@ -0,0 +1,51 @@
+/*
+** 2009-12-28 - This is the implementation of the brand-new "nag" dialog. The first intended use is to
+** allow a bit friendlier indication of deprecated/removed commands, by keeping them listed
+** and replacing the body with a call here.
+*/
+
+#include "gentoo.h"
+
+#include "cfg_nag.h"
+#include "configure.h"
+#include "dialog.h"
+
+#include "nag_dialog.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+gboolean ndl_dialog_sync_new_wait(MainInfo *min, const gchar *tag, const gchar *title, const gchar *body)
+{
+ GtkWidget *vbox, *wid, *ignore;
+ gboolean ret = FALSE;
+ Dialog *dlg;
+
+ if(cng_is_ignored(&min->cfg.nag, tag))
+ return TRUE;
+
+ /* Not already ignored, so build and present dialog. */
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ wid = gtk_label_new(NULL);
+ gtk_label_set_width_chars(GTK_LABEL(wid), 60);
+ gtk_label_set_justify(GTK_LABEL(wid), GTK_JUSTIFY_LEFT);
+ gtk_label_set_line_wrap(GTK_LABEL(wid), TRUE);
+ gtk_label_set_line_wrap_mode(GTK_LABEL(wid), PANGO_WRAP_WORD);
+ gtk_label_set_markup(GTK_LABEL(wid), body);
+ gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 0);
+ ignore = gtk_check_button_new_with_mnemonic(_("_Don't show this dialog again"));
+ gtk_box_pack_start(GTK_BOX(vbox), ignore, FALSE, FALSE, 5);
+
+ dlg = dlg_dialog_sync_new(vbox, title, _("OK"));
+ dlg_dialog_sync_wait(dlg);
+
+ /* The widgets are still around, so check directly if check button was checked. */
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ignore)))
+ {
+ cng_ignore(&min->cfg.nag, tag);
+ cfg_modified_set(min);
+ ret = TRUE;
+ }
+ dlg_dialog_sync_destroy(dlg);
+
+ return ret;
+}
diff --git a/src/nag_dialog.h b/src/nag_dialog.h
new file mode 100644
index 0000000..ee6847b
--- /dev/null
+++ b/src/nag_dialog.h
@@ -0,0 +1,7 @@
+/*
+** This module implements a dialog that can "nag" the user, but also remember if the user
+** really doesn't want to be nagged at any more. It remembers this separately for each
+** thing we nag about, as is common these days.
+*/
+
+extern gboolean ndl_dialog_sync_new_wait(MainInfo *min, const gchar *tag, const gchar *title, const gchar *body);
diff --git a/src/odmultibutton.c b/src/odmultibutton.c
new file mode 100644
index 0000000..509ab4a
--- /dev/null
+++ b/src/odmultibutton.c
@@ -0,0 +1,554 @@
+/*
+** Custom button widget, that supports having a secondary click-function associated with being
+** clicked by the middle mouse button. Very much inspired by Directory Opus on the Amiga.
+**
+** Original GTK+ 1.2.x version by Johan Hanson, re-written for GTK+ 2.0 and 3.0 by Emil Brink.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include "odmultibutton.h"
+
+static void od_multibutton_class_init(ODMultiButtonClass *mbc);
+static void od_multibutton_init(ODMultiButton *mb);
+
+/* This seems to be customary in GTK+-land. I find it a bit... weird. */
+static GtkButtonClass *button_class = NULL;
+
+void od_multibutton_set_trace(ODMultiButton *widget, unsigned int trace_mask)
+{
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(widget));
+
+ widget->trace_mask = trace_mask;
+}
+
+GType od_multibutton_get_type(void)
+{
+ static GType od_multibutton_type = 0;
+
+ if(od_multibutton_type == 0)
+ {
+ static const GTypeInfo mb_info =
+ {
+ sizeof (ODMultiButtonClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) od_multibutton_class_init,
+ NULL,
+ NULL,
+ sizeof (ODMultiButton),
+ 8,
+ (GInstanceInitFunc) od_multibutton_init,
+ };
+ od_multibutton_type = g_type_register_static(GTK_TYPE_BUTTON, "ODMultiButton", &mb_info, 0);
+ }
+ return od_multibutton_type;
+}
+
+/* Set which "page" should be displayed. Typically called as user clicks on the button widget. */
+static void od_multibutton_set_page(GtkWidget *widget, guint index)
+{
+ ODMultiButton *mb;
+ GtkWidget *p, *op;
+
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(index < sizeof mb->page / sizeof *mb->page);
+ g_return_if_fail(OD_IS_MULTIBUTTON(widget));
+
+ mb = OD_MULTIBUTTON(widget);
+
+ p = mb->page[index].widget;
+ op = gtk_bin_get_child(GTK_BIN(mb));
+
+ if(op != p)
+ {
+ if(op != NULL)
+ {
+ g_object_ref(G_OBJECT(op));
+ gtk_container_remove(GTK_CONTAINER(mb), op);
+ }
+ if(p != NULL)
+ {
+ GtkWidget *pparent = gtk_widget_get_parent(p);
+
+ if(gtk_widget_get_state_flags(widget) != gtk_widget_get_state_flags(p))
+ gtk_widget_set_state_flags(p, gtk_widget_get_state_flags(widget), TRUE);
+ gtk_widget_show(p);
+ if(pparent != NULL)
+ {
+ /* Manual reparenting. Semi-legacy code, not sure when this is needed at all. :/ */
+ g_object_ref(p);
+ gtk_container_remove(GTK_CONTAINER(pparent), p);
+ gtk_container_add(GTK_CONTAINER(widget), p);
+ g_object_unref(p);
+ }
+ else
+ {
+ gtk_container_add(GTK_CONTAINER(mb), p);
+ g_object_unref(G_OBJECT(p));
+ }
+ }
+ mb->last_index = index;
+ }
+ if(gtk_widget_is_drawable(widget))
+ gtk_widget_queue_draw(widget);
+}
+
+/* Compute size of the page widgets, and set width & height members to the maximum page size. */
+static void od_multibutton_page_size_calc(ODMultiButton *mb)
+{
+ guint i;
+
+ mb->width = mb->height = 0;
+ for(i = 0; i < sizeof mb->page / sizeof *mb->page; i++)
+ {
+ GtkWidget *w;
+
+ if((w = mb->page[i].widget) != NULL)
+ {
+ GtkRequisition req_min, req_max;
+
+ gtk_widget_get_preferred_size(w, &req_min, &req_max);
+ mb->width = MAX(mb->width, req_min.width);
+ mb->height = MAX(mb->height, req_min.height);
+ }
+ }
+}
+
+static void od_multibutton_get_preferred_width(GtkWidget *widget, gint *min_width, gint *max_width)
+{
+ ODMultiButton *mb;
+ gint width;
+
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(widget));
+
+ mb = OD_MULTIBUTTON(widget);
+ od_multibutton_page_size_calc(mb);
+ width = mb->width;
+
+ width += 2 * gtk_container_get_border_width(GTK_CONTAINER(widget));
+ /* FIXME: Not sure if we need to dig up CSS box model spacing here (margin/padding). */
+
+ if(min_width != NULL)
+ *min_width = width;
+ if(max_width != NULL)
+ *max_width = width;
+}
+
+/* Paint the "dog ear" that indicates second-mouse-button binding. This code is pretty much lifted
+** from Johan Hanson's original ODEmilButton widget, although not a straight copy and paste.
+*/
+static void od_multibutton_paint_dog_ear(GtkWidget *widget, cairo_t *cr, const GtkAllocation *alloc, gint bw)
+{
+ const GtkStateFlags sflags = gtk_widget_get_state_flags(widget);
+
+ if(gtk_widget_is_drawable(widget) && sflags != GTK_STATE_FLAG_ACTIVE)
+ {
+ const gint EAR_SIZE = 5;
+
+ cairo_move_to(cr, alloc->width - 2 * bw - (EAR_SIZE + 1), 0);
+ cairo_rel_line_to(cr, 0, EAR_SIZE);
+ cairo_rel_line_to(cr, EAR_SIZE, 0);
+ cairo_close_path(cr);
+ cairo_set_line_width(cr, 0.5);
+ cairo_stroke(cr);
+ }
+}
+
+static void od_multibutton_paint_foreground(GtkWidget *widget, cairo_t *cr)
+{
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(cr != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(widget));
+
+ if(gtk_widget_is_drawable(widget))
+ {
+ const ODMultiButton *mb = OD_MULTIBUTTON(widget);
+ GtkAllocation alloc;
+ const gint bw = gtk_container_get_border_width(GTK_CONTAINER(widget));
+
+ gtk_widget_get_allocation(widget, &alloc);
+ if(mb->page[1].widget != NULL)
+ od_multibutton_paint_dog_ear(widget, cr, &alloc, bw);
+ if(mb->config && mb->config_down)
+ {
+ GtkStyleContext *sctx = gtk_widget_get_style_context(widget);
+
+ /* Trivial border-rendering, instead of faked sunken-in. */
+ gtk_render_focus(sctx, cr, 0, 0, alloc.width - 2 * bw, alloc.height - 2 * bw);
+ }
+ }
+}
+
+
+/* This is the core expose handler. It simply relies on the superclass (GtkButton) to do most
+** of the drawing, taking care to fool it into doing what we want by poking a little. We also
+** have our own foreground painting routine, for that oh-so-cute dog ear.
+*/
+static gboolean od_multibutton_draw(GtkWidget *widget, cairo_t *cr)
+{
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(cr != NULL, FALSE);
+ g_return_val_if_fail(OD_IS_MULTIBUTTON(widget), FALSE);
+
+ /* First let GtkButton draw, getting the basic button painted. */
+ GTK_WIDGET_CLASS(button_class)->draw(widget, cr);
+ /* Then paint our own modifying graphics on top, to get the dog ear and config border. */
+ od_multibutton_paint_foreground(widget, cr);
+
+ return FALSE;
+}
+
+/* (Mouse) button press handler. Switch to page 2 if it's the middle button. */
+static gboolean od_multibutton_button_press_event(GtkWidget *widget, GdkEventButton *evt)
+{
+ ODMultiButton *mb;
+
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(evt != NULL, FALSE);
+ g_return_val_if_fail(OD_IS_MULTIBUTTON(widget), FALSE);
+
+ if(evt->button >= 3)
+ return FALSE;
+
+ mb = OD_MULTIBUTTON(widget);
+
+ /* Ignore presses of middle button in config mode. Otherwise, don't be picky about page being defined. */
+ if(mb->config)
+ {
+ if(evt->button > 1)
+ return FALSE;
+ }
+ else if(mb->page[evt->button - 1].widget != NULL)
+ {
+ od_multibutton_set_page(widget, evt->button - 1);
+ /* GtkButton only handles button-1-presses, so fool it. :) */
+ evt->button = 1;
+ }
+ else
+ return FALSE;
+ return GTK_WIDGET_CLASS(button_class)->button_press_event(widget, evt);
+}
+
+/* (Mouse) button release handler. Doesn't do much. */
+static gboolean od_multibutton_button_release_event(GtkWidget *widget, GdkEventButton *evt)
+{
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(evt != NULL, FALSE);
+ g_return_val_if_fail(OD_IS_MULTIBUTTON(widget), FALSE);
+
+ if(evt->button > 2)
+ return FALSE;
+
+ /* In config mode, toggle lock on release. */
+ if(OD_MULTIBUTTON(widget)->config)
+ {
+ if(evt->button > 1)
+ return FALSE;
+ OD_MULTIBUTTON(widget)->config_down ^= 1/*GTK_BUTTON(widget)->in_button*/; /*FIXME?*/
+ }
+
+ /* GtkButton wants to believe button 1 was pressed, so let's make it so. */
+ evt->button = 1;
+ GTK_WIDGET_CLASS(button_class)->button_release_event(widget, evt);
+ /* Reset to initial page. */
+ od_multibutton_set_page(widget, 0);
+
+ return FALSE;
+}
+
+/* Initialize class. */
+static void od_multibutton_class_init(ODMultiButtonClass *mbc)
+{
+ GtkWidgetClass *widget = (GtkWidgetClass *) mbc;
+
+ /* It seems common practice to keep a superclass reference around as a global. */
+ button_class = g_type_class_peek_parent(mbc);
+
+ /* Override methods. */
+ widget->draw = od_multibutton_draw;
+ widget->get_preferred_width = od_multibutton_get_preferred_width;
+
+ widget->button_press_event = od_multibutton_button_press_event;
+ widget->button_release_event = od_multibutton_button_release_event;
+}
+
+/* Initialize a brand new multibutton instance. */
+static void od_multibutton_init(ODMultiButton *mb)
+{
+ guint i;
+
+ gtk_widget_set_can_focus(GTK_WIDGET(mb), FALSE);
+ gtk_widget_set_can_default(GTK_WIDGET(mb), FALSE);
+ gtk_widget_set_receives_default(GTK_WIDGET(mb), FALSE);
+
+ for(i = 0; i < sizeof mb->page / sizeof *mb->page; i++)
+ {
+ mb->page[i].widget = NULL;
+ mb->page[i].user = NULL;
+ }
+ mb->width = mb->height = 0;
+ mb->config = FALSE;
+ mb->config_down = FALSE;
+ mb->last_index = 0;
+}
+
+/* I like GTK+ 2 constructors. They're short and sweet, and just pass the buck. */
+GtkWidget * od_multibutton_new(void)
+{
+ return g_object_new(OD_MULTIBUTTON_TYPE, NULL);
+}
+
+/* Enable or disable the special togglebutton-like "configuration mode". Used in gentoo's config UI. */
+void od_multibutton_set_config(ODMultiButton *mb, gboolean config)
+{
+ g_return_if_fail(mb != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(mb));
+
+ if(mb->config && !config)
+ od_multibutton_set_config_selected(mb, FALSE);
+ mb->config = config;
+}
+
+/* Set the config toggle state. In practice (in gentoo), this is only ever used to deselect a button. */
+void od_multibutton_set_config_selected(ODMultiButton *mb, gboolean selected)
+{
+ g_return_if_fail(mb != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(mb));
+ g_return_if_fail(OD_MULTIBUTTON(mb)->config);
+
+ if(mb->config && selected != mb->config_down)
+ {
+ mb->config_down = selected;
+ gtk_widget_queue_draw(GTK_WIDGET(mb));
+ }
+}
+
+static void od_multibutton_remove_widget(ODMultiButton *mb, guint index)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail(mb != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(mb));
+ g_return_if_fail(index > sizeof mb->page / sizeof *mb->page);
+
+ widget = mb->page[index].widget;
+ if(gtk_bin_get_child(GTK_BIN(mb)) == widget)
+ gtk_container_remove(GTK_CONTAINER(mb), widget);
+ else
+ g_object_unref(G_OBJECT(widget));
+ gtk_widget_queue_draw(GTK_WIDGET(mb));
+}
+
+static void od_multibutton_set_widget(ODMultiButton *mb, guint index, GtkWidget *widget, gpointer user)
+{
+ g_return_if_fail(mb != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(mb));
+ g_return_if_fail(index < sizeof mb->page / sizeof *mb->page);
+
+ if(mb->page[index].widget != widget)
+ {
+ if(mb->page[index].widget != NULL)
+ od_multibutton_remove_widget(mb, index);
+
+ mb->page[index].widget = widget;
+ g_object_ref(G_OBJECT(widget));
+ }
+ mb->page[index].user = user;
+
+ if(index == 0)
+ od_multibutton_set_page(GTK_WIDGET(mb), 0);
+}
+
+/* Build a color attribute, suitable for a Pango markup <span> element, of the given name. */
+static gboolean format_color_attribute(gchar *buf, gsize bufsize, const gchar *name, const GdkColor *color)
+{
+ if(buf == NULL || name == NULL || color == NULL)
+ return FALSE;
+ return g_snprintf(buf, bufsize, "%s=\"#%02X%02X%02X\"",
+ name, color->red >> 8, color->green >> 8, color->blue >> 8) < bufsize;
+}
+
+/* Re-set the label text for the given button's indicated face. This rebuilds the formatting
+** markup in the label to accomodate colors, if set.
+*/
+static void od_multibutton_reset_label(const ODMultiButton *mb, guint index, GtkLabel *label, const gchar *text, const GdkColor *bg, const GdkColor *fg)
+{
+ if(bg != NULL || fg != NULL)
+ {
+ gchar tmp[1024], bga[32], fga[32];
+
+ /* Warm up by building attributes. */
+ bga[0] = fga[0] = '\0';
+ if(bg != NULL)
+ format_color_attribute(bga, sizeof bga, " background", bg);
+ if(fg != NULL)
+ format_color_attribute(fga, sizeof fga, " color", fg);
+ /* Then build final label, ignoring any incoming span. Non-used colors are empty. */
+ g_snprintf(tmp, sizeof tmp, "<span%s%s>%s</span>", fga, bga, text);
+ gtk_label_set_markup_with_mnemonic(label, tmp);
+ }
+ else
+ gtk_label_set_text_with_mnemonic(label, text);
+}
+
+/* Set the textual content of one of the faces of the button. The userdata is handy when clicked. */
+void od_multibutton_set_text(ODMultiButton *mb, guint index, const gchar *text, const GdkColor *bg, const GdkColor *fg, gpointer user)
+{
+ GtkWidget *w;
+
+ g_return_if_fail(mb != NULL);
+ g_return_if_fail(OD_IS_MULTIBUTTON(mb));
+ g_return_if_fail(index < sizeof mb->page / sizeof *mb->page);
+
+ /* If there is a widget set, and it's a label: just change it in place. */
+ if((w = mb->page[index].widget) != NULL)
+ {
+ if(GTK_IS_LABEL(w))
+ {
+ od_multibutton_reset_label(mb, index, GTK_LABEL(w), text, bg, fg);
+ if(gtk_widget_get_parent(GTK_WIDGET(mb)))
+ gtk_widget_queue_resize(GTK_WIDGET(mb));
+ if(gtk_widget_is_drawable(GTK_WIDGET(mb)))
+ gtk_widget_queue_draw(GTK_WIDGET(mb));
+ }
+ }
+ else /* If no widget set, create label. */
+ {
+ w = gtk_label_new("");
+ od_multibutton_reset_label(mb, index, GTK_LABEL(w), text, bg, fg);
+ }
+ if(GTK_IS_LABEL(w))
+ {
+ gtk_label_set_xalign(GTK_LABEL(w), 0.5f);
+ gtk_label_set_yalign(GTK_LABEL(w), 0.5f);
+ }
+ od_multibutton_set_widget(mb, index, w, user);
+}
+
+/* Returns index of last active page. */
+gint od_multibutton_get_index(const ODMultiButton *mb)
+{
+ g_return_val_if_fail(mb != NULL, -1);
+ g_return_val_if_fail(OD_IS_MULTIBUTTON(mb), -1);
+
+ return OD_MULTIBUTTON(mb)->last_index;
+}
+
+gpointer od_multibutton_get_userdata_last(const ODMultiButton *mb)
+{
+ g_return_val_if_fail(mb != NULL, NULL);
+ g_return_val_if_fail(OD_IS_MULTIBUTTON(mb), NULL);
+
+ return OD_MULTIBUTTON(mb)->page[OD_MULTIBUTTON(mb)->last_index].user;
+}
+
+/* ------------------------------------------------------------------------------------------------------------------------- */
+
+#if defined ODMULTIBUTTON_STANDALONE
+
+static void evt_clicked(GtkWidget *wid, gpointer user)
+{
+ g_printf("clicked, index=%d, data=%p\n", od_multibutton_get_index(OD_MULTIBUTTON(wid)),
+ od_multibutton_get_userdata_last(OD_MULTIBUTTON(wid)));
+}
+
+static void mb_random_color(GtkWidget *wid, unsigned int face)
+{
+ GdkColor col;
+
+ col.red = rand();
+ col.green = rand();
+ col.blue = rand();
+ od_multibutton_set_background(OD_MULTIBUTTON(wid), face, &col);
+}
+
+static void evt_color_clicked(GtkWidget *wid, gpointer user)
+{
+ mb_random_color(user, 0);
+ mb_random_color(user, 1);
+}
+
+static void evt_clear_clicked(GtkWidget *wid, gpointer user)
+{
+ od_multibutton_set_config_selected(OD_MULTIBUTTON(user), FALSE);
+}
+
+static void evt_exit_config_clicked(GtkWidget *wid, gpointer user)
+{
+ od_multibutton_set_config(OD_MULTIBUTTON(user), FALSE);
+}
+
+int main(int argc, char *argv[])
+{
+ GtkWidget *win, *box, *test, *btn;
+ GdkColormap *cmap;
+ guint i;
+
+ gtk_init(&argc, &argv);
+
+ win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ box = gtk_hbox_new(FALSE, 0);
+
+ btn = gtk_button_new_with_label("Filler");
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+
+ test = od_multibutton_new();
+ od_multibutton_set_config(OD_MULTIBUTTON(test), TRUE);
+// gtk_container_set_border_width(GTK_CONTAINER(test), 5);
+// od_multibutton_set_widget_text(OD_MULTIBUTTON(test), 0, "Achtung", NULL);
+ od_multibutton_set_widget_text(OD_MULTIBUTTON(test), 0, "Delete", NULL);
+ od_multibutton_set_widget_text(OD_MULTIBUTTON(test), 1, "Copy <span color=\"#ff0000\">As</span>", NULL);
+ g_signal_connect(G_OBJECT(test), "clicked", G_CALLBACK(evt_clicked), NULL);
+ gtk_box_pack_start(GTK_BOX(box), test, TRUE, TRUE, 0);
+
+ btn = gtk_button_new_with_label("Random Color");
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_color_clicked), test);
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+
+ btn = gtk_button_new_with_label("Clear Lock");
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_clear_clicked), test);
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+
+ {
+ GtkWidget *btn, *evb, *lab;
+ GdkColor test;
+
+ lab = gtk_label_new("Event Test");
+ evb = gtk_event_box_new();
+ gtk_container_add(GTK_CONTAINER(evb), lab);
+ gdk_color_parse("red", &test);
+ gtk_widget_modify_bg(evb, GTK_STATE_NORMAL, &test);
+ gtk_widget_modify_bg(evb, GTK_STATE_PRELIGHT, &test);
+ gtk_widget_modify_bg(evb, GTK_STATE_ACTIVE, &test);
+ btn = gtk_button_new();
+ gtk_container_add(GTK_CONTAINER(btn), evb);
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+ }
+
+/* btn = od_multibutton_new();
+ od_multibutton_set_config(OD_MULTIBUTTON(btn), TRUE);
+ od_multibutton_set_widget_text(OD_MULTIBUTTON(btn), 0, "Test Test", NULL);
+ mb_random_colors(btn, 0);
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+*/
+ btn = gtk_button_new_with_label("Exit Config");
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_exit_config_clicked), test);
+ gtk_box_pack_start(GTK_BOX(box), btn, TRUE, TRUE, 0);
+
+ gtk_container_add(GTK_CONTAINER(win), box);
+
+ gtk_widget_show_all(win);
+ gtk_main();
+
+ return EXIT_SUCCESS;
+}
+
+#endif /* ODMULTIBUTTON_STANDALONE */
diff --git a/src/odmultibutton.h b/src/odmultibutton.h
new file mode 100644
index 0000000..7f3f136
--- /dev/null
+++ b/src/odmultibutton.h
@@ -0,0 +1,62 @@
+/*
+** odmultibutton - A two-faced button widget.
+**
+** An attempt at writing a GTK+ button widget, for gentoo. This is a GTK+ 2.x
+** rewrite from scratch, by Emil Brink. The original widget, called ODEmilButton,
+** was done by Johan Hanson, but this is not a mere "port" of his code, it's a
+** complete re-write, although "white box" in nature.
+**
+*/
+
+#if !defined OD_MULTIBUTTON_H
+#define OD_MULTIBUTTON_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define OD_MULTIBUTTON_TYPE (od_multibutton_get_type())
+#define OD_MULTIBUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), OD_MULTIBUTTON_TYPE, ODMultiButton))
+#define OD_MULTIBUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), OD_MULTIBUTTON_TYPE, ODMultiButtonClass))
+#define OD_IS_MULTIBUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), OD_MULTIBUTTON_TYPE))
+#define OD_IS_MULTIBUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), OD_MULTIBUTTON_TYPE))
+
+typedef struct
+{
+ GtkWidget *widget;
+ gpointer user;
+} MultiButtonPage;
+
+typedef struct
+{
+ GtkButton button;
+ /* This stuff really is private. */
+ MultiButtonPage page[2];
+ guint width, height;
+
+ gboolean config;
+ gboolean config_down; /* Used in config mode, for toggle button action. */
+ guint last_index;
+
+ guint trace_mask;
+} ODMultiButton;
+
+typedef struct
+{
+ GtkButtonClass parent_class;
+} ODMultiButtonClass;
+
+extern GType od_multibutton_get_type(void);
+
+extern GtkWidget * od_multibutton_new(void);
+extern void od_multibutton_set_trace(ODMultiButton *mb, unsigned int trace_mask);
+extern void od_multibutton_set_config(ODMultiButton *mb, gboolean config);
+extern void od_multibutton_set_config_selected(ODMultiButton *mb, gboolean selected);
+extern void od_multibutton_set_text(ODMultiButton *mb, guint index, const gchar *text,
+ const GdkColor *bg, const GdkColor *fg, gpointer user);
+extern gint od_multibutton_get_index(const ODMultiButton *mb);
+extern gpointer od_multibutton_get_userdata_last(const ODMultiButton *mb);
+
+G_END_DECLS
+
+#endif /* OD_MULTIBUTTON_H */
diff --git a/src/overwrite.c b/src/overwrite.c
new file mode 100644
index 0000000..8133bd1
--- /dev/null
+++ b/src/overwrite.c
@@ -0,0 +1,143 @@
+/*
+** 1998-09-17 - A module to deal with the (possible) overwriting of files, and warn the user
+** when that is about to happen. Deleting a file is considered to be an overwrite.
+** Changing protection bits and owner info is not.
+** 1999-03-13 - Changes for the new dialog module.
+** 1999-06-12 - Added "Skip All" button.
+** 2001-01-01 - Added simplistic (and most likely insufficient) recursion-detection.
+** 2003-11-23 - Now tells caller if collision was with directory or file.
+*/
+
+#include "gentoo.h"
+#include "dialog.h"
+#include "dirpane.h"
+#include "errors.h"
+#include "strutil.h"
+#include "fileutil.h"
+#include "overwrite.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static struct {
+ guint level;
+ gboolean do_all; /* Gets set when user clicks "All". */
+ gboolean skip_all; /* Gets set when user clicks "Skip All". */
+ MainInfo *min;
+ const gchar *fmt;
+ guint32 flags;
+ GtkWidget *label;
+ Dialog *dlg;
+} ovw_info = { 0U }; /* Makes sure <level> is 0 on first call. */
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-17 - Begin a "session" with overwrite protection. The <fmt> string is used in a
+** call to sprintf() with the destination file as argument if we need to inform
+** the user. Very handy. Calls to this function REALLY should nest with calls to
+** ovw_overwrite_end()! Or else.
+*/
+void ovw_overwrite_begin(MainInfo *min, const gchar *fmt, guint32 flags)
+{
+ if(ovw_info.level == 0)
+ {
+ ovw_info.do_all = FALSE;
+ ovw_info.skip_all = FALSE;
+ ovw_info.min = min;
+ ovw_info.fmt = fmt;
+ ovw_info.flags = flags;
+ ovw_info.label = gtk_label_new("");
+ ovw_info.dlg = dlg_dialog_sync_new(ovw_info.label, _("Please Confirm"), _("_OK|A_ll|_Skip|Skip _All|_Cancel"));
+ }
+ else
+ fprintf(stderr, "OVERWRITE: Mismatched call (level=%d)!\n", ovw_info.level);
+ ovw_info.level++;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static OvwRes proceed_file(GFileInfo *fi)
+{
+ return g_file_info_get_file_type(fi) == G_FILE_TYPE_DIRECTORY ? OVW_PROCEED_DIR : OVW_PROCEED_FILE;
+}
+
+OvwRes ovw_overwrite_unary_file(DirPane *dst, const GFile *dst_file)
+{
+ GFileInfo *fi;
+ OvwRes res = OVW_PROCEED;
+
+ /* If overwrite-checking has not even begun, abort abort. */
+ if(ovw_info.level == 0)
+ return OVW_CANCEL;
+
+ if(dst_file == NULL)
+ return OVW_PROCEED;
+
+ if((fi = g_file_query_info((GFile *) dst_file, "standard::*", 0, NULL, NULL)) != NULL)
+ {
+ gchar buf[PATH_MAX + 2048], *dn;
+ gint dlg_res;
+
+ if(ovw_info.do_all) /* Already answered "All"? */
+ res = proceed_file(fi);
+ else if(ovw_info.skip_all) /* Already answered "Skip All"? */
+ res = OVW_SKIP;
+ else
+ {
+ dn = g_file_get_parse_name((GFile *) dst_file);
+ g_snprintf(buf, sizeof buf, ovw_info.fmt, dn);
+ g_free(dn);
+ gtk_label_set_text(GTK_LABEL(ovw_info.label), buf);
+
+ dlg_res = dlg_dialog_sync_wait(ovw_info.dlg);
+ switch(dlg_res)
+ {
+ case DLG_POSITIVE: /* OK ? */
+ res = proceed_file(fi);
+ break;
+ case 1: /* All? */
+ ovw_info.do_all = TRUE;
+ res = proceed_file(fi);
+ break;
+ case 2: /* Skip? */
+ res = OVW_SKIP;
+ break;
+ case 3:
+ ovw_info.skip_all = TRUE;
+ res = OVW_SKIP;
+ break;
+ default:
+ res = OVW_CANCEL;
+ }
+ }
+ g_object_unref(fi);
+
+ return res;
+ }
+ return OVW_PROCEED;
+}
+
+OvwRes ovw_overwrite_unary_name(DirPane *dst, const gchar *dst_name)
+{
+ OvwRes res = OVW_PROCEED;
+ GFile *file;
+
+ if((file = dp_get_file_from_name(dst, dst_name)) != NULL)
+ {
+ res = ovw_overwrite_unary_file(dst, file);
+ g_object_unref(file);
+ }
+ return res;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void ovw_overwrite_end(MainInfo *min)
+{
+ if(--ovw_info.level == 0)
+ {
+ ovw_info.min = NULL;
+ ovw_info.fmt = NULL;
+ dlg_dialog_sync_destroy(ovw_info.dlg);
+ ovw_info.dlg = NULL;
+ }
+}
diff --git a/src/overwrite.h b/src/overwrite.h
new file mode 100644
index 0000000..9736edf
--- /dev/null
+++ b/src/overwrite.h
@@ -0,0 +1,13 @@
+/*
+** 1998-09-17 - Header for the overwrite protection system. Sounds cool, eh?
+*/
+
+enum { OVWF_NO_RECURSE_TEST = 1 << 0 };
+
+typedef enum { OVW_SKIP, OVW_PROCEED, OVW_PROCEED_FILE, OVW_PROCEED_DIR, OVW_CANCEL } OvwRes;
+
+extern void ovw_overwrite_begin(MainInfo *min, const gchar *desc, guint32 flags);
+extern OvwRes ovw_overwrite_file(MainInfo *min, const gchar *old_file, const gchar *new_file);
+extern OvwRes ovw_overwrite_unary_name(DirPane *dst, const gchar *dst_name);
+extern OvwRes ovw_overwrite_unary_file(DirPane *dst, const GFile *dst_file);
+extern void ovw_overwrite_end(MainInfo *min);
diff --git a/src/progress.c b/src/progress.c
new file mode 100644
index 0000000..fabbae4
--- /dev/null
+++ b/src/progress.c
@@ -0,0 +1,384 @@
+/*
+** 1998-09-29 - This is a Russion space shuttle. It is also the module responsible for
+** reporting various commands' progress to the user, and providing a nice
+** way of aborting commands prematurely.
+** 1999-01-30 - Now cancels operation if ESCape is hit. Pretty convenient.
+** 1999-03-05 - Adapted for new selection management. Also fixes a couple of minor bugs.
+** 2000-07-16 - Operation can now be cancelled by closing the progress window.
+*/
+
+#include "gentoo.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "dirpane.h"
+#include "fileutil.h"
+#include "guiutil.h"
+#include "miscutil.h"
+#include "sizeutil.h"
+
+#include "progress.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+static struct {
+ guint level; /* Current begin/end nesting level. Keep first!! */
+ guint32 flags; /* Flags from original progress_begin() call. */
+ GCancellable *cancel; /* This is from the future. */
+ gboolean show_byte; /* Show total bytes progress bar? */
+ gboolean show_item; /* Show the item bar? */
+ gboolean delayed; /* Set to 1 during initial display delay. */
+ guint tot_num; /* Total number of items to process. */
+ guint tot_pos; /* Index of current item. */
+ guint64 byte_tot; /* Total bytes in operation. */
+ guint64 byte_pos; /* Position, in bytes. */
+ gchar name[4 * FILENAME_MAX]; /* Current filename. */
+ off_t item_size; /* Size of current item being processed. */
+ off_t item_pos; /* Position in the item. */
+ GTimeVal time_begin; /* The time when pgs_progress_begin() was called. */
+ guint delay_time; /* Delay until display, in microseconds (!). */
+ guint last_secs; /* Elapsed seconds last time we displayed ETA and stuff. */
+
+ MainInfo *min;
+ GtkWidget *dlg;
+ GtkWidget *body;
+ GtkWidget *tot_pgs;
+
+ GtkWidget *byte_pgs;
+ GtkWidget *byte_high;
+
+ GtkWidget *item;
+ GtkWidget *item_pgs;
+
+ GtkWidget *eta; /* Label for elapsed time, speed, and ETA. */
+} pgs_info = { 0U };
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-30 - Count number of top-level selections.
+** 1998-10-01 - Added size support.
+*/
+static guint count_toplevel_selected(MainInfo *min, guint64 *size)
+{
+ DirPane *dp = min->gui->cur_pane;
+ GSList *slist, *iter;
+ guint num = 0;
+ guint64 dummy;
+
+ if(size == NULL)
+ size = &dummy;
+
+ for(iter = slist = dp_get_selection(dp), *size = 0; iter != NULL; iter = g_slist_next(iter), num++)
+ *size += dp_row_get_size(dp_get_tree_model(dp), iter->data);
+ dp_free_selection(slist);
+
+ return num;
+}
+
+/* 1998-09-30 - Count number of items recursively from all selections.
+** 1998-10-01 - Added size support.
+** 1998-12-20 - Now uses the fut_dir_size() function for the recursive scanning.
+*/
+static guint count_recursive_selected(MainInfo *min, guint64 *size)
+{
+ DirPane *dp = min->gui->cur_pane;
+ GSList *slist, *iter;
+ guint num = 0;
+
+ if(size != NULL)
+ *size = 0U;
+ for(iter = slist = dp_get_selection(dp); iter != NULL; iter = g_slist_next(iter), num++)
+ {
+ if(size)
+ *size += dp_row_get_size(dp_get_tree_model(dp), iter->data);
+ if(dp_row_get_file_type(dp_get_tree_model(dp), iter->data, TRUE) == G_FILE_TYPE_DIRECTORY)
+ {
+ FUCount fu;
+ GFile *dir;
+
+ dir = dp_get_file_from_row(dp, iter->data);
+ if(fut_size_gfile(min, dir, size, &fu, NULL))
+ num += fu.num_total;
+ g_object_unref(dir);
+ }
+ }
+ dp_free_selection(slist);
+
+ return num;
+}
+
+static gint evt_delete(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ g_cancellable_cancel(user);
+ return TRUE;
+}
+
+/* 1998-09-30 - A callback for the big "Cancel" button. */
+static gint evt_cancel_clicked(GtkWidget *wid, gpointer user)
+{
+ g_cancellable_cancel(user);
+ return TRUE;
+}
+
+static gint evt_keypress(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ if(evt->keyval == GDK_KEY_Escape)
+ g_cancellable_cancel(user);
+ return TRUE;
+}
+
+/* 1998-09-30 - Begin a new "session" with progress reporting. */
+void pgs_progress_begin(MainInfo *min, const gchar *op_name, guint32 flags)
+{
+ gchar size_buf[32], buf[128];
+ GtkWidget *cancel, *hbox, *label;
+
+ pgs_info.min = min;
+
+ if(pgs_info.level == 0)
+ {
+ if(flags & PFLG_BUSY_MODE)
+ flags &= PFLG_BUSY_MODE; /* Clear any other flag. */
+
+ pgs_info.flags = flags;
+ pgs_info.show_byte = (flags & PFLG_BYTE_VISIBLE) ? TRUE : FALSE;
+ pgs_info.show_item = (flags & PFLG_ITEM_VISIBLE) ? TRUE : FALSE;
+ pgs_info.delayed = TRUE;
+ pgs_info.delay_time = 250000U;
+ pgs_info.byte_pos = 0;
+ pgs_info.last_secs = 0U;
+
+ if(pgs_info.cancel == NULL)
+ pgs_info.cancel = g_cancellable_new();
+ else
+ g_cancellable_reset(pgs_info.cancel);
+
+ if(flags & PFLG_COUNT_RECURSIVE)
+ pgs_info.tot_num = count_recursive_selected(min, &pgs_info.byte_tot);
+ else
+ pgs_info.tot_num = count_toplevel_selected(min, &pgs_info.byte_tot);
+
+ pgs_info.tot_pos = 0;
+
+ pgs_info.dlg = win_dialog_open(min->gui->window);
+ gtk_widget_set_size_request(pgs_info.dlg, 384, -1);
+ pgs_info.body = gtk_label_new(op_name);
+ g_signal_connect(G_OBJECT(pgs_info.dlg), "delete_event", G_CALLBACK(evt_delete), pgs_info.cancel);
+ g_signal_connect(G_OBJECT(pgs_info.dlg), "key_press_event", G_CALLBACK(evt_keypress), pgs_info.cancel);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), pgs_info.body, FALSE, FALSE, 0);
+
+ if(pgs_info.show_item)
+ {
+ pgs_info.item = gtk_label_new("");
+ gtk_label_set_xalign(GTK_LABEL(pgs_info.item), 0.f);
+ gtk_label_set_yalign(GTK_LABEL(pgs_info.item), 0.5f);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), pgs_info.item, FALSE, FALSE, 5);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ pgs_info.item_pgs = gtk_progress_bar_new();
+ gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(pgs_info.item_pgs), TRUE);
+ gtk_box_pack_start(GTK_BOX(hbox), pgs_info.item_pgs, TRUE, TRUE, 0);
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pgs_info.item_pgs), 0.f);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), hbox, FALSE, FALSE, 0);
+ }
+
+ pgs_info.tot_pgs = gtk_progress_bar_new();
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ if(flags & PFLG_BUSY_MODE)
+ {
+ gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(pgs_info.tot_pgs), 1.f / 10.f);
+ gtk_box_pack_start(GTK_BOX(hbox), pgs_info.tot_pgs, TRUE, TRUE, 0);
+ }
+ else
+ {
+ label = gtk_label_new("0");
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), pgs_info.tot_pgs, TRUE, TRUE, 0);
+ g_snprintf(buf, sizeof buf, "%d", pgs_info.tot_num);
+ label = gtk_label_new(buf);
+ gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(pgs_info.tot_pgs), TRUE);
+ }
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pgs_info.tot_pgs), 0.f);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), hbox, FALSE, FALSE, 0);
+
+ if(pgs_info.show_byte)
+ {
+ sze_put_offset(size_buf, sizeof size_buf, pgs_info.byte_tot, SZE_AUTO, 3, ',');
+ g_snprintf(buf, sizeof buf, _("Total (%s)"), size_buf);
+ label = gtk_label_new(buf);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), label, FALSE, FALSE, 0);
+ pgs_info.byte_pgs = gtk_progress_bar_new();
+ gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(pgs_info.byte_pgs), TRUE);
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), pgs_info.byte_pgs, TRUE, TRUE, 0);
+ }
+ if(!(flags & PFLG_BUSY_MODE))
+ {
+ pgs_info.eta = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(pgs_info.dlg))), pgs_info.eta, FALSE, FALSE, 0);
+ }
+ else
+ pgs_info.eta = NULL;
+ cancel = gtk_button_new_with_label(_("Cancel"));
+ g_signal_connect(G_OBJECT(cancel), "clicked", G_CALLBACK(evt_cancel_clicked), pgs_info.cancel);
+ gtk_dialog_add_action_widget(GTK_DIALOG(pgs_info.dlg), cancel, GTK_RESPONSE_CANCEL);
+
+ g_get_current_time(&pgs_info.time_begin);
+ }
+ else
+ g_warning("pgs_progress_begin() doesn't nest");
+ pgs_info.level++;
+}
+
+GCancellable * pgs_progress_get_cancellable(void)
+{
+ return pgs_info.cancel;
+}
+
+/* 1998-09-30 - End a progress-reporting session. Closes down the dialog box. */
+void pgs_progress_end(MainInfo *min)
+{
+ if(pgs_info.level == 1)
+ {
+ gtk_widget_destroy(pgs_info.dlg);
+ pgs_info.dlg = NULL;
+ }
+ pgs_info.level--;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-30 - Begin on a new "item"; typically a file, being <size> bytes. */
+void pgs_progress_item_begin(MainInfo *min, const gchar *name, off_t size)
+{
+ if(pgs_info.flags & PFLG_BUSY_MODE)
+ gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pgs_info.tot_pgs));
+ else
+ {
+ gchar buf[32];
+ g_snprintf(buf, sizeof buf, "%u", pgs_info.tot_pos);
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pgs_info.tot_pgs), buf);
+ pgs_info.tot_pos++;
+ }
+ g_snprintf(pgs_info.name, sizeof pgs_info.name, "%s", name);
+ pgs_progress_item_resize(min, size);
+}
+
+/* 2012-01-09 - Set a new size for the current item. This makes sense when moving. */
+void pgs_progress_item_resize(MainInfo *min, off_t new_size)
+{
+ pgs_info.item_size = new_size;
+
+ if(pgs_info.show_item)
+ {
+ gchar size_buf[32], buf[FILENAME_MAX + 32];
+
+ sze_put_offset(size_buf, sizeof size_buf, pgs_info.item_size, SZE_AUTO, 3, ',');
+ g_snprintf(buf, sizeof buf, "%s (%s)", pgs_info.name, size_buf);
+ gtk_label_set_text(GTK_LABEL(pgs_info.item), buf);
+ }
+ gui_events_flush();
+}
+
+/* 2014-03-02 - Format a bunch of seconds into a more friendly "time" format. */
+static void format_eta(gchar *buf, gsize buf_max, guint seconds)
+{
+ const guint base[] = { 60, 60, 24, 0 };
+ guint field[sizeof base / sizeof *base], i, conv = seconds;
+
+ for(i = 0; i < sizeof field / sizeof *field; ++i)
+ {
+ if(base[i])
+ {
+ field[i] = conv % base[i];
+ conv /= base[i];
+ }
+ else
+ field[i] = conv;
+ }
+
+ if(seconds < 60 * 60) /* Enough with MM:SS? */
+ g_snprintf(buf, buf_max, "%02u:%02u", field[1], field[0]);
+ else if(seconds < 24 * 60 * 60) /* Enough with HH:MM:SS? */
+ g_snprintf(buf, buf_max, "%02u:%02u:%02u", field[2], field[1], field[0]);
+ else if(field[3] == 1) /* FIXME: Perhaps there's better I18N magic to use here for day(s). */
+ g_snprintf(buf, buf_max, _("%u day, %02u:%02u:%02u"), field[3], field[2], field[1], field[0]);
+ else
+ g_snprintf(buf, buf_max, _("%u days, %02u:%02u:%02u"), field[3], field[2], field[1], field[0]);
+}
+
+/* 1998-09-30 - Indicate progress operating on the most recently registered item. Our
+** current position in the item is <pos> bytes.
+*/
+PgsRes pgs_progress_item_update(MainInfo *min, off_t pos)
+{
+ GTimeVal time_now;
+
+ if(pgs_info.dlg != NULL)
+ {
+ g_get_current_time(&time_now);
+ if(pgs_info.delayed)
+ {
+ const guint micro = 1E6 * (time_now.tv_sec - pgs_info.time_begin.tv_sec) +
+ (time_now.tv_usec - pgs_info.time_begin.tv_usec);
+
+ if(micro >= pgs_info.delay_time)
+ pgs_info.delayed = FALSE;
+ }
+ if(!pgs_info.delayed)
+ {
+ if(pgs_info.eta != NULL)
+ {
+ const gfloat secs = msu_diff_timeval(&pgs_info.time_begin, &time_now);
+ if((guint) secs != pgs_info.last_secs)
+ {
+ gchar buf[64], spdbuf[16], etabuf[32];
+ gfloat spd;
+ guint eta;
+
+ pgs_info.last_secs = secs;
+ spd = (pgs_info.byte_pos + pos) / secs;
+ eta = (pgs_info.byte_tot - (pgs_info.byte_pos + pos)) / spd;
+ format_eta(etabuf, sizeof etabuf, eta);
+ sze_put_offset(spdbuf, sizeof spdbuf, spd, SZE_AUTO, 3, ',');
+ g_snprintf(buf, sizeof buf, _("Elapsed %02d:%02d Speed %s/s ETA %s"),
+ pgs_info.last_secs / 60, pgs_info.last_secs % 60, spdbuf,
+ etabuf);
+ gtk_label_set_text(GTK_LABEL(pgs_info.eta), buf);
+ }
+ }
+ gtk_widget_realize(pgs_info.dlg);
+ gdk_window_set_group(gtk_widget_get_window(pgs_info.dlg), gtk_widget_get_window(pgs_info.min->gui->window));
+ gtk_widget_show_all(pgs_info.dlg);
+ }
+ if(pgs_info.show_byte && pgs_info.byte_tot)
+ {
+ gchar tmp[32];
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pgs_info.byte_pgs), (gfloat) (pgs_info.byte_pos + pos) / pgs_info.byte_tot);
+ sze_put_offset(tmp, sizeof tmp, pgs_info.byte_pos + pos, SZE_AUTO, 3, ',');
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pgs_info.byte_pgs), tmp);
+ }
+ if(pgs_info.show_item && pgs_info.item_size)
+ {
+ gchar tmp[32];
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pgs_info.item_pgs), (gfloat) pos / pgs_info.item_size);
+ sze_put_offset(tmp, sizeof tmp, pos, SZE_AUTO, 3, ',');
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pgs_info.item_pgs), tmp);
+ }
+ gui_events_flush();
+ if(g_cancellable_is_cancelled(pgs_info.cancel))
+ return PGS_CANCEL;
+ }
+ return PGS_PROCEED;
+}
+
+/* 1998-09-30 - Done with an item. */
+void pgs_progress_item_end(MainInfo *min)
+{
+ pgs_info.byte_pos += pgs_info.item_size;
+
+ gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pgs_info.tot_pgs), (gfloat) pgs_info.tot_pos / pgs_info.tot_num);
+ gui_events_flush();
+}
diff --git a/src/progress.h b/src/progress.h
new file mode 100644
index 0000000..d11241b
--- /dev/null
+++ b/src/progress.h
@@ -0,0 +1,35 @@
+/*
+** 1998-09-30 - Header file for the progress reporting module. Pretty simple.
+*/
+
+#if !defined PROGRESS_H
+#define PROGRESS_H
+
+typedef enum { PGS_CANCEL, PGS_PROCEED } PgsRes;
+
+enum {
+ PFLG_COUNT_RECURSIVE = (1<<0), /* Count # of items recursively? */
+ PFLG_ITEM_VISIBLE = (1<<1), /* Display progress for individual items? */
+ PFLG_BYTE_VISIBLE = (1<<2), /* Display total byte progress? */
+ PFLG_BUSY_MODE = (1<<10) /* Just indicate "busyness", no direct filesystem coupling. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Call this to set up an operation, which is assumed to consist of doing
+** something to a bunch of items.
+*/
+extern void pgs_progress_begin(MainInfo *min, const gchar *op_name, guint32 flags);
+
+extern GCancellable * pgs_progress_get_cancellable(void);
+
+/* Use these calls to report the progress of each item. */
+extern void pgs_progress_item_begin(MainInfo *min, const gchar *name, off_t size);
+extern void pgs_progress_item_resize(MainInfo *min, off_t new_size);
+extern PgsRes pgs_progress_item_update(MainInfo *min, off_t pos);
+extern void pgs_progress_item_end(MainInfo *min);
+
+/* Call this when the operation as a whole has completed. */
+extern void pgs_progress_end(MainInfo *min);
+
+#endif /* PROGRESS_H */
diff --git a/src/queue.c b/src/queue.c
new file mode 100644
index 0000000..fda9a8f
--- /dev/null
+++ b/src/queue.c
@@ -0,0 +1,97 @@
+/*
+** 1998-09-20 - This module helps maintain a queue of ("small") events that need to be
+** taken care of as soon as is convenient (i.e., in our idle handler).
+** The most typical event is "continue running a command sequence".
+** Besides, anything that gives me reason to type "queue" more
+** often is worth doing. My fingers just love it. :^)
+*/
+
+#include "gentoo.h"
+
+#include <stdarg.h>
+
+#include "cmdseq.h"
+#include "children.h"
+#include "queue.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct QueueInfo {
+ guint32 queue; /* The queue state is just a bit vector. */
+ guint tag; /* Tag for the timeout function. */
+ GList *end_list; /* List of after-flags for running commands. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-03-31 - Just initialize the queue data, and return a pointer to the private data
+** structure defining the queue.
+*/
+QueueInfo * que_initialize(void)
+{
+ QueueInfo *que;
+
+ que = g_malloc(sizeof *que);
+ que->queue = 0UL;
+ que->tag = 0;
+ que->end_list = NULL;
+
+ return que;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint idle_handler(gpointer user)
+{
+ MainInfo *min = user;
+
+ if(min->que->queue & (1 << QEVT_END_CMD))
+ {
+ GList *iter;
+
+ for(iter = min->que->end_list; iter != NULL; iter = g_list_next(iter))
+ csq_handle_ba_flags(min, GPOINTER_TO_UINT(iter->data));
+ g_list_free(min->que->end_list);
+ min->que->end_list = NULL;
+ min->que->queue &= ~ (1 << QEVT_END_CMD);
+ }
+ if(min->que->queue & (1 << QEVT_CONTINUE_CMD))
+ {
+ min->que->queue &= ~(1 << QEVT_CONTINUE_CMD);
+ gtk_widget_set_sensitive(min->gui->window, TRUE);
+ gtk_widget_grab_focus(GTK_WIDGET(min->gui->cur_pane->view));
+ chd_clear_lock();
+ csq_continue(min);
+ }
+
+ if(min->que->queue == 0) /* No longer any need for the idle function? */
+ {
+ g_source_remove(min->que->tag);
+ min->que->tag = 0;
+ return FALSE; /* Then let GTK+ know that. */
+ }
+ return TRUE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-20 - Enqueue an event of type <evt> for execution some time later. */
+void que_enqueue(MainInfo *min, QEvt evt, ...)
+{
+ min->que->queue |= (1 << evt);
+
+ if(evt == QEVT_END_CMD) /* A command that needs to be finished? */
+ {
+ va_list arg;
+
+ va_start(arg, evt);
+ min->que->end_list = g_list_append(min->que->end_list, GUINT_TO_POINTER(va_arg(arg, guint32)));
+ va_end(arg);
+ }
+
+ if(min->que->tag == 0)
+ {
+ if(min->que->tag == 0) /* Since we treat 0 specially, pretend GTK+ does, too. */
+ min->que->tag = g_idle_add(idle_handler, min);
+ }
+}
diff --git a/src/queue.h b/src/queue.h
new file mode 100644
index 0000000..6911716
--- /dev/null
+++ b/src/queue.h
@@ -0,0 +1,16 @@
+/*
+** 1998-09-20 - Header for the very small and simple pseudo-queue module.
+*/
+
+#if !defined QUEUE_H
+#define QUEUE_H
+
+typedef struct QueueInfo QueueInfo;
+
+typedef enum { QEVT_CONTINUE_CMD, QEVT_END_CMD } QEvt;
+
+extern QueueInfo * que_initialize(void);
+
+extern void que_enqueue(MainInfo *min, QEvt evt, ...);
+
+#endif /* QUEUE_H */
diff --git a/src/sizeutil.c b/src/sizeutil.c
new file mode 100644
index 0000000..c37254c
--- /dev/null
+++ b/src/sizeutil.c
@@ -0,0 +1,220 @@
+/*
+** 1998-08-31 - This little module provides helper functions when dealing with representations
+** of numbers, specifically numbers describing the size of things. For example,
+** this module knows that 1457664 bytes can be expressed conveniently as 1.39 MB.
+** I haven't tried teaching it to make that into the "official" 1.44 MB yet, though...
+** 1999-05-09 - Added explicit support for 64-bit sizes. Might not be very portable. :(
+** 2000-02-18 - Redid handling of 64-bit constants in sze_put_size(). More portability now?
+** 2000-07-02 - Added support for I18N. Fairly hairy.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "strutil.h"
+#include "sizeutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Information about the various units we support. Note that the "config" names are slighly legacy. */
+static const struct {
+ const gchar *unit;
+ const gchar *config;
+ const gchar *label;
+ gdouble multiplier;
+} sze_unit_info[] = {
+ { "", "native", N_("Unformatted Size"), 1 },
+ { "", "bytesnounit", N_("Formatted Size, Without Unit") },
+ { N_("bytes"), "bytes", N_("Formatted Size, in Bytes"), 1 },
+ { N_("KB"), "kilobytes", N_("Formatted Size, in Kilobytes"), 1024.0 },
+ { N_("MB"), "megabytes", N_("Formatted Size, in Megabytes"), 1024.0 * 1024.0 },
+ { N_("GB"), "gigabytes", N_("Formatted Size, in Gigabytes"), 1024.0 * 1024.0 * 1024.0 },
+ { N_("TB"), "tb", N_("Formatted Size, in Terabytes"), 1024.0 * 1024.0 * 1024.0 * 1024.0 },
+ { "", "smart", N_("Formatted Size, Automatic Unit"), -1.0 }
+ };
+
+/* ----------------------------------------------------------------------------------------- */
+
+const gchar * sze_get_unit_label(SzUnit unit)
+{
+ return sze_unit_info[unit].label;
+}
+
+/* 2010-09-22 - Given a SzUnit, this returns a unique symbolic name. This name is intended for
+** use when externally representing the SzUnit, i.e. in a configuration file.
+*/
+const gchar * sze_get_unit_config_name(SzUnit unit)
+{
+ return sze_unit_info[unit].config;
+}
+
+/* 2010-09-22 - Parse a config name as returned by sze_get_unit_config_name(), and return the
+** corresponding SzeUnit. If the name is unknown, SZE_NONE is returned.
+*/
+SzUnit sze_parse_unit_config_name(const gchar *name)
+{
+ size_t i;
+
+ for(i = 0; i < sizeof sze_unit_info / sizeof *sze_unit_info; i++)
+ {
+ if(strcmp(sze_unit_info[i].config, name) == 0)
+ return (SzUnit) i;
+ }
+ return SZE_NONE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-09-22 - Skip characters at <s> while <classifier> returns TRUE. */
+static const gchar * utf8_skip_class(const gchar *s, gboolean (*classifier)(gunichar ch))
+{
+ while(*s)
+ {
+ const gunichar here = g_utf8_get_char(s);
+ if(!classifier(here))
+ return s;
+ s = g_utf8_next_char(s);
+ }
+ return s;
+}
+
+/* 2010-09-22 - Attempt to parse an offset from string at <buf>. The string can be UTF-8.
+** * Leading spaces are stripped.
+** * A trailing unit from the set of units supported by this module can appear.
+*/
+goffset sze_get_offset(const gchar *buf)
+{
+ gunichar here;
+
+ buf = utf8_skip_class(buf, g_unichar_isspace);
+
+ here = g_utf8_get_char(buf);
+ if(g_ascii_isdigit(here))
+ {
+ gchar *end = NULL;
+ const gdouble value = strtod(buf, &end);
+ gdouble multiplier = 1;
+
+ if(end > buf)
+ {
+ gchar ubuf[32];
+ const gchar *unit = utf8_skip_class(end, g_unichar_isspace);
+ const gchar *uend = utf8_skip_class(unit, g_unichar_isalpha);
+ const gsize len = uend - unit;
+
+ /* Any unit found? */
+ if(uend > unit && len < sizeof ubuf - 1)
+ {
+ gsize i;
+
+ memcpy(ubuf, unit, len);
+ ubuf[len] = '\0';
+ for(i = 0; i < SZE_NUM_UNITS; i++)
+ {
+ if(strcmp(_(sze_unit_info[i].unit), unit) == 0)
+ {
+ multiplier = sze_unit_info[i].multiplier;
+ break;
+ }
+ }
+ }
+ else if(len >= sizeof ubuf)
+ g_warning("Unable to parse unit at '%s', too long", unit);
+ }
+ return value * multiplier;
+ }
+ return -1;
+}
+
+/* 2010-08-08 - Format an offset, which the is native type used in GIO for file sizes. Since it's
+** pretty much guaranteed to be 64 bits, it's all we need. We pretend it's unsigned.
+*/
+gint sze_put_offset(gchar *buf, gsize buf_max, goffset value, SzUnit unit, guint precision, gchar tick)
+{
+ gchar tmp[32], *fsize, *funit = "";
+ gdouble temp = 0.0;
+ static gchar fmt[16];
+ static guint fmt_precision = 0, fmt_tick = 0;
+
+ /* Check if we need to re-format the formatting string. Quite meta. */
+ if(precision != fmt_precision || tick != (gchar) fmt_tick)
+ {
+ g_snprintf(fmt, sizeof fmt, "%%.%uf %%s", precision);
+ fmt_precision = precision;
+ fmt_tick = tick;
+ }
+
+ switch(unit)
+ {
+ case SZE_NONE:
+ return g_snprintf(buf, buf_max, "%" G_GUINT64_FORMAT, value);
+ case SZE_BYTES_NO_UNIT:
+ break;
+ case SZE_BYTES:
+ funit = _("bytes");
+ break;
+ case SZE_KB:
+ temp = value / 1024.0;
+ funit = _("KB");
+ break;
+ case SZE_MB:
+ temp = value / (1024.0 * 1024.0);
+ funit = _("MB");
+ break;
+ case SZE_GB:
+ temp = value / (1024.0 * 1024.0 * 1024.0);
+ funit = _("GB");
+ break;
+ case SZE_TB:
+ temp = value / (1024.0 * 1024.0 * 1024.0 * 1024.0);
+ funit = _("TB");
+ break;
+ case SZE_AUTO:
+ if(value < (1 << 10))
+ return sze_put_offset(buf, buf_max, value, SZE_BYTES, precision, tick);
+ else if(value < (G_GINT64_CONSTANT(1) << 20))
+ return sze_put_offset(buf, buf_max, value, SZE_KB, precision, tick);
+ else if(value < (G_GINT64_CONSTANT(1) << 30))
+ return sze_put_offset(buf, buf_max, value, SZE_MB, precision, tick);
+ else if(value < (G_GINT64_CONSTANT(1) << 40))
+ return sze_put_offset(buf, buf_max, value, SZE_GB, precision, tick);
+ return sze_put_offset(buf, buf_max, value, SZE_TB, precision, tick);
+ default:
+ return 0;
+ }
+
+ /* Nothing in the temporary double? Then just use value as-is. */
+ if(temp == 0.0)
+ {
+ tmp[sizeof tmp - 1] = '\0';
+ fsize = stu_tickify(tmp + sizeof tmp - 1, value, tick);
+ return g_snprintf(buf, buf_max, "%s %s", fsize, funit);
+ }
+ /* Now format the floating point version using both ticks and user's precision. Not, eh, super fast. */
+ if(tick != 0)
+ {
+ gchar tmp2[32];
+ gdouble fraction;
+ const gdouble scale = pow(10, precision);
+
+ /* Round the floating point version to the desired precision. */
+ temp *= scale;
+ temp += 0.5;
+ temp = (gint) temp;
+ temp /= scale;
+
+ /* Now split into integer and fraction parts, so we can format properly. */
+ fraction = modf(temp, &temp);
+ tmp[sizeof tmp - 1] = '\0';
+ fsize = stu_tickify(tmp + sizeof tmp - 1, (long) temp, tick);
+ /* Format fraction+unit. */
+ g_snprintf(tmp2, sizeof tmp2, fmt, fraction, funit);
+ return g_snprintf(buf, buf_max, "%s%s", fsize, tmp2 + 1); /* Skip the parts before the decimal point. */
+ }
+ return g_snprintf(buf, buf_max, fmt, temp, funit);
+}
diff --git a/src/sizeutil.h b/src/sizeutil.h
new file mode 100644
index 0000000..4c94605
--- /dev/null
+++ b/src/sizeutil.h
@@ -0,0 +1,25 @@
+/*
+** 1998-08-31 - Header for the pretty cool module called "sizeutil".
+*/
+
+#if !defined SIZEUTIL_H
+#define SIZEUTIL_H
+
+/* This enum must be 1:1 with the integers from 0..(SZE_NUM_UNITS-1), to simplify life elsewhere. */
+typedef enum {
+ SZE_NONE, SZE_BYTES_NO_UNIT, SZE_BYTES,
+ SZE_KB, SZE_MB, SZE_GB, SZE_TB, SZE_AUTO,
+ SZE_NUM_UNITS
+} SzUnit;
+
+extern void sze_initialize(void);
+
+extern const gchar * sze_get_unit_label(SzUnit unit);
+
+extern const gchar * sze_get_unit_config_name(SzUnit unit);
+extern SzUnit sze_parse_unit_config_name(const gchar *name);
+
+extern goffset sze_get_offset(const gchar *buf);
+extern gint sze_put_offset(gchar *buf, gsize buf_max, goffset offset, SzUnit unit, guint precision, gchar tick);
+
+#endif /* SIZEUTIL_H */
diff --git a/src/strutil.c b/src/strutil.c
new file mode 100644
index 0000000..77d8831
--- /dev/null
+++ b/src/strutil.c
@@ -0,0 +1,471 @@
+/*
+** 1998-08-02 - This module holds various utility functions sharing one common trait:
+** they all deal with character strings in one way or another.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "sizeutil.h"
+#include "strutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2002-04-28 - Create a textual representation of <n>, with <tick> inserted every
+** 3rd digit (counting from the right) into <buf>. Returns pointer to
+** first digit.
+** NOTE NOTE That <buf> pointer should point at one position past where the **last**
+** character of the tickified number is to appear. This is for speed reasons.
+*/
+gchar * stu_tickify(gchar *buf, guint64 n, gchar tick)
+{
+ register gint cnt = 0;
+
+ do
+ {
+ if(tick && cnt == 3)
+ *--buf = tick, cnt = 0;
+ *--buf = '0' + n % 10;
+ n /= 10;
+ cnt++;
+ } while(n);
+ return buf;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Attempt to find <string> in <vector> of strings. Returns vector index, or <def>. */
+gint stu_strcmp_vector(const gchar *string, const gchar **vector, gsize vector_size, gint def)
+{
+ gsize i;
+
+ for(i = 0; i < vector_size && vector[i] != NULL; ++i)
+ {
+ if(strcmp(string, vector[i]) == 0)
+ return (gint) i;
+ }
+ return def;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-30 - Core glob->RE translator. Returns a pointer to a (dynamically allocated)
+** piece of memory holding the RE. When done with that, please g_free() it.
+*/
+gchar * stu_glob_to_re(const gchar *glob)
+{
+ GString *re;
+ gchar here, *ret;
+ const gchar *ptr, *end;
+
+ if((re = g_string_new(NULL)) == NULL)
+ return NULL;
+
+ for(ptr = glob; *ptr != '\0'; ptr++)
+ {
+ here = *ptr;
+ if(here == '[' && ptr[1] != ']') /* Character set begins? */
+ {
+ if((end = strchr(ptr + 1, ']')) != NULL)
+ {
+ for(; ptr <= end; ptr++)
+ g_string_append_c(re, *ptr);
+ ptr--;
+ }
+ }
+ else
+ {
+ switch(here)
+ {
+ case '.':
+ g_string_append(re, "\\.");
+ break;
+ case '*':
+ g_string_append(re, ".*");
+ break;
+ case '+':
+ g_string_append(re, "\\+");
+ break;
+ case '?':
+ g_string_append_c(re, '.');
+ break;
+ default:
+ g_string_append_c(re, here);
+ }
+ }
+ }
+ ret = re->str;
+ g_string_free(re, FALSE); /* Keeps the buffer. */
+ return ret;
+}
+
+/* 1998-08-30 - Translate a glob pattern into a System V8 regular expression. Thanks to the
+** magic of GStrings, it will look to the caller as if the string is simply
+** replaced by the translation. This code was moved from the good 'ol cmd_select
+** module, since I wanted glob->RE translation in other places, too (types).
+** This routine doesn't exactly fit in among the other, but since it deals with
+** strings, I thought it could live here at least for a while.
+*/
+void stu_gstring_glob_to_re(GString *glob)
+{
+ gchar *re;
+
+ if((re = stu_glob_to_re(glob->str)) != NULL)
+ {
+ g_string_assign(glob, re);
+ g_free(re);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-19 - Convert the protection <mode> to a (more) human-readable form stored at <buf>.
+** Will not use more than <max> bytes of <buf>. Returns <buf>, or NULL on failure.
+** 1999-01-05 - Finally sat down and experimentally deduced the way GNU 'ls' formats its mode
+** strings, and did something similar here.
+** 2000-09-14 - g_snprintf() is not scanf(). Remembered that.
+*/
+gchar * stu_mode_to_text(gchar *buf, gsize buf_max, mode_t mode)
+{
+ gchar *grp[] = { "---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx" };
+ gint u, g, o;
+
+ if(buf_max < 12) /* A lazy size limitation. */
+ return NULL;
+
+ u = (mode & S_IRWXU) >> 6;
+ g = (mode & S_IRWXG) >> 3;
+ o = (mode & S_IRWXO);
+ if(g_snprintf(buf, buf_max, "-%s%s%s", grp[u], grp[g], grp[o]) < 0)
+ return NULL;
+
+ /* Set the left-most character according to the file's intrinsic type. */
+ if(S_ISLNK(mode))
+ buf[0] = 'l';
+ else if(S_ISDIR(mode))
+ buf[0] = 'd';
+ else if(S_ISBLK(mode))
+ buf[0] = 'b';
+ else if(S_ISCHR(mode))
+ buf[0] = 'c';
+ else if(S_ISFIFO(mode))
+ buf[0] = 'p';
+ else if(S_ISSOCK(mode)) /* This is just a guess... */
+ buf[0] = 's';
+
+ /* This is magic until you understand how it works. The trick seems to be that one
+ ** bit (e.g. "SETUID") is displayed on top of another bit (in this case user read)
+ ** by changing that character either to 'S' (if it was not set) or 's' (if set).
+ ** AFAIK, this is not documented anywhere (except perhaps in ls's source).
+ */
+ if(mode & S_ISVTX) /* Sticky bit set? This is not POSIX... */
+ buf[9] = (buf[9] == '-') ? 'T' : 't';
+ if(mode & S_ISGID) /* Set GID bit set? */
+ buf[6] = (buf[6] == '-') ? 'S' : 's';
+ if(mode & S_ISUID) /* Set UID bit set? */
+ buf[3] = (buf[3] == '-') ? 'S' : 's';
+
+ return buf;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-10-07 - Scan a string from <def>, and put a pointer to a dynamically allocated version
+** of it into <str>. The string should be delimited by double quotes. Characters
+** (such as commas and whitespace) between strings are ignored. Returns a pointer
+** to the beginning of the next string (suitable for a repeat call), or NULL when
+** no more strings were found.
+** 1999-02-24 - Added support for backslash escaping. Might be useful when this routine is used
+** to scan strings which are then parsed by the command argument stuff. Or, you
+** could just use single quotes of course...
+*/
+const gchar * stu_scan_string(const gchar *def, const gchar **str)
+{
+ GString *tmp;
+
+ if((def == NULL) || (str == NULL))
+ return NULL;
+
+ while(*def && *def != '"')
+ def++;
+
+ if(*def == '"') /* Beginning of string actually found? */
+ {
+ def++;
+ if((tmp = g_string_new(NULL)) != NULL)
+ {
+ while(*def && *def != '"')
+ {
+ if(*def == '\\')
+ {
+ def++;
+ if(*def == '\0')
+ break;
+ }
+ g_string_append_c(tmp, *def++);
+ }
+ if(*def == '"') /* Closing quote here, too? */
+ {
+ *str = tmp->str;
+ g_string_free(tmp, FALSE);
+ return ++def; /* Then return with an OK status. */
+ }
+ g_string_free(tmp, TRUE);
+ }
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-02-24 - Compute the length and content of the first word at <str>. Knows about
+** quoting and backslash escapes. Stores word at <store>. Will typically be
+** run twice on the same input, since you can't know how much space is going
+** to be needed without running it once (with store == NULL).
+** Quoting rules: A word can contain whitespace (space, tab) only if quoted.
+** Double (") and single (') quotes can both be used, and have
+** the same "power". One quotes the other, so "'" and '"' are
+** both legal 1-character words. To include the quote used for
+** a word IN the word, it must be backslash escaped: "\"" is
+** the 1-character word ".
+** Returns pointer to first character after word, or NULL if there are no more
+** words. Stores word length at <len> (if non-NULL).
+*/
+const gchar * stu_word_length(const gchar *str, gsize *len, gchar *store)
+{
+ gchar quote = 0, here;
+ gsize l = 0;
+
+ if(str == NULL)
+ return NULL;
+
+ while(*str && isspace((guchar) *str)) /* Skip inter-word spaces. */
+ str++;
+
+ if(*str == '\0')
+ return NULL;
+ for(; *str && !(quote == 0 && isspace((guchar) *str)); l++)
+ {
+ if((here = *str) == '\\') /* Backslash escapade? */
+ {
+ here = *++str;
+ if(here == '\0') /* At end of string? */
+ break;
+ }
+ else if(here == '\'' || here == '"')
+ {
+ if(quote == 0 || quote == here) /* Ignore "other" quote. */
+ {
+ if(quote == here)
+ quote = 0;
+ else
+ quote = here;
+ str++;
+ l--; /* Don't count the quote. */
+ continue; /* Avoid storing the quote. */
+ }
+ }
+ if(store != NULL)
+ *store++ = here;
+ str++;
+ }
+ if(quote != '\0' && *str == quote) /* Skip ending quote. */
+ str++;
+ if(len != NULL)
+ *len = l;
+
+ return str;
+}
+
+/* 1999-02-24 - This takes a string intended as a shell command and splits it into a word-
+** vector as used by exec() functions. Think argv[]. Handles some quoting and
+** escaped characters, too. The returned vector will be NULL-terminated, and
+** can be freed by a single call to g_free().
+*/
+gchar ** stu_split_args(const gchar *argstring)
+{
+ gsize wlen;
+ gint wtotlen, wnum, i;
+ const gchar *ptr = argstring;
+ gchar **argv, *store;
+
+ for(wnum = wlen = wtotlen = 0; (ptr = stu_word_length(ptr, &wlen, NULL)) != NULL; wnum++, wtotlen += wlen + 1)
+ ;
+
+ if(wnum == 0) /* Nothing found? */
+ return NULL;
+
+ argv = g_malloc((wnum + 1) * sizeof *argv + wtotlen);
+ store = (gchar *) argv + (wnum + 1) * sizeof *argv;
+ for(ptr = (gchar *) argstring, i = 0; (ptr = stu_word_length(ptr, &wlen, store)) != NULL; i++)
+ {
+ argv[i] = store;
+ store[wlen] = '\0';
+ store += (wlen + 1);
+ }
+ argv[i] = NULL;
+
+ return argv;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2003-11-25 - Create internal (static, be careful!) version of <string> where certain
+** characters have been escaped by backslashes, and return pointer to it.
+*/
+const gchar * stu_escape(const gchar *string)
+{
+ static GString *str = NULL;
+
+ if(str == NULL)
+ str = g_string_new("");
+ else
+ g_string_truncate(str, 0);
+ for(; *string; string++)
+ {
+ if(*string == '"' || *string == '\'' || *string == '\\')
+ g_string_append_c(str, '\\');
+ g_string_append_c(str, *string);
+ }
+ return str->str;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-10-11 - Do a simple "search and replace", on a single input string. The text in <find>
+** is searched for, and replaced with <replace>. If <global>, all instances are
+** replaced, otherwise only the first.
+**
+** Note: All strings are assumed to be UTF-8 encoded.
+** Example: input="fr�knar �r inte �ckligt", find="�", replace="e"
+*/
+guint stu_replace_simple(GString *output, const gchar *input, const gchar *find, const gchar *replace, gboolean global, gboolean nocase)
+{
+ gboolean busy;
+ gsize flen;
+ guint count = 0;
+
+ if(output == NULL || input == NULL || find == NULL || replace == NULL)
+ return count;
+
+ /* Make sure output is clean. */
+ g_string_truncate(output, 0);
+ flen = strlen(find);
+
+ do
+ {
+ gchar *hit;
+
+ /* Plain old strstr() works on UTF-8. */
+ if((hit = strstr(input, find)) != NULL)
+ {
+ gsize pfx = hit - input;
+ g_string_append_len(output, input, pfx);
+ input += flen + pfx;
+ g_string_append(output, replace);
+ busy = global;
+ count += 1;
+ }
+ else
+ busy = FALSE;
+ } while(busy);
+ /* There might be a trailing tail, here. */
+ g_string_append(output, input);
+
+ return count;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-03-07 - Tries to look up a character in the given string, by calling the filtering function for each
+** character. If the function returns true, a pointer to the character is returned, else NULL.
+*/
+const gchar * stu_utf8_find(const gchar *string, gboolean (*function)(gunichar ch, gpointer user), gpointer user)
+{
+ if(string == NULL || function == NULL)
+ return NULL;
+
+ while(*string != '\0')
+ {
+ gunichar here = g_utf8_get_char(string);
+
+ if(function(here, user))
+ return string;
+ string = g_utf8_next_char(string);
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-12-03 - Interpolate things looking like "{this}" by replacing with the value for the key "this" from
+** the dictionary. Fun for the whole family. To get an explicit brace, escape with backslash
+** (which has the power to escape anything, for simplicity).
+*/
+gboolean stu_interpolate_dictionary(gchar *out, gsize size, const gchar *format, const GHashTable *dictionary)
+{
+ gchar key[32], *kput = NULL, here, *out_end;
+ gboolean in_key = FALSE;
+ gconstpointer value;
+
+ /* A NULL dictionary can be okay, but not if it's referenced. Lazy. */
+ if(out == NULL || size <= 1 || format == NULL)
+ return FALSE;
+
+ out_end = out + size - 1;
+ while((here = *format++) != '\0' && out < out_end)
+ {
+ if(in_key)
+ {
+ if(here == '}')
+ {
+ *kput = '\0';
+ /* If we got this far without a hash, fail. */
+ if(!dictionary)
+ return FALSE;
+ if((value = g_hash_table_lookup((GHashTable *) dictionary, key)) != NULL)
+ {
+ const gsize vlen = strlen(value);
+
+ if(vlen <= (out_end - out))
+ {
+ strcpy(out, value);
+ out += vlen;
+ }
+ }
+ in_key = FALSE;
+ }
+ else if(kput < (key + sizeof key - 1)) /* Silently drop overflowing key characters. */
+ *kput++ = here;
+ continue;
+ }
+ else if(here == '{')
+ {
+ kput = key;
+ in_key = TRUE;
+ continue;
+ }
+ else if(here == '\\')
+ {
+ if(*format != '\0')
+ {
+ *out++ = *format;
+ format++;
+ continue;
+ }
+ else
+ break;
+ }
+ *out++ = here;
+ }
+ *out = '\0';
+
+ return TRUE;
+}
diff --git a/src/strutil.h b/src/strutil.h
new file mode 100644
index 0000000..ddc413e
--- /dev/null
+++ b/src/strutil.h
@@ -0,0 +1,35 @@
+/*
+** 1998-08-02 - Header file for the new string module.
+** 2000-04-16 - When <string.h> is included, all symbols starting with "str" are reserved for
+** the C implementation. This makes my use of "str_" as a module-prefix for this
+** module a blatantly obvious conformance error. Fixed by changing to "stu_"
+** (for string utils, of course?).
+*/
+
+#include <sys/types.h> /* For mode_t. */
+
+#include <glib.h> /* For the g-types. */
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern gchar * stu_tickify(gchar *buf, guint64 n, gchar tick);
+
+extern gint stu_strcmp_vector(const gchar *string, const gchar **vector, gsize vector_size, gint def);
+
+extern gchar * stu_glob_to_re(const gchar *glob);
+extern void stu_gstring_glob_to_re(GString *glob);
+
+extern gchar * stu_mode_to_text(gchar *buf, gsize buf_max, mode_t mode);
+
+extern const gchar * stu_scan_string(const gchar *def, const gchar **str);
+
+extern const gchar * stu_word_length(const gchar *str, gsize *len, gchar *store);
+extern gchar ** stu_split_args(const char *argstring);
+
+extern const gchar * stu_escape(const gchar *string);
+
+extern guint stu_replace_simple(GString *output, const gchar *input, const gchar *find, const gchar *replace, gboolean global, gboolean nocase);
+
+extern const gchar * stu_utf8_find(const gchar *string, gboolean (*function)(gunichar ch, gpointer user), gpointer user);
+
+extern gboolean stu_interpolate_dictionary(gchar *output, gsize size, const gchar *format, const GHashTable *dictionary);
diff --git a/src/style_dialog.c b/src/style_dialog.c
new file mode 100644
index 0000000..c884761
--- /dev/null
+++ b/src/style_dialog.c
@@ -0,0 +1,51 @@
+/*
+** 1998-09-12 - This module contains code to allow the user to select a style from a
+** simple list representation. This is used in two places; the "reparent"
+** button in cfg_styles, and the "style" button in cfg_types. Since the
+** old (short, inline) approach was severely broken, this needs a module
+** of its own.
+** 1999-05-24 - More or less completely rewritten. About 1/4 the size of the old one.
+** 1999-06-19 - Adapted for the new dialog module.
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "styles.h"
+#include "dialog.h"
+#include "style_dialog.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-24 - Main style dialog entry point. */
+Style * sdl_dialog_sync_new_wait(StyleInfo *si, Style *ignore)
+{
+ GtkWidget *scwin, *tv;
+ Style *sel = NULL;
+ Dialog *dlg;
+ GtkCellRenderer *cr;
+ GtkTreeViewColumn *vc;
+
+ scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+ tv = gtk_tree_view_new_with_model(GTK_TREE_MODEL(stl_styleinfo_build_partial(si, ignore)));
+ cr = gtk_cell_renderer_text_new();
+ vc = gtk_tree_view_column_new_with_attributes("(Styles)", cr, "text", 0, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tv), vc);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv), FALSE);
+ gtk_container_add(GTK_CONTAINER(scwin), tv);
+ gtk_widget_set_size_request(scwin, 256, 448);
+ dlg = dlg_dialog_sync_new(scwin, _("Select Style"), NULL);
+ if(dlg_dialog_sync_wait(dlg) == DLG_POSITIVE)
+ {
+ GtkTreeIter iter;
+
+ if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)), NULL, &iter))
+ gtk_tree_model_get(gtk_tree_view_get_model(GTK_TREE_VIEW(tv)), &iter, 1, &sel, -1);
+ }
+ dlg_dialog_sync_destroy(dlg);
+
+ return sel;
+}
diff --git a/src/style_dialog.h b/src/style_dialog.h
new file mode 100644
index 0000000..d748b98
--- /dev/null
+++ b/src/style_dialog.h
@@ -0,0 +1,5 @@
+/*
+** 1999-05-24 - A rewritten style selection dialog module. Very handy.
+*/
+
+extern Style * sdl_dialog_sync_new_wait(StyleInfo *si, Style *ignore);
diff --git a/src/styles.c b/src/styles.c
new file mode 100644
index 0000000..b5671a5
--- /dev/null
+++ b/src/styles.c
@@ -0,0 +1,1409 @@
+/*
+** 1999-05-19 - Started a complete rewrite of this module. It became twice the size of the old
+** code, but adds a *lot* of flexibility. And, the config module shrunk, too. :)
+*/
+
+#include "gentoo.h"
+
+#include <stdlib.h>
+
+#include "cmdseq.h"
+#include "strutil.h"
+#include "styles.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+struct StyleInfo {
+ guint freeze_count; /* When non-zero, changes to styles don't propagate downwards. */
+ gboolean update_pending; /* Set when something changes during freeze. */
+ GNode *styles; /* A N-ary tree holding the style hierarchy. Neat. */
+};
+
+typedef enum { SPT_COLOR = 0, SPT_ICON, SPT_ACTION } StlPType;
+
+typedef struct {
+ StlPType type;
+ union {
+ GdkColor color;
+ gchar icon[FILENAME_MAX];
+ GString *action;
+ } data;
+} StlPVal;
+
+/* These are the old (L for legacy) integer identifiers for style properties. They are
+** used in the old_load_property() function, when converting to the more modern string-
+** based property names used by this module.
+*/
+enum {
+ L_TYPE_UNSEL_BGCOL = 0,
+ L_TYPE_UNSEL_FGCOL = 1,
+ L_TYPE_UNSEL_ICON = 2,
+ L_TYPE_ACTN_DEFAULT = 6,
+ L_TYPE_ACTN_VIEW = 7,
+ L_TYPE_ACTN_EDIT = 8,
+ L_TYPE_ACTN_PRINT = 9,
+ L_TYPE_ACTN_PLAY = 10
+};
+
+typedef struct {
+ gchar name[STL_PROPERTY_NAME_SIZE]; /* Unique property identifier. */
+ gboolean override; /* Is the value really here? */
+ StlPVal *value;
+} StlProp;
+
+struct Style {
+ StyleInfo *styleinfo; /* Which styleinfo does this style belong to? */
+ gchar name[STL_STYLE_NAME_SIZE]; /* Name of this style (e.g. "WAV", "HTML"). */
+ GHashTable *properties; /* A hash of properties for this style. */
+ gboolean expand; /* Is the style shown expanded in the config? */
+};
+
+/* This is used internally by the stl_styleinfo_style_find() function. */
+struct style_find_data {
+ const gchar *name;
+ Style *stl;
+};
+
+/* This is used by stl_styleinfo_widget_find(). */
+struct widget_find_data {
+ Style *style;
+ GtkWidget *widget;
+};
+
+struct property_rename_data {
+ Style *style;
+ gchar name_old[STL_PROPERTY_NAME_SIZE],
+ name_new[STL_PROPERTY_NAME_SIZE];
+};
+
+/* This is used when looking for a style in a GtkTreeModel. */
+struct tree_find_data {
+ const Style *style;
+ GtkTreeIter iter;
+};
+
+/* This is used to avoid magic numbers all over the place. */
+enum {
+ TREE_COLUMN_NAME = 0, TREE_COLUMN_STYLE
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - Create a new, empty, styleinfo. */
+StyleInfo * stl_styleinfo_new(void)
+{
+ StyleInfo *si;
+
+ si = g_malloc(sizeof *si);
+ si->freeze_count = 0U;
+ si->update_pending = FALSE;
+ si->styles = NULL;
+
+ return si;
+}
+
+/* 1999-05-19 - Create a new styleinfo containing the built-in default styles. There are few. */
+StyleInfo * stl_styleinfo_default(void)
+{
+ StyleInfo *si;
+ Style *stl, *root;
+
+ si = stl_styleinfo_new();
+ stl_styleinfo_freeze(si);
+
+ root = stl_style_new(_("Root"));
+ stl_style_property_set_color_rgb(root, SPN_COL_UNSEL_BG, 56540U, 56540U, 56540U);
+ stl_style_property_set_color_rgb(root, SPN_COL_UNSEL_FG, 0U, 0U, 0U);
+ stl_style_property_set_icon(root, SPN_ICON_UNSEL, "Document.xpm");
+ stl_styleinfo_style_add(si, NULL, root);
+
+ stl = stl_style_new(_("Directory"));
+ stl_style_property_set_color_rgb(stl, SPN_COL_UNSEL_FG, 65535U, 16384U, 8192U);
+ stl_style_property_set_icon(stl, SPN_ICON_UNSEL, "Directory2.xpm");
+ stl_style_property_set_action(stl, SPN_ACTN_DEFAULT, "DirEnter");
+ stl_styleinfo_style_add(si, root, stl);
+
+ stl_styleinfo_thaw(si);
+ return si;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - Recursively copy styles and add them to the parent style pointed at by <user>. */
+static void styleinfo_style_copy(GNode *node, gpointer user)
+{
+ Style *stl, *parent = user;
+
+ stl = stl_style_copy(node->data);
+ stl_styleinfo_style_add(parent->styleinfo, parent, stl);
+ g_node_children_foreach(node, G_TRAVERSE_ALL, styleinfo_style_copy, stl);
+}
+
+/* 1999-05-20 - Create an identical copy of <si>, sharing no memory between the two. */
+StyleInfo * stl_styleinfo_copy(StyleInfo *si)
+{
+ StyleInfo *nsi = NULL;
+ Style *root;
+
+ if(si != NULL)
+ {
+ nsi = stl_styleinfo_new();
+ if(si->styles != NULL)
+ {
+ stl_styleinfo_freeze(nsi);
+ root = stl_style_copy(si->styles->data);
+ stl_styleinfo_style_add(nsi, NULL, root);
+ g_node_children_foreach(si->styles, G_TRAVERSE_ALL, styleinfo_style_copy, root);
+ stl_styleinfo_thaw(nsi);
+ }
+ }
+ return nsi;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - If the style in <user> doesn't override the property <value>, create
+** a non-copying link to it, thus inheriting the value. This is it.
+*/
+static void property_update(gpointer key, gpointer value, gpointer user)
+{
+ Style *stl = user;
+ StlProp *pr, *ppr = value;
+
+ /* Is there a property with the same name? */
+ if((pr = g_hash_table_lookup(stl->properties, ppr->name)) != NULL)
+ {
+ if(!pr->override)
+ pr->value = ppr->value; /* Establish the copy link. */
+ }
+ else /* No property found, so create a fresh linking one. */
+ {
+ pr = g_malloc(sizeof *pr);
+ g_strlcpy(pr->name, ppr->name, sizeof pr->name);
+ pr->override = FALSE;
+ pr->value = ppr->value;
+ g_hash_table_insert(stl->properties, pr->name, pr);
+ }
+}
+
+/* 1999-05-20 - Update a single style, and then recurse to do its children. Heavily recursive. */
+static void style_update(GNode *node, gpointer user)
+{
+ Style *stl = node->data, *parent = user;
+
+ g_hash_table_foreach(parent->properties, property_update, stl);
+ g_node_children_foreach(node, G_TRAVERSE_ALL, style_update, stl);
+}
+
+/* 1999-05-19 - Update style tree in <si>; causes all non-overridden properties in all styles to
+** acquire the value of the nearest overriding parent. Simple.
+*/
+static void styleinfo_update(StyleInfo *si)
+{
+ if(si != NULL)
+ {
+ if(si->freeze_count == 0)
+ {
+ g_node_children_foreach(si->styles, G_TRAVERSE_ALL, style_update, si->styles->data);
+ si->update_pending = FALSE;
+ }
+ else
+ si->update_pending = TRUE;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-19 - Freeze given styleinfo. When a styleinfo is frozen, you can add, alter, and
+** remove styles without causing the entire inheritance tree to be traversed
+** on each operation. Handy when doing loads of such operations.
+*/
+void stl_styleinfo_freeze(StyleInfo *si)
+{
+ if(si != NULL)
+ si->freeze_count++;
+}
+
+/* 1999-05-19 - Thaw a styleinfo. If anything was changed during freeze, update tree now. */
+void stl_styleinfo_thaw(StyleInfo *si)
+{
+ if(si != NULL)
+ {
+ if(si->freeze_count == 0)
+ fprintf(stderr, "STYLES: Mismatched call to stl_styleinfo_thaw() detected!\n");
+ else if(--si->freeze_count == 0)
+ {
+ if(si->update_pending)
+ styleinfo_update(si);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+#if 0
+/* 1999-05-20 - A g_hash_table_foreach() callback. */
+static void dump_property(gpointer key, gpointer value, gpointer user)
+{
+ StlProp *pr = value;
+ guint i, d = *(guint *) user;
+ gchar *tname[] = { "Color", "Icon", "Action" };
+
+ for(i = 0; i < d; i++)
+ putchar(' ');
+ printf("(%c) %s [%s: ", pr->override ? 'X' : ' ', pr->name, tname[pr->value->type]);
+
+ switch(pr->value->type)
+ {
+ case SPT_COLOR:
+ printf("%04X,%04X,%04X", pr->value->data.color.red, pr->value->data.color.green, pr->value->data.color.blue);
+ break;
+ case SPT_ICON:
+ printf("\"%s\"", pr->value->data.icon);
+ break;
+ case SPT_ACTION:
+ printf("'%s'", pr->value->data.action->str);
+ break;
+ }
+ printf("]\n");
+}
+
+/* 1999-05-20 - A g_node_traverse() callback. */
+static gboolean dump_style(GNode *node, gpointer user)
+{
+ guint i, d = g_node_depth(node);
+
+ for(i = 0; i < d - 1; i++)
+ putchar('-');
+ printf(" '%s'\n", ((Style *) node->data)->name);
+ g_hash_table_foreach(((Style *) node->data)->properties, dump_property, &d);
+ return FALSE;
+}
+
+/* 1999-05-20 - Dump the contents of given styleinfo's style tree. Mainly useful during
+** development and debugging of this module. Should not be included in release
+** builds of gentoo, since it's not really useful there.
+*/
+void stl_styleinfo_dump(StyleInfo *si)
+{
+ guint level;
+
+ printf("There are %u styles in given styleinfo:\n", g_node_n_nodes(si->styles, G_TRAVERSE_ALL));
+ g_node_traverse(si->styles, G_PRE_ORDER, G_TRAVERSE_ALL, -1, dump_style, &level);
+}
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-19 - Get the GNode that holds the given <stl>. */
+static GNode * styleinfo_style_get_node(const StyleInfo *si, const Style *stl)
+{
+ return g_node_find(si->styles, G_PRE_ORDER, G_TRAVERSE_ALL, (gpointer) stl);
+}
+
+/* 1999-05-20 - Find the sibling of <parent> that should come next after <node>,
+** if it were inserted. The implied ordering is simply alphabetical.
+** If there is no suitable sibling (<=> stl goes last), return NULL.
+*/
+static GNode * find_next_sibling(GNode *parent, GNode *node)
+{
+ guint i;
+ GNode *here;
+
+ for(i = 0; (here = g_node_nth_child(parent, i)) != NULL; i++)
+ {
+ if(strcmp(((Style *) here->data)->name, ((Style *) node->data)->name) > 0)
+ return here;
+ }
+ return NULL;
+}
+
+/* 1999-05-19 - Add a style to <si>, linking it in so <parent> is its immediate parent.
+** Call with <parent> == NULL to set the root style (moving the existing
+** styles, if any, down one level).
+*/
+void stl_styleinfo_style_add(StyleInfo *si, Style *parent, Style *stl)
+{
+ if((si != NULL) && (stl != NULL))
+ {
+ GNode *node, *pnode;
+
+ stl->styleinfo = si;
+ node = g_node_new(stl);
+
+ if(parent == NULL) /* Insert as root? */
+ {
+ if(si->styles != NULL) /* Is there a parent to replace? */
+ g_node_insert(node, -1, si->styles);
+ si->styles = node;
+ }
+ else
+ {
+ if((pnode = styleinfo_style_get_node(si, parent)) != NULL)
+ g_node_insert_before(pnode, find_next_sibling(pnode, node), node);
+ else
+ fprintf(stderr, "STYLES: Unknown parent style '%s' referenced\n", parent->name);
+ }
+ styleinfo_update(si);
+ }
+}
+
+/* 1999-05-20 - A g_node_traverse() callback, to free the memory used by a style. */
+static gboolean remove_style(GNode *node, gpointer user)
+{
+ if(node != user) /* Avoid recursing on root. */
+ stl_style_destroy(node->data, FALSE);
+ return FALSE; /* Keep traversing. */
+}
+
+/* 1999-05-20 - Remove a style from the styleinfo tree. Causes all child styles to be
+** removed and destroyed, as well.
+*/
+void stl_styleinfo_style_remove(StyleInfo *si, Style *stl)
+{
+ if((si != NULL) && (stl != NULL))
+ {
+ GNode *node;
+
+ if((node = styleinfo_style_get_node(si, stl)) != NULL)
+ {
+ g_node_unlink(node);
+ g_node_traverse(node, G_POST_ORDER, G_TRAVERSE_ALL, -1, remove_style, node);
+ g_node_destroy(node);
+ styleinfo_update(si);
+ }
+ }
+}
+
+/* 1999-05-20 - Check for a named node. */
+static gboolean find_callback(GNode *node, gpointer user)
+{
+ struct style_find_data *sfd = user;
+
+ if(strcmp(((Style *) node->data)->name, sfd->name) == 0)
+ {
+ sfd->stl = node->data;
+ return TRUE; /* Wanted node has been found, so stop. */
+ }
+ return FALSE; /* Keep traversing. */
+}
+
+/* 1999-05-20 - Find the named style in given styleinfo's style tree. NULL can be used as
+** a shorthand for the name of the root style.
+*/
+Style * stl_styleinfo_style_find(const StyleInfo *si, const gchar *name)
+{
+ struct style_find_data sfd;
+
+ sfd.name = name;
+ sfd.stl = NULL;
+ if(si != NULL)
+ {
+ if(name != NULL)
+ g_node_traverse(si->styles, G_PRE_ORDER, G_TRAVERSE_ALL, -1, find_callback, &sfd);
+ else
+ return stl_styleinfo_style_root(si);
+ }
+ return sfd.stl;
+}
+
+/* 1999-05-24 - Change the parent for <stl>. <new_parent> should really NOT be a child of
+** <stl>, or there will definitely be evil. Note that this operation can NOT
+** be done as a remove()/add() combo, since the remove is destructive.
+*/
+void stl_styleinfo_style_set_parent(StyleInfo *si, Style *stl, Style *new_parent)
+{
+ if((si != NULL) && (stl != NULL))
+ {
+ GNode *node, *pnode;
+
+ node = styleinfo_style_get_node(si, stl);
+ g_node_unlink(node);
+ pnode = styleinfo_style_get_node(si, new_parent);
+ g_node_insert_before(pnode, find_next_sibling(pnode, node), node);
+ styleinfo_update(si);
+ }
+}
+
+/* 1999-05-24 - Get the parent style of <stl>. If there is no parent (<stl> is root, or
+** perhaps has not yet been added to a styleinfo), NULL is returned.
+*/
+Style * stl_styleinfo_style_get_parent(StyleInfo *si, Style *stl)
+{
+ if((stl != NULL) && (stl->styleinfo == si))
+ {
+ GNode *node;
+
+ node = styleinfo_style_get_node(stl->styleinfo, stl);
+ if(node->parent != NULL)
+ return node->parent->data;
+ }
+ return NULL;
+}
+
+/* 1999-06-12 - Return TRUE if <stla> and <stlb> are siblings (i.e., they have the same
+** immediate parent), FALSE otherwise.
+*/
+gboolean stl_styleinfo_style_siblings(StyleInfo *si, Style *stla, Style *stlb)
+{
+ if((si != NULL) && (stla != NULL) && (stlb != NULL))
+ {
+ GNode *na, *nb;
+
+ na = styleinfo_style_get_node(si, stla);
+ nb = styleinfo_style_get_node(si, stlb);
+
+ return na->parent == nb->parent;
+ }
+ return FALSE;
+}
+
+/* 1999-05-26 - Return the root style of <si>. This is actually the only reliable way of getting
+** at it, since you don't know its name.
+*/
+Style * stl_styleinfo_style_root(const StyleInfo *si)
+{
+ if(si != NULL)
+ {
+ if(si->styles != NULL)
+ return si->styles->data;
+ }
+ return NULL;
+}
+
+/* 1999-05-27 - Return TRUE if <stl> has one or more children, otherwise FALSE. */
+gboolean stl_styleinfo_style_has_children(StyleInfo *si, Style *stl)
+{
+ if((si != NULL) && (stl != NULL))
+ {
+ GNode *node;
+
+ if((node = styleinfo_style_get_node(si, stl)) != NULL)
+ return g_node_n_children(node) > 0 ? TRUE : FALSE;
+ }
+ return FALSE;
+}
+
+/* 1999-05-29 - Just a g_node_traverse() callback to build a list of child styles. */
+static gboolean get_child(GNode *node, gpointer user)
+{
+ GList **list = user;
+
+ *list = g_list_append(*list, node->data);
+
+ return FALSE; /* And keep traversing. */
+}
+
+/* 1999-05-29 - Return a list of all child styles of <stl>. If <include_root> is TRUE, then
+** the root style <stl> will be included in the list. If FALSE, it will not.
+** Don't forget to g_list_free() the returned list when you're done with it.
+*/
+GList * stl_styleinfo_style_get_children(StyleInfo *si, Style *stl, gboolean include_root)
+{
+ if((si != NULL) && (stl != NULL) && (stl->styleinfo == si))
+ {
+ GNode *node;
+
+ if((node = styleinfo_style_get_node(si, stl)) != NULL)
+ {
+ GList *list = NULL;
+
+ g_node_traverse(node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, get_child, &list);
+ if(!include_root)
+ {
+ GList *first = list;
+
+ list = g_list_remove_link(list, list); /* Remove head of child list. */
+ g_list_free(first);
+ }
+ return list;
+ }
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - A g_hash_table_foreach() callback that writes out a property definition. */
+static void save_property(gpointer key, gpointer value, gpointer user)
+{
+ StlProp *pr = value;
+ FILE *out = user;
+
+ /* We don't save non-overridden properties, of course. */
+ if(!pr->override)
+ return;
+
+ xml_put_node_open(out, "Property");
+ xml_put_text(out, "name", pr->name);
+ switch(pr->value->type)
+ {
+ case SPT_COLOR:
+ xml_put_color(out, "color", &pr->value->data.color);
+ break;
+ case SPT_ICON:
+ xml_put_text(out, "icon", pr->value->data.icon);
+ break;
+ case SPT_ACTION:
+ xml_put_text(out, "action", pr->value->data.action->str);
+ break;
+ }
+ xml_put_node_close(out, "Property");
+}
+
+/* 1999-05-27 - A g_node_traverse() function to save out a single style. */
+static gboolean save_style(GNode *node, gpointer user)
+{
+ Style *stl = node->data;
+ FILE *out = user;
+
+ xml_put_node_open(out, "Style");
+ xml_put_text(out, "name", stl->name);
+ if(node->parent != NULL)
+ xml_put_text(out, "parent", ((Style *) node->parent->data)->name);
+ xml_put_boolean(out, "expand", stl->expand);
+ if(stl_style_property_overrides(stl))
+ {
+ xml_put_node_open(out, "Properties");
+ g_hash_table_foreach(stl->properties, save_property, out);
+ xml_put_node_close(out, "Properties");
+ }
+ xml_put_node_close(out, "Style");
+
+ return FALSE; /* Keep traversing, we relly want to save all styles. */
+}
+
+/* 1999-05-27 - Save out contents of <si> into <out>, nicely bracketed by <tag> tags. */
+void stl_styleinfo_save(MainInfo *min, StyleInfo *si, FILE *out, const gchar *tag)
+{
+ if((min == NULL) || (si == NULL) || (out == NULL) || (tag == NULL))
+ return;
+
+ xml_put_node_open(out, tag);
+ g_node_traverse(si->styles, G_PRE_ORDER, G_TRAVERSE_ALL, -1, save_style, out);
+ xml_put_node_close(out, tag);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - Load an old-styled property. Convert legacy properties, identified using
+** integers, into the newer named style. Add the property to the style pointed
+** to by <user>.
+*/
+static void old_load_property(const XmlNode *node, gpointer user)
+{
+ gint type;
+ gboolean ok = FALSE;
+ const gchar *name = NULL, *text = NULL;
+ GdkColor col;
+ StlPType newtype = SPT_COLOR;
+ Style *stl = user;
+
+ xml_get_integer(node, "type", &type);
+
+ /* Map old integer-identified properties to new textually named ones. */
+ switch(type)
+ {
+ case L_TYPE_UNSEL_BGCOL:
+ name = SPN_COL_UNSEL_BG;
+ if((ok = xml_get_color(node, "color", &col)))
+ newtype = SPT_COLOR;
+ break;
+ case L_TYPE_UNSEL_FGCOL:
+ name = SPN_COL_UNSEL_FG;
+ if((ok = xml_get_color(node, "color", &col)))
+ newtype = SPT_COLOR;
+ break;
+ case L_TYPE_UNSEL_ICON:
+ name = SPN_ICON_UNSEL;
+ if((ok = xml_get_text(node, "icon", &text)))
+ newtype = SPT_ICON;
+ break;
+ case L_TYPE_ACTN_DEFAULT:
+ name = SPN_ACTN_DEFAULT;
+ if((ok = xml_get_text(node, "action", &text)))
+ newtype = SPT_ACTION;
+ break;
+ case L_TYPE_ACTN_VIEW:
+ name = SPN_ACTN_VIEW;
+ if((ok = xml_get_text(node, "action", &text)))
+ newtype = SPT_ACTION;
+ break;
+ case L_TYPE_ACTN_EDIT:
+ name = SPN_ACTN_EDIT;
+ if((ok = xml_get_text(node, "action", &text)))
+ newtype = SPT_ACTION;
+ break;
+ case L_TYPE_ACTN_PRINT:
+ name = SPN_ACTN_PRINT;
+ if((ok = xml_get_text(node, "action", &text)))
+ newtype = SPT_ACTION;
+ break;
+ case L_TYPE_ACTN_PLAY:
+ name = SPN_ACTN_PLAY;
+ if((ok = xml_get_text(node, "action", &text)))
+ newtype = SPT_ACTION;
+ break;
+ default:
+ g_warning("STYLES: Ignoring unknown legacy property type %d in style '%s'\n", type, stl->name);
+ }
+ if(ok)
+ {
+ switch(newtype)
+ {
+ case SPT_COLOR:
+ stl_style_property_set_color(stl, name, &col);
+ break;
+ case SPT_ICON:
+ stl_style_property_set_icon(stl, name, text);
+ break;
+ case SPT_ACTION:
+ stl_style_property_set_action(stl, name, csq_cmdseq_map_name(text, stl->name));
+ break;
+ }
+ }
+}
+
+/* 1999-05-27 - Load modern-style property (has textual identifier). Pretty simple stuff. */
+static void load_property(const XmlNode *data, gpointer user)
+{
+ Style *stl = user;
+ const gchar *name;
+
+ if(xml_get_text(data, "name", &name))
+ {
+ GdkColor color;
+ const gchar *text;
+
+ if(xml_get_color(data, "color", &color))
+ stl_style_property_set_color(stl, name, &color);
+ else if(xml_get_text(data, "icon", &text))
+ stl_style_property_set_icon(stl, name, text);
+ else if(xml_get_text(data, "action", &text))
+ stl_style_property_set_action(stl, name, csq_cmdseq_map_name(text, stl_style_get_name(stl)));
+ else
+ g_warning("STYLES: Unknown value type for property '%s' (style '%s')\n", name, stl->name);
+ }
+}
+
+/* 1999-05-20 - Another xml_node_visit_children() callback. Load in all properties for
+** given style, and store them in the style. This is where the backwards-
+** compatibility really gets going.
+*/
+static void load_properties(const XmlNode *node, Style *stl)
+{
+ const XmlNode *data;
+
+ if((data = xml_tree_search(node, "Property")) != NULL)
+ {
+ if(xml_get_integer(data, "type", NULL))
+ xml_node_visit_children(node, old_load_property, stl);
+ else
+ xml_node_visit_children(node, load_property, stl);
+ }
+}
+
+/* 1999-05-20 - A xml_node_visit_children() callback to load in a style. Deals with the
+** annoying complexities of backwards compatibility. :(
+*/
+static void load_style(const XmlNode *node, gpointer user)
+{
+ StyleInfo *si = user;
+ Style *stl, *parent = NULL;
+ const gchar *name = "new style", *pname;
+ const XmlNode *prop;
+ gboolean btmp = FALSE;
+
+ xml_get_text(node, "name", &name);
+ stl = stl_style_new(name);
+
+ if(xml_get_boolean(node, "expand", &btmp))
+ stl_style_set_expand(stl, btmp);
+ if((prop = xml_tree_search(node, "Properties")) != NULL)
+ load_properties(prop, stl);
+ if(xml_get_text(node, "parent", &pname))
+ parent = stl_styleinfo_style_find(si, pname);
+ stl_styleinfo_style_add(si, parent, stl);
+}
+
+/* 1999-05-20 - Load an entire styleinfo tree from XML data rooted at <node>. Note that the
+** top-level tag identifier (the one passed to stl_styleinfo_save()) should already
+** have been used before calling this function, to find <node>. It is assumed
+** that the given node contains a bunch of children, each of which defines a style.
+*/
+StyleInfo * stl_styleinfo_load(const XmlNode *node)
+{
+ StyleInfo *si;
+
+ si = stl_styleinfo_new();
+ stl_styleinfo_freeze(si);
+ xml_node_visit_children(node, load_style, si);
+ stl_styleinfo_thaw(si);
+
+ return si;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - Destroy given styleinfo, freeing all memory used by it. */
+void stl_styleinfo_destroy(StyleInfo *si)
+{
+ if(si != NULL)
+ {
+ stl_styleinfo_freeze(si); /* There's no point in updating inherited stuff while destroying. */
+ if(si->styles != NULL)
+ stl_style_destroy(si->styles->data, TRUE);
+ g_free(si);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2006-03-02 - Append a branch of the style tree to the given store. This does not collapse/expand it
+ * properly, since that's not doable with GTK+2 at this level (it's a view property).
+*/
+static void append_branch(GtkTreeStore *store, const GNode *node, GtkTreeIter *parent, const Style *ignore, gboolean *modify_flag)
+{
+ GtkTreeIter child;
+
+ for(; (node != NULL); node = node->next)
+ {
+ if((ignore != NULL) && (node->data == ignore))
+ continue;
+ gtk_tree_store_append(store, &child, parent);
+ gtk_tree_store_set(store, &child, TREE_COLUMN_NAME, ((const Style *) node->data)->name,
+ TREE_COLUMN_STYLE, node->data,
+ -1);
+ if(node->children != NULL)
+ append_branch(store, node->children, &child, ignore, modify_flag);
+ }
+}
+
+/* 2006-03-02 - Build a partial style store, ignoring any branch rooted at <ignore>. */
+GtkTreeStore * stl_styleinfo_build_partial(const StyleInfo *si, const Style *ignore)
+{
+ GtkTreeStore *store;
+
+ store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
+ append_branch(store, si->styles, NULL, ignore, NULL);
+
+ return store;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-22 - We need a way to read out a Style pointer from a constructed tree, in the config. */
+Style * stl_styleinfo_get_style_iter(const StyleInfo *si, GtkTreeStore *store, GtkTreeIter *iter)
+{
+ Style *style = NULL;
+
+ if(si == NULL || store == NULL || iter == NULL)
+ return NULL;
+ gtk_tree_model_get(GTK_TREE_MODEL(store), iter, TREE_COLUMN_STYLE, &style, -1);
+
+ return style;
+}
+
+/* Simple bookkeeping struct used by stl_styleinfo_tree_find_style(), below. */
+struct find_info
+{
+ const Style *style;
+ gboolean found;
+ GtkTreeIter iter;
+};
+
+static gboolean cb_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
+{
+ struct find_info *fi = data;
+ Style *here;
+
+ gtk_tree_model_get(model, iter, TREE_COLUMN_STYLE, &here, -1);
+ if(here == fi->style)
+ {
+ fi->iter = *iter;
+ fi->found = TRUE;
+ }
+ return fi->found;
+}
+
+/* 2009-03-24 - Find the given style in the given store, and set the iter accordingly.
+** This is a straight tree search, so it takes a while, but this really
+** shouldn't be a problem.
+*/
+gboolean stl_styleinfo_tree_find_style(const StyleInfo *si, GtkTreeStore *store, const Style *style, GtkTreeIter *iter)
+{
+ struct find_info fi;
+
+ fi.style = style;
+ fi.found = FALSE;
+ gtk_tree_model_foreach(GTK_TREE_MODEL(store), cb_foreach, &fi);
+ if(fi.found)
+ {
+ if(iter != NULL)
+ *iter = fi.iter;
+ }
+ return fi.found;
+}
+
+/* 2008-05-11 - Set the name of a style, based on a GtkTreeIter. This will change not only
+ * the value in the tree model, but also the style itself.
+*/
+void stl_styleinfo_set_name_iter(const StyleInfo *si, GtkTreeStore *store, GtkTreeIter *iter, const gchar *name)
+{
+ Style *style;
+
+ if((style = stl_styleinfo_get_style_iter(si, store, iter)) == NULL)
+ return;
+ stl_style_set_name(style, name);
+ gtk_tree_store_set(store, iter, TREE_COLUMN_NAME, name, -1);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-19 - Create a new, empty style named <name>. */
+Style * stl_style_new(const gchar *name)
+{
+ Style *stl;
+
+ stl = g_malloc(sizeof *stl);
+ g_strlcpy(stl->name, name, sizeof stl->name);
+ stl->styleinfo = NULL;
+ stl->properties = g_hash_table_new(g_str_hash, g_str_equal);
+ stl->expand = TRUE;
+
+ return stl;
+}
+
+/* 1999-05-26 - Create a new style, taking care to choose a name not used in <si>.
+** BUG BUG BUG If you have 9999 styles called "New Style N", this might fail... Big "oops".
+*/
+Style * stl_style_new_unique_name(StyleInfo *si)
+{
+ if(si != NULL)
+ {
+ gchar buf[STL_STYLE_NAME_SIZE];
+
+ g_strlcpy(buf, ("New Style"), sizeof buf);
+ if(stl_styleinfo_style_find(si, buf) != NULL)
+ {
+ guint i = 1;
+
+ do
+ {
+ g_snprintf(buf, sizeof buf, _("New Style %u"), i + 1);
+ i++;
+ } while((stl_styleinfo_style_find(si, buf) != NULL) && (i < 10000U)); /* This might fail. Big deal. */
+ }
+ return stl_style_new(buf);
+ }
+ return NULL;
+}
+
+/* 1999-05-20 - Copy a property, storing the copy in the style pointed to by <user>. */
+static void property_copy(gpointer key, gpointer value, gpointer user)
+{
+ StlProp *pr = value;
+ Style *stl = user;
+
+ if(pr->override)
+ {
+ switch(pr->value->type)
+ {
+ case SPT_COLOR:
+ stl_style_property_set_color(stl, pr->name, &pr->value->data.color);
+ break;
+ case SPT_ICON:
+ stl_style_property_set_icon(stl, pr->name, pr->value->data.icon);
+ break;
+ case SPT_ACTION:
+ stl_style_property_set_action(stl, pr->name, pr->value->data.action->str);
+ break;
+ }
+ }
+}
+
+/* 1999-05-19 - Copy a style, creating a non-memory-sharing duplicate. Note that we only
+** copy overriden properties, relying on the fact that if the copy is going
+** to be used (i.e., added to a styleinfo), its inheritance will be computed.
+*/
+Style * stl_style_copy(Style *stl)
+{
+ Style *ns = NULL;
+
+ if(stl != NULL)
+ {
+ ns = stl_style_new(stl->name);
+ ns->expand = stl->expand;
+ g_hash_table_foreach(stl->properties, property_copy, ns);
+ }
+ return ns;
+}
+
+/* 1999-05-24 - Return style from a tree selection (<wid> should be the widget passed to
+** the select handler used by stl_styleinfo_build().
+*/
+Style * stl_style_get(GtkWidget *wid)
+{
+ if(wid != NULL)
+ return g_object_get_data(G_OBJECT(wid), "user");
+ return NULL;
+}
+
+/* 1999-05-22 - Set the expand status of a style. Used when building GUI representation. */
+void stl_style_set_expand(Style *stl, gboolean expand)
+{
+ if(stl != NULL)
+ stl->expand = expand;
+}
+
+/* 1999-05-22 - Get the current expand/collapse status of given style. */
+gboolean stl_style_get_expand(Style *stl)
+{
+ if(stl != NULL)
+ return stl->expand;
+ return FALSE;
+}
+
+/* 1999-05-24 - Rename a style. */
+void stl_style_set_name(Style *stl, const gchar *name)
+{
+ if((stl != NULL) && (name != NULL))
+ g_strlcpy(stl->name, name, sizeof stl->name);
+}
+
+/* 1999-05-20 - Just get a pointer (read-only, as usual) to the style's name. */
+const gchar * stl_style_get_name(Style *stl)
+{
+ if(stl != NULL)
+ return stl->name;
+ return NULL;
+}
+
+/* 1999-06-12 - Get the branch that begins with the root style and ends with <stl>. */
+static GSList * style_get_branch(const Style *stl)
+{
+ GNode *node;
+
+ if((node = styleinfo_style_get_node(stl->styleinfo, stl)) != NULL)
+ {
+ GSList *l = NULL;
+
+ for(; node != NULL; node = node->parent)
+ l = g_slist_prepend(l, ((Style *) node->data)->name);
+ return l;
+ }
+ return NULL;
+}
+
+/* 1999-05-20 - Compare hierarchial names of <stla> and <stlb>. Used by dirpane module,
+** to sort on styles. Comparison is done so that styles with common parents
+** are grouped.
+*/
+gint stl_style_compare_hierarchy(const Style *stla, const Style *stlb)
+{
+ GSList *la, *lb;
+
+ if(stla == stlb) /* Quickly determine if they're the same. */
+ return 0;
+
+ if((la = style_get_branch(stla)) != NULL)
+ {
+ gint sd = -1;
+ if((lb = style_get_branch(stlb)) != NULL)
+ {
+ GSList *ia, *ib;
+
+ for(ia = la, ib = lb; (ia != NULL) && (ib != NULL) && ((sd = strcmp(ia->data, ib->data)) == 0);)
+ {
+ ia = g_slist_next(ia);
+ ib = g_slist_next(ib);
+ }
+ if((ia == NULL) || (ib == NULL))
+ sd = (ia == NULL) ? -1 : 1;
+ g_slist_free(lb);
+ }
+ g_slist_free(la);
+
+ return sd;
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-19 - Create a new value structure, init it as the given type, and return a pointer to it. */
+static StlPVal * value_new(StlPType type)
+{
+ StlPVal *val;
+
+ val = g_malloc(sizeof *val);
+ val->type = type;
+ switch(type)
+ {
+ case SPT_COLOR:
+ val->data.color.red = 0U;
+ val->data.color.green = 0U;
+ val->data.color.blue = 0U;
+ val->data.color.pixel = 0UL;
+ break;
+ case SPT_ICON:
+ val->data.icon[0] = '\0';
+ break;
+ case SPT_ACTION:
+ val->data.action = g_string_new("");
+ break;
+ }
+ return val;
+}
+
+/* 1999-05-19 - Destroy a value. */
+static void value_destroy(StlPVal *val)
+{
+ if(val != NULL)
+ {
+ switch(val->type)
+ {
+ case SPT_COLOR:
+ case SPT_ICON:
+ break;
+ case SPT_ACTION:
+ g_string_free(val->data.action, TRUE);
+ break;
+ }
+ g_free(val);
+ }
+}
+
+/* 1999-05-20 - Get a pointer to an overriding property named <name> in <stl>, whose type
+** is <type>. If no such property exists, create it.
+*/
+static StlProp * style_get_property(Style *stl, const gchar *name, StlPType type)
+{
+ StlProp *pr;
+
+ if((pr = g_hash_table_lookup(stl->properties, name)) != NULL)
+ {
+ if(pr->override)
+ {
+ if(pr->value->type == type)
+ return pr;
+ /* Only destroy if overriden, else we shared pointer. */
+ value_destroy(pr->value);
+ }
+ }
+ else
+ {
+ pr = g_malloc(sizeof *pr);
+ g_strlcpy(pr->name, name, sizeof pr->name);
+ g_hash_table_insert(stl->properties, pr->name, pr);
+ }
+ pr->override = TRUE;
+ pr->value = value_new(type);
+
+ return pr;
+}
+
+/* 1999-05-19 - Destroy a property, freeing all memory occupied by it. When this is called,
+** the property better NOT be still held in a style's hash table!
+*/
+static void style_property_destroy(StlProp *pr)
+{
+ if(pr != NULL)
+ {
+ if(pr->override)
+ value_destroy(pr->value);
+ g_free(pr);
+ }
+}
+
+/* 1999-05-19 - Set a new color for a color property. */
+void stl_style_property_set_color(Style *stl, const gchar *property, const GdkColor *value)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (value != NULL))
+ {
+ pr = style_get_property(stl, property, SPT_COLOR);
+ pr->value->data.color = *value;
+ styleinfo_update(stl->styleinfo);
+ }
+}
+
+/* 1999-05-19 - Set a color property, using an RGB triplet. Sometimes convenient. */
+void stl_style_property_set_color_rgb(Style *stl, const gchar *property, guint16 red, guint16 green, guint16 blue)
+{
+ GdkColor color;
+
+ color.red = red;
+ color.green = green;
+ color.blue = blue;
+ color.pixel = 0UL;
+ stl_style_property_set_color(stl, property, &color);
+}
+
+/* 1999-05-19 - Set the name of an icon-property. */
+void stl_style_property_set_icon(Style *stl, const gchar *property, const gchar *value)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (value != NULL))
+ {
+ pr = style_get_property(stl, property, SPT_ICON);
+ g_strlcpy(pr->value->data.icon, value, sizeof pr->value->data.icon);
+ styleinfo_update(stl->styleinfo);
+ }
+}
+
+/* 1999-05-19 - Set an action property to a new string. Note that empty strings are not allowed. */
+void stl_style_property_set_action(Style *stl, const gchar *property, const gchar *value)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (value != NULL))
+ {
+ pr = style_get_property(stl, property, SPT_ACTION);
+ g_string_assign(pr->value->data.action, value);
+ styleinfo_update(stl->styleinfo);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-19 - Get a read-only pointer to the color held in a color-property. */
+const GdkColor * stl_style_property_get_color(const Style *stl, const gchar *property)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (property != NULL) && ((pr = g_hash_table_lookup(stl->properties, property)) != NULL))
+ {
+ if(pr->value->type == SPT_COLOR)
+ return &pr->value->data.color;
+ }
+ return NULL;
+}
+
+/* 1999-05-19 - Get a (read-only) icon name of an appropriately typed property. */
+const gchar * stl_style_property_get_icon(const Style *stl, const gchar *property)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (property != NULL) && ((pr = g_hash_table_lookup(stl->properties, property)) != NULL))
+ {
+ if(pr->value->type == SPT_ICON)
+ return pr->value->data.icon;
+ }
+ return NULL;
+}
+
+/* 1999-05-19 - Get a (read-only, dammit) pointer to an action property definition. */
+const gchar * stl_style_property_get_action(const Style *stl, const gchar *property)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (property != NULL) && ((pr = g_hash_table_lookup(stl->properties, property)) != NULL))
+ {
+ if(pr->value->type == SPT_ACTION)
+ return pr->value->data.action->str;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-24 - Get the override status (which tells if the property is local or inherited) for
+** a named property.
+*/
+gboolean stl_style_property_get_override(const Style *stl, const gchar *property)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && (property != NULL) && ((pr = g_hash_table_lookup(stl->properties, property)) != NULL))
+ return pr->override;
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void get_action(gpointer key, gpointer value, gpointer user)
+{
+ GList **list = user;
+ StlProp *prop = value;
+
+ if(prop->value->type == SPT_ACTION)
+ *list = g_list_insert_sorted(*list, prop->name, (GCompareFunc) strcmp);
+}
+
+/* 1999-05-24 - Return a list of (very read-only) action property names. The list is valid
+** until the next person sneezes, or someone calls property_set() or _remove().
+** The list can be freed with a simple call to g_list_free().
+*/
+GList * stl_style_property_get_actions(const Style *stl)
+{
+ GList *list = NULL;
+
+ if(stl != NULL)
+ g_hash_table_foreach(stl->properties, get_action, &list);
+ return list;
+}
+
+gboolean stl_style_property_has_action(const Style *stl, const gchar *action)
+{
+ StlProp *p;
+
+ if((p = g_hash_table_lookup(stl->properties, action)) != NULL)
+ {
+ if(p->value->type == SPT_ACTION)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-27 - Another g_hash_table_foreach() callback. This one checks for overrides. */
+static void check_override(gpointer key, gpointer value, gpointer user)
+{
+ gboolean *overrides = user;
+
+ if(((StlProp *) value)->override)
+ *overrides = TRUE;
+}
+
+/* 1999-05-27 - Return TRUE if the given style overrides any property, FALSE if all it does
+** is inherit them. Handy when saving, to avoid empty "<Properties></Properties>"
+** stuff.
+*/
+gboolean stl_style_property_overrides(Style *stl)
+{
+ gboolean overrides = FALSE;
+
+ if(stl != NULL)
+ g_hash_table_foreach(stl->properties, check_override, &overrides);
+
+ return overrides;
+}
+
+/* 1999-05-25 - Answer whether the named <property> is unique in the style tree. If a property
+** is unique, deleting it will truly delete the property. If it's not, deleting
+** it will just replace the value with an inherited value. This distinction is not
+** very interesting in itself, but it helps in user interface design. :)
+*/
+gboolean stl_style_property_is_unique(Style *stl, const gchar *property)
+{
+ if((stl != NULL) && (property != NULL))
+ {
+ GNode *node;
+
+ if((node = styleinfo_style_get_node(stl->styleinfo, stl)) != NULL)
+ {
+ for(node = node->parent; node != NULL; node = node->parent)
+ {
+ if(g_hash_table_lookup(((Style *) node->data)->properties, property))
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/* 2009-04-22 - Major rewrite. This doesn't actually do a rename; it does a delete of all non-overriden
+** properties of the correct name. These, by definition, have the same value as the property
+** in the parent, so no user-owned information is lost.
+*/
+static void traverse_property_rename(GNode *node, gpointer user)
+{
+ struct property_rename_data *data = user;
+ Style *here = node->data;
+ const StlProp *pr;
+
+ if((pr = g_hash_table_lookup(here->properties, data->name_old)) != NULL)
+ {
+ /* If this child overrides the property, abort. */
+ if(pr->override)
+ return;
+ stl_style_property_remove(here, data->name_old);
+ g_node_children_foreach(node, G_TRAVERSE_ALL, traverse_property_rename, data);
+ }
+}
+
+/* 1999-05-25 - Rename <property> to <new_name>. If there is already a property with that name
+** in the given <stl>, rename will fail and return FALSE. Else, TRUE is returned.
+** 2004-02-24 - This was broken. It must recurse all child Styles, and let the renaming take
+** effect in (all) child styles, or there will be "orphan" properties left about.
+*/
+gboolean stl_style_property_rename(Style *stl, const gchar *property, const gchar *new_name)
+{
+ StlProp *pr;
+ GNode *me;
+
+ if(stl == NULL || property == NULL || new_name == NULL)
+ return FALSE;
+ if(g_hash_table_lookup(stl->properties, new_name) != NULL)
+ return FALSE;
+ if((pr = g_hash_table_lookup(stl->properties, property)) == NULL)
+ return FALSE;
+ if(!pr->override)
+ {
+ fprintf(stderr, "**Styles: can't rename non-overriden property '%s'\n", property);
+ return FALSE;
+ }
+ /* Remove from hash table, rename, and re-insert. */
+ g_hash_table_remove(stl->properties, pr->name);
+ g_strlcpy(pr->name, new_name, sizeof pr->name);
+ g_hash_table_insert(stl->properties, pr->name, pr);
+ /* Name changed. Now traverse children, and remove non-overridden instances. */
+ if((me = g_node_find(stl->styleinfo->styles, G_PRE_ORDER, G_TRAVERSE_ALL, stl)) != NULL)
+ {
+ struct property_rename_data data;
+
+ data.style = stl;
+ g_snprintf(data.name_old, sizeof data.name_old, "%s", property);
+ g_snprintf(data.name_new, sizeof data.name_new, "%s", new_name);
+ g_node_children_foreach(me, G_TRAVERSE_ALL, traverse_property_rename, &data);
+ }
+ /* Finally re-inherit stuff, if our override was of a parent's property we will now get it "back". */
+ styleinfo_update(stl->styleinfo);
+
+ return TRUE;
+}
+
+/* 1999-05-19 - Remove (and destroy) a property from a style. */
+void stl_style_property_remove(Style *stl, const gchar *property)
+{
+ StlProp *pr;
+
+ if((stl != NULL) && ((pr = g_hash_table_lookup(stl->properties, property)) != NULL))
+ {
+ g_hash_table_remove(stl->properties, property);
+ style_property_destroy(pr);
+ styleinfo_update(stl->styleinfo);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-05-20 - A g_hash_table_foreach_remove() callback. Kill a property. */
+static gboolean destroy_property(gpointer key, gpointer value, gpointer user)
+{
+ style_property_destroy(value);
+
+ return TRUE; /* Really remove. */
+}
+
+/* 1999-05-20 - Destroy a style. If <unlink> is TRUE, it will also remove the style from
+** the styleinfo, thus causing any children to <stl> to be destroyed as well.
+** This is really recommended, as leaving a styleinfo referencing destroyed
+** styles hanging around is likely to be unhealthy.
+*/
+void stl_style_destroy(Style *stl, gboolean unlink)
+{
+ if(stl != NULL)
+ {
+ if(unlink)
+ stl_styleinfo_style_remove(stl->styleinfo, stl);
+ g_hash_table_foreach_remove(stl->properties, destroy_property, NULL);
+ g_hash_table_destroy(stl->properties);
+ g_free(stl);
+ }
+}
diff --git a/src/styles.h b/src/styles.h
new file mode 100644
index 0000000..fbf3deb
--- /dev/null
+++ b/src/styles.h
@@ -0,0 +1,104 @@
+/*
+** 1998-08-11 - Header for the styles module. Surprise.
+*/
+
+#if !defined STYLES_H
+#define STYLES_H
+
+#include "xmlutil.h"
+
+/* Maximum number of guaranteed unique style name characters, plus 1. */
+#define STL_STYLE_NAME_SIZE (32)
+#define STL_PROPERTY_NAME_SIZE (32)
+
+/* A string of characters NOT legal in style names. Not enforced by style module,
+** but recommended nevertheless.
+*/
+#define STL_STYLE_NAME_REJECT "\t\n\\,.;:!\"#$¤%&/()=+*/<>[]{}'´~^"
+
+typedef struct StyleInfo StyleInfo;
+typedef struct Style Style;
+
+/* A couple of standard property names. Has no real importance, but useful to minimize
+** pain in going from the old hard-coded vector-based system to the new hash-based one.
+*/
+#define SPN_COL_UNSEL_BG "uBG"
+#define SPN_COL_UNSEL_FG "uFG"
+#define SPN_ICON_UNSEL "uIcon"
+#define SPN_ACTN_DEFAULT "Default"
+#define SPN_ACTN_VIEW "View"
+#define SPN_ACTN_EDIT "Edit"
+#define SPN_ACTN_PRINT "Print"
+#define SPN_ACTN_PLAY "Play"
+
+/* ----------------------------------------------------------------------------------------- */
+
+StyleInfo * stl_styleinfo_new(void);
+StyleInfo * stl_styleinfo_default(void);
+StyleInfo * stl_styleinfo_copy(StyleInfo *si);
+void stl_styleinfo_destroy(StyleInfo *si);
+GtkTreeStore * stl_styleinfo_build_partial(const StyleInfo *si, const Style *ignore);
+
+Style * stl_styleinfo_get_style_iter(const StyleInfo *si, GtkTreeStore *store, GtkTreeIter *iter);
+gboolean stl_styleinfo_tree_find_style(const StyleInfo *si, GtkTreeStore *store, const Style *style, GtkTreeIter *iter);
+void stl_styleinfo_set_name_iter(const StyleInfo *si, GtkTreeStore *store, GtkTreeIter *iter, const gchar *name);
+
+void stl_styleinfo_freeze(StyleInfo *si);
+void stl_styleinfo_thaw(StyleInfo *si);
+
+void stl_styleinfo_dump(StyleInfo *si);
+
+void stl_styleinfo_style_add(StyleInfo *si, Style *parent, Style *stl);
+void stl_styleinfo_style_remove(StyleInfo *si, Style *stl);
+Style * stl_styleinfo_style_find(const StyleInfo *si, const gchar *name);
+Style * stl_styleinfo_style_get_parent(StyleInfo *si, Style *stl);
+void stl_styleinfo_style_set_parent(StyleInfo *si, Style *stl, Style *new_parent);
+Style * stl_styleinfo_style_get_parent(StyleInfo *si, Style *stl);
+
+gboolean stl_styleinfo_style_siblings(StyleInfo *si, Style *stla, Style *stlb);
+
+Style * stl_styleinfo_style_root(const StyleInfo *si);
+gboolean stl_styleinfo_style_has_children(StyleInfo *si, Style *stl);
+GList * stl_styleinfo_style_get_children(StyleInfo *si, Style *stl, gboolean include_root);
+
+void stl_styleinfo_save(MainInfo *min, StyleInfo *si, FILE *out, const gchar *tag);
+StyleInfo * stl_styleinfo_load(const XmlNode *node);
+
+Style * stl_style_new(const gchar *name);
+Style * stl_style_new_unique_name(StyleInfo *si);
+Style * stl_style_copy(Style *stl);
+Style * stl_style_get(GtkWidget *wid);
+
+void stl_style_set_expand(Style *stl, gboolean expand);
+gboolean stl_style_get_expand(Style *stl);
+
+void stl_style_set_name(Style *stl, const gchar *name);
+void stl_style_set_name_widget(GtkWidget *wid, const gchar *name);
+const gchar * stl_style_get_name(Style *stl);
+GString * stl_style_get_name_full(Style *stl);
+
+gint stl_style_compare_hierarchy(const Style *stla, const Style *stlb);
+
+/* Setting a non-existent property adds it to the style. Setting a property with
+** the wrong kind of value will not do anything, but is stupid, so don't do that.
+** The way to change a property's type is to first remove it, then set it again.
+*/
+void stl_style_property_set_color(Style *stl, const gchar *property, const GdkColor *value);
+void stl_style_property_set_color_rgb(Style *stl, const gchar *property, guint16 red, guint16 green, guint16 blue);
+void stl_style_property_set_icon(Style *stl, const gchar *property, const gchar *value);
+void stl_style_property_set_action(Style *stl, const gchar *property, const gchar *value);
+const GdkColor* stl_style_property_get_color(const Style *stl, const gchar *property);
+const gchar * stl_style_property_get_icon(const Style *stl, const gchar *property);
+const gchar * stl_style_property_get_action(const Style *stl, const gchar *property);
+gboolean stl_style_property_get_override(const Style *stl, const gchar *property);
+GList * stl_style_property_get_actions(const Style *stl);
+gboolean stl_style_property_has_action(const Style *stl, const gchar *action);
+
+gboolean stl_style_property_overrides(Style *stl);
+gboolean stl_style_property_is_unique(Style *stl, const gchar *property);
+gboolean stl_style_property_rename(Style *stl, const gchar *property, const gchar *new_name);
+void stl_style_property_remove(Style *stl, const gchar *property);
+
+void stl_style_destroy(Style *stl, gboolean unlink);
+
+#endif /* STYLES_H */
diff --git a/src/textview.c b/src/textview.c
new file mode 100644
index 0000000..5216085
--- /dev/null
+++ b/src/textview.c
@@ -0,0 +1,886 @@
+/*
+** 1998-05-19 - A text viewer window. Is it simple? Yep, it worked in under well 100 lines.
+** 1998-09-10 - Sooner or later, all old code gets rewritten, it seems. This one did last
+** a long while, though.
+** 1998-09-16 - Added a command (cmd_viewtext). Sorry about the name, but it feels better.
+** 1998-12-15 - Added a GTK+ widget name to the text widget.
+** 1998-12-18 - Rewrote text reader to use mmap(), and implemented a hex viewer.
+** 1999-01-05 - Extended. Added more buttons (mainly for navigation), and a neat Goto dialog.
+** 1999-01-07 - Added search capabilities. Rather limited and perhaps not uber-smooth to use,
+** but better than nothing IMO.
+** 1999-03-02 - Revamped interface, now sort of semi-opaque. Better.
+** 1999-03-13 - Changed for the new dialog module.
+** 1999-12-12 - Removed manually created vertical scrollbar, put the GtkText widget in a scrolled
+** window instead. Might make it work better with wheelie mice?
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <gdk/gdkkeysyms.h>
+
+#include "convstream.h"
+#include "errors.h"
+#include "fileutil.h"
+#include "dirpane.h"
+#include "dialog.h"
+#include "guiutil.h"
+#include "strutil.h"
+#include "textview.h"
+
+#define HEX_ROW_SIZE (32) /* Must be multiple of four! */
+#define HEX_UNPRINTABLE ('.')
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef enum { MVE_UP = 0, MVE_DOWN, MVE_TOP, MVE_BOTTOM } MoveID;
+
+typedef struct { /* Used by the Goto-dialog. */
+ Dialog *dlg; /* Must be first, for initialization below! */
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *entry;
+} DlgGoto;
+
+typedef struct {
+ Dialog *dlg; /* Must be first, see init of static instance below. */
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *entry;
+ GtkWidget *hbox;
+ GtkWidget *fnocase;
+ GtkWidget *fnolf;
+} DlgSrch;
+
+/* As of gentoo 0.9.24, this structure is internal to this module. */
+typedef struct {
+ MainInfo *min; /* Incredibly handy. */
+ GtkWidget *win;
+ GtkWidget *scwin;
+ GObject *buffer; /* GtkTextBuffer object holding the actual text. */
+ GtkWidget *text;
+ GtkWidget *bhbox; /* Horizontal box with action buttons. */
+ GtkWidget *blabel; /* A label that is in the action box. */
+ GtkWidget *bplabel; /* This label shows file position. */
+ guint search_pos; /* Offset into text to start next search at. */
+ gulong delete_handler; /* Handler ID for the delete event. */
+ gulong keypress_handler; /* Handler ID for the keypress event. */
+ ConvStream *convstream; /* Used to abstract away encoding issues. */
+} TxvInfo;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static DlgGoto goto_dialog = { NULL }; /* Make sure the 'dlg' member is NULL. */
+static DlgSrch srch_dialog = { NULL }; /* Same here. */
+
+#define SEARCH_RE_SIZE (256) /* Far more than *I* would need... ;^) */
+
+/* Store search parameters between invocations. */
+static struct {
+ gchar re[SEARCH_RE_SIZE];
+ gboolean no_case;
+ gboolean no_lf;
+} last_search = { "", FALSE, FALSE };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gboolean do_search(TxvInfo *txi, const gchar *re_src, gboolean nocase, gboolean nolf);
+static void do_search_repeat(TxvInfo *txi);
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void really_destroy(GtkWidget *wid)
+{
+ TxvInfo *txi;
+
+ if((wid != NULL) && ((txi = g_object_get_data(G_OBJECT(wid), "user")) != NULL))
+ {
+ if(goto_dialog.dlg != NULL) /* Goto dialog window open? Then close it. */
+ {
+ dlg_dialog_sync_close(goto_dialog.dlg, -1);
+ goto_dialog.dlg = NULL;
+ }
+ if(srch_dialog.dlg != NULL) /* Close down search window, if open. */
+ {
+ dlg_dialog_sync_close(srch_dialog.dlg, -1);
+ srch_dialog.dlg = NULL;
+ }
+ g_object_unref(txi->buffer);
+ g_free(txi);
+ win_window_close(wid);
+ }
+}
+
+/* 2012-12-27 - Helper function to move the cursor to the start of the buffer. This is handy after
+** loading, since all the append()s tend to leave the cursor at the end, while the
+** visible part is the first page. This causes weirdness when moving.
+*/
+static void cursor_to_start(TxvInfo *txi)
+{
+ GtkTextIter iter;
+
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ gtk_text_buffer_place_cursor(GTK_TEXT_BUFFER(txi->buffer), &iter);
+}
+
+/* 1998-05-19 - This simplistic thing causes the textviewing window to close when needed. */
+static gint evt_delete(GtkWidget *wid, GdkEvent *evt, gpointer user)
+{
+ really_destroy(wid);
+
+ return FALSE;
+}
+
+/* 2010-07-19 - Rewritten in a much simpler way. Now, input is expected to be UTF-8, so we don't need to check/convert. */
+static void do_text_append(TxvInfo *txi, const gchar *text, gsize length)
+{
+ GtkTextIter iter;
+
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ gtk_text_buffer_insert(GTK_TEXT_BUFFER(txi->buffer), &iter, text, length);
+}
+
+/* 1999-03-02 - Users of this module no longer have access to the GtkText widget, so
+** this function is needed for them to be able to actually display text.
+*/
+void txv_text_append(GtkWidget *wid, const gchar *text, gsize length)
+{
+ TxvInfo *txi;
+
+ if((wid == NULL) || ((txi = g_object_get_data(G_OBJECT(wid), "user")) == NULL) || length < 1)
+ return;
+ do_text_append(txi, text, length);
+}
+
+/* 2008-09-26 - Append a block of text, and give it the given color too. Spiffy! */
+void txv_text_append_with_color(GtkWidget *wid, const gchar *text, gsize length, const GdkColor *color)
+{
+ TxvInfo *txi;
+ GtkTextIter start, end;
+ gchar tname[32];
+ gint pos;
+ GtkTextTagTable *ttab;
+ GtkTextTag *tag;
+
+ if(color == NULL)
+ {
+ txv_text_append(wid, text, length);
+ return;
+ }
+ if((wid == NULL) || ((txi = g_object_get_data(G_OBJECT(wid), "user")) == NULL) || length < 1)
+ return;
+ pos = gtk_text_buffer_get_char_count(GTK_TEXT_BUFFER(txi->buffer));
+ do_text_append(txi, text, length);
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &start, pos);
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(txi->buffer), &end);
+
+ /* Be clever. Build a tag name that depends on the color, to re-use tags. */
+ g_snprintf(tname, sizeof tname, "txv-%04x%04x%04x", color->red, color->green, color->blue);
+ /* If a tag by this name already exists, re-use it. */
+ ttab = gtk_text_buffer_get_tag_table(GTK_TEXT_BUFFER(txi->buffer));
+ if((tag = gtk_text_tag_table_lookup(ttab, tname)) == NULL)
+ tag = gtk_text_buffer_create_tag(GTK_TEXT_BUFFER(txi->buffer), tname, "foreground-gdk", color, NULL);
+ gtk_text_buffer_apply_tag(GTK_TEXT_BUFFER(txi->buffer), tag, &start, &end);
+}
+
+static void sink_text(const gchar *text, gsize length, gpointer user)
+{
+ TxvInfo *txi = user;
+
+ /* Is the conversion stream trying to signal us an error? */
+ if(length == 0)
+ {
+ gchar msg[256];
+ gsize len;
+ GdkColor red;
+
+ len = g_snprintf(msg, sizeof msg, _("\n** Text conversion from charset '%s' failed, aborting."), text);
+ red.red = 0xffff;
+ red.green = 0;
+ red.blue = 0;
+ red.pixel = 0;
+ txv_text_append_with_color(txi->win, msg, len, &red);
+ return;
+ }
+ do_text_append(txi, text, length);
+}
+
+/* 1998-12-18 - Rewrote this a couple of times today. Note how this version really doesn't
+** care about the size of its input file; it just reads until reading fails.
+** This makes it possible to look at /proc files, which have size 0.
+** 1998-12-20 - Now uses mmap() if file has a non-zero size. Best of both worlds.
+** 1999-02-03 - Changed prototype slightly, since it got public. Added the <use_mmap> flag,
+** since we don't want to read config options at this level.
+** 1999-02-20 - Now checks the return value of mmap() correctly (I assumed it returned
+** NULL on failure, don't know how I got that idea). Also now falls back on
+** using normal file I/O if mmap() fails, which can happen on certain filesystems.
+** 1999-03-02 - New interface, renamed.
+** 1999-04-06 - Added the <buf_size> argument, which is used when mmap() isn't.
+** 2010-02-28 - Ported to GIO, mmap support removed (sadly).
+*/
+gint txv_text_load(GtkWidget *wid, GFile *file, gsize buf_size, const gchar *encoding, GError **err)
+{
+ TxvInfo *txi;
+ GFileInputStream *is;
+
+ if((wid == NULL) || ((txi = g_object_get_data(G_OBJECT(wid), "user")) == NULL) || (file == NULL))
+ return 0;
+
+ txv_set_label_from_file(wid, file);
+
+ err_clear(txi->min);
+ if((is = g_file_read(file, NULL, err)) != NULL)
+ {
+ gchar *buf;
+ gssize got;
+ ConvStream *cs;
+
+ buf = g_malloc(buf_size);
+ cs = convstream_new(encoding, 32 << 10, sink_text, txi);
+ while((got = g_input_stream_read(G_INPUT_STREAM(is), buf, buf_size, NULL, err)) > 0)
+ {
+ convstream_source(cs, buf, got);
+ }
+ convstream_destroy(cs);
+ g_free(buf);
+ g_object_unref(is);
+ cursor_to_start(txi);
+ }
+ return *err == NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-12-18 - Build "groups" of actual hex data, from <data> and <bytes> bytes on. */
+static void build_hex_group(const guchar *data, gchar *group, gsize bytes)
+{
+ const static gchar *hex = "0123456789ABCDEF";
+ guint8 here;
+ gsize i;
+
+ for(i = 0; i < bytes; i++)
+ {
+ if(i && !(i & 3))
+ group++;
+ here = (guint8) *data++;
+ *group++ = hex[here >> 4];
+ *group++ = hex[here & 15];
+ }
+}
+
+/* 1998-12-18 - Build text representation of stuff found at <data>, <bytes> bytes worth. */
+static void build_hex_text(const guchar *data, gchar *text, gsize bytes)
+{
+ gsize i;
+
+ for(i = 0; i < bytes; i++, data++)
+ *text++ = isprint((guchar) *data) ? *data : HEX_UNPRINTABLE;
+}
+
+/* 1998-12-18 - Add contents of file <name> into GtkText widget <wid>, as a hex dump.
+** 1999-02-03 - New prototype, now public.
+** 1999-02-20 - Fixed use of mmap(), and added fall-back to ordinary read() I/O if
+** the wanted file couldn't be mapped. This might be suboptimal for huge
+** files...
+** 1999-03-02 - New interface, renamed.
+** 1999-04-06 - Cleaned up. Since the data-to-ASCII-hex conversion is only done on a small
+** number of bytes at a time, it was grossly inefficient to load the entire file.
+** Now we do plenty of small read()s instead, which I'm sure is slower, but at
+** least doesn't waste memory.
+** 2010-02-28 - Ported to use GIO.
+*/
+gint txv_text_load_hex(GtkWidget *win, GFile *file, GError **err)
+{
+ gchar line[8 + 1 + (HEX_ROW_SIZE / 4) * 9 + 1 + HEX_ROW_SIZE + 1 + 1],
+ group[9 * (HEX_ROW_SIZE / 4) + 1], text[HEX_ROW_SIZE + 1];
+ TxvInfo *txi;
+ GFileInputStream *is;
+ GtkTextTag *tag;
+
+ if((win == NULL) || ((txi = g_object_get_data(G_OBJECT(win), "user")) == NULL) || (file == NULL))
+ return 0;
+
+ txv_set_label_from_file(win, file);
+
+ memset(group, ' ', sizeof group - 1);
+ group[sizeof group - 1] = '\0';
+ memset(text, ' ', sizeof text - 1);
+ text[sizeof text - 1] = '\0';
+
+ err_clear(txi->min);
+ if((is = g_file_read(file, NULL, err)) != NULL)
+ {
+ guchar buf[HEX_ROW_SIZE];
+ GtkTextIter iter;
+ gsize offset = 0, chunk, len;
+
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ while((chunk = g_input_stream_read(G_INPUT_STREAM(is), buf, sizeof buf, NULL, err)) > 0)
+ {
+ if(chunk < sizeof buf)
+ {
+ memset(group, ' ', sizeof group - 1);
+ memset(text, ' ', sizeof text - 1);
+ }
+ build_hex_group(buf, group, chunk);
+ build_hex_text(buf, text, chunk);
+ len = g_snprintf(line, sizeof line, "%08lX %s %s\n", (unsigned long) offset, group, text);
+ gtk_text_buffer_insert(GTK_TEXT_BUFFER(txi->buffer), &iter, line, len);
+ offset += chunk;
+ }
+ g_object_unref(is);
+ cursor_to_start(txi);
+ }
+
+ if((tag = gtk_text_tag_new("fixed")) != NULL)
+ {
+ GtkTextIter start, end;
+ GtkTextTagTable *tt;
+
+ g_object_set(G_OBJECT(tag), "family", "Monospace", NULL);
+ tt = gtk_text_buffer_get_tag_table(GTK_TEXT_BUFFER(txi->buffer));
+ gtk_text_tag_table_add(tt, tag);
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(txi->buffer), &start);
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(txi->buffer), &end);
+ gtk_text_buffer_apply_tag(GTK_TEXT_BUFFER(txi->buffer), tag, &start, &end);
+ g_object_unref(G_OBJECT(tag));
+ }
+ return *err == NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-01-07 - Reset the search, so that the next one starts at the beginning. */
+static void reset_search(TxvInfo *txi)
+{
+ if(txi != NULL)
+ {
+ GtkTextIter iter;
+
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ gtk_text_buffer_select_range(GTK_TEXT_BUFFER(txi->buffer), &iter, &iter);
+ txi->search_pos = 0;
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-02-23 - An attempt to support ESCape for closing down the text viewer. Shouldn't
+** be too harmful. I hope.
+*/
+static gint evt_keypress(GtkWidget *wid, GdkEventKey *evt, gpointer user)
+{
+ TxvInfo *txi = g_object_get_data(G_OBJECT(wid), "user");
+
+ if(evt->keyval == GDK_KEY_Escape || evt->keyval == GDK_KEY_Left)
+ really_destroy(wid);
+ else if(evt->keyval == GDK_KEY_End)
+ {
+ GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(txi->scwin));
+ gtk_adjustment_set_value(adj, gtk_adjustment_get_upper(adj));
+ }
+ else if(evt->keyval == GDK_KEY_F3)
+ do_search_repeat(txi);
+ else
+ return FALSE;
+ return TRUE;
+}
+
+/* 1999-01-07 - This handler gets called when the vertical range (scrollbar) changes. This
+** should probably also include the number of lines available, but that is a
+** rather fuzzy quantity, so I'll just leave that for now.
+*/
+static gint evt_pos_changed(GtkAdjustment *adj, gpointer user)
+{
+ TxvInfo *txi = user;
+ gchar buf[64];
+ gfloat p;
+ GtkTextIter iter;
+ gint bx, by;
+ const float value = gtk_adjustment_get_value(adj);
+ const float upper = gtk_adjustment_get_upper(adj);
+ const float page_size = gtk_adjustment_get_page_size(adj);
+
+ if(upper - page_size > 0.0f)
+ {
+ p = 100 * (value / (upper - page_size));
+ if(p > 100.0)
+ p = 100.0;
+ }
+ else
+ p = 0.0f;
+
+ gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(txi->text), GTK_TEXT_WINDOW_WIDGET, 0, 0, &bx, &by);
+ gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(txi->text), &iter, by, NULL);
+ by = gtk_text_iter_get_line(&iter) + 1;
+ g_snprintf(buf, sizeof buf, _("Line %d (%.0f%%)"), by, p);
+ gtk_label_set_text(GTK_LABEL(txi->bplabel), buf);
+
+ return TRUE;
+}
+
+/* 1999-01-05 - User clicked on one of the four basic movement buttons. Determine which, and
+** make the text move accordingly.
+*/
+static gint evt_move_clicked(GtkWidget *wid, gpointer user)
+{
+ TxvInfo *txi = user;
+ GtkTextIter iter;
+ gint bx, by;
+
+ gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(txi->text), GTK_TEXT_WINDOW_WIDGET, 0, 0, &bx, &by);
+ gtk_text_view_get_line_at_y(GTK_TEXT_VIEW(txi->text), &iter, by, NULL);
+
+ switch((MoveID) GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "user")))
+ {
+ case MVE_UP:
+ gtk_text_view_backward_display_line(GTK_TEXT_VIEW(txi->text), &iter);
+ gtk_text_view_backward_display_line_start(GTK_TEXT_VIEW(txi->text), &iter);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 0.0);
+ break;
+ case MVE_DOWN:
+ gtk_text_view_forward_display_line(GTK_TEXT_VIEW(txi->text), &iter);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 0.0);
+ break;
+ case MVE_TOP:
+ gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 0.0);
+ reset_search(txi);
+ break;
+ case MVE_BOTTOM:
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(txi->buffer), &iter);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 1.0);
+ reset_search(txi);
+ break;
+ }
+ return TRUE;
+}
+
+/* 1999-01-05 - User hit the "Goto..." button. Pop up a dialog asking for destination. */
+static void evt_goto_clicked(GtkWidget *wid, gpointer user)
+{
+ TxvInfo *txi = user;
+ GtkAdjustment *adj;
+
+ goto_dialog.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ goto_dialog.label = gtk_label_new(_("Enter Line Number or Percentage:"));
+ gtk_box_pack_start(GTK_BOX(goto_dialog.vbox), goto_dialog.label, FALSE, FALSE, 0);
+ goto_dialog.entry = gui_dialog_entry_new();
+ gtk_box_pack_start(GTK_BOX(goto_dialog.vbox), goto_dialog.entry, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(goto_dialog.vbox);
+ goto_dialog.dlg = dlg_dialog_sync_new(goto_dialog.vbox, _("Goto"), NULL);
+ gtk_widget_grab_focus(goto_dialog.entry);
+ if((dlg_dialog_sync_wait(goto_dialog.dlg) == DLG_POSITIVE) &&
+ (adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(txi->scwin))) != NULL)
+ {
+ const gchar *txt;
+ gchar unit;
+ gint value, line;
+ GtkTextIter iter;
+
+ txt = gtk_entry_get_text(GTK_ENTRY(goto_dialog.entry));
+ if(sscanf(txt, "0x%x", &value) == 1) /* Hexadecimal offset? */
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &iter, value);
+ else if(sscanf(txt, "%d%c", &value, &unit) == 2)
+ {
+ /* Kind of overly clever this part, perhaps. */
+ switch(unit)
+ {
+ case '%':
+ line = (gtk_text_buffer_get_line_count(GTK_TEXT_BUFFER(txi->buffer)) * value) / 100;
+ gtk_text_buffer_get_iter_at_line(GTK_TEXT_BUFFER(txi->buffer), &iter, line);
+ break;
+ case 'M':
+ case 'm':
+ value <<= 10; /* Yes, only 10, 10 more below. */
+ /* Fall-through, re-use get_iter call. */
+ case 'K':
+ case 'k':
+ value <<= 10;
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &iter, value);
+ break;
+ }
+ }
+ else if(sscanf(txt, "%d", &value) == 1) /* Line number? */
+ gtk_text_buffer_get_iter_at_line(GTK_TEXT_BUFFER(txi->buffer), &iter, value);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 0.0);
+ }
+ if(goto_dialog.dlg != NULL)
+ {
+ dlg_dialog_sync_destroy(goto_dialog.dlg);
+ goto_dialog.dlg = NULL; /* Indicate that the dialog is no longer open. */
+ }
+}
+
+static gint evt_close_clicked(GtkWidget *wid, gpointer user)
+{
+ TxvInfo *txi = user;
+ GtkWidget *win;
+
+ if(txi != NULL)
+ {
+ win = txi->win;
+ really_destroy(win);
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-01-07 - Scroll the text so that the character at offset <pos> from the beginning
+** becomes visible. This search disregards wrapped lines, for reasons of
+** programmer sanity preservation. This obviously sucks, but I really don't
+** want to dig *that* deep into the GtkText widget. There is an easy way to
+** accomplish this that eliminates this problem: use a insert/delete pair.
+** However, that causes the widget to *scroll* to the required position. Yawn.
+** 2008-03-09 - Then came GTK+, TextIters, and life became simpler in some ways.
+*/
+static void show_text(TxvInfo *txi, gint pos)
+{
+ GtkTextIter iter;
+
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &iter, pos);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(txi->text), &iter, 0.0, TRUE, 0.0, 0.0);
+}
+
+/* 1999-01-07 - Do the actual search, using <re_src> as the regular expression source. This
+** should really begin with '(', end with ')', and don't contain any non-escaped
+** parentheses within!
+** 2008-03-15 - Ported to use glib's GRegex data structures, for fun.
+*/
+static gboolean do_search(TxvInfo *txi, const gchar *re_src, gboolean nocase, gboolean nolf)
+{
+ GRegex *re;
+ GError *err = NULL;
+ gchar *text;
+ gint found = FALSE, cflags = G_REGEX_EXTENDED | G_REGEX_MULTILINE;
+
+ if(nocase)
+ cflags |= G_REGEX_CASELESS;
+ if(nolf)
+ cflags |= G_REGEX_DOTALL;
+
+ if((re = g_regex_new(re_src, cflags, G_REGEX_MATCH_NOTBOL, &err)) != NULL)
+ {
+ GtkTextIter start, end;
+
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &start, txi->search_pos);
+ gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(txi->buffer), &end);
+ if((text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(txi->buffer), &start, &end, TRUE)) != NULL)
+ {
+ GMatchInfo *match = NULL;
+
+ if(g_regex_match(re, text, 0, &match))
+ {
+ gint startpos, endpos;
+
+ if(g_match_info_fetch_pos(match, 0, &startpos, &endpos))
+ {
+ show_text(txi, txi->search_pos + startpos);
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &start, txi->search_pos + startpos);
+ gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(txi->buffer), &end, txi->search_pos + endpos);
+ gtk_text_buffer_select_range(GTK_TEXT_BUFFER(txi->buffer), &start, &end);
+ txi->search_pos += endpos;
+ }
+ found = TRUE;
+ }
+ g_match_info_free(match);
+ g_free(text);
+ }
+ g_regex_unref(re);
+ }
+ if(err != NULL)
+ {
+ dlg_dialog_async_new_error(err->message);
+ g_error_free(err);
+ }
+ return found;
+}
+
+/* 1999-01-07 - User hit the "Search" button, so let's pop up something to request parameters. */
+static void evt_search_clicked(GtkWidget *wid, gpointer user)
+{
+ TxvInfo *txi = user;
+
+ srch_dialog.vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ srch_dialog.label = gtk_label_new(_("Enter Text to Search For (RE)"));
+ gtk_box_pack_start(GTK_BOX(srch_dialog.vbox), srch_dialog.label, FALSE, FALSE, 0);
+ srch_dialog.entry = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(srch_dialog.entry), SEARCH_RE_SIZE - 1);
+ gtk_entry_set_text(GTK_ENTRY(srch_dialog.entry), last_search.re);
+ gtk_editable_select_region(GTK_EDITABLE(srch_dialog.entry), 0, -1);
+ gtk_box_pack_start(GTK_BOX(srch_dialog.vbox), srch_dialog.entry, FALSE, FALSE, 0);
+ srch_dialog.hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ srch_dialog.fnocase = gtk_check_button_new_with_label(_("Ignore Case?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(srch_dialog.fnocase), last_search.no_case);
+ gtk_box_pack_start(GTK_BOX(srch_dialog.hbox), srch_dialog.fnocase, TRUE, TRUE, 0);
+ srch_dialog.fnolf = gtk_check_button_new_with_label(_("Don't Span Newlines?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(srch_dialog.fnolf), last_search.no_lf);
+ gtk_box_pack_start(GTK_BOX(srch_dialog.hbox), srch_dialog.fnolf, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(srch_dialog.vbox), srch_dialog.hbox, FALSE, FALSE, 0);
+
+ gtk_widget_show_all(srch_dialog.vbox);
+ srch_dialog.dlg = dlg_dialog_sync_new(srch_dialog.vbox, _("Search"), NULL);
+ gtk_widget_grab_focus(srch_dialog.entry);
+ if(dlg_dialog_sync_wait(srch_dialog.dlg) == DLG_POSITIVE)
+ {
+ const gchar *txt;
+ GString *tmp;
+
+ txt = gtk_entry_get_text(GTK_ENTRY(srch_dialog.entry));
+ g_strlcpy(last_search.re, txt, sizeof last_search.re);
+ last_search.no_case = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(srch_dialog.fnocase));
+ last_search.no_lf = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(srch_dialog.fnolf));
+ if(txt != NULL && (tmp = g_string_new("(")) != NULL)
+ {
+ for(; *txt; txt++) /* Quote any parentheses in user's string. */
+ {
+ if(*txt == '(')
+ g_string_append(tmp, "\\(");
+ else if(*txt == ')')
+ g_string_append(tmp, "\\)");
+ else
+ g_string_append_c(tmp, *txt);
+ }
+ g_string_append_c(tmp, ')');
+ do_search(txi, tmp->str, last_search.no_case, last_search.no_lf);
+ g_string_free(tmp, TRUE);
+ }
+ }
+ if(srch_dialog.dlg != NULL)
+ {
+ dlg_dialog_sync_destroy(srch_dialog.dlg);
+ srch_dialog.dlg = NULL; /* Indicate that the dialog is no longer open. */
+ }
+}
+
+static void do_search_repeat(TxvInfo *txi)
+{
+ if(last_search.re[0] != '\0')
+ {
+ if(!do_search(txi, last_search.re, last_search.no_case, last_search.no_lf) && txi->search_pos > 0)
+ {
+ reset_search(txi);
+ do_search(txi, last_search.re, last_search.no_case, last_search.no_lf);
+ }
+ }
+ else
+ evt_search_clicked(NULL, txi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-10 - A complete rewrite of the textview widget creation stuff. Now supports just creating
+** the necessary widgetry, and then returning it to the caller for custom manipulation
+** elsewhere. Very useful when capturing output of commands. Consistency is nice.
+** 1998-09-11 - Added the <with_save> boolean, which when TRUE enables a "Save" button.
+** 1999-01-05 - Removed the <with_save> boolean, added loads of other fun buttons that are always
+** there instead. :)
+** 1999-02-03 - Added the <label> argument, which will be set if non-NULL.
+** 1999-03-02 - Redid interface.
+*/
+GtkWidget * txv_open(MainInfo *min, const gchar *label)
+{
+ GtkWidget *vbox, *btn, *bhbox;
+ TxvInfo *txi;
+ GtkAccelGroup *accel;
+
+ txi = g_malloc(sizeof *txi);
+
+ txi->min = min;
+ txi->search_pos = 0; /* Start searching from the beginning. */
+ txi->delete_handler = 0u;
+ txi->keypress_handler = 0u;
+
+ txi->win = win_window_open(min->cfg.wininfo, WIN_TEXTVIEW);
+ g_object_set_data(G_OBJECT(txi->win), "user", txi);
+ txv_connect_delete(txi->win, NULL, NULL);
+ txv_connect_keypress(txi->win, NULL, NULL);
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ txi->buffer = G_OBJECT(gtk_text_buffer_new(NULL));
+ txi->text = gtk_text_view_new_with_buffer(GTK_TEXT_BUFFER(txi->buffer));
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(txi->text), FALSE);
+ gtk_widget_set_name(txi->text, "txvText");
+
+ txi->scwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txi->scwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ g_signal_connect_after(G_OBJECT(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(txi->scwin))),
+ "value_changed", G_CALLBACK(evt_pos_changed), txi);
+ gtk_container_add(GTK_CONTAINER(txi->scwin), txi->text);
+
+ gtk_box_pack_start(GTK_BOX(vbox), txi->scwin, TRUE, TRUE, 0);
+
+ txi->bhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ if(label != NULL)
+ txi->blabel = gtk_label_new(label);
+ else
+ txi->blabel = gtk_label_new("");
+ gtk_label_set_ellipsize(GTK_LABEL(txi->blabel), PANGO_ELLIPSIZE_MIDDLE);
+ gtk_label_set_xalign(GTK_LABEL(txi->blabel), 0.f);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), txi->blabel, TRUE, TRUE, 10);
+
+ txi->bplabel = gtk_label_new("");
+ gtk_label_set_xalign(GTK_LABEL(txi->bplabel), 1.0f);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), txi->bplabel, FALSE, FALSE, 0);
+
+ accel = gtk_accel_group_new();
+
+ btn = gtk_button_new_from_icon_name("go-up", GTK_ICON_SIZE_MENU);
+ g_object_set_data(G_OBJECT(btn), "user", GINT_TO_POINTER(MVE_UP));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_move_clicked), txi);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), btn, FALSE, FALSE, 0);
+ btn = gtk_button_new_from_icon_name("go-down", GTK_ICON_SIZE_MENU);
+ g_object_set_data(G_OBJECT(btn), "user", GINT_TO_POINTER(MVE_DOWN));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_move_clicked), txi);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), btn, FALSE, FALSE, 0);
+ btn = gtk_button_new_from_icon_name("go-top", GTK_ICON_SIZE_MENU);
+ g_object_set_data(G_OBJECT(btn), "user", GINT_TO_POINTER(MVE_TOP));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_move_clicked), txi);
+ gtk_widget_add_accelerator(btn, "clicked", accel, GDK_KEY_Home, 0, 0);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), btn, FALSE, FALSE, 0);
+ btn = gtk_button_new_from_icon_name("go-bottom", GTK_ICON_SIZE_MENU);
+ g_object_set_data(G_OBJECT(btn), "user", GINT_TO_POINTER(MVE_BOTTOM));
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_move_clicked), txi);
+ gtk_widget_add_accelerator(btn, "clicked", accel, GDK_KEY_End, 0, 0);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), btn, FALSE, FALSE, 0);
+
+ bhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ btn = gtk_button_new_from_icon_name("go-jump", GTK_ICON_SIZE_MENU);
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_goto_clicked), txi);
+ gtk_box_pack_start(GTK_BOX(bhbox), btn, FALSE, FALSE, 0);
+
+ btn = gui_details_button_new();
+ gtk_widget_add_accelerator(btn, "clicked", accel, GDK_KEY_F, GDK_CONTROL_MASK, 0);
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_search_clicked), txi);
+ gtk_box_pack_start(GTK_BOX(bhbox), btn, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), bhbox, FALSE, FALSE, 5);
+
+ btn = gtk_button_new_from_icon_name("window-close", GTK_ICON_SIZE_MENU);
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(evt_close_clicked), txi);
+ gtk_box_pack_start(GTK_BOX(txi->bhbox), btn, FALSE, TRUE, 0);
+ gtk_widget_set_sensitive(txi->bhbox, FALSE);
+ gtk_box_pack_start(GTK_BOX(vbox), txi->bhbox, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(txi->win), vbox);
+ gtk_window_add_accel_group(GTK_WINDOW(txi->win), accel);
+
+ /* Now that all is built, initialize position-displaying label. */
+ evt_pos_changed(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(txi->scwin)), txi);
+
+ gtk_widget_show_all(vbox);
+ gtk_widget_grab_focus(txi->text);
+
+ return txi->win;
+}
+
+/* 1999-12-23 - Show the textviewing widget. Just a wrapper, isolating the use of the window
+** utility module from the point of view of users of the textview. OK?
+*/
+void txv_show(GtkWidget *textviewer)
+{
+ win_window_show(textviewer);
+}
+
+/* 2010-03-13 - Factored this one out of txv_connect_delete() and txv_connect_keypress, below. */
+static gulong connect_handler(TxvInfo *txi, gulong *handler, const gchar *signame, GCallback func, GCallback default_func, gpointer user)
+{
+ if(*handler != 0u)
+ {
+ g_signal_handler_disconnect(G_OBJECT(txi->win), *handler);
+ *handler = 0;
+ }
+ if(func == NULL) /* Reset internal handler? */
+ {
+ func = default_func;
+ user = txi->win;
+ }
+ *handler = g_signal_connect(G_OBJECT(txi->win), signame, func, user);
+ return *handler;
+}
+
+/* 2010-03-13 - Replace the module's own default delete handler with a custom handler.
+** Note that in order to not leak memory, any custom handler must call
+** txv_close() itself to clean up after the view.
+*/
+gulong txv_connect_delete(GtkWidget *wid, GCallback func, gpointer user)
+{
+ TxvInfo *txi;
+
+ if((wid == NULL) || ((txi = g_object_get_data(G_OBJECT(wid), "user")) == NULL))
+ return 0;
+ return connect_handler(txi, &txi->delete_handler, "delete_event", func, G_CALLBACK(evt_delete), user);
+}
+
+/* 1999-03-02 - Install a keypress handler on the textviewing window. This cannot be
+** done directly by the module user, since we have an internal handler
+** and they don't seem to chain properly... Odd.
+*/
+gulong txv_connect_keypress(GtkWidget *wid, GCallback func, gpointer user)
+{
+ TxvInfo *txi;
+
+ if((wid == NULL) || ((txi = g_object_get_data(G_OBJECT(wid), "user")) == NULL))
+ return 0;
+ return connect_handler(txi, &txi->keypress_handler, "key_press_event", func, G_CALLBACK(evt_keypress), user);
+}
+
+/* 1999-01-05 - Set the label. This is kind of redundant, but true to the original Opus look. :)
+** 1999-03-02 - New interface.
+*/
+void txv_set_label(GtkWidget *wid, const gchar *text)
+{
+ TxvInfo *txi;
+
+ if(wid != NULL && (txi = g_object_get_data(G_OBJECT(wid), "user")) != NULL && text != NULL)
+ {
+ win_window_set_title(wid, text);
+ gtk_label_set_text(GTK_LABEL(txi->blabel), text);
+ }
+}
+
+/* 2009-05-27 - Set the label of the view, based on a filename input. This needs encoding-conversion.
+** 2010-02-28 - Converted to GIO.
+*/
+void txv_set_label_from_file(GtkWidget *wid, GFile *file)
+{
+ gchar *dn;
+
+ if((dn = g_file_get_parse_name(file)) != NULL)
+ {
+ txv_set_label(wid, dn);
+ g_free(dn);
+ }
+}
+
+/* 1999-03-02 - Enable the text widget for viewing. Called once all insertions are done. */
+void txv_enable(GtkWidget *wid)
+{
+ TxvInfo *txi;
+
+ if((wid != NULL) && ((txi = g_object_get_data(G_OBJECT(wid), "user")) != NULL))
+ {
+ gtk_widget_show(wid); /* Just in case. */
+/* gtk_adjustment_set_value(GTK_ADJUSTMENT(GTK_TEXT(txi->text)->vadj), 0.0f);*/
+ gtk_widget_set_sensitive(txi->bhbox, TRUE);
+ }
+ else
+ fprintf(stderr, "TEXTVIEW: Couldn't enable\n");
+}
+
+/* 1999-02-23 - Close down a text viewer. Handy for use from cmdgrab.
+** 1999-03-02 - New interface.
+*/
+void txv_close(GtkWidget *wid)
+{
+ TxvInfo *txi;
+
+ if(wid != NULL && (txi = g_object_get_data(G_OBJECT(wid), "user")) != NULL)
+ really_destroy(txi->win); /* This makes the TxvInfo go away. */
+}
diff --git a/src/textview.h b/src/textview.h
new file mode 100644
index 0000000..2392002
--- /dev/null
+++ b/src/textview.h
@@ -0,0 +1,35 @@
+/*
+** 1998-05-19 - Header file for the text viewing module. Real complex.
+** 1999-03-02 - Completely redesigned interface. Now uses a (rather) opaque
+** GTK+ widget. Makes life easier for the cmdgrab module.
+*/
+
+#if !defined TEXTVIEW_H
+#define TEXTVIEW_H
+
+/* Open and return a pointer to a text viewing window. The only thing the caller
+** is allowed to assume about it is that it is a GTK+ window widget. Its GTK+
+** user data slot is used internally by the txv module, so keep out! Also, it's
+** not a good idea to destroy it by any other means than calling txv_close() on it.
+*/
+extern GtkWidget * txv_open(MainInfo *min, const gchar *label);
+
+extern void txv_show(GtkWidget *textviewer);
+
+extern gulong txv_connect_delete(GtkWidget *wid, GCallback func, gpointer user);
+extern gulong txv_connect_keypress(GtkWidget *wid, GCallback func, gpointer user);
+
+extern void txv_set_label(GtkWidget *wid, const gchar *text);
+extern void txv_set_label_from_file(GtkWidget *wid, GFile *file);
+
+extern void txv_text_append(GtkWidget *wid, const gchar *text, gsize length);
+extern void txv_text_append_with_color(GtkWidget *wid, const gchar *text, gsize length, const GdkColor *color);
+
+extern gint txv_text_load(GtkWidget *wid, GFile *file, gsize buf_size, const gchar *encoding, GError **err);
+extern gint txv_text_load_hex(GtkWidget *wid, GFile *file, GError **err);
+
+extern void txv_enable(GtkWidget *wid);
+
+extern void txv_close(GtkWidget *wid);
+
+#endif /* TEXTVIEW_H */
diff --git a/src/types.c b/src/types.c
new file mode 100644
index 0000000..ff12561
--- /dev/null
+++ b/src/types.c
@@ -0,0 +1,591 @@
+/*
+** 1998-08-02 - This module deals with file types. It provides services to initialize the
+** default types, add/delete/move previously created types, and even using all
+** this type information to analyze files. This is useful stuff.
+** 1998-08-15 - Mild redesign; all functions now take a "generic" GList rather than a CfgInfo.
+** This allows use of these functions on styles _not_ sitting on the global
+** CfgInfo.style list. Very handy when editing.
+** 1998-08-26 - Massive hacking to implement support for 'file' RE matching. Got a lot nicer
+** than I had first expected, actually. If used, 'file' is always envoked
+** exactly once for each dirpane. This cuts down on the overhead of 'file'
+** reading and parsing its rather hefty (~120 KB on my system) config file.
+** 1998-09-15 - Added support for case-insensitive regular expressions.
+** 1998-09-16 - Added priorities to file types, controlling the order in which they are
+** checked (and listed, of course). Priorities are in 0..254, which I really
+** think should be enough. If I'm wrong, I'll just square that number. :) 0 is
+** the highest priority (which should explain why 255 is reserved for "Unknown").
+** 1998-09-18 - Regular expressions are now handled by the POSIX code in the standard C library.
+** No longer any need for Henry Spencer's code. Feels good.
+** 1998-12-13 - Priorities removed. Types now explicitly ordered by user in config.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <stddef.h>
+
+#include "dirpane.h"
+#include "errors.h"
+#include "strutil.h"
+#include "styles.h"
+#include "fileutil.h"
+#include "types.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Collected variables that deal with 'file' into a struct, for clarity. */
+static struct
+{
+ gboolean file_used; /* Any types using 'file' active? */
+ GSList *files; /* Current list of files to inspect. */
+ gboolean sigpipe_installed; /* SIGPIPE handler installed? */
+ volatile gint sigpipe_occured; /* Did we just catch SIGPIPE? */
+} file_info;
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-02 - Create a new type, with the given <name> and identification strings. Use
+** NULL for an identifier that should not be used. Returns a pointer to a new
+** FType structure, or NULL on failure.
+** 1998-08-11 - Now takes the name of a <style> to apply to files of this type, too.
+** 1998-09-07 - Added another argument, for the new permissions support. That's eight
+** arguments; pretty close to my personal limit. :)
+** 1999-05-29 - Removed the <style> argument again, since it was too complex. Use typ_type_set_style().
+*/
+FType * typ_type_new(CfgInfo *cfg, const gchar *name, mode_t mode, gint perm, const gchar *suffix, const gchar *name_re, const gchar *file_re)
+{
+ FType *type;
+
+ if((type = g_malloc(sizeof *type)) != NULL)
+ {
+ g_strlcpy(type->name, name, sizeof type->name);
+ type->mode = mode;
+ type->perm = perm;
+ type->flags = 0UL;
+ type->suffix[0] = '\0';
+ type->name_re_src[0] = '\0';
+ type->name_re = NULL;
+ type->file_re_src[0] = '\0';
+ type->file_re = NULL;
+ if(perm != 0)
+ type->flags |= FTFL_REQPERM;
+
+ if(suffix != NULL)
+ {
+ g_strlcpy(type->suffix, suffix, sizeof type->suffix);
+ type->flags |= FTFL_REQSUFFIX;
+ }
+ if(name_re != NULL)
+ {
+ g_strlcpy(type->name_re_src, name_re, sizeof type->name_re_src);
+ type->flags |= FTFL_NAMEMATCH;
+ }
+ if(file_re != NULL)
+ {
+ g_strlcpy(type->file_re_src, file_re, sizeof type->file_re_src);
+ type->flags |= FTFL_FILEMATCH;
+ }
+ type->style = NULL;
+ }
+ return type;
+}
+
+/* 1998-08-14 - Create a copy of the <old> type. Has the side-effect of clearing all compiled
+** regular expressions in the original (and the copy).
+*/
+FType * typ_type_copy(FType *old)
+{
+ FType *nt;
+
+ if((nt = g_malloc(sizeof *nt)) != NULL)
+ {
+ if(old->name_re != NULL)
+ {
+ regfree(old->name_re);
+ g_free(old->name_re);
+ old->name_re = NULL;
+ }
+ if(old->file_re != NULL)
+ {
+ regfree(old->file_re);
+ g_free(old->file_re);
+ old->file_re = NULL;
+ }
+ *nt = *old;
+ }
+ return nt;
+}
+
+void typ_type_destroy(FType *type)
+{
+ if(type->name_re != NULL)
+ {
+ regfree(type->name_re);
+ g_free(type->name_re);
+ }
+ if(type->file_re != NULL)
+ {
+ regfree(type->file_re);
+ g_free(type->file_re);
+ }
+ g_free(type);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2009-03-13 - Return the Unknown type. */
+FType * typ_type_get_unknown(const CfgInfo *cfg)
+{
+ const GList *iter;
+
+ for(iter = cfg->type; iter != NULL; iter = g_list_next(iter))
+ {
+ if(TYP_IS_UNKNOWN((const FType *) iter->data))
+ return iter->data;
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-07 - Check if the file described by <line> matches the permissions requirements
+** in <type>. Returns 1 if so, otherwise 0.
+** 1999-03-14 - Made the access to the DirRow (previously DirLine) a lot more abstract.
+** 2010-03-27 - It's been a while, I guess. Porting to GIO and DirRow2.
+*/
+static gint check_perm(const FType *type, GtkTreeModel *model, const DirRow2 *row)
+{
+ mode_t mode = 0;
+
+ /* First build mode mask, for SetUID, SetGID and sticky. */
+ if(type->perm & FTPM_SETUID)
+ mode |= S_ISUID;
+ if(type->perm & FTPM_SETGID)
+ mode |= S_ISGID;
+ if(type->perm & FTPM_STICKY)
+ mode |= S_ISVTX;
+
+ /* Now we know the mode requirements - check if fulfilled. */
+ if((mode != 0) && ((dp_row_get_mode(model, row) & mode) != mode))
+ return 0;
+
+ if(type->perm & FTPM_READ)
+ {
+ if(!dp_row_get_can_read(model, row))
+ return 0;
+ }
+ if(type->perm & FTPM_WRITE)
+ {
+ if(!dp_row_get_can_write(model, row))
+ return 0;
+ }
+ if(type->perm & FTPM_EXECUTE)
+ {
+ if(!dp_row_get_can_execute(model, row))
+ return 0;
+ }
+ return 1;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-15 - Check the RE in <re>, which has source <re_src>, against <string>.
+** Returns 1 on match, 0 on failure.
+*/
+static gint check_re(const gchar *re_src, regex_t **re, gboolean glob, gboolean nocase, const gchar *string)
+{
+ gchar *glob_re = NULL;
+
+ if(*re == NULL) /* RE not compiled? */
+ {
+ if(glob)
+ {
+ glob_re = stu_glob_to_re(re_src);
+ re_src = glob_re;
+ }
+ *re = g_malloc(sizeof **re);
+ regcomp(*re, re_src, REG_EXTENDED | REG_NOSUB | (nocase ? REG_ICASE : 0));
+ if(glob_re)
+ g_free(glob_re); /* Free the globbed version. */
+ }
+ if(*re != NULL)
+ return regexec(*re, string, 0, NULL, 0) == 0;
+ return 0;
+}
+
+static gboolean check_type(DirPane *dp, const DirRow2 *row, FType *type, const gchar *fout)
+{
+ gint tries = 0, hits = 0;
+ const gchar *name;
+ GFileType tt;
+ GtkTreeModel *model;
+
+ /* Catch-all: all files match the unknown type. */
+ if(TYP_IS_UNKNOWN(type))
+ return TRUE;
+
+ /* FIXME: Translate type's legacy type-information into simple GFileType value. */
+ if(S_ISREG(type->mode))
+ tt = G_FILE_TYPE_REGULAR;
+ else if(S_ISDIR(type->mode))
+ tt = G_FILE_TYPE_DIRECTORY;
+ else if(S_ISLNK(type->mode))
+ tt = G_FILE_TYPE_SYMBOLIC_LINK;
+ else if(S_ISFIFO(type->mode) || S_ISSOCK(type->mode))
+ tt = G_FILE_TYPE_SPECIAL;
+ else
+ tt = G_FILE_TYPE_UNKNOWN;
+
+ model = dp_get_tree_model(dp);
+
+ /* Apply the type test first, since it's the fastest. */
+ if(tt != dp_row_get_file_type(model, row, TRUE))
+ return FALSE;
+ name = dp_row_get_name(model, row);
+ /* Now do the rest, and count the number of matches. */
+ if(type->flags & FTFL_REQPERM)
+ {
+ tries++;
+ hits += check_perm(type, model, row);
+ }
+ if(type->flags & FTFL_REQSUFFIX)
+ {
+ tries++;
+ hits += g_str_has_suffix(name, type->suffix);
+ }
+ if(type->flags & FTFL_NAMEMATCH)
+ {
+ tries++;
+ hits += check_re(type->name_re_src, &type->name_re, type->flags & FTFL_NAMEGLOB, type->flags & FTFL_NAMENOCASE, name);
+ }
+ if(type->flags & FTFL_FILEMATCH)
+ {
+ tries++;
+ if(fout != NULL)
+ hits += check_re(type->file_re_src, &type->file_re, type->flags & FTFL_FILEGLOB, type->flags & FTFL_FILENOCASE, fout);
+ }
+ return (tries == hits);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-08-02 - Initialize the file typing subsystem with some simple default types.
+** 1998-09-02 - Painlessly diked out all but "Unknown" and "Directory", since I think these
+** two are the only ones that are going to be built-in.
+*/
+void typ_init(CfgInfo *cfg)
+{
+ FType *type;
+
+ cfg->type = NULL;
+ if((type = typ_type_new(cfg, _("Unknown"), 0, 0, NULL, NULL, NULL)) != NULL)
+ {
+ cfg->type = typ_type_insert(cfg->type, NULL, type);
+ cfg->type = typ_type_set_style(cfg->type, type, cfg->style, NULL);
+ }
+ if((type = typ_type_new(cfg, _("Directory"), S_IFDIR, 0, NULL, NULL, NULL)) != NULL)
+ {
+ cfg->type = typ_type_insert(cfg->type, NULL, type);
+ cfg->type = typ_type_set_style(cfg->type, type, cfg->style, _("Directory"));
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-12-14 - Rewritten another time. Now never inserts anything after the "Unknown" type.
+** Pretty lazily implemented, but so?
+** 1999-01-09 - Rewritten again. Now takes an additional <after> argument, and inserts <typ>
+** right after it. If <after> is the "Unknown", we insert before it. If it's
+** NULL, the same thing happens.
+*/
+GList * typ_type_insert(GList *list, FType *after, FType *type)
+{
+ gint li;
+
+ if(after == NULL || TYP_IS_UNKNOWN(after)) /* No reference element given, or "Unknown" ref? */
+ {
+ GList *last;
+
+ if((last = g_list_last(list)) != NULL)
+ {
+ if(TYP_IS_UNKNOWN((FType *) last->data))
+ {
+ li = g_list_index(list, last->data);
+ return g_list_insert(list, type, li);
+ }
+ }
+ return g_list_append(list, type);
+ }
+ li = g_list_index(list, after);
+ return g_list_insert(list, type, li + 1);
+}
+
+/* 1998-12-14 - Remove a type from the list, and return the new list. Not strictly
+** necessary (only called at one place), but makes me feel good. :^)
+*/
+GList * typ_type_remove(GList *list, FType *type)
+{
+ if(list == NULL || type == NULL)
+ return NULL;
+
+ if(TYP_IS_UNKNOWN(type)) /* Can't remove the "Unknown" type. */
+ return list;
+
+ list = g_list_remove(list, type);
+ typ_type_destroy(type);
+
+ return list;
+}
+
+/* 2002-03-17 - Do a globbed lookup of a named type. Returns a list of matching FTypes, which
+** will be a sublist of the grand input <list> of all types. The list, of course,
+** will need to be freed when you're done. The data in it, however, will not.
+*/
+GList * typ_type_lookup_glob(const GList *list, const gchar *glob)
+{
+ GList *ret = NULL;
+ gchar *re_src;
+ regex_t re;
+
+ re_src = stu_glob_to_re(glob);
+ if(regcomp(&re, re_src, REG_EXTENDED | REG_NOSUB | REG_ICASE) == 0)
+ {
+ for(; list != NULL; list = g_list_next(list))
+ {
+ if(regexec(&re, ((FType *) list->data)->name, 0, NULL, 0) == 0)
+ ret = g_list_append(ret, list->data);
+ }
+ regfree(&re);
+ }
+ g_free(re_src);
+ return ret;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-09-17 - Change the name of given type. Since the name is used as a fall-back
+** when sorting types of equal priority, this calls for a resort.
+** 1998-12-13 - Removing the priorities also removed the sorting dependency on names,
+** so this became a lot simpler. I could remove the entire function,
+** but I'll keep it. You never know...
+*/
+GList * typ_type_set_name(GList *list, FType *type, const gchar *name)
+{
+ g_strlcpy(type->name, name, sizeof type->name);
+ return list;
+}
+
+/* 1999-05-29 - Set the 'style' field of <type> to the style whose name is <name>. */
+GList * typ_type_set_style(GList *list, FType *type, StyleInfo *si, const gchar *name)
+{
+ if((type != NULL) && (si != NULL))
+ type->style = stl_styleinfo_style_find(si, name);
+ return list;
+}
+
+/* 1998-12-13 - Move given <type> either up (<delta> == -1) or down (1). Returns
+** new version of <list>. Other <delta> values are illegal.
+*/
+GList * typ_type_move(GList *list, FType *type, gint delta)
+{
+ gint pos, np;
+
+ if(delta != -1 && delta != 1)
+ return list;
+
+ pos = g_list_index(list, type);
+ list = g_list_remove(list, type);
+ np = pos + delta;
+ if(np < 0)
+ np = 0;
+ else if(np > (gint) g_list_length(list) - 1)
+ np = (gint) g_list_length(list) - 1;
+
+ return g_list_insert(list, type, np);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void typ_identify_begin(DirPane *dp)
+{
+ GList *here;
+
+ if(file_info.files != NULL)
+ g_warning("**TYPES: Attempted to nest calls to typ_identify_begin()!");
+
+ for(here = dp->main->cfg.type; here != NULL; here = g_list_next(here))
+ {
+ if(((FType *) here->data)->flags & FTFL_FILEMATCH)
+ break;
+ }
+ file_info.file_used = (here != NULL);
+}
+
+static FType * identify(DirPane *dp, const DirRow2 *row)
+{
+ const GList *here;
+
+ for(here = dp->main->cfg.type; here != NULL; here = g_list_next(here))
+ {
+ if(check_type(dp, row, here->data, NULL))
+ return here->data;
+ }
+ return NULL;
+}
+
+void typ_identify(DirPane *dp, const DirRow2 *row)
+{
+ FType *ft;
+
+ ft = identify(dp, row);
+ if(ft != NULL)
+ dp_row_set_ftype(dp_get_tree_model(dp), row, ft);
+ if(TYP_IS_UNKNOWN(ft) && file_info.file_used)
+ {
+ DirRow2 *sr;
+
+ sr = g_slice_alloc(sizeof *sr);
+ memcpy(sr, row, sizeof *sr);
+ file_info.files = g_slist_prepend(file_info.files, sr);
+ }
+}
+
+/* 2010-03-13 - Attempt to match all types in list against <line>, knowing that 'file' said
+** <fout>. Only types that include a 'file'-matching RE are checked, of course.
+** Returns the matching type if any, or NULL if there's no match.
+*/
+static FType * match_file(DirPane *dp, GList *list, DirRow2 *row, const gchar *fout)
+{
+ FType *type;
+
+ for(; (list != NULL) && (type = (FType *) list->data); list = g_list_next(list))
+ {
+ if(check_type(dp, row, list->data, fout))
+ return type;
+ }
+ return NULL;
+}
+
+/* 2009-03-11 - Trivial SIGPIPE handler, that just sets a global flag. */
+static void sigpipe_handler(int sig)
+{
+ if(sig != SIGPIPE)
+ return;
+ g_atomic_int_set(&file_info.sigpipe_occured, 1);
+}
+
+/* 2009-03-11 - Installs a signal handler for SIGPIPE, so we can catch broken 'file' runs. */
+static gboolean install_handler(void)
+{
+ struct sigaction act;
+
+ if(file_info.sigpipe_installed)
+ return TRUE;
+
+ act.sa_handler = sigpipe_handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+
+ return file_info.sigpipe_installed = (sigaction(SIGPIPE, &act, NULL) == 0);
+}
+
+gboolean typ_identify_end(DirPane *dp)
+{
+ gchar *argv[] = { "file", "-n", "-f", "-", NULL }, *path;
+ GPid file_pid;
+ gint file_stdin, file_stdout;
+ GError *error = NULL;
+ GtkTreeModel *tm = dp_get_tree_model(dp);
+ GSList *here;
+ gboolean ret = TRUE;
+
+ if(file_info.files == NULL || !dp->dir.is_local)
+ return TRUE;
+ if((path = g_file_get_path(dp->dir.root)) == NULL)
+ return TRUE;
+
+ install_handler();
+
+ if(g_spawn_async_with_pipes(path, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
+ NULL, NULL, &file_pid, &file_stdin, &file_stdout, NULL, &error))
+ {
+ FILE *in;
+
+ if((in = fdopen(file_stdout, "rt")) != NULL)
+ {
+ for(here = file_info.files; here != NULL; here = g_slist_next(here))
+ {
+ gchar buf[URI_MAX + 256], *path;
+ size_t len, to_go;
+ ssize_t wrote;
+
+ /* Handle missing path by skipping, just like we do below. */
+ if((path = g_file_get_path(dp_get_file_from_row(dp, here->data))) == NULL)
+ continue;
+ len = g_snprintf(buf, sizeof buf, "%s\n", path);
+ g_free(path);
+ if(len >= sizeof buf) /* Handle overflow by just skipping that file. */
+ continue;
+ g_atomic_int_set(&file_info.sigpipe_occured, 0);
+ for(to_go = len; to_go > 0; to_go -= wrote)
+ {
+ wrote = write(file_stdin, buf + (len - to_go), to_go);
+ if(wrote < 0)
+ {
+ if(errno == EPIPE)
+ g_atomic_int_set(&file_info.sigpipe_occured, 1);
+ break;
+ }
+ }
+ if(g_atomic_int_get(&file_info.sigpipe_occured))
+ break;
+ if(fgets(buf, sizeof buf, in) != NULL)
+ {
+ const char *fout;
+ char *lf;
+ FType *type;
+
+ if((fout = strrchr(buf, ':')) == NULL)
+ continue;
+ for(fout++; isspace(*fout); fout++)
+ ;
+ if((lf = strchr(fout + 1, '\n')) != NULL)
+ *lf = '\0';
+ if((type = match_file(dp, dp->main->cfg.type, here->data, fout)) != NULL)
+ dp_row_set_ftype(tm, here->data, type);
+ }
+ }
+ fclose(in);
+ }
+ close(file_stdin);
+ close(file_stdout);
+ g_spawn_close_pid(file_pid);
+ if(g_atomic_int_get(&file_info.sigpipe_occured))
+ {
+ /* FIXME: This is problematic; the nicely formatted text is often lost due to free space printing. */
+ err_printf(dp->main, _("Got SIGPIPE when writing to 'file' process (%s), it seems to have terminated prematurely."), argv[0]);
+ ret = FALSE;
+ }
+ }
+ else
+ {
+ g_prefix_error(&error, _("Unable to run spawn 'file' command: "));
+ err_printf(dp->main, "%s", error->message);
+ g_error_free(error);
+ ret = FALSE;
+ }
+ /* Walk list once more, freeing all data. */
+ for(here = file_info.files; here != NULL; here = g_slist_next(here))
+ g_slice_free1(sizeof (DirRow2), here->data);
+ g_slist_free(file_info.files);
+ file_info.files = NULL;
+ g_free(path);
+
+ return ret;
+}
diff --git a/src/types.h b/src/types.h
new file mode 100644
index 0000000..f654be4
--- /dev/null
+++ b/src/types.h
@@ -0,0 +1,30 @@
+/*
+** 1998-08-02 - Header file for the file-typing module. Interesting?
+*/
+
+#if !defined TYPES_H
+#define TYPES_H
+
+#define TYP_IS_UNKNOWN(t) ((t)->mode == 0)
+
+extern FType * typ_type_new(CfgInfo *cfg, const gchar *name, mode_t mode, gint perm, const gchar *suffix, const gchar *name_re, const gchar *file_re);
+extern FType * typ_type_copy(FType *old);
+extern GList * typ_type_insert(GList *list, FType *after, FType *type);
+extern GList * typ_type_remove(GList *list, FType *type);
+extern GList * typ_type_lookup_glob(const GList *list, const gchar *glob);
+extern void typ_type_destroy(FType *type);
+
+extern FType * typ_type_get_unknown(const CfgInfo *cfg);
+
+extern GList * typ_type_set_name(GList *list, FType *type, const gchar *name);
+extern GList * typ_type_set_style(GList *list, FType *type, StyleInfo *si, const gchar *name);
+extern GList * typ_type_set_priority(GList *list, FType *type, guint16 prio);
+extern GList * typ_type_move(GList *list, FType *type, gint delta);
+
+extern void typ_identify_begin(DirPane *dp);
+extern void typ_identify(DirPane *dp, const DirRow2 *row);
+extern gboolean typ_identify_end(DirPane *dp);
+
+extern void typ_init(CfgInfo *cfg);
+
+#endif /* TYPES_H */
diff --git a/src/userinfo.c b/src/userinfo.c
new file mode 100644
index 0000000..344acb0
--- /dev/null
+++ b/src/userinfo.c
@@ -0,0 +1,279 @@
+/*
+** 1998-05-23 - This little module helps map user and group IDs to ASCII names.
+** To perform this mapping, it reads /etc/passwd.
+** 1998-05-29 - Heavily modified. Now it is more eager to learn, since it will always
+** store *all* new encountered (uid,uname) and (gid,gname) pairs.
+** This maximizes the amount of user/group info available, and allows
+** this info to be used for other funky things (such as a chown command).
+** 1998-06-08 - Redesigned the menu-creation support, and also added some crucial
+** functionality (squeezed it in).
+** 1998-12-22 - Completely rewrote the /etc/passwd parsing. No longer lets the user control
+** the file name, but considers it the system's business. Uses the BSD-ish
+** getpwent()-API to access the file. Much cleaner and more robust. Also added
+** storing of the user's home directories to another hash (for ~-support).
+** Then did the exact same thing for group file parsing. These changes resulted
+** in a cleaner interface, since this module is now self-contained.
+*/
+
+#include "gentoo.h"
+
+#include <grp.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "strutil.h"
+#include "userinfo.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct { /* Holds information about system users (maps UIDs to names). */
+ GHashTable *dict_uname; /* Hashes uid -> uname. */
+ GHashTable *dict_uhome; /* Hashes uname -> uhome. Handy for "~emil" and stuff. */
+ GHashTable *dict_gname; /* Hashes gid -> gname. */
+} UsrInfo;
+
+static UsrInfo the_usr = { NULL, NULL, NULL };
+
+/* ----------------------------------------------------------------------------------------- */
+
+static gint cmp_string_num(gconstpointer a, gconstpointer b)
+{
+ gint ia, ib;
+
+ if(sscanf(a, "%d", &ia) == 1 && sscanf(b, "%d", &ib) == 1)
+ return (ia < ib) ? -1 : (ia > ib);
+ return 0;
+}
+
+static void list_visit(gpointer key, gpointer value, gpointer user)
+{
+ *(GList **) user = g_list_insert_sorted(*(GList **) user, g_strdup_printf("%d %s", GPOINTER_TO_INT(key), (const gchar *) value), cmp_string_num);
+}
+
+/* 2000-03-21 - Build a list of strings (not GStrings, but plain old dynamic gchar pointers) of
+** all groups (if category == UIC_USER) or users (UIC_GROUP) we know of. If <index>
+** is non-NULL, it will be filled in with the index for the row describing the group
+** or user whose numerical ID is <id>.
+*/
+GList * usr_string_list_create(UsrCategory category, gint id, gint *index)
+{
+ GList *list = NULL, *iter;
+
+ g_hash_table_foreach(category == UIC_USER ? the_usr.dict_uname : the_usr.dict_gname, list_visit, &list);
+
+ if(index != NULL) /* Do we need to search? */
+ {
+ gint tmp, pos;
+
+ for(iter = list, pos = 0; iter != NULL; iter = g_list_next(iter), pos++)
+ {
+ if((sscanf(iter->data, "%d", &tmp) == 1) && (tmp == id))
+ *index = pos;
+ }
+ }
+ return list;
+}
+
+/* 2000-03-21 - Free a list of strings as created by usr_string_list_create() above. */
+void usr_string_list_destroy(GList *list)
+{
+ GList *iter;
+
+ for(iter = list; iter != NULL; iter = g_list_next(iter))
+ g_free(iter->data);
+ g_list_free(list);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-12-22 - Build a hash table with system's password info in it. This might be very
+** stupid on large systems, in terms of memory usage...
+*/
+static void scan_uid(void)
+{
+ struct passwd *pw;
+ gchar *old, *home, *name;
+
+ setpwent();
+ while((pw = getpwent()) != NULL)
+ {
+ if((old = g_hash_table_lookup(the_usr.dict_uname, GINT_TO_POINTER((gint) pw->pw_uid))) != NULL)
+ {
+ if((home = g_hash_table_lookup(the_usr.dict_uhome, old)) != NULL)
+ {
+ g_hash_table_remove(the_usr.dict_uname, GINT_TO_POINTER((gint) pw->pw_uid));
+ g_hash_table_remove(the_usr.dict_uhome, old);
+ g_free(old);
+ g_free(home);
+ }
+ else
+ fprintf(stderr, "USERINFO: passwd data for '%s' (%d) has no home dir!\n", old, (gint) pw->pw_uid);
+ }
+ if((name = g_strdup(pw->pw_name)) != NULL)
+ {
+ if((home = g_strdup(pw->pw_dir)) != NULL)
+ {
+ g_hash_table_insert(the_usr.dict_uname, GINT_TO_POINTER((gint) pw->pw_uid), name);
+ g_hash_table_insert(the_usr.dict_uhome, name, home);
+ }
+ else
+ {
+ g_free(name);
+ fprintf(stderr, "USERINFO: Couldn't duplicate home dir\n");
+ }
+ }
+ else
+ fprintf(stderr, "USERINFO: Couldn't duplicate user name string\n");
+ }
+ endpwent();
+}
+
+/* 1998-12-22 - Parse some system-specific file containing group information (typically "/etc/group").
+** Store group names in a hash table indexed on group ids, for easy look-ups later.
+*/
+static void scan_gid(void)
+{
+ struct group *gr;
+ gchar *old, *name;
+
+ setgrent();
+ while((gr = getgrent()) != NULL)
+ {
+ if((old = g_hash_table_lookup(the_usr.dict_gname, GINT_TO_POINTER((gint) gr->gr_gid))) != NULL)
+ {
+ g_hash_table_remove(the_usr.dict_gname, GINT_TO_POINTER((gint) gr->gr_gid));
+ g_free(old);
+ }
+ if((name = g_strdup(gr->gr_name)) != NULL)
+ g_hash_table_insert(the_usr.dict_gname, GINT_TO_POINTER((gint) gr->gr_gid), name);
+ }
+ endgrent();
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-02-11 - Returns the current user's home directory. Implemented according to the
+** guidelines in the glib documentation. Does never return NULL or an empty'
+** string, defaults to "/" if all else fails. Prefers $HOME over passwd.
+*/
+const gchar * usr_get_home(void)
+{
+ const char *home = g_getenv ("HOME");
+ if(!home)
+ home = g_get_home_dir();
+ if(!home || *home == '\0')
+ return "/";
+ return home;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-05-29 - Rewritten & renamed. This routine looks up the name of the user with the given
+** <uid>. Returns pointer to string, or NULL if the user is unknown.
+*/
+const gchar * usr_lookup_uname(uid_t uid)
+{
+ return g_hash_table_lookup(the_usr.dict_uname, GINT_TO_POINTER((gint) uid));
+}
+
+struct id_lookup {
+ const gchar *name; /* The name we're looking for. */
+ long value; /* The value, if found. */
+};
+
+/* 2000-03-23 - Another g_hash_table_foreach() callback. Cool, because we can reuse
+** it for both user and group lookups.
+*/
+static void cb_lookup_id(gpointer key, gpointer value, gpointer user)
+{
+ struct id_lookup *idl = user;
+
+ if(strcmp(value, idl->name) == 0)
+ idl->value = GPOINTER_TO_INT(key);
+}
+
+/* 2000-03-23 - This does the reverse lookup of the function above. I don't really like the
+** name, but it'll do for now. :) Returns the uid, or -1 if the name wasn't
+** found. Oh, and this will be slow, so don't do it often, OK?
+*/
+long usr_lookup_uid(const gchar *name)
+{
+ struct id_lookup idl;
+
+ idl.name = name;
+ idl.value = -1;
+
+ g_hash_table_foreach(the_usr.dict_uname, cb_lookup_id, &idl);
+
+ return idl.value;
+}
+
+/* 1998-12-22 - Look up the home directory of a user called <uname>. Returns pointer to string,
+** or NULL if there is no such user. If <uname> is "" or NULL, returns the home
+** directory of the current effective user.
+*/
+const gchar * usr_lookup_uhome(const gchar *uname)
+{
+ if(uname == NULL || *uname == '\0')
+ {
+ if((uname = usr_lookup_uname(geteuid())) != NULL)
+ return g_hash_table_lookup(the_usr.dict_uhome, uname);
+ }
+ return usr_get_home();
+}
+
+/* 1998-05-29 - Rewritten & renamed. This routine looks up the name of the group with the given
+** <gid>. Returns pointer to string, or NULL if the group is unknown.
+*/
+const gchar * usr_lookup_gname(gid_t gid)
+{
+ return g_hash_table_lookup(the_usr.dict_gname, GINT_TO_POINTER(gid));
+}
+
+/* 2000-03-23 - This does the reverse lookup of the function above. I don't really like the
+** name, but it'll do for now. :) Returns the uid, or -1 if the name wasn't
+** found. Oh, and this will be slow, so don't do it often, OK?
+*/
+long usr_lookup_gid(const gchar *name)
+{
+ struct id_lookup idl;
+
+ idl.name = name;
+ idl.value = -1;
+
+ g_hash_table_foreach(the_usr.dict_gname, cb_lookup_id, &idl);
+
+ return idl.value;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Compare two pointers as integers. Can't use g_int_equal(), since that dereferences. */
+static gint cmp_int(gconstpointer a, gconstpointer b)
+{
+ return GPOINTER_TO_INT(a) == GPOINTER_TO_INT(b);
+}
+
+/* 1998-12-22 - Initialize the userinfo module. Calling any of the functions exported from this
+** module without a prior call to usr_init() is illegal, and will likely crash.
+** Returns TRUE on success, a sullen FALSE on failure.
+*/
+gboolean usr_init(void)
+{
+ if((the_usr.dict_uname = g_hash_table_new(g_direct_hash, cmp_int)) != NULL)
+ {
+ if((the_usr.dict_uhome = g_hash_table_new(g_str_hash, g_str_equal)) != NULL)
+ {
+ if((the_usr.dict_gname = g_hash_table_new(g_direct_hash, cmp_int)) != NULL)
+ {
+ scan_uid();
+ scan_gid();
+ return TRUE;
+ }
+ g_hash_table_destroy(the_usr.dict_uhome);
+ }
+ g_hash_table_destroy(the_usr.dict_uname);
+ }
+ return FALSE;
+}
diff --git a/src/userinfo.h b/src/userinfo.h
new file mode 100644
index 0000000..6f517f9
--- /dev/null
+++ b/src/userinfo.h
@@ -0,0 +1,24 @@
+/*
+** 1998-05-23 - Header for the (g|u)uid-to-name mapping module.
+*/
+
+#include <unistd.h>
+
+/* ------------------------------------------------------------------------------------------ */
+
+gboolean usr_init(void);
+
+const gchar * usr_get_home(void);
+
+const gchar * usr_lookup_uname(uid_t uid);
+long usr_lookup_uid(const gchar *name);
+const gchar * usr_lookup_uhome(const gchar *uname);
+const gchar * usr_lookup_gname(gid_t gid);
+long usr_lookup_gid(const gchar *name);
+
+/* ------------------------------------------------------------------------------------------ */
+
+typedef enum { UIC_USER = 0, UIC_GROUP } UsrCategory;
+
+extern GList * usr_string_list_create(UsrCategory category, gint id, gint *index);
+extern void usr_string_list_destroy(GList *list);
diff --git a/src/window.c b/src/window.c
new file mode 100644
index 0000000..2a57145
--- /dev/null
+++ b/src/window.c
@@ -0,0 +1,787 @@
+/*
+** 1999-12-23 - Hm, perhaps this is an unfortunate choice of module title. It might bloat,
+** or something. :) Anyway, the purpose of this module is to help handle
+** (toplevel) windows, specifically remembering their sizes and positions.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "guiutil.h"
+#include "graphics/icon_gentoo_small.xpm"
+
+#include "window.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+typedef struct
+{
+ guint32 id; /* Unique identifier for this windata. */
+ WinType type; /* What type of window? */
+ gboolean persistent; /* Makes close() actually do a hide(). */
+ const gchar *title; /* Text for window's title bar. */
+ const gchar *label; /* Short descriptive label (like "main", "config" etc). */
+ gboolean pos_grab;
+ gboolean size_grab;
+ /* Data below here is stored in configuration file. */
+ gint x, y; /* Window's opening position. */
+ gint width, height; /* The desired size of this window. */
+ gboolean pos_use; /* Should we set use the recorded position? */
+ gboolean pos_update; /* Update recorded position when window closes? */
+ gboolean size_use; /* Use recorded size? */
+ gboolean size_update; /* Update recorded size with current size on close? */
+} WinDef;
+
+struct WinInfo
+{
+ MainInfo *min; /* The handiness of this pointer cannot be overstated. */
+ GList *windows; /* List of WinDef:s as per above. There's no rush. */
+ gint border_width; /* User's idea of her window manager's border size. Hackish. */
+ gint border_height;
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+static WinDef * window_find(const WinInfo *wi, guint32 id);
+
+/* ----------------------------------------------------------------------------------------- */
+
+WinInfo * win_wininfo_new(MainInfo *min)
+{
+ WinInfo *wi;
+
+ wi = g_malloc(sizeof *wi);
+ wi->min = min;
+ wi->windows = NULL;
+
+ return wi;
+}
+
+/* 1999-12-23 - Create a new WinInfo, initialized with the "default" (i.e., legacy) windows. */
+WinInfo * win_wininfo_new_default(MainInfo *min)
+{
+ WinInfo *wi;
+
+ wi = win_wininfo_new(min);
+
+ /* This is what seems to be right on my stock GNOME desktop.
+ ** Mileage will vary, wildly.
+ */
+ win_borders_set(wi, 4, 24);
+
+ win_window_new(wi, WIN_MAIN, WIN_TYPE_SIMPLE_TOPLEVEL, FALSE, geteuid() == 0 ? "gentoo [root]" : "gentoo", "main");
+ win_window_pos_grab_set(wi, WIN_MAIN, TRUE);
+ win_window_size_set(wi, WIN_MAIN, 764, 932);
+ win_window_size_use_set(wi, WIN_MAIN, TRUE);
+ win_window_size_update_set(wi, WIN_MAIN, TRUE);
+ win_window_size_grab_set(wi, WIN_MAIN, TRUE);
+
+ win_window_new(wi, WIN_CONFIG, WIN_TYPE_COMPLEX_DIALOG, TRUE, _("Configure gentoo"), "config");
+ win_window_pos_use_set(wi, WIN_CONFIG, FALSE);
+ win_window_size_set(wi, WIN_CONFIG, -1, 464);
+ win_window_size_use_set(wi, WIN_CONFIG, TRUE);
+ win_window_size_update_set(wi, WIN_CONFIG, TRUE);
+
+ win_window_new(wi, WIN_TEXTVIEW, WIN_TYPE_SIMPLE_TOPLEVEL, FALSE, _("Text Viewer"), "textview");
+ win_window_pos_use_set(wi, WIN_TEXTVIEW, FALSE);
+ win_window_size_set(wi, WIN_TEXTVIEW, 640, 480);
+ win_window_size_use_set(wi, WIN_TEXTVIEW, TRUE);
+ win_window_size_update_set(wi, WIN_TEXTVIEW, TRUE);
+
+ win_window_new(wi, WIN_INFO, WIN_TYPE_SIMPLE_DIALOG, FALSE, "Info", "info");
+ win_window_size_set(wi, WIN_INFO, 320, 480);
+ win_window_size_use_set(wi, WIN_INFO, TRUE);
+ win_window_size_update_set(wi, WIN_INFO, TRUE);
+
+ return wi;
+}
+
+/* 1999-12-23 - Create a copy of <wi>, sharing no memory with it. */
+WinInfo * win_wininfo_copy(const WinInfo *wi)
+{
+ WinInfo *nwi;
+ WinDef *win;
+ GList *iter;
+
+ nwi = win_wininfo_new(wi->min);
+
+ for(iter = wi->windows; iter != NULL; iter = g_list_next(iter))
+ {
+ win = iter->data;
+
+ win_window_new(nwi, win->id, win->type, win->persistent,
+ win->title, win->label);
+ win_window_pos_grab_set(nwi, win->id, win->pos_grab);
+ win_window_pos_set(nwi, win->id, win->x, win->y);
+ win_window_pos_use_set(nwi, win->id, win->pos_use);
+ win_window_pos_update_set(nwi, win->id, win->pos_update);
+ win_window_size_grab_set(nwi, win->id, win->size_grab);
+ win_window_size_set(nwi, win->id, win->width, win->height);
+ win_window_size_use_set(nwi, win->id, win->size_use);
+ win_window_size_update_set(nwi, win->id, win->size_update);
+ }
+ nwi->border_width = wi->border_width;
+ nwi->border_height = wi->border_height;
+ return nwi;
+}
+
+void win_wininfo_destroy(WinInfo *wi)
+{
+ GList *iter;
+
+ for(iter = wi->windows; iter != NULL; iter = g_list_next(iter))
+ g_free(iter->data);
+ g_list_free(wi->windows);
+ g_free(wi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+enum
+{
+ SUBFRAME_POSITION, SUBFRAME_SIZE
+};
+
+static void evt_boolean_clicked(GtkWidget *wid, gpointer user)
+{
+ gboolean *flag = user;
+ gboolean *modified;
+
+ *flag = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
+ if((modified = g_object_get_data(G_OBJECT(wid), "modified")) != NULL)
+ *modified = TRUE;
+}
+
+static void evt_integer_changed(GtkAdjustment *adj, gpointer user)
+{
+ gint *value = user;
+ gboolean *modified;
+
+ *value = gtk_adjustment_get_value(adj);
+ if((modified = g_object_get_data(G_OBJECT(adj), "modified")) != NULL)
+ *modified = TRUE;
+}
+
+/* Grab position. We implicitly *know* that the window in question is the main
+** gentoo window, and therefore access it directly through the MainInfo. We
+** then put the grabbed position into the editing copy of the WinDef, and update
+** the spin buttons to match. Of course, we don't forget setting that pesky old
+** modified-flag, either. :) What would people think?
+*/
+static void evt_pos_grab_clicked(GtkWidget *wid, gpointer user)
+{
+ MainInfo *min;
+ WinDef *wd = user;
+
+ min = g_object_get_data(G_OBJECT(wid), "min");
+ gdk_window_get_position(gtk_widget_get_window(min->gui->window), &wd->x, &wd->y);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(wid), "spin1")), wd->x);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(wid), "spin2")), wd->y);
+ *(gboolean *) g_object_get_data(G_OBJECT(wid), "modified") = TRUE;
+}
+
+/* Grab size. Works only for main gentoo window. See comment for pos_grab above. */
+static void evt_size_grab_clicked(GtkWidget *wid, gpointer user)
+{
+ MainInfo *min;
+ WinDef *wd = user;
+
+ min = g_object_get_data(G_OBJECT(wid), "min");
+ wd->width = gdk_window_get_width(gtk_widget_get_window(min->gui->window));
+ wd->height = gdk_window_get_height(gtk_widget_get_window(min->gui->window));
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(wid), "spin1")), wd->width);
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(g_object_get_data(G_OBJECT(wid), "spin2")), wd->height);
+ *(gboolean *) g_object_get_data(G_OBJECT(wid), "modified") = TRUE;
+}
+
+static GtkWidget * subframe_build(const WinInfo *wi, WinDef *win, gint type, gboolean *modified)
+{
+ const gchar *ltext[] =
+ { N_("Position"), N_("Size") }, *etext[] =
+ { N_("X"), N_("Y"), N_("Width"), N_("Height") };
+ GtkWidget *label, *frame, *cbtn, *vbox, *grid, *spin1, *spin2;
+ GtkAdjustment *adj;
+ gint val1 = 0, val2 = 0;
+
+ frame = gtk_frame_new(_(ltext[type]));
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ cbtn = gtk_check_button_new_with_label(_("Set on Open?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbtn), (type == SUBFRAME_POSITION) ? win_window_pos_use_get(wi, win->id) : win_window_size_use_get(wi, win->id));
+ g_object_set_data(G_OBJECT(cbtn), "modified", modified);
+ g_signal_connect(G_OBJECT(cbtn), "clicked", G_CALLBACK(evt_boolean_clicked), (type == SUBFRAME_POSITION) ? &win->pos_use : &win->size_use);
+ gtk_box_pack_start(GTK_BOX(vbox), cbtn, FALSE, FALSE, 0);
+
+ cbtn = gtk_check_button_new_with_label(_("Update on Close?"));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbtn), (type == SUBFRAME_POSITION) ? win_window_pos_update_get(wi, win->id) : win_window_size_update_get(wi, win->id));
+ g_object_set_data(G_OBJECT(cbtn), "modified", modified);
+ g_signal_connect(G_OBJECT(cbtn), "clicked", G_CALLBACK(evt_boolean_clicked), (type == SUBFRAME_POSITION) ? &win->pos_update : &win->size_update);
+ gtk_box_pack_start(GTK_BOX(vbox), cbtn, FALSE, FALSE, 0);
+
+ grid = gtk_grid_new();
+
+ if(type == SUBFRAME_POSITION)
+ win_window_pos_get(wi, win->id, &val1, &val2);
+ else
+ win_window_size_get(wi, win->id, &val1, &val2);
+
+ label = gtk_label_new(_(etext[2 * type]));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 1, 1);
+ adj = gtk_adjustment_new(val1, -1.0, 65535.0, 1.0, 25.0, 0.0);
+ spin1 = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.0, 0.0);
+ g_object_set_data(G_OBJECT(adj), "modified", modified);
+ g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(evt_integer_changed), type == SUBFRAME_POSITION ? &win->x : &win->width);
+ gtk_widget_set_hexpand(spin1, TRUE);
+ gtk_widget_set_halign(spin1, GTK_ALIGN_FILL);
+ gtk_grid_attach(GTK_GRID(grid), spin1, 1, 0, 1, 1);
+ label = gtk_label_new(_(etext[2 * type + 1]));
+ gtk_grid_attach(GTK_GRID(grid), label, 0, 1, 1, 1);
+ adj = gtk_adjustment_new(val2, -1.0, 65535.0, 1.0, 25.0, 0.0);
+ spin2 = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.0, 0.0);
+ g_object_set_data(G_OBJECT(adj), "modified", modified);
+ g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(evt_integer_changed), type == SUBFRAME_POSITION ? &win->y : &win->height);
+ gtk_grid_attach(GTK_GRID(grid), spin2, 1, 1, 1, 1);
+ if((type == SUBFRAME_POSITION && win->pos_grab) || (type == SUBFRAME_SIZE && win->size_grab))
+ {
+ GtkWidget *grab;
+
+ grab = gtk_button_new_with_label(_("Grab"));
+
+ g_object_set_data(G_OBJECT(grab), "min", wi->min);
+ g_object_set_data(G_OBJECT(grab), "spin1", spin1);
+ g_object_set_data(G_OBJECT(grab), "spin2", spin2);
+ g_object_set_data(G_OBJECT(grab), "modified", modified);
+ g_signal_connect(G_OBJECT(grab), "clicked", type == SUBFRAME_POSITION ? G_CALLBACK(evt_pos_grab_clicked) : G_CALLBACK(evt_size_grab_clicked), win);
+ gtk_grid_attach(GTK_GRID(grid), grab, 2, 0, 1, 2);
+ }
+ gtk_box_pack_start(GTK_BOX(vbox), grid, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+ return frame;
+}
+
+GtkWidget * win_wininfo_build(const WinInfo *wi, gboolean *modified)
+{
+ GtkWidget *vbox, *frame, *hbox, *sframe;
+ GList *iter;
+ gchar tmp[64];
+ WinDef *win;
+
+ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+ for(iter = wi->windows; iter != NULL; iter = g_list_next(iter))
+ {
+ win = iter->data;
+
+ g_snprintf(tmp, sizeof tmp, "%c%s", toupper(*win->label), win->label + 1);
+ frame = gtk_frame_new(tmp);
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ sframe = subframe_build(wi, win, SUBFRAME_POSITION, modified);
+ gtk_box_pack_start(GTK_BOX(hbox), sframe, TRUE, TRUE, 5);
+ sframe = subframe_build(wi, win, SUBFRAME_SIZE, modified);
+ gtk_box_pack_start(GTK_BOX(hbox), sframe, TRUE, TRUE, 5);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+ gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
+ }
+ return vbox;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2000-02-24 - Write WinInfo out to given file <out>, at its current location. */
+void win_wininfo_save(const WinInfo *wi, FILE *out)
+{
+ GList *iter;
+ WinDef *wd;
+
+ xml_put_node_open(out, "Windows");
+ for(iter = wi->windows; iter != NULL; iter = g_list_next(iter))
+ {
+ wd = iter->data;
+
+ xml_put_node_open(out, "Window");
+ xml_put_uinteger(out, "id", wd->id);
+ xml_put_integer(out, "x", wd->x);
+ xml_put_integer(out, "y", wd->y);
+ xml_put_integer(out, "w", wd->width);
+ xml_put_integer(out, "h", wd->height);
+ xml_put_boolean(out, "pos_use", wd->pos_use);
+ xml_put_boolean(out, "pos_update", wd->pos_update);
+ xml_put_boolean(out, "size_use", wd->size_use);
+ xml_put_boolean(out, "size_update", wd->size_update);
+ xml_put_node_close(out, "Window");
+ }
+ /* This goes INSIDE <Windows>, since there is no outer structure. :| */
+ xml_put_node_open(out, "Borders");
+ xml_put_integer(out, "width", wi->border_width);
+ xml_put_integer(out, "height", wi->border_height);
+ xml_put_node_close(out, "Borders");
+ xml_put_node_close(out, "Windows");
+}
+
+static void window_load(const XmlNode *node, gpointer user)
+{
+ WinInfo *wi = user;
+
+ if(xml_node_has_name(node, "Window"))
+ {
+ guint32 id;
+
+ if(xml_get_uinteger(node, "id", &id))
+ {
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ xml_get_integer(node, "x", &wd->x);
+ xml_get_integer(node, "y", &wd->y);
+ xml_get_integer(node, "w", &wd->width);
+ xml_get_integer(node, "h", &wd->height);
+ xml_get_boolean(node, "pos_use", &wd->pos_use);
+ xml_get_boolean(node, "pos_update", &wd->pos_update);
+ xml_get_boolean(node, "size_use", &wd->size_use);
+ xml_get_boolean(node, "size_update", &wd->size_update);
+ }
+ }
+ }
+ else if(xml_node_has_name(node, "Borders"))
+ {
+ xml_get_integer(node, "width", &wi->border_width);
+ xml_get_integer(node, "height", &wi->border_height);
+ }
+}
+
+/* 2000-02-24 - Fill in <wi> with details for windows, loaded from <node>. */
+void win_wininfo_load(WinInfo *wi, const XmlNode *node)
+{
+ /* Visit all children. Since the XML structure, for the usual raisins, is a bit
+ ** messed up, the Window elements are at the same level as the Borders.
+ */
+ xml_node_visit_children(node, window_load, wi);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void win_borders_set(WinInfo *wi, gint width, gint height)
+{
+ if(wi == NULL)
+ return;
+ wi->border_width = width;
+ wi->border_height = height;
+}
+
+void win_borders_get(const WinInfo *wi, gint *width, gint *height)
+{
+ if(wi == NULL)
+ return;
+ if(width != NULL)
+ *width = wi->border_width;
+ if(height != NULL)
+ *height = wi->border_height;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void win_window_new(WinInfo *wi, guint32 id, WinType type, gboolean persistent, const gchar *title, const gchar *label)
+{
+ WinDef *wd;
+
+ wd = g_malloc(sizeof *wd);
+ wd->id = id;
+ wd->type = type;
+ wd->persistent = persistent;
+ wd->title = title;
+ wd->label = label;
+ wd->pos_grab = FALSE;
+ wd->size_grab = FALSE;
+
+ wd->x = 32;
+ wd->y = 32;
+ wd->width = 32;
+ wd->height = 32;
+
+ wd->pos_use = FALSE;
+ wd->pos_update = FALSE;
+ wd->size_use = FALSE;
+ wd->size_update = TRUE;
+
+ wi->windows = g_list_append(wi->windows, wd);
+}
+
+static WinDef * window_find(const WinInfo *wi, guint32 id)
+{
+ GList *iter;
+
+ if(wi == NULL)
+ return NULL;
+
+ for(iter = wi->windows; iter != NULL; iter = g_list_next(iter))
+ {
+ if(((WinDef *) iter->data)->id == id)
+ return iter->data;
+ }
+ return NULL;
+}
+
+void win_window_pos_grab_set(const WinInfo *wi, guint32 id, gboolean grab)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->pos_grab = grab;
+}
+
+void win_window_pos_set(const WinInfo *wi, guint32 id, gint x, gint y)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ wd->x = x;
+ wd->y = y;
+ }
+}
+
+gboolean win_window_pos_get(const WinInfo *wi, guint32 id, gint *x, gint *y)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ if(x)
+ *x = wd->x;
+ if(y)
+ *y = wd->y;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void win_window_pos_use_set(const WinInfo *wi, guint32 id, gboolean enabled)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->pos_use = enabled;
+}
+
+gboolean win_window_pos_use_get(const WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ return wd->pos_use;
+ return FALSE;
+}
+
+void win_window_pos_update_set(const WinInfo *wi, guint32 id, gboolean enabled)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->pos_update = enabled;
+}
+
+gboolean win_window_pos_update_get(const WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ return wd->pos_update;
+ return FALSE;
+}
+
+void win_window_size_grab_set(const WinInfo *wi, guint32 id, gboolean grab)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->size_grab = grab;
+}
+
+void win_window_size_set(const WinInfo *wi, guint32 id, gint width, gint height)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ wd->width = width;
+ wd->height = height;
+ }
+}
+
+gboolean win_window_size_get(const WinInfo *wi, guint32 id, gint *width,
+ gint *height)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ if(width)
+ *width = wd->width;
+ if(height)
+ *height = wd->height;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void win_window_size_use_set(const WinInfo *wi, guint32 id, gboolean enabled)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->size_use = enabled;
+}
+
+gboolean win_window_size_use_get(const WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ return wd->size_use;
+ return FALSE;
+}
+
+void win_window_size_update_set(const WinInfo *wi, guint32 id, gboolean enabled)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ wd->size_update = enabled;
+}
+
+gboolean win_window_size_update_get(const WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ return wd->size_update;
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+void win_window_destroy(WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ wi->windows = g_list_remove(wi->windows, wd);
+ g_free(wd);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-12-12 - Rewritten to not use deprecated (and crazy-seeming) GDK calls. */
+static void window_set_icon(GtkWindow *win)
+{
+ GdkPixbuf *pbuf;
+
+ if((pbuf = gdk_pixbuf_new_from_xpm_data(icon_gentoo_small_xpm)) != NULL)
+ {
+ gtk_window_set_default_icon(pbuf);
+ gtk_window_set_icon_name(win, PACKAGE);
+ g_object_unref(G_OBJECT(pbuf)); /* I believe GTK+ owns this, now. */
+ }
+}
+
+/* 1999-12-23 - Open the window described by <key> in <wi>. The window will not be shown yet. */
+GtkWidget * win_window_open(const WinInfo *wi, guint32 id)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ GtkWidget *wid = NULL;
+
+ switch (wd->type)
+ {
+ case WIN_TYPE_SIMPLE_TOPLEVEL:
+ case WIN_TYPE_SIMPLE_DIALOG:
+ wid = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ break;
+ case WIN_TYPE_SIMPLE_POPUP:
+ wid = gtk_window_new(GTK_WINDOW_POPUP);
+ break;
+ case WIN_TYPE_COMPLEX_DIALOG:
+ wid = win_dialog_open(wi->min->gui->window);
+ break;
+ }
+ g_object_set_data(G_OBJECT(wid), "wininfo", (gpointer) wi);
+ g_object_set_data(G_OBJECT(wid), "windef", (gpointer) wd);
+ if(!wd->pos_use)
+ gtk_window_set_position(GTK_WINDOW(wid), GTK_WIN_POS_MOUSE);
+ gtk_widget_realize(wid);
+ if(id == WIN_MAIN)
+ window_set_icon(GTK_WINDOW(wid));
+ else if(id != WIN_MAIN && id != WIN_TYPE_COMPLEX_DIALOG && wi->min->gui != NULL)
+ gtk_window_set_transient_for(GTK_WINDOW(wid), GTK_WINDOW(wi->min->gui->window));
+ if(wd->title != NULL)
+ win_window_set_title(wid, wd->title);
+ if(wd->label != NULL)
+ gtk_window_set_role(GTK_WINDOW(wid), wd->label);
+ return wid;
+ }
+ return NULL;
+}
+
+/* 2000-02-19 - Refresh link between <wi> and <window>. Handy after <wi> has been replaced
+** while window was open, as happens in the config window case.
+*/
+void win_window_relink(const WinInfo *wi, guint32 id, GtkWidget *window)
+{
+ WinDef *wd;
+
+ if((wd = window_find(wi, id)) != NULL)
+ {
+ g_object_set_data(G_OBJECT(window), "wininfo", (gpointer) wi);
+ g_object_set_data(G_OBJECT(window), "windef", wd);
+ }
+}
+
+/* 2002-08-10 - Set title of a window. Since it seems to break if locale is set, we simply
+** un-set the locale temporarily. Hopefully, noone sets window titles in inner
+** loops around here.
+** NOTE NOTE This works for *all* windows, not just those created through this module.
+** That might surprise, but it felt more sensical to stick it in here anyway.
+*/
+void win_window_set_title(GtkWidget *win, const gchar *title)
+{
+ gtk_widget_realize(win);
+ gtk_window_set_title(GTK_WINDOW(win), title);
+}
+
+/* 1999-12-23 - Use this rather than gtk_widget_show() when you want to the window to appear, since
+** this gives us a chance to set the window's size and position according to preference.
+*/
+void win_window_show(GtkWidget *window)
+{
+ WinInfo *wi;
+ WinDef *wd;
+
+ if(gtk_widget_get_visible(window))
+ return;
+
+ wi = g_object_get_data(G_OBJECT(window), "wininfo");
+ wd = g_object_get_data(G_OBJECT(window), "windef");
+ if((wd != NULL) && wd->size_use && wd->width >= 0)
+ gtk_window_set_default_size(GTK_WINDOW(window), wd->width, wd->height);
+ /* For the main window, make sure to make it possible to shrink very much. */
+ if(wd != NULL && wd->id == WIN_MAIN)
+ {
+ GdkGeometry geo;
+
+ geo.min_width = 10;
+ geo.min_height = 10;
+ gtk_window_set_geometry_hints(GTK_WINDOW(window), window, &geo, GDK_HINT_MIN_SIZE);
+ }
+
+ /* This causes the window to appear at some more or less random position. We then reposition
+ ** it to the configured place. This is visually distracting, unattractive, and almost s*cks,
+ ** but unfortunately I haven't been able to figure out how to fix it. If you move the show()
+ ** call to below the if, it works, but not all the time. :( Tips welcome.
+ */
+ gtk_widget_show_all(window);
+
+ /* If user wants to set position, check where it ended up and move it home. */
+ if((wd != NULL) && wd->pos_use && wd->x >= 0)
+ {
+ gint cx, cy;
+
+ gtk_window_get_position(GTK_WINDOW(window), &cx, &cy);
+ if(wi != NULL) /* Any borders to adjust for? */
+ {
+ cx += wi->border_width;
+ cy += wi->border_height;
+ }
+ gtk_window_move(GTK_WINDOW(window), wd->x - cx, wd->y - cy);
+ gui_events_flush();
+ gtk_window_get_position(GTK_WINDOW(window), &cx, &cy);
+ }
+}
+
+/* 2000-03-04 - If <a_new> is different from *<a>, update *<a> to <a_new> and return TRUE, else
+** return FALSE. Likewise for <b>, whatever that would mean.
+*/
+static gboolean update_pair(gint *a, gint *b, gint a_new, gint b_new)
+{
+ if((*a != a_new) || (*b != b_new))
+ {
+ *a = a_new;
+ *b = b_new;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 2000-03-18 - Do an update for the given window, changing the config as needed. Returns TRUE
+** if the config was indeed changed.
+*/
+gboolean win_window_update(GtkWidget *win)
+{
+ WinDef *wd;
+
+ if((wd = g_object_get_data(G_OBJECT(win), "windef")) != NULL)
+ {
+ gboolean ret = FALSE;
+ gint ta, tb;
+
+ if(wd->pos_update)
+ {
+ gdk_window_get_root_origin(gtk_widget_get_window(win), &ta, &tb);
+ ret |= update_pair(&wd->x, &wd->y, ta, tb);
+ }
+ if(wd->size_update)
+ {
+ ta = gdk_window_get_width(gtk_widget_get_window(win));
+ tb = gdk_window_get_height(gtk_widget_get_window(win));
+ ret |= update_pair(&wd->width, &wd->height, ta, tb);
+ }
+ return ret;
+ }
+ return FALSE;
+}
+
+/* 1999-12-23 - Close the given window. Use this rather than a direct gtk_widget_destroy(), since
+** we need a chance to update the position and size fields if needed. Also, if the
+** window is classified as "persistent", we don't actually destroy it, but only hide
+** it. Returns TRUE if the config was changed, i.e. if one of the update flags were
+** set AND the relevant property actually had changed.
+*/
+gboolean win_window_close(GtkWidget *win)
+{
+ WinDef *wd;
+
+ if((wd = g_object_get_data(G_OBJECT(win), "windef")) != NULL)
+ {
+ gboolean ret;
+
+ ret = win_window_update(win);
+ if(wd->persistent)
+ gtk_widget_hide(win);
+ else
+ gtk_widget_destroy(win);
+ return ret;
+ }
+ gtk_widget_destroy(win);
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 2010-12-12 - New single way of opening a dialog, that tries to make sure it gets the proper
+** linkage to the main window. This shares the icon, among (possibly) other things.
+*/
+GtkWidget * win_dialog_open(GtkWidget *main_window)
+{
+ GtkWidget *wid = gtk_dialog_new();
+
+ if(main_window != NULL)
+ gtk_window_set_transient_for(GTK_WINDOW(wid), GTK_WINDOW(main_window));
+
+ return wid;
+}
diff --git a/src/window.h b/src/window.h
new file mode 100644
index 0000000..31d6bb5
--- /dev/null
+++ b/src/window.h
@@ -0,0 +1,79 @@
+/*
+** 1999-12-23 - This is the window module. It's main responsibility is to provide a
+** way of tracking a bunch of windows' sizes and positions, and making
+** that information persistent through the config file.
+*/
+
+#if !defined WINDOW_H
+#define WINDOW_H
+
+#include "xmlutil.h"
+
+typedef struct WinInfo WinInfo;
+
+/* The windows that are handled by this module are well-known and few,
+** so we can simply define their global IDs here, and use these symbols
+** in place of the <id> parameter in all calls of this module.
+*/
+enum { WIN_MAIN, /* The main window, with the panes and all. */
+ WIN_CONFIG, /* The window used by the Configure command. */
+ WIN_TEXTVIEW, /* The window used by ViewText and output capture. */
+ WIN_INFO, /* The window used by the Info command. */
+ WIN_INVALID = ~0 /* No window can have this ID. */
+};
+
+/* The different types of windows we support. The difference is simply in the GTK+
+** call used to create the widget for the window. Each type is commented with the
+** kind of call we will issue in win_window_open() to create it.
+*/
+typedef enum {
+ WIN_TYPE_SIMPLE_TOPLEVEL, /* gtk_window_new(GTK_WINDOW_TOPLEVEL). */
+ WIN_TYPE_SIMPLE_DIALOG, /* gtk_window_new(GTK_WINDOW_DIALOG). */
+ WIN_TYPE_SIMPLE_POPUP, /* gtk_window_new(GTK_WINDOW_POPUP). */
+ WIN_TYPE_COMPLEX_DIALOG /* gtk_dialog_new(). */
+} WinType;
+
+/* ----------------------------------------------------------------------------------------- */
+
+WinInfo * win_wininfo_new(MainInfo *min);
+WinInfo * win_wininfo_new_default(MainInfo *min);
+WinInfo * win_wininfo_copy(const WinInfo *wi);
+void win_wininfo_destroy(WinInfo *wi);
+
+GtkWidget * win_wininfo_build(const WinInfo *wi, gboolean *modified);
+
+void win_wininfo_save(const WinInfo *wi, FILE *out);
+void win_wininfo_load(WinInfo *wi, const XmlNode *node);
+
+void win_borders_set(WinInfo *, gint width, gint height);
+void win_borders_get(const WinInfo *, gint *width, gint *height);
+
+void win_window_new(WinInfo *wi, guint32 id, WinType type, gboolean persistent, const gchar *title, const gchar *label);
+void win_window_pos_grab_set(const WinInfo *wi, guint32 id, gboolean grab);
+void win_window_pos_set(const WinInfo *wi, guint32 id, gint x, gint y);
+gboolean win_window_pos_get(const WinInfo *wi, guint32 id, gint *x, gint *y);
+void win_window_pos_use_set(const WinInfo *wi, guint32 id, gboolean enabled);
+gboolean win_window_pos_use_get(const WinInfo *wi, guint32 id);
+void win_window_pos_update_set(const WinInfo *wi, guint32 id, gboolean enabled);
+gboolean win_window_pos_update_get(const WinInfo *wi, guint32 id);
+
+void win_window_size_grab_set(const WinInfo *wi, guint32 id, gboolean grab);
+void win_window_size_set(const WinInfo *wi, guint32 id, gint width, gint height);
+gboolean win_window_size_get(const WinInfo *wi, guint32 id, gint *width, gint *height);
+void win_window_size_use_set(const WinInfo *wi, guint32 id, gboolean enabled);
+gboolean win_window_size_use_get(const WinInfo *wi, guint32 id);
+void win_window_size_update_set(const WinInfo *wi, guint32 id, gboolean enabled);
+gboolean win_window_size_update_get(const WinInfo *wi, guint32 id);
+
+void win_window_destroy(WinInfo *wi, guint32 id);
+
+GtkWidget * win_window_open(const WinInfo *wi, guint32 id);
+void win_window_relink(const WinInfo *wi, guint32 id, GtkWidget *window);
+void win_window_set_title(GtkWidget *window, const gchar *title);
+void win_window_show(GtkWidget *window); /* Use instead of gtk_widget_show(). */
+gboolean win_window_update(GtkWidget *window);
+gboolean win_window_close(GtkWidget *window);
+
+GtkWidget * win_dialog_open(GtkWidget *main_window); /* Use instead of gtk_dialog_new(), for icons. */
+
+#endif /* WINDOW_H */
diff --git a/src/xmlutil.c b/src/xmlutil.c
new file mode 100644
index 0000000..6424375
--- /dev/null
+++ b/src/xmlutil.c
@@ -0,0 +1,877 @@
+/*
+** 1998-07-25 - Various utility functions for dealing with XML files. Does both writing
+** (xml_put_XXX) and reading (xml_get_XXX). Not meant to be beatiful, but
+** rather utalitarian.
+** 1998-07-27 - Rewrote the xml_put_XXX() stuff, and actually got it rather neat (IMHO).
+** Also made sure all three config-modules actually use these functions (and
+** nothing BUT these functions) to write their config stuff.
+** 1998-08-10 - Now quotes all strings. Escapes any embedded quotes as \". This was re-
+** quired in order to support explicitly empty strings, which were previously
+** very ambigous and difficult to detect & handle correctly.
+** 1999-01-04 - Discovered a few old-style (incorrect, misguided) uses of g_slist_XXX()
+** functions, and fixed them.
+** 1999-04-04 - Increased use of glib types, fixed minor bug in indentation (>=).
+** 1999-04-05 - Added new value type, the unsigned integer. Identified in files by simply
+** prefixing the actual value with the letter 'u'.
+*/
+
+#include "gentoo.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+#include <gdk/gdk.h>
+
+#include "strutil.h"
+#include "xmlutil.h"
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* Types of values held by leaf nodes in trees. */
+typedef enum { XVT_NONE, XVT_TEXT, XVT_INTEGER, XVT_UINTEGER, XVT_REAL, XVT_BOOL, XVT_COLOR } XVType;
+
+typedef struct {
+ XVType type;
+ GString *value;
+} XVText;
+
+typedef struct {
+ XVType type;
+ gint value;
+} XVInt;
+
+typedef struct {
+ XVType type;
+ guint value;
+} XVUInt;
+
+typedef struct {
+ XVType type;
+ gfloat value;
+} XVReal;
+
+typedef struct {
+ XVType type;
+ gboolean value;
+} XVBool;
+
+typedef struct { /* Um, perhaps kind of clumsy. But it saves space. */
+ XVType type;
+ GdkColor value;
+} XVColor;
+
+typedef union {
+ XVType type; /* Should "collide" with type fields of actual value-structs. */
+ XVText text;
+ XVInt integer;
+ XVUInt uinteger;
+ XVReal real;
+ XVBool bool;
+ XVColor color;
+} XmlData;
+
+#define XML_NAME_SIZE (32)
+
+struct XmlNode {
+ gchar name[XML_NAME_SIZE]; /* Name from surrounding tag. */
+ XmlData data; /* Data for this node (only valid for leafs). */
+ GSList *children; /* List of subtags in file order. */
+};
+
+/* ----------------------------------------------------------------------------------------- */
+
+#define THE_ONE_TRUE_TAB_SIZE (8) /* ;^) */
+
+#define XML_TRUE "TRUE"
+#define XML_FALSE "FALSE"
+#define XML_UNSIGNED "u" /* Prefix for unsigned integers. */
+#define XML_COLOR "C" /* Prefix for GdkColor RGB triplets. */
+#define NODE_INTERNAL(tag) (isupper((guchar) tag[0]) || (tag[0] == '/' && isupper((guchar) tag[1])))
+#define NODE_COMMENT(tag) (tag[0] == '?')
+#define SIGN(x) (((x) == 0) ? 0 : (((x) > 0) ? 1 : -1))
+
+/* Here are a few escape sequences for various characters that need protection. I haven't
+** really added much here. Feel free to contribute.
+*/
+static struct {
+ gchar *sequence;
+ gchar equiv;
+ } esc_seq[] = { {"&lt;", '<'}, {"&gt;", '>'}, {"&amp;", '&'},
+ {"&apos;", '\''}, {"&quot;", '"'},
+ };
+#define NUM_ESC_SEQ (sizeof esc_seq / sizeof esc_seq[0])
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* This little global variable (shudder) holds the nesting level for tags in the file being
+** written by xml_put_XXX() functions.
+*/
+static guint put_level = 0;
+
+/* ----------------------------------------------------------------------------------------- */
+
+static void put_string(FILE *out, const gchar *str);
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-27 - Open a file for output, and write any required XML header to it. Then return the
+** file pointer, so the user can use it in further calls to this module, in order to
+** store various nodes and leafs. When done, the user should call xml_put_close().
+** BUG Calls to xml_put_open() and xml_put_close() don't nest!! Sue me!
+*/
+FILE * xml_put_open(const gchar *name)
+{
+ FILE *out;
+
+ if((out = fopen(name, "wt")) != NULL)
+ {
+ fprintf(out, "<?xml version=\"1.0\" standalone=\"yes\"?>\n\n");
+ put_level = 0; /* The reason we don't nest. */
+ }
+ return out;
+}
+
+/* 1998-07-27 - Close the current XML output file. */
+void xml_put_close(FILE *out)
+{
+ if(put_level != 0)
+ fprintf(stderr, "**XML Put Error: xml_put_close() called on level %d\n", put_level);
+ fclose(out);
+}
+
+/* 1998-07-27 - Output indentation for current level. Smart enough to use TAB characters when
+** possible.
+*/
+static void indent(FILE *out)
+{
+ guint i;
+
+ for(i = put_level; i >= THE_ONE_TRUE_TAB_SIZE; i -= THE_ONE_TRUE_TAB_SIZE)
+ fputc('\t', out);
+ for(; i > 0; i--)
+ fputc(' ', out);
+}
+
+/* 1998-07-27 - Output an opening node, i.e. something that (possibly) has children. */
+void xml_put_node_open(FILE *out, const gchar *node)
+{
+ indent(out);
+ fprintf(out, "<%s>\n", node);
+ put_level++;
+}
+
+/* 1998-07-27 - Close a node previously opened. Does not protect against overlapping
+** nodes.
+*/
+void xml_put_node_close(FILE *out, const gchar *node)
+{
+ if(put_level > 0)
+ {
+ put_level--;
+ indent(out);
+ fprintf(out, "</%s>\n", node);
+ }
+ else
+ fprintf(stderr, "**XML Put Error: xml_put_node_close() called on level 0!\n");
+}
+
+/* 1998-07-27 - Output a leaf with an integer in it. */
+void xml_put_integer(FILE *out, const gchar *name, gint value)
+{
+ indent(out);
+ fprintf(out, "<%s>%d</%s>\n", name, value, name);
+}
+
+/* 1999-04-05 - Output unsigned leaf. Note use of prefix to resolve it from plain integer. */
+void xml_put_uinteger(FILE *out, const gchar *name, guint value)
+{
+ indent(out);
+ fprintf(out, "<%s>%s%u</%s>\n", name, XML_UNSIGNED, value, name);
+}
+
+/* 1998-07-27 - Output a leaf with a real number.
+** 2002-06-16 - Significantly more complex, since we need to do this in ASCII. glib 2.0, please.
+** 2014-12-25 - Somewhat later: now we really can assume glib 2.x. Right now, it's 2.42.1.
+*/
+void xml_put_real(FILE *out, const gchar *name, gfloat value)
+{
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE + 1];
+
+ indent(out);
+ g_ascii_dtostr(buf, sizeof buf, value);
+ fprintf(out, "<%s>%s</%s>\n", name, buf, name);
+}
+
+/* 1998-07-27 - Output a leaf with a boolean in it. */
+void xml_put_boolean(FILE *out, const gchar *name, gboolean value)
+{
+ indent(out);
+ fprintf(out, "<%s>%s</%s>\n", name, value ? XML_TRUE : XML_FALSE, name);
+}
+
+/* 1998-07-27 - Output a text leaf. Might screw up the indentation if the text contains
+** line feeds. Big deal.
+*/
+void xml_put_text(FILE *out, const gchar *name, const gchar *value)
+{
+ indent(out);
+ fprintf(out, "<%s>\"", name);
+ put_string(out, value);
+ fprintf(out, "\"</%s>\n", name);
+}
+
+/* 1999-05-01 - Write out a GdkColor. Kind of unusual, perhaps (and very application-
+** specific), but a lot more efficient than doing it with another nested
+** node. Note that we save only the red, green & blue components.
+*/
+void xml_put_color(FILE *out, const gchar *name, const GdkColor *color)
+{
+ indent(out);
+ fprintf(out, "<%s>%s%04X,%04X,%04X</%s>\n", name, XML_COLOR, color->red, color->green, color->blue, name);
+}
+
+/* 1998-07-25 - Write string <str> to file <out>, while attempting to catch any character
+** we don't want appearing between tags (such as < and >). This is overly
+** paranoid; usually you don't need to protect the '>' character.
+*/
+static void put_string(FILE *out, const gchar *str)
+{
+ gchar here;
+ gint i;
+
+ for(; str && (here = *str) != '\0'; str++)
+ {
+ for(i = 0; i < NUM_ESC_SEQ; i++)
+ {
+ if(here == esc_seq[i].equiv)
+ {
+ fprintf(out, "%s", esc_seq[i].sequence);
+ break;
+ }
+ }
+ if(i == NUM_ESC_SEQ) /* No escape sequence found? */
+ {
+ if(here == '\\')
+ fprintf(out, "\\\\");
+ else
+ putc(here, out);
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1999-01-30 - Find a child of <node> named <name>, having a value of type <type>. */
+static const XmlNode * get_node(const XmlNode *node, const gchar *name, XVType type)
+{
+ const XmlNode *data;
+
+ if(node == NULL || name == NULL)
+ return NULL;
+ if(((data = xml_tree_search(node, name)) != NULL) && (data->data.type == type))
+ return data;
+ return NULL;
+}
+
+/* 1998-12-25 - Look through <node>'s children for a node named <name>. When found, store its
+** data (which really should be integer) in <n>, and return 1. If any of these
+** steps fail, return 0. Can be called with <n> == NULL to check for the presence
+** of a correctly typed and named value.
+*/
+gboolean xml_get_integer(const XmlNode *node, const gchar *name, gint *n)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_INTEGER)) != NULL)
+ {
+ if(n != NULL)
+ *n = data->data.integer.value;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+gboolean xml_get_uinteger(const XmlNode *node, const gchar *name, guint *n)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_UINTEGER)) != NULL)
+ {
+ if(n != NULL)
+ *n = data->data.uinteger.value;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-12-25 - Search through <node>'s children for a real-valued node named <name>, and store
+** the number in question at <x>. Returns 1 if value was found, 0 otherwise.
+*/
+gboolean xml_get_real(const XmlNode *node, const gchar *name, gfloat *x)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_REAL)) != NULL)
+ {
+ if(x != NULL)
+ *x = data->data.real.value;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-12-25 - Search <node>'s kids for a boolean value named <name>. Returns 1 if the named
+** value was indeed found (storing it in <x> if it's non-NULL), 0 otherwise.
+*/
+gboolean xml_get_boolean(const XmlNode *node, const gchar *name, gboolean *x)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_BOOL)) != NULL)
+ {
+ if(x != NULL)
+ *x = data->data.bool.value;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-12-25 - Look through <node>'s children for a node named <name>, having type
+** text. If found, return 1 while storing a pointer to the text at <str>
+** (if non-NULL). Otherwise returns 0.
+*/
+gboolean xml_get_text(const XmlNode *node, const gchar *name, const gchar **str)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_TEXT)) != NULL)
+ {
+ if(str != NULL)
+ *str = data->data.text.value->str;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+gboolean xml_get_color(const XmlNode *node, const gchar *name, GdkColor *col)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_COLOR)) != NULL)
+ {
+ if(col != NULL)
+ *col = data->data.color.value;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-12-25 - Look through <node>'s children for a node named <name>, hoping it
+** contains text. If found, and <str> is non-NULL, copy the text there,
+** using no more than <max> characters. Returns 1 on success, or 0.
+*/
+gboolean xml_get_text_copy(const XmlNode *node, const gchar *name, gchar *str, gsize max)
+{
+ const XmlNode *data;
+
+ if((data = get_node(node, name, XVT_TEXT)) != NULL)
+ {
+ if(str != NULL)
+ g_strlcpy(str, data->data.text.value->str, max);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Report some kind of parse error to the (probably ignorant) user. If any of
+** these errors start popping up, the config file is likely damaged (or edited:).
+*/
+static void xml_error(gchar *fmt, ...)
+{
+ va_list arg;
+
+ va_start(arg, fmt);
+ fprintf(stderr, "**XML: ");
+ vfprintf(stderr, fmt, arg);
+ fputc('\n', stderr);
+ va_end(arg);
+}
+
+/* 1998-07-25 - Get the next "token" and return it. I define a token as either a tag (opening
+** or closing), or as an arbitrary amound of characters found between tags. Note
+** that tokens may well include whitespace. Example: "<a> hello </a>" consists of
+** three tokens; "a", " hello " (note the spaces) and "/a". The first and the last
+** would be considered tags.
+** Returns a GString holding the token, which really should be destroyed by the
+** caller when done. Also returns an integer in <what> indicating the type of
+** the string returned; this is 0 for user text, 1 for a tag, and -1 on error.
+*/
+static GString * get_token(FILE *in, gint *what)
+{
+ GString *str;
+ gint here, in_tag = 0, found_nsc = 0, in_string = 0;
+
+ if(what == NULL)
+ return NULL;
+ *what = -1; /* Assume the worst. */
+
+ if((str = g_string_new(NULL)) != NULL)
+ {
+ while((here = fgetc(in)) >= 0)
+ {
+ if(!in_string && here == '<') /* Either beginning of tag or end of user data. */
+ {
+ if(found_nsc) /* Any non-space characters found? */
+ {
+ *what = 0;
+ ungetc(here, in);
+ return str;
+ }
+ else
+ {
+ g_string_truncate(str, 0);
+ in_tag = 1;
+ }
+ }
+ else if(!in_string && here == '>') /* *Must* be end of tag. */
+ {
+ if(in_tag)
+ {
+ *what = 1;
+ return str;
+ }
+ else
+ {
+ xml_error("Unmatched '>' detected");
+ break;
+ }
+ }
+ else
+ {
+ if(here == '\\')
+ {
+ if((here = fgetc(in)) < 0)
+ break;
+ g_string_append_c(str, '\\');
+ g_string_append_c(str, here);
+ continue;
+ }
+ g_string_append_c(str, here);
+ found_nsc |= !isspace((guchar) here);
+ in_string ^= (here == '"');
+ }
+ }
+ }
+ g_string_free(str, TRUE);
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-25 - Allocate and initialize a new node structure. */
+XmlNode * xml_node_new(const gchar *name)
+{
+ XmlNode *node;
+
+ if((node = g_malloc(sizeof *node)) != NULL)
+ {
+ if(name != NULL)
+ g_strlcpy(node->name, name, sizeof node->name);
+ else
+ node->name[0] = '\0';
+ node->data.type = XVT_NONE;
+ node->children = NULL;
+ }
+ return node;
+}
+
+/* 1998-12-25 - Check if the given node is called <name>. If so, return 1.
+** Otherwise return 0.
+*/
+gint xml_node_has_name(const XmlNode *node, const gchar *name)
+{
+ if(node != NULL && name != NULL)
+ return strcmp(node->name, name) == 0;
+ return 0;
+}
+
+/* 1998-07-25 - Add <child> as a child to the node <node>.
+** 1999-01-04 - Noted that this still used my old misguided way of using the glib list
+** functions. Fixed.
+*/
+void xml_node_add_child(XmlNode *node, XmlNode *child)
+{
+ if((node->children = g_slist_append(node->children, child)) == NULL)
+ xml_error("Couldn't build child list for '%s'", node->name);
+}
+
+/* 1998-07-26 - Visit all of a node's immediate children, using a callback. This is not
+** recursive, since the intent is to leave that to the user, who may want
+** to use different callback functions for different nodes.
+** 1999-01-04 - This too used the old bad way of using glib's list functions. Fixed.
+*/
+void xml_node_visit_children(const XmlNode *node, void (*func)(const XmlNode *child, gpointer user), gpointer user)
+{
+ const GSList *iter;
+
+ for(iter = node->children; iter != NULL; iter = g_slist_next(iter))
+ func(iter->data, user);
+}
+
+/* 1998-07-26 - Destroy a node. Knows how to destroy string data. You really shouldn't destroy a
+** node that has live children, since it will become (infinitely) more difficult to
+** access those children when their parent has been destroyed!
+*/
+void xml_node_destroy(XmlNode *node)
+{
+ if(node->data.type == XVT_TEXT)
+ g_string_free(node->data.text.value, TRUE);
+ if(node->children != NULL)
+ g_slist_free(node->children);
+ g_free(node);
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Returns TRUE if the given strings are a matched tag pair, FALSE otherwise. */
+static gint match_tags(const gchar *beg, const gchar *end)
+{
+ if(beg[0] == '/')
+ return FALSE;
+ if(end[0] != '/')
+ return FALSE;
+ return strcmp(beg, end + 1) == 0;
+}
+
+/* 1998-07-26 - A fancy strcmp() that knows how to skip whitespace. Checks if <str> is
+** equal to <word>, ignoring any whitespace. Case-sensitive.
+*/
+static gint is_word(const gchar *str, const gchar *word)
+{
+ while(isspace((guchar) *str))
+ str++;
+ return strcmp(str, word) == 0;
+}
+
+/* 1998-07-27 - Parse a real number from <str>, and store it in <p>. Requires that the
+** number contains exactly one period ('.') used to separate integer and
+** fractional parts. Doesn't give a damn about i18n, obviously. This function
+** is required since you can't "stack" sscanf() calls with formats of "%f
+** and "%d" the way I want to... :(
+** 1998-07-31 - Bug fix: attempted to parse things beginning with a period as floats,
+** thus clearly blurring the line between text and floats. This means that
+** reals are now required to contain at least one digit before the dot.
+*/
+static gboolean get_real(const gchar *str, gfloat *p)
+{
+ const gchar *beg = str;
+ gfloat num = 0.0f, fract, weight;
+ gint sign = 1;
+
+ if(*str == '-')
+ {
+ sign = -1;
+ str++;
+ }
+ while(isdigit((guchar) *str))
+ {
+ num *= 10;
+ num += *str - '0';
+ str++;
+ }
+ if(str == beg) /* If no digits were found, it's not a real anymore. */
+ return FALSE;
+ if(*str == '.')
+ {
+ for(str++, fract = 0.0f, weight = 0.1f; isdigit((guchar) *str); str++, weight /= 10.0f)
+ fract += (*str - '0') * weight;
+ *p = sign * (num + fract);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* 1998-07-27 - Create a duplicate of the string data in <in>, while taking care to replace any &-escaped
+** "sequences" (such as "&amp;") with their single-character equivalences. Note that we don't
+** even pretend to support all XML sequences.
+*/
+static GString * get_text_data(const gchar *in)
+{
+ GString *str;
+ gchar here, next;
+ guint i;
+
+ if((str = g_string_new(NULL)) != NULL)
+ {
+ if(*in == '"')
+ in++;
+ for(; (here = *in) != '\0'; in++)
+ {
+ if(here == '&') /* Special sequence here? */
+ {
+ for(i = 0; i < NUM_ESC_SEQ; i++)
+ {
+ if(strncmp(in, esc_seq[i].sequence, strlen(esc_seq[i].sequence)) == 0)
+ {
+ g_string_append_c(str, esc_seq[i].equiv);
+ in += strlen(esc_seq[i].sequence) - 1;
+ break;
+ }
+ }
+ if(i == NUM_ESC_SEQ) /* No match found? */
+ xml_error("Unknown &-sequence ignored");
+ }
+ else if(here == '\\') /* Escape sequence? */
+ {
+ if((next = *(in + 1)) == '\0') /* Trailing backslash OK and ignored. */
+ break;
+ switch(next)
+ {
+ case '\\':
+ g_string_append_c(str, '\\');
+ break;
+ case '"':
+ g_string_append_c(str, '"');
+ break;
+ default:
+ xml_error("Unsupported backslash escaped character '%c'!", next);
+ }
+ in++;
+ }
+ else if(!(here == '"' && *(in + 1) == '\0')) /* Accept internal quotes, reject final. */
+ g_string_append_c(str, here);
+ }
+ }
+ return str;
+}
+
+/* 1998-07-26 - Parse out the data from the string <str>. Data can be either text, a bool,
+** an integer or a real number. Returns TRUE if data was successfully parsed,
+** FALSE if it was not. Uses built-in knowledge about how different types of
+** data look in the XML file to determine the type of data at <str>.
+*/
+static gint get_data(XmlNode *node, const gchar *str)
+{
+ guint red, green, blue;
+
+ node->data.type = XVT_NONE;
+
+ if(sscanf(str, XML_UNSIGNED "%u", &node->data.uinteger.value) == 1)
+ node->data.type = XVT_UINTEGER;
+ else if(sscanf(str, XML_COLOR "%04X,%04X,%04X", &red, &green, &blue) == 3)
+ {
+ node->data.type = XVT_COLOR;
+ node->data.color.value.red = red;
+ node->data.color.value.green = green;
+ node->data.color.value.blue = blue;
+ }
+ else if(get_real(str, &node->data.real.value) == 1)
+ node->data.type = XVT_REAL;
+ else if(sscanf(str, "%d", &node->data.integer.value) == 1)
+ node->data.type = XVT_INTEGER;
+ else if(is_word(str, XML_TRUE))
+ {
+ node->data.bool.value = TRUE;
+ node->data.type = XVT_BOOL;
+ }
+ else if(is_word(str, XML_FALSE))
+ {
+ node->data.bool.value = FALSE;
+ node->data.type = XVT_BOOL;
+ }
+ else
+ {
+ if((node->data.text.value = get_text_data(str)) != NULL)
+ node->data.type = XVT_TEXT;
+ else
+ xml_error("No memory for text data in node '%s'", node->name);
+ }
+ return node->data.type != XVT_NONE;
+}
+
+/* 1998-07-26 - Read nodes from file <in>, build a tree rooted in <root>. Tags are classified
+** as either internal nodes or leaf nodes by the casing of their first character;
+** internal nodes begin with upper-case characters, leafs with lower-case chars.
+** Note: this will only read *one* tree from the file; if there are more, all trees
+** but the first will be ignored. Also note that this function is recursive, so if
+** you're allergic to that kind of thing, stay away. Otherwise, enjoy!
+*/
+static XmlNode * read_tree(FILE *in, XmlNode *root)
+{
+ GString *str, *data, *end;
+ XmlNode *node, *tree;
+ gint type, data_type, end_type;
+
+ while((str = get_token(in, &type)) != NULL)
+ {
+ if(type == 1 && NODE_INTERNAL(str->str))
+ {
+ if(str->str[0] == '/')
+ {
+ if(root != NULL)
+ {
+ if(match_tags(root->name, str->str))
+ break;
+ }
+ else
+ xml_error("Bare ending tag '%s' found!", str->str);
+ }
+ else
+ {
+ if((node = xml_node_new(str->str)) != NULL)
+ {
+ if(root == NULL)
+ tree = read_tree(in, root = node);
+ else
+ {
+ tree = read_tree(in, node);
+ xml_node_add_child(root, tree);
+ }
+ }
+ else
+ xml_error("Couldn't create node for '%s'", str->str);
+ }
+ }
+ else if(type == 1 && NODE_COMMENT(str->str))
+ continue;
+ else if(root != NULL && (node = xml_node_new(str->str)))
+ {
+ if((data = get_token(in, &data_type)) != NULL)
+ {
+ if((end = get_token(in, &end_type)) != NULL)
+ {
+ if(match_tags(str->str, end->str))
+ {
+ if(get_data(node, data->str))
+ xml_node_add_child(root, node);
+ else
+ xml_error("Couldn't get data for '%s' (unknown type)", node->name);
+ }
+ else
+ xml_error("Overlapping tag found (%s,%s)", str->str, end->str);
+ }
+ else
+ xml_error("Missing end tag for '%s'", node->name);
+ }
+ else
+ xml_error("Couldn't get data for '%s' (no token)", node->name);
+ }
+ else
+ xml_error("Bare data found");
+ g_string_free(str, TRUE);
+ }
+ if(str != NULL)
+ g_string_free(str, TRUE);
+ return root;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Destroy a tree, by freeing all the nodes. Don't keep references into a tree
+** you're about to destroy; copy any interesting data, then destroy the tree. Don't
+** let the tree hang around for longer than required either, since it'skind'a large.
+** 1999-01-04 - Corrected the way glib's list functions are used. Was broken.
+*/
+void xml_tree_destroy(XmlNode *node)
+{
+ const GSList *iter;
+
+ if(node != NULL)
+ {
+ for(iter = node->children; iter != NULL; iter = g_slist_next(iter))
+ xml_tree_destroy(iter->data);
+ xml_node_destroy(node);
+ }
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+#if 0 /* xml_tree_print() */
+/* 1998-07-27 - Prints an outline of a tree. Quite handy when debugging. */
+void xml_tree_print(const XmlNode *root, gpointer user)
+{
+ gint i, level = (gint) user;
+
+ if(root != NULL)
+ {
+ for(i = 0; i < level; i++)
+ putchar(' ');
+ printf("%s", root->name);
+ if(root->data.type != XVT_NONE)
+ {
+ switch(root->data.type)
+ {
+ case XVT_NONE: /* Keep the compiler happy. */
+ break;
+ case XVT_TEXT:
+ printf(" = '%s'", root->data.text.value->str);
+ break;
+ case XVT_INTEGER:
+ printf(" = %d", root->data.integer.value);
+ break;
+ case XVT_UINTEGER:
+ printf(" = %s%u", XML_UNSIGNED, root->data.uinteger.value);
+ break;
+ case XVT_REAL:
+ printf(" = %f", root->data.real.value);
+ break;
+ case XVT_BOOL:
+ printf(" = %s", root->data.bool.value ? XML_TRUE : XML_FALSE);
+ break;
+ case XVT_COLOR:
+ printf(" = [%04X,%04X,%04X]", root->data.color.value.red, root->data.color.value.green, root->data.color.value.blue);
+ }
+ }
+ putchar('\n');
+ g_slist_foreach(root->children, (GFunc) xml_tree_print, GINT_TO_POINTER((level + 1)));
+ }
+}
+#endif
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Find a node named <name>, and return a pointer to it. If no such node exists,
+** we return NULL. Recurses through entire tree.
+*/
+const XmlNode * xml_tree_search(const XmlNode *root, const gchar *name)
+{
+ const GSList *iter;
+ const XmlNode *node;
+
+ if(root != NULL)
+ {
+ if(strcmp(root->name, name) == 0)
+ return root;
+ for(iter = root->children; iter != NULL; iter = g_slist_next(iter))
+ {
+ if((node = xml_tree_search(iter->data, name)) != NULL)
+ return node;
+ }
+ }
+ return NULL;
+}
+
+/* ----------------------------------------------------------------------------------------- */
+
+/* 1998-07-26 - Load the first XML tree found in the file <name>. Case of the first
+** letter of tags determine wether the node created should be internal
+** or leaf.
+*/
+XmlNode * xml_tree_load(const gchar *name)
+{
+ XmlNode *tree = NULL;
+ FILE *in;
+
+ if((in = fopen(name, "rt")) != NULL)
+ {
+ tree = read_tree(in, NULL);
+ fclose(in);
+ }
+ return tree;
+}
diff --git a/src/xmlutil.h b/src/xmlutil.h
new file mode 100644
index 0000000..992e711
--- /dev/null
+++ b/src/xmlutil.h
@@ -0,0 +1,46 @@
+/*
+** 1998-07-25 - The obligatory header file for the XML utility module. The module provides
+** a way of reading in an XML file (um, at least I think it's XML) into a tree,
+** and then do various operations on that tree. Useful for configuration data.
+*/
+
+#if !defined XMLUTIL_H
+#define XMLUTIL_H
+
+/* This is one of gentoo's few opaque datatypes. */
+typedef struct XmlNode XmlNode;
+
+/* ----------------------------------------------------------------------------------------- */
+
+extern FILE * xml_put_open(const gchar *name);
+extern void xml_put_close(FILE *out);
+extern void xml_put_node_open(FILE *out, const gchar *node);
+extern void xml_put_node_close(FILE *out, const gchar *node);
+
+extern void xml_put_integer(FILE *out, const gchar *name, gint value);
+extern void xml_put_uinteger(FILE *out, const gchar *name, guint value);
+extern void xml_put_real(FILE *out, const gchar *name, gfloat value);
+extern void xml_put_boolean(FILE *out, const gchar *name, gboolean value);
+extern void xml_put_text(FILE *out, const gchar *name, const gchar *value);
+extern void xml_put_color(FILE *out, const gchar *name, const GdkColor *color);
+
+extern gboolean xml_get_integer(const XmlNode *node, const gchar *name, gint *n);
+extern gboolean xml_get_uinteger(const XmlNode *node, const gchar *name, guint *n);
+extern gboolean xml_get_real(const XmlNode *node, const gchar *name, gfloat *x); /* ;^) */
+extern gboolean xml_get_boolean(const XmlNode *node, const gchar *name, gboolean *x);
+extern gboolean xml_get_text(const XmlNode *node, const gchar *name, const gchar **str);
+extern gboolean xml_get_text_copy(const XmlNode *node, const gchar *name, gchar *str, gsize max);
+extern gboolean xml_get_color(const XmlNode *node, const gchar *name, GdkColor *col);
+
+extern XmlNode * xml_node_new(const gchar *name);
+extern gint xml_node_has_name(const XmlNode *node, const gchar *name);
+extern void xml_node_add_child(XmlNode *node, XmlNode *child);
+extern void xml_node_visit_children(const XmlNode *node, void (*func)(const XmlNode *child, gpointer user_data),
+ gpointer user_data);
+extern void xml_node_destroy(XmlNode *node);
+
+extern XmlNode * xml_tree_load(const gchar *name);
+extern const XmlNode * xml_tree_search(const XmlNode *root, const gchar *name);
+extern void xml_tree_destroy(XmlNode *node);
+
+#endif /* XMLUTIL_H */