[Wine] Program won't load fonts when run outside of installed dir
L. Rahyen
research at science.su
Fri Feb 6 13:41:40 CST 2009
On 2009-02-06 (Friday) 14:38:43 Tofystedeth wrote:
> I'm trying get a couple pieces of software we use at work so we can replace
> a bunch of aging Windows machines with Linux boxes, but I'm having a little
> trouble. I'll start with the potentially easiest problem first.
>
> One of the programs I'm trying to use is Lightspeed Virtual Terminal. It
> runs fairly well with just a couple of glitches. If I go to the directory
> it was installed to, either in the terminal or the file browser, and run it
> with the "Wine Program Loader" menu option, or 'wine lsvt.exe' it opens
> normally. However, if I try to create a link or a launcher for it, it
> doesn't load the fonts and comes up looking awful.
>
> How can I fix this?
Short answer: You are always supposed to run a Windows program
from where it was installed. So, when creating a launcher use something like "wine
start /unix /path/to/your_program.exe" to start your program. If you want to
create a link then link to script with "wine start /unix /path/to/your_program.exe"
inside. Also you need to set WINEPREFIX environment variable in your script and
convert with winepath all Unix paths in argument list for Windows program or it will
not find files you want to open with it. This means, for example, that you cannot
drag'n'drop file from Konqueror onto Windows program and expect it to open it.
Please read long answer below if you want to solve all of above problems once and for all.
Long answer: personally I dislike to write "wine start /unix ..." or "wine ..." or to cd to
directory where a program is installed and think about current WINEPREFIX environment
variable everytime I want to run Windows program; also I dislike that I cannot drag'n'drop
in Konqueror a file onto Windows program (well, actually I can but result of such operation
will not be useful) or can't use Unix path to a file I want to open it with Windows program.
Writing program-specific script for each Windows programs isn't and option, especially
if you are using more than a few of Windows programs.
To solve these problems I prefer to use support for misc binaries in the Linux kernel.
Using it you can run any Windows executable directly (in other words you will be able to run
Windows executables exactly the same as you run native Linux executables - for example
you can type in your terminal "/path/to/your_program.exe" and hit enter and your_program.exe
will run). If you want to use support for misc binaries to run Windows programs in Linux I
recommend you to create wrapper script /usr/local/bin/winestart with the following content
(actually this script is useful even if you don't want to use support for misc binaries).
#!/bin/sh
# Copyright (C) 2009 L. Rahyen
# License: GNU LGPL version 2 or later
if [[ -z "$WINEPREFIX" ]]; then
{
APATH="$@"
if [[ -n "`echo $APATH | cut -d/ -f1`" ]]; then
{
APATH="`pwd`/$@"
} fi
WINEPREFIX="`echo \"$APATH\" | sed 's/\/\.\//\//g;s/\/dosdevices\/.:\//\/drive_c\//;s/\harddiskvolume0/\/drice_c\//' |
awk '
{
n = split($0, a, "/drive_c/")
printf("%s", a[1]);
}
'`"
export WINEPREFIX
if [[ ! -d "$WINEPREFIX" ]]; then
{
unset WINEPREFIX
} fi
} fi
ARGS="$1"
shift
while [[ "$1" != "" ]]; do
{
FILE="`winepath -w \"$1\" | sed 's/ /\\ /g'`"
if [[ -e "`winepath -u \"$FILE\"`" ]]; then
{
ARGS="$ARGS $FILE"
}
else
{
ARGS="$ARGS $1"
} fi
echo "$ARGS"
shift
} done
wine start /unix "$ARGS"
Then save it and make it executable by running "sudo chmod +x /usr/local/bin/winestart". Then run this as root:
echo ':DOSWin:M::MZ::/usr/local/bin/winestart:' > /proc/sys/fs/binfmt_misc/register
Make sure to put this command somewhere in your startup scripts (if you
already have it there then change it accordingly); otherwise after reboot you will
need to run it manually again. If you get "write error" then you already have DOSWin
registered and you need to unregister it by running:
echo -1 > /proc/sys/fs/binfmt_misc/DOSWin
...then run "echo ':DOSWin:M::MZ::/usr/local/bin/winestart:' > /proc/sys/fs/binfmt_misc/register"
again.
Now you can run (for example) notepad like this:
~/.wine/drive_c/windows/notepad.exe
And even if you run your program in non-default Wine prefix it will run
correctly. For running next few examples you need non-default Wine prefix so let's
create one (unset command in second line is there just in case if you have non-empty
WINEPREFIX environment variable):
WINEPREFIX=~/.my-wine-prefix wineboot
unset WINEPREFIX
Now you can start notepad like this:
~/.my-wine-prefix/drive_c/windows/notepad.exe
Or like this:
cd ~/.my-wine-prefix/drive_c/
windows/notepad.exe
...And in both cases winestart the wrapper script will detect that you are
running notepad in non-default Wine prefix and will run notepad in ~/.my-wine-prefix
Wine prefix (instead of using default ~/.wine). Obviously instead of notepad.exe you
can run any program you want (usually you can find your Windows programs in
drive_c/Program\ Files directory).
Another example:
~/.my-wine-prefix/dosdevices/z:/$HOME/your-program.exe
Or:
cd ~/.my-wine-prefix/dosdevices/z:/$HOME/
./your-program.exe
Both commands will run your-program.exe in ~/.my-wine-prefix Wine prefix.
However if you explicitly specify Wine prefix using WINEPREFIX environment variable
it will override auto-detection. For example:
WINEPREFIX=~/.wine ~/.my-wine-prefix/drive_c/windows/notepad.exe
This will run ~/.my-wine-prefix/drive_c/windows/notepad.exe in ~/.wine Wine
prefix. Overriding auto-detection is useful sometimes for testing (for example you
can run a program installed in ~/.my-wine-prefix using ~/.wine Wine prefix where it
wasn't installed to see how well (or how bad) your program will work without
installation).
Support for direct execution of Windows executables will work with all file
managers and shells so you can run all your Windows programs like native ones.
Make sure to remove all associations in your file manager(s) with Wine (*.exe files)
so file manager(s) can run Windows programs directly. Also you can specify in your
launcher(s) Windows programs without prefixing them with "wine " or "wine start /unix"
and/or specifying Wine WINEPREFIX environment variable (so in many cases you can
use hard or symbolic links instead of launchers).
Few more examples... Let's create a simple text file:
echo Text > ~/text.txt
Now let's try to open it with notepad (or any other Windows program you like):
cd ~/.my-wine-prefix/drive_c/windows/
./notepad.exe ~/text.txt
Notepad will successfully open ~/text.txt!
If you are using Konqueror run it and go to "~/.my-wine-prefix/drive_c/windows/".
You should see notepad.exe. Run another instance of Konqueror (or split Konqueror
window you just opened); make sure that you can see two Konqueror windows
simultaneously. In another Konqueror window go to your home directory and find text.txt.
Now drag'n'drop text.txt to notepad.exe - Notepad will open text.txt for you.
As you can see this script and support for misc binaries is very useful when used
properly. I hope this information will be helpful. If something doesn't work as you expected
let me know.
More information about the wine-users
mailing list