wwine 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/wwine +306 -142
- data/wwine.1 +105 -37
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ddfd32972c75b495e5bbbbe50ae199142e9f9d362602fca83f2c41264e894690
|
4
|
+
data.tar.gz: 8685c5b8731666a8ff21c263278c1714c78f9d71220d452241dcbb3a79365e8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 684934489489f1d4cd122efe06c08b69a9733c556fb035b09f3d7a396b15744e8b6bace63820b24eee7cc55bd0feb034f26bf03d34cc6ef33a3bd467e76172a8
|
7
|
+
data.tar.gz: 2d10e6dcc66feb60791f0f45a720f93d3ecf1ec7fcfece501074512a746d873dd14512470f9730c1a66798d0d8bcb7e5de75672098e61c3d9f1b9c1febe2a5ef
|
data/wwine
CHANGED
@@ -20,15 +20,11 @@ require 'getoptlong'
|
|
20
20
|
# To read info for --debuginfo
|
21
21
|
require 'open3'
|
22
22
|
# Application version
|
23
|
-
$version = '0.
|
23
|
+
$version = '0.4'
|
24
24
|
# The wine flavour to use
|
25
25
|
$wine = nil
|
26
26
|
# The bottle to use
|
27
27
|
$bottle = nil
|
28
|
-
# CX path
|
29
|
-
$cxPath = nil
|
30
|
-
# CXG path
|
31
|
-
$cxgPath = nil
|
32
28
|
# Path to write wrapper to
|
33
29
|
$wrapperPath = nil
|
34
30
|
# Directory to cd to in a wrapper
|
@@ -39,9 +35,15 @@ $wwineDataFrom = nil
|
|
39
35
|
$envMode = false
|
40
36
|
# true if we're in --tricks mode
|
41
37
|
$tricksMode = false
|
38
|
+
# Wether to enable (LD_PRELOAD) the Feral Interactive GameMode library
|
39
|
+
$preloadGameMode = false
|
42
40
|
# A positive integer if we're in --kill or --drykill mode
|
43
41
|
# (--drykill = 9999)
|
44
42
|
$killMode = nil
|
43
|
+
# Wine debugging levels
|
44
|
+
$wineDebug = nil
|
45
|
+
# The wine architecture
|
46
|
+
$wineArch = nil
|
45
47
|
# Verbosity level
|
46
48
|
$verbosity = 0
|
47
49
|
V_INFO=1
|
@@ -82,8 +84,6 @@ def killWine (signal)
|
|
82
84
|
end
|
83
85
|
if !dryRun
|
84
86
|
print 'Sending '+sigName+' to the following processes:'+"\n\n"
|
85
|
-
else
|
86
|
-
print 'Would send '+sigName+' to the following processes:'+"\n\n"
|
87
87
|
end
|
88
88
|
format = "%-10s %-12s %-8s %-20s\n"
|
89
89
|
printf(format,'Wine','Bottle','PID','Command')
|
@@ -176,14 +176,14 @@ def getFromEnviron(path)
|
|
176
176
|
env = Hash.new
|
177
177
|
source.each("\0") do |entry|
|
178
178
|
key = entry.sub(/^([^=]+)=.*$/,'\1').chomp
|
179
|
-
value = entry.sub(/^[^=]+=(.*)$/,'\1').chomp
|
179
|
+
value = entry.sub(/^[^=]+=(.*)$/,'\1').sub(/\0/,'').chomp
|
180
180
|
env[key] = value
|
181
181
|
end
|
182
182
|
|
183
183
|
if env['CX_BOTTLE']
|
184
184
|
info['bottle'] = env['CX_BOTTLE']
|
185
185
|
elsif env['WINEPREFIX']
|
186
|
-
info['bottle'] = env['WINEPREFIX']
|
186
|
+
info['bottle'] = File.basename(env['WINEPREFIX'])
|
187
187
|
elsif env['__WWINE_INT_XBOTTLE']
|
188
188
|
info['bottle'] = env['__WWINE_INT_XBOTTLE']
|
189
189
|
else
|
@@ -197,9 +197,10 @@ def getFromEnviron(path)
|
|
197
197
|
info['wine'] = env['__WWINE_INT_XWINE']
|
198
198
|
elsif env['WINELOADER']
|
199
199
|
info['wine'] = 'wine'
|
200
|
+
elsif info['bottle'] == '.wine-pipelight'
|
201
|
+
info['wine'] = 'pipelight'
|
202
|
+
info['bottle'] = '(pipelight)'
|
200
203
|
end
|
201
|
-
info['wine'].sub!(/\0/,'')
|
202
|
-
info['bottle'].sub!(/\0/,'')
|
203
204
|
end
|
204
205
|
return info
|
205
206
|
end
|
@@ -292,11 +293,13 @@ def writeWrapper (targetFile, wwineCommand, otherCommand, cwd, wwineInfo, args,
|
|
292
293
|
exit(1)
|
293
294
|
end
|
294
295
|
|
295
|
-
#
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
metaFormat = '
|
296
|
+
# --gamemode requires v6, --arch requires v5, otherwise we are v4 compatible
|
297
|
+
if $preloadGameMode
|
298
|
+
metaFormat = 'v6'
|
299
|
+
elsif $wineArch
|
300
|
+
metaFormat = 'v5'
|
301
|
+
else
|
302
|
+
metaFormat = 'v4'
|
300
303
|
end
|
301
304
|
|
302
305
|
file.puts('#!/bin/sh')
|
@@ -311,9 +314,6 @@ def writeWrapper (targetFile, wwineCommand, otherCommand, cwd, wwineInfo, args,
|
|
311
314
|
wwineInfo.each do |key,value|
|
312
315
|
file.puts('# wwine'+key+': '+value)
|
313
316
|
end
|
314
|
-
# wwineCmd isn't used in v2 or v3, but v1 outputs an invalid message if it
|
315
|
-
# doesn't exist. wwineCmd (unnumbered) will be dropped in a later version.
|
316
|
-
file.puts('# wwineCmd: nil')
|
317
317
|
|
318
318
|
subN = 0
|
319
319
|
args.each do |sub|
|
@@ -329,10 +329,10 @@ def writeWrapper (targetFile, wwineCommand, otherCommand, cwd, wwineInfo, args,
|
|
329
329
|
file.puts("\t"+'wwine="`which wwine 2> /dev/null`"')
|
330
330
|
file.puts('fi')
|
331
331
|
file.puts('if [ "x$wwine" != "x" ]; then')
|
332
|
-
# _WWINE_SCRIPT is currently
|
333
|
-
# to use '--from' automatically in
|
334
|
-
#
|
335
|
-
# by scripts.
|
332
|
+
# _WWINE_SCRIPT is currently just used to detect if a wrapper script is
|
333
|
+
# being used. But is intended to help wwine use '--from' automatically in
|
334
|
+
# the future if for some reason there are backwards-incompatible changes to
|
335
|
+
# one of the command-line parameters used by scripts.
|
336
336
|
file.puts("\t"+'export _WWINE_SCRIPT="$0"')
|
337
337
|
file.puts("\t"+'exec "$wwine" '+shellQuote(wwineCommand).join(" ")+' "$@"')
|
338
338
|
file.puts('else')
|
@@ -342,8 +342,18 @@ def writeWrapper (targetFile, wwineCommand, otherCommand, cwd, wwineInfo, args,
|
|
342
342
|
wineprefix.sub!(/'/,'\\')
|
343
343
|
file.puts("\t"+'export WINEPREFIX='+shellQuote(wineprefix))
|
344
344
|
end
|
345
|
-
if
|
346
|
-
|
345
|
+
if $wineArch
|
346
|
+
file.puts("\t"+'export WINEARCH='+shellQuote($wineArch))
|
347
|
+
end
|
348
|
+
if wwineInfo['Wine'] =~ /^(pol|lutris)/i
|
349
|
+
type = 'POL'
|
350
|
+
if wwineInfo['Wine'] =~ /^lutris/
|
351
|
+
type = 'lutris'
|
352
|
+
end
|
353
|
+
path = getCustomwithParams(wwineInfo['Wine'].sub(/^(pol|lutris)[-:]?/i,''),nil,type,false,true)
|
354
|
+
if path == nil
|
355
|
+
abort("getCustomwithParams returned nil wine. This is a bug")
|
356
|
+
end
|
347
357
|
if ENV['WINEDEBUG'] != nil
|
348
358
|
file.puts("\t"+"export WINEDEBUG="+shellQuote(ENV['WINEDEBUG']))
|
349
359
|
end
|
@@ -355,6 +365,9 @@ def writeWrapper (targetFile, wwineCommand, otherCommand, cwd, wwineInfo, args,
|
|
355
365
|
file.puts("\t"+"export WINEDEBUG="+shellQuote(ENV['WINEDEBUG']))
|
356
366
|
end
|
357
367
|
end
|
368
|
+
if $preloadGameMode
|
369
|
+
file.puts("\t"+'export LD_PRELOAD="/usr/\$LIB/libgamemodeauto.so:$LD_PRELOAD"')
|
370
|
+
end
|
358
371
|
file.puts("\t"+"exec "+shellQuote(otherCommand).join(" ")+' "$@"')
|
359
372
|
file.puts('fi')
|
360
373
|
file.puts('echo "Launch script failed. No wwine found and wine command failed to exec."')
|
@@ -370,23 +383,27 @@ end
|
|
370
383
|
def generateWwineCmd (wine,bottle,wineCommand,type = nil)
|
371
384
|
wwineCmd = []
|
372
385
|
wwineInfo = {
|
373
|
-
'Cxinstalldir' => 'nil',
|
374
386
|
'Dir' => 'nil',
|
375
387
|
'Bottle' => 'nil',
|
376
|
-
'Wine' => 'nil'
|
388
|
+
'Wine' => 'nil',
|
389
|
+
'GameMode' => 'nil',
|
377
390
|
}
|
378
391
|
|
379
392
|
# Generate a wwine command-line
|
380
393
|
if $verbosity > 0
|
381
394
|
wwineCmd.push('--verbose')
|
382
395
|
end
|
383
|
-
if $
|
384
|
-
wwineCmd.push('--
|
385
|
-
wwineInfo['
|
396
|
+
if $wineDebug
|
397
|
+
wwineCmd.push('--debug',$wineDebug)
|
398
|
+
wwineInfo['Debug'] = $wineDebug
|
386
399
|
end
|
387
|
-
if $
|
388
|
-
wwineCmd.push('--
|
389
|
-
wwineInfo['
|
400
|
+
if $wineArch
|
401
|
+
wwineCmd.push('--arch',$wineArch)
|
402
|
+
wwineInfo['Arch'] = $wineArch
|
403
|
+
end
|
404
|
+
if $preloadGameMode
|
405
|
+
wwineCmd.push('--gamemode')
|
406
|
+
wwineInfo['GameMode'] = 'true'
|
390
407
|
end
|
391
408
|
if wine
|
392
409
|
wwineCmd.push('--wine',wine)
|
@@ -427,7 +444,7 @@ def generateWrapper (wine,bottle,targetFile,wineCommand,args,type = nil)
|
|
427
444
|
|
428
445
|
# For wine there is no --bottle definition in the wine command itself,
|
429
446
|
# so we need to export a wineprefix in the launch script
|
430
|
-
if (type == 'wine' || type =~ /^pol[-:]/) && ENV['WINEPREFIX']
|
447
|
+
if (type == 'wine' || type =~ /^(pol|lutris)[-:]/) && ENV['WINEPREFIX']
|
431
448
|
wineprefix = ENV['WINEPREFIX'].dup
|
432
449
|
end
|
433
450
|
|
@@ -440,9 +457,9 @@ def setEnvAndExec (wine,bottle,cmd,args,type)
|
|
440
457
|
if wine == nil
|
441
458
|
type,cmd = getAutoWithParams(bottle)
|
442
459
|
end
|
443
|
-
envPut('
|
460
|
+
envPut('__WWINE_INT_WINE',wine)
|
444
461
|
|
445
|
-
if
|
462
|
+
if type == 'crossover'
|
446
463
|
cxdir = getCXwithParams(wine,bottle,true,false,true)
|
447
464
|
if File.executable?(cxdir+'/bin/wineserver')
|
448
465
|
envPut('WINESERVER',cxdir+'/bin/wineserver')
|
@@ -458,21 +475,26 @@ def setEnvAndExec (wine,bottle,cmd,args,type)
|
|
458
475
|
if $verbosity > 0
|
459
476
|
envPut('__WWINE_INT_VERBOSITY',$verbosity.to_s)
|
460
477
|
end
|
461
|
-
if $cxPath
|
462
|
-
envPut('__WWINE_INT_CXPATH',$cxPath);
|
463
|
-
end
|
464
|
-
if $cxgPath
|
465
|
-
envPut('__WWINE_INT_CXGPATH',$cxgPath);
|
466
|
-
end
|
467
478
|
|
468
|
-
if wine == 'wine' || File.exists?(wine)
|
479
|
+
if type == 'wine' || wine == 'wine' || (File.exists?(wine) && !File.directory?(wine)) || wine =~ /^(pol|lutris)[-:]?/i
|
480
|
+
vputs(V_DBG,"Used ENV/WINEPREFIX method to get bottle")
|
469
481
|
bottlePath = ENV['WINEPREFIX']
|
470
482
|
elsif resolveWine(wine) == 'gametree'
|
483
|
+
vputs(V_DBG,"Used ENV/cedega method to get bottle")
|
471
484
|
bottlePath = ENV['HOME']+'/.cedega/'+bottle
|
472
485
|
else
|
486
|
+
vputs(V_DBG,"Used CX method to get bottle")
|
473
487
|
bottlePath = getCXwithParams(wine,bottle,true,true)
|
474
488
|
end
|
489
|
+
if $wineArch
|
490
|
+
envPut('WINEARCH',$wineArch)
|
491
|
+
envPut('__WWINE_INT_WINEARCH',$wineArch)
|
492
|
+
end
|
475
493
|
|
494
|
+
if bottlePath == nil
|
495
|
+
puts "ERROR: setEnvAndExec() has no bottlePath"
|
496
|
+
exit 1
|
497
|
+
end
|
476
498
|
envPut('WINEPREFIX',bottlePath)
|
477
499
|
envPut('WINE',File.expand_path($0))
|
478
500
|
if args.length > 0
|
@@ -512,9 +534,6 @@ def loadWwineDataFromFile (file,dryRun = false)
|
|
512
534
|
end
|
513
535
|
|
514
536
|
info = Hash.new
|
515
|
-
# Default entries
|
516
|
-
info['CxGamesinstalldir'] = 'nil'
|
517
|
-
info['Cxinstalldir'] = 'nil'
|
518
537
|
|
519
538
|
source.each do |line|
|
520
539
|
if line.match(/^#\s+wwine/)
|
@@ -529,22 +548,28 @@ def loadWwineDataFromFile (file,dryRun = false)
|
|
529
548
|
puts "Unable to continue."
|
530
549
|
exit(0)
|
531
550
|
end
|
532
|
-
|
551
|
+
# FIXME: Should convert info version to an integer and just check that
|
552
|
+
if info['Info'] == 'v2' || info['Info'] == 'v3' || info['Info'] == 'v4' || info['Info'] == 'v5' || info['Info'] == 'v6'
|
553
|
+
vputs(V_DBG,'File contains wwine metadata '+info['Info'])
|
533
554
|
info = parseWwineDataV2(info);
|
534
555
|
elsif info['Info'].match(/^v1/)
|
535
|
-
info = parseWwineDataV1(info)
|
536
556
|
if ! $wrapperPath
|
537
|
-
puts "
|
538
|
-
puts "
|
539
|
-
puts "This format
|
540
|
-
puts "a later version of wwine.
|
541
|
-
puts "wwine
|
542
|
-
puts "--
|
557
|
+
puts "ERROR: Unsupported wwine metadata format (v1)"
|
558
|
+
puts ""
|
559
|
+
puts "This format is no longer supported directly, and even upgrade support will"
|
560
|
+
puts "be removed in a later version of wwine. To upgrade the file to the new"
|
561
|
+
puts "wwine format, run this command:"
|
562
|
+
puts " wwine --from "+shellQuote(file)+" --wrap "+shellQuote(file+'.new')+" && mv "+shellQuote(file)+" "+shellQuote(file+'.old')+' && mv '+shellQuote(file+'.new')+' '+shellQuote(file)
|
543
563
|
puts ""
|
564
|
+
puts "This will upgrade the file, while leaving an old backup copy in place with a"
|
565
|
+
puts ".old-extension. You may delete the .old file if you have never edited the"
|
566
|
+
puts "script directly, or after you have copied over your changes."
|
567
|
+
exit(1)
|
544
568
|
end
|
569
|
+
info = parseWwineDataV1(info)
|
545
570
|
else
|
546
571
|
version = info['Info'].sub(/^(v\S+).+/,'\1').chomp
|
547
|
-
puts "This version of wwine supports info format
|
572
|
+
puts "This version of wwine supports info format v2, v3, v4, v5 and v6."
|
548
573
|
puts "This file is version "+version
|
549
574
|
puts "Unable to continue."
|
550
575
|
exit(0)
|
@@ -579,6 +604,15 @@ def loadWwineDataFromFile (file,dryRun = false)
|
|
579
604
|
# Get the --wine to use
|
580
605
|
if $wine == nil && info['Wine'] != 'nil'
|
581
606
|
$wine = info['Wine']
|
607
|
+
# Support for legacy Cx*installdir
|
608
|
+
if info['Cxinstalldir'] != 'nil' && info['Cxinstalldir'] != nil
|
609
|
+
vputs(V_DBG,'Converting Cxinstalldir entry to a Wine entry')
|
610
|
+
$wine = info['Cxinstalldir']
|
611
|
+
end
|
612
|
+
if info['CxGamesinstalldir'] != 'nil' && info['CxGamesinstalldir'] != nil
|
613
|
+
vputs(V_DBG,'Converting CxGamesinstalldir entry to a Wine entry')
|
614
|
+
$wine = info['CxGamesinstalldir']
|
615
|
+
end
|
582
616
|
printf(outFormat,outMessage+'--wine',$wine)
|
583
617
|
end
|
584
618
|
|
@@ -588,14 +622,21 @@ def loadWwineDataFromFile (file,dryRun = false)
|
|
588
622
|
printf(outFormat,outMessage+'--bottle',$bottle)
|
589
623
|
end
|
590
624
|
|
591
|
-
#
|
592
|
-
if
|
593
|
-
|
594
|
-
|
625
|
+
# Set wineArch
|
626
|
+
if info['Arch']
|
627
|
+
if info['Arch'] == 'win32' || info['Arch'] == 'win64'
|
628
|
+
$wineArch = info['Arch']
|
629
|
+
printf(outFormat,outMessage+'--arch ',$wineArch)
|
630
|
+
else
|
631
|
+
puts('WARNING: Arch: '+info['Arch']+' is invalid, ignoring!')
|
632
|
+
end
|
595
633
|
end
|
596
|
-
|
597
|
-
|
598
|
-
|
634
|
+
|
635
|
+
# Enable GameMode if needed
|
636
|
+
if info['GameMode'] && info['GameMode'] == 'true'
|
637
|
+
$preloadGameMode = true
|
638
|
+
# FIXME: Drop the 'true'
|
639
|
+
printf(outFormat,outMessage+'--gamemode','true')
|
599
640
|
end
|
600
641
|
|
601
642
|
# Set the command to run
|
@@ -619,10 +660,16 @@ def parseWwineDataV1 (rawData)
|
|
619
660
|
unquoteShellArray(rawData['Info'],data)
|
620
661
|
info = Hash.new
|
621
662
|
info['Dir'] = data[1]
|
622
|
-
info['Wine'] = data[2]
|
663
|
+
info['Wine'] = resolveWine(data[2])
|
623
664
|
info['Bottle'] = data[3]
|
624
665
|
info['Cxinstalldir'] = data[4]
|
625
666
|
|
667
|
+
if info['Wine'] == 'crossover' || info['Wine'] == 'cxgames'
|
668
|
+
if info['Cxinstalldir']
|
669
|
+
info['Wine'] = info['Cxinstalldir']
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
626
673
|
cmd = []
|
627
674
|
|
628
675
|
unquoteShellArray(rawData['Cmd'],cmd)
|
@@ -630,7 +677,7 @@ def parseWwineDataV1 (rawData)
|
|
630
677
|
return info
|
631
678
|
end
|
632
679
|
|
633
|
-
# Parses wwine metadata version 2 (wwine 0.2+)
|
680
|
+
# Parses wwine metadata version 2+ (wwine 0.2+)
|
634
681
|
def parseWwineDataV2 (data)
|
635
682
|
cmd = []
|
636
683
|
currNo = 0
|
@@ -679,6 +726,10 @@ end
|
|
679
726
|
|
680
727
|
# Purpose: Set an environment variable
|
681
728
|
def envPut (name,value)
|
729
|
+
if value == nil
|
730
|
+
puts "ERROR: Tried to set nil env var: '"+name+"'"
|
731
|
+
exit 1
|
732
|
+
end
|
682
733
|
vputs(V_DBG,'Set '+name+'='+value)
|
683
734
|
ENV[name] = value;
|
684
735
|
end
|
@@ -690,14 +741,14 @@ def Help ()
|
|
690
741
|
puts "Usage: wwine (WWINE PARAMETERS) PROGRAM -- [PROGRAM ARGUMENTS]"
|
691
742
|
puts ""
|
692
743
|
printHelp('-h','--help','Display this help text')
|
693
|
-
printHelp('-w','--wine','Select the wine to use. Any wine listed in "wwine --list" or the path to a wine binary.')
|
744
|
+
printHelp('-w','--wine','Select the wine to use. Any wine listed in "wwine --list" or the path to a wine binary or crossover installation directory.')
|
694
745
|
printHelp('-b','--bottle','Use the selected bottle (~/.wwinebottles/[NAME] for wine, CX bottle or cedega folder, depending on the --wine in use). The bottle will be created if it does not exist.')
|
746
|
+
printHelp('','--debug','Enable wine debugging output with the supplied levels (using the format of the WINEDEBUG environment variable)')
|
695
747
|
printHelp('','--env','Set the WINE and WINEPREFIX environment variables to match the parameters provided to wwine and optionally run a program with those variables set.')
|
748
|
+
printHelp('','--arch','Set the wine architecture. Accepts win32 and win64. The default is win32 if --wine does not end with "64"')
|
696
749
|
printHelp('-l','--list','List all available wine versions')
|
697
750
|
printHelp('-k','--kill','Attempt to kill all running wine processes')
|
698
751
|
printHelp('','--drykill','Print what --kill would have done, but don\'t actually do anything')
|
699
|
-
printHelp('-c','--cxinstalldir','Use the supplied path as the install path for Crossover (default: autodetect).')
|
700
|
-
printHelp('-C','--cxg-installdir','Use the supplied path as the install path for CXGames (default: autodetect)')
|
701
752
|
printHelp('','--wrap','Write a wrapper script of your current wwine command to the path supplied')
|
702
753
|
printHelp('','--wrapdir','Use the supplied directory as the working directory for the script created by --wrap (default: current directory)')
|
703
754
|
printHelp('-s','--from','Load parameters and program from the wrapper script supplied. Command-line arguments overrides settings from wrapper script.')
|
@@ -808,8 +859,6 @@ def getGameTreeVersionString ()
|
|
808
859
|
if cedegaVer == nil
|
809
860
|
cedegaVer = 'present'
|
810
861
|
end
|
811
|
-
else
|
812
|
-
cedegaVer = '(not present)'
|
813
862
|
end
|
814
863
|
|
815
864
|
return cedegaVer
|
@@ -852,7 +901,7 @@ def getCXVersionsFrom (source,wantString = false)
|
|
852
901
|
return cxVer
|
853
902
|
end
|
854
903
|
else
|
855
|
-
return
|
904
|
+
return nil
|
856
905
|
end
|
857
906
|
else
|
858
907
|
return cxVer,cxwVer
|
@@ -906,7 +955,7 @@ def listWines(debug = false)
|
|
906
955
|
if inPath('wine')
|
907
956
|
wineVer = getWineVersion()
|
908
957
|
printf(outFormat,'wine',wineVer)
|
909
|
-
if defaultWine == 'wine'
|
958
|
+
if defaultWine == 'wine' && !debug
|
910
959
|
puts " (default when no --wine is specified)"
|
911
960
|
end
|
912
961
|
end
|
@@ -922,29 +971,57 @@ def listWines(debug = false)
|
|
922
971
|
cxoBin = getCXwithParams('cxoffice',nil,false)
|
923
972
|
cxoVer = getCXVersionsFrom(cxoBin,true)
|
924
973
|
|
925
|
-
if (cxgBin || !cxoBin)
|
926
|
-
printf(outFormat,'cxgames',cxgVer)
|
927
|
-
|
974
|
+
if (cxgBin || !cxoBin || debug)
|
975
|
+
printf(outFormat,'cxgames',cxgVer || '(not present)')
|
976
|
+
if !debug
|
977
|
+
puts " (aliases for cxgames: cxg, cxgames)"
|
978
|
+
end
|
928
979
|
end
|
929
980
|
|
930
|
-
if cxoVer
|
981
|
+
if cxoVer || debug
|
931
982
|
printf(outFormat,'crossover',cxoVer)
|
932
|
-
if !
|
933
|
-
|
934
|
-
|
935
|
-
|
983
|
+
if !debug
|
984
|
+
if !cxgBin
|
985
|
+
puts " (aliases for crossover: cx, cxo, cxg, cxoffice, cxgames)"
|
986
|
+
else
|
987
|
+
puts " (aliases for crossover: cx, cxo, cxoffice)"
|
988
|
+
end
|
936
989
|
end
|
937
990
|
end
|
938
991
|
|
939
992
|
cedegaVer = getGameTreeVersionString()
|
940
|
-
if cedegaVer
|
941
|
-
printf(outFormat,'gametree',cedegaVer)
|
942
|
-
|
993
|
+
if cedegaVer || debug
|
994
|
+
printf(outFormat,'gametree',cedegaVer || '(not present)')
|
995
|
+
if ! debug
|
996
|
+
puts " (aliases for gametree: cedega)"
|
997
|
+
end
|
943
998
|
end
|
944
999
|
|
945
1000
|
Dir.glob(ENV['HOME']+'/.PlayOnLinux/wine/linux-*/*') do |dir|
|
946
|
-
|
947
|
-
|
1001
|
+
if File.executable?(dir+'/bin/wine')
|
1002
|
+
name = dir.sub(/^.*\/([^\/]+)/,'\1')
|
1003
|
+
printf(outFormat,'pol-'+name,getWineVersion(dir+'/bin/wine'))
|
1004
|
+
end
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
Dir.glob(ENV['HOME']+'/.local/share/lutris/runners/wine/*') do |dir|
|
1008
|
+
if File.executable?(dir+'/bin/wine')
|
1009
|
+
name = dir.sub(/^.*\/([^\/]+)/,'\1')
|
1010
|
+
printf(outFormat,'lutris-'+name,getWineVersion(dir+'/bin/wine'))
|
1011
|
+
end
|
1012
|
+
end
|
1013
|
+
|
1014
|
+
if $wine != nil && debug
|
1015
|
+
version = nil
|
1016
|
+
if File.directory?($wine)
|
1017
|
+
cxBin = getCXwithParams($wine,nil,false)
|
1018
|
+
version = getCXVersionsFrom(cxBin,true)
|
1019
|
+
elsif File.executable?($wine)
|
1020
|
+
version = getWineVersion($wine)
|
1021
|
+
end
|
1022
|
+
if version != nil
|
1023
|
+
printf(outFormat,$wine,version)
|
1024
|
+
end
|
948
1025
|
end
|
949
1026
|
rescue => ex
|
950
1027
|
handleException(ex)
|
@@ -969,7 +1046,16 @@ end
|
|
969
1046
|
# Purpose: Get parameters for wine
|
970
1047
|
def getWineWithParams (wine,bottle, missingIsFatal = true, playOnLinux = false)
|
971
1048
|
final = []
|
972
|
-
possibleWines = [
|
1049
|
+
possibleWines = []
|
1050
|
+
if wine =~ /^wine(64|32|-unstable(32|64)?)$/
|
1051
|
+
possibleWines = [ wine ]
|
1052
|
+
else
|
1053
|
+
if $wineArch && $wineArch == 'win64'
|
1054
|
+
possibleWines = [ 'wine64','wine-unstable64','wine','wine.bin','wine.real','wine-unstable' ]
|
1055
|
+
else
|
1056
|
+
possibleWines = [ 'wine32','wine','wine64','wine.bin','wine.real','wine-unstable','wine32-unstable' ]
|
1057
|
+
end
|
1058
|
+
end
|
973
1059
|
# Manual search path, in the odd case none of the above are in $PATH.
|
974
1060
|
# Ie. /usr/lib32/wine/wine.bin is the real wine binary on Debian
|
975
1061
|
searchPath = [ '/usr/lib32/wine/','/usr/bin','/usr/lib/i386-linux-gnu/wine-unstable','/usr/lib/i386-linux-gnu/wine', ]
|
@@ -1046,8 +1132,11 @@ def getWineWithParams (wine,bottle, missingIsFatal = true, playOnLinux = false)
|
|
1046
1132
|
envPut('WINEPREFIX',bottle)
|
1047
1133
|
end
|
1048
1134
|
|
1049
|
-
#
|
1050
|
-
if
|
1135
|
+
# Enable debugging if requested
|
1136
|
+
if $wineDebug
|
1137
|
+
envPut('WINEDEBUG',$wineDebug)
|
1138
|
+
# Default to no debugging output if WINEDEBUG is not set yet
|
1139
|
+
elsif ! ENV.has_key?('WINEDEBUG')
|
1051
1140
|
envPut('WINEDEBUG','-all')
|
1052
1141
|
end
|
1053
1142
|
|
@@ -1059,30 +1148,33 @@ end
|
|
1059
1148
|
def getCXwithParams (wine,bottle, missingIsFatal = true, getBottleDir = false, getCXpath = false)
|
1060
1149
|
final = []
|
1061
1150
|
cxdir = nil
|
1151
|
+
pathMode = nil
|
1062
1152
|
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1153
|
+
if File.directory?(wine)
|
1154
|
+
if Dir.glob(wine+'/etc/cxgames*.conf').length > 0
|
1155
|
+
installName = 'cxgames'
|
1156
|
+
mode = 'cxgames'
|
1157
|
+
else
|
1158
|
+
installName = 'cxoffice'
|
1159
|
+
mode = 'crossover'
|
1160
|
+
end
|
1161
|
+
pathMode = wine
|
1162
|
+
wines = [ wine ]
|
1163
|
+
else
|
1164
|
+
installName = wine
|
1165
|
+
if wine == 'crossover'
|
1166
|
+
installName = 'cxoffice'
|
1167
|
+
end
|
1168
|
+
mode = wine
|
1072
1169
|
|
1073
|
-
|
1074
|
-
|
1075
|
-
if wine == 'cxgames' && $cxgPath != nil
|
1076
|
-
pathMode = $cxgPath
|
1077
|
-
wines = [ $cxgPath+'/'+installName, $cxgPath ]
|
1078
|
-
elsif $cxPath != nil
|
1079
|
-
pathMode = $cxPath
|
1080
|
-
wines = [ $cxPath+'/'+installName, $cxPath ]
|
1170
|
+
# Various crossover install paths
|
1171
|
+
wines = ['/opt/'+installName, ENV['HOME']+'/'+installName, ENV['HOME']+'/.local/'+installName, ENV['HOME']+'/games/'+installName]
|
1081
1172
|
end
|
1173
|
+
bottleDir = '.'+installName
|
1082
1174
|
|
1083
1175
|
wines.each do |path|
|
1084
1176
|
if File.exists?(path)
|
1085
|
-
if ( File.executable?(path+'/bin/cximportbottles') || File.executable?(path+'/bin/crossover') ) and
|
1177
|
+
if ( File.executable?(path+'/bin/cximportbottles') || File.executable?(path+'/bin/crossover') ) and installName != 'cxgames'
|
1086
1178
|
# Perform additional detection of dotDir, as that one tends to change
|
1087
1179
|
dotDir = Dir.glob(path+'/etc/cxoffice*.conf').shift
|
1088
1180
|
if( dotDir != nil && dotDir.sub!(/^.*(cxoffice\d*)\.conf$/,'\1') )
|
@@ -1100,7 +1192,7 @@ def getCXwithParams (wine,bottle, missingIsFatal = true, getBottleDir = false, g
|
|
1100
1192
|
|
1101
1193
|
# If we're using $cx*Path, perform some additional detection
|
1102
1194
|
if pathMode != nil and mode != 'crossover'
|
1103
|
-
if File.exists?(pathMode+'/etc/'+
|
1195
|
+
if File.exists?(pathMode+'/etc/'+installName+'.conf')
|
1104
1196
|
cxdir = pathMode
|
1105
1197
|
else
|
1106
1198
|
cxdir = nil
|
@@ -1110,7 +1202,7 @@ def getCXwithParams (wine,bottle, missingIsFatal = true, getBottleDir = false, g
|
|
1110
1202
|
# If the dir does not exist, give up
|
1111
1203
|
if not cxdir
|
1112
1204
|
if !missingIsFatal
|
1113
|
-
vputs(V_DBG,'Failed to detect cxdir')
|
1205
|
+
vputs(V_DBG,'Failed to detect cxdir for '+mode)
|
1114
1206
|
return nil
|
1115
1207
|
end
|
1116
1208
|
if pathMode != nil
|
@@ -1121,20 +1213,10 @@ def getCXwithParams (wine,bottle, missingIsFatal = true, getBottleDir = false, g
|
|
1121
1213
|
else
|
1122
1214
|
reverse = 'cxgames'
|
1123
1215
|
end
|
1124
|
-
if $cxPath != nil && pathMode == $cxPath
|
1125
|
-
if File.exists?($cxPath+'/'+reverse) || File.exists?($cxPath+'/etc/'+reverse+'.conf')
|
1126
|
-
puts('The directory looks like a '+reverse+' directory. Maybe you wanted')
|
1127
|
-
puts('--wine '+reverse+' instead?')
|
1128
|
-
end
|
1129
|
-
end
|
1130
1216
|
else
|
1131
|
-
puts('Failed to locate '+wine)
|
1217
|
+
puts('Failed to locate '+wine+ ' (cx)')
|
1132
1218
|
puts('You could try to explicitly tell wwine where '+wine+' is installed')
|
1133
|
-
|
1134
|
-
puts('by supplying --cxg-installdir')
|
1135
|
-
else
|
1136
|
-
puts('by supplying --cxinstalldir')
|
1137
|
-
end
|
1219
|
+
puts('by supplying the full path to --wine')
|
1138
1220
|
end
|
1139
1221
|
exit(1)
|
1140
1222
|
elsif getCXpath
|
@@ -1145,10 +1227,13 @@ def getCXwithParams (wine,bottle, missingIsFatal = true, getBottleDir = false, g
|
|
1145
1227
|
if(bottle != nil && bottle.length > 0)
|
1146
1228
|
final.push('--bottle',bottle)
|
1147
1229
|
end
|
1230
|
+
if $wineDebug
|
1231
|
+
final.push('--debugmsg',$wineDebug)
|
1232
|
+
end
|
1148
1233
|
final.push('--');
|
1149
1234
|
|
1150
1235
|
# Create the bottle if it does not exist
|
1151
|
-
if bottle != nil
|
1236
|
+
if bottle != nil && !File.exists?(ENV['HOME']+'/'+bottleDir+'/'+bottle)
|
1152
1237
|
vputs(V_DBG,ENV['HOME']+'/'+bottleDir+'/'+bottle+' did not exist')
|
1153
1238
|
puts 'The bottle '+bottle+' did not exist, creating...'
|
1154
1239
|
runcmd([ cxdir+'/bin/cxbottle', '--bottle',bottle,'--create','--template','winxp'],'system')
|
@@ -1186,6 +1271,10 @@ def getGameTreeWithParams (wine,bottle, missingIsFatal = true)
|
|
1186
1271
|
|
1187
1272
|
final.push(gametreeBin,'--install')
|
1188
1273
|
|
1274
|
+
if $wineDebug
|
1275
|
+
finalpush('--debugmsg',$wineDebug)
|
1276
|
+
end
|
1277
|
+
|
1189
1278
|
# Use wwineFolder as the folder if no bottle was supplied
|
1190
1279
|
if (bottle == nil || bottle.length == 0)
|
1191
1280
|
bottle = 'wwineFolder'
|
@@ -1196,9 +1285,16 @@ def getGameTreeWithParams (wine,bottle, missingIsFatal = true)
|
|
1196
1285
|
return final
|
1197
1286
|
end
|
1198
1287
|
|
1199
|
-
# Purpose: Get parameters for PlayOnLinux
|
1200
|
-
def
|
1201
|
-
winePaths = [
|
1288
|
+
# Purpose: Get parameters for PlayOnLinux or Lutris
|
1289
|
+
def getCustomwithParams(wine,bottle, type = 'POL', missingIsFatal = true, returnDetected = false)
|
1290
|
+
winePaths = []
|
1291
|
+
polMode = true
|
1292
|
+
if type =~ /^pol/i
|
1293
|
+
winePaths = [ ENV['HOME']+'/.PlayOnLinux/wine/linux-x86', ENV['HOME']+'/.PlayOnLinux/wine/linux-amd64' ]
|
1294
|
+
else
|
1295
|
+
polMode = false
|
1296
|
+
winePaths = [ ENV['HOME']+'/.local/share/lutris/runners/wine/' ]
|
1297
|
+
end
|
1202
1298
|
detectedWine = nil
|
1203
1299
|
detectedWineDir = nil
|
1204
1300
|
winePaths.each do |path|
|
@@ -1227,7 +1323,7 @@ def getPOLwithParams(wine,bottle, missingIsFatal = true, returnDetected = false)
|
|
1227
1323
|
envPut('WINELOADER',detectedWine)
|
1228
1324
|
envPut('WINEDLLPATH',detectedWineDir+'/lib/wine:'+ENV['WINEDLLPATH'].to_s)
|
1229
1325
|
envPut('LD_LIBRARY_PATH',detectedWineDir+'/lib:'+ENV['LD_LIBRARY_PATH'].to_s)
|
1230
|
-
getWineWithParams(detectedWine,bottle,missingIsFatal,
|
1326
|
+
return getWineWithParams(detectedWine,bottle,missingIsFatal,polMode)
|
1231
1327
|
end
|
1232
1328
|
|
1233
1329
|
# Purpose: Detect which wine to use and get parameters for that one
|
@@ -1273,7 +1369,15 @@ def runWine (wine,bottle,args)
|
|
1273
1369
|
wine = resolveWine(wine)
|
1274
1370
|
type = wine
|
1275
1371
|
|
1276
|
-
if wine
|
1372
|
+
if File.directory?(wine)
|
1373
|
+
if File.executable?(wine+'/bin/cxstart')
|
1374
|
+
vputs(V_DBG,wine+': looks like a cx directory, assuming type=cx')
|
1375
|
+
type = 'crossover'
|
1376
|
+
end
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
if type == 'crossover' || wine == 'cxgames' || wine == 'cxoffice' || wine == 'crossover'
|
1380
|
+
type = 'crossover'
|
1277
1381
|
missingIsFatal = true
|
1278
1382
|
if wine == 'cxgames'
|
1279
1383
|
missingIsFatal = false
|
@@ -1285,17 +1389,22 @@ def runWine (wine,bottle,args)
|
|
1285
1389
|
puts('Converting --wine cxgames to --wine crossover since cxgames is not installed')
|
1286
1390
|
end
|
1287
1391
|
end
|
1288
|
-
elsif wine
|
1392
|
+
elsif wine =~ /^wine(64|32|-unstable(32|64)?)?$/ || ( File.executable?(wine) && !File.directory?(wine) )
|
1289
1393
|
type = 'wine'
|
1290
1394
|
cmd = getWineWithParams(wine,bottle)
|
1291
1395
|
elsif resolveWine(wine) == 'gametree'
|
1292
1396
|
cmd = getGameTreeWithParams(wine,bottle)
|
1293
|
-
elsif wine =~ /^pol[-:]?/i
|
1294
|
-
realWine = wine.sub(/^pol[-:]?/i,'')
|
1295
|
-
cmd =
|
1397
|
+
elsif wine =~ /^(pol|lutris)[-:]?/i
|
1398
|
+
realWine = wine.sub(/^(pol|lutris)[-:]?/i,'')
|
1399
|
+
cmd = getCustomwithParams(realWine,bottle,wine)
|
1296
1400
|
else
|
1297
1401
|
puts('Unknown --wine: '+wine)
|
1402
|
+
if File.directory?(wine)
|
1403
|
+
puts(wine+' does not appear to be the path to a crossover installation directory')
|
1404
|
+
puts('')
|
1405
|
+
end
|
1298
1406
|
puts('Must be one of: wine, crossover, cxgames, cedega, or the path to a wine executable')
|
1407
|
+
puts('or a crossover installation directory')
|
1299
1408
|
exit(1)
|
1300
1409
|
end
|
1301
1410
|
end
|
@@ -1340,6 +1449,16 @@ def runWine (wine,bottle,args)
|
|
1340
1449
|
if bottle
|
1341
1450
|
envPut('__WWINE_INT_XBOTTLE',bottle);
|
1342
1451
|
end
|
1452
|
+
if $wineArch
|
1453
|
+
envPut('WINEARCH',$wineArch)
|
1454
|
+
end
|
1455
|
+
if $preloadGameMode
|
1456
|
+
preload = '/usr/$LIB/libgamemodeauto.so'
|
1457
|
+
if ENV['LD_PRELOAD']
|
1458
|
+
preload = preload+':'+ENV['LD_PRELOAD']
|
1459
|
+
end
|
1460
|
+
envPut('LD_PRELOAD',preload)
|
1461
|
+
end
|
1343
1462
|
runcmd(cmd)
|
1344
1463
|
end
|
1345
1464
|
end
|
@@ -1355,17 +1474,21 @@ if ENV['__WWINE_INT_ENVMODE'] == $version
|
|
1355
1474
|
if ENV['__WWINE_INT_VERBOSITY'] && ENV['__WWINE_INT_VERBOSITY'].to_i > 0
|
1356
1475
|
$verbosity = ENV['__WWINE_INT_VERBOSITY'].to_i
|
1357
1476
|
end
|
1358
|
-
if ENV['__WWINE_INT_CXPATH']
|
1359
|
-
opts['--cxinstalldir'] = ENV['__WWINE_INT_CXPATH']
|
1360
|
-
end
|
1361
1477
|
opts['--bottle'] = ENV['__WWINE_INT_BOTTLE']
|
1478
|
+
if ENV['__WWINE_INT_WINEARCH']
|
1479
|
+
opts['--arch'] = ENV['__WWINE_INT_WINEARCH']
|
1480
|
+
end
|
1362
1481
|
else
|
1363
1482
|
opts = GetoptLong.new(
|
1364
1483
|
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
1365
1484
|
[ '--wine', '-w', GetoptLong::REQUIRED_ARGUMENT ],
|
1366
1485
|
[ '--bottle', '-b', GetoptLong::REQUIRED_ARGUMENT ],
|
1486
|
+
[ '--arch', GetoptLong::REQUIRED_ARGUMENT ],
|
1367
1487
|
[ '--kill', '-k', GetoptLong::OPTIONAL_ARGUMENT ],
|
1368
|
-
[ '--
|
1488
|
+
[ '--gamemode','-g', GetoptLong::NO_ARGUMENT ],
|
1489
|
+
[ '--no-gamemode', GetoptLong::NO_ARGUMENT ],
|
1490
|
+
[ '--running','--drykill', GetoptLong::NO_ARGUMENT ],
|
1491
|
+
[ '--debug',GetoptLong::REQUIRED_ARGUMENT ],
|
1369
1492
|
[ '--cxinstalldir','-c',GetoptLong::REQUIRED_ARGUMENT ],
|
1370
1493
|
[ '--cxg-installdir','--cxgamesinstalldir','-C',GetoptLong::REQUIRED_ARGUMENT ],
|
1371
1494
|
[ '--version',GetoptLong::NO_ARGUMENT ],
|
@@ -1397,21 +1520,41 @@ end
|
|
1397
1520
|
|
1398
1521
|
# Handle command-line arguments
|
1399
1522
|
begin
|
1523
|
+
overrideCX = nil
|
1524
|
+
overrideCXG = nil
|
1400
1525
|
opts.each do |opt, arg|
|
1401
1526
|
case opt
|
1402
1527
|
when '--help'
|
1403
1528
|
Help()
|
1404
1529
|
exit(0)
|
1530
|
+
when '--gamemode'
|
1531
|
+
$preloadGameMode = true
|
1532
|
+
when '--no-gamemode'
|
1533
|
+
$preloadGameMode = false
|
1405
1534
|
when '--wine'
|
1406
1535
|
$wine = arg
|
1407
1536
|
when '--bottle'
|
1408
1537
|
$bottle = arg
|
1409
1538
|
when '--verbose'
|
1410
1539
|
$verbosity = $verbosity+1
|
1411
|
-
when '--
|
1540
|
+
when '--running'
|
1412
1541
|
$killMode = 9999
|
1413
1542
|
when '--debuginfo'
|
1414
1543
|
debugInfo()
|
1544
|
+
when '--debug'
|
1545
|
+
$wineDebug = arg
|
1546
|
+
when '--arch'
|
1547
|
+
if arg == '32' || arg == '32bit' || arg == 'i386'
|
1548
|
+
arg = 'win32'
|
1549
|
+
elsif arg == '64' || arg == '64bit' || arg == 'x86_64'
|
1550
|
+
arg = 'win64'
|
1551
|
+
end
|
1552
|
+
if arg == 'win32' || arg == 'win64'
|
1553
|
+
$wineArch = arg
|
1554
|
+
else
|
1555
|
+
puts('Invalid --arch parameter"'+arg+'". Must be one of: win32, win64')
|
1556
|
+
puts('(accepted aliases: 32, 32bit, i386, 64, 64bit, x86_64)')
|
1557
|
+
end
|
1415
1558
|
when '--list-wines'
|
1416
1559
|
listWines()
|
1417
1560
|
exit(0)
|
@@ -1421,15 +1564,21 @@ begin
|
|
1421
1564
|
end
|
1422
1565
|
$killMode = arg
|
1423
1566
|
when '--cxinstalldir'
|
1424
|
-
|
1425
|
-
|
1426
|
-
|
1567
|
+
if ENV['_WWINE_SCRIPT'] == nil
|
1568
|
+
puts('--cx-installdir is deprecated. Use "--wine '+arg+'" instead')
|
1569
|
+
end
|
1570
|
+
overrideCX = arg
|
1571
|
+
if ! File.exists?(arg)
|
1572
|
+
puts('The supplied --cxinstalldir "'+arg+'" does not exist')
|
1427
1573
|
exit(1)
|
1428
1574
|
end
|
1429
1575
|
when '--cxg-installdir'
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1576
|
+
if ENV['_WWINE_SCRIPT'] == nil
|
1577
|
+
puts('--cxg-installdir is deprecated. Use "--wine '+arg+'" instead')
|
1578
|
+
end
|
1579
|
+
overrideCXG = arg
|
1580
|
+
if ! File.exists?(arg)
|
1581
|
+
puts('The supplied --cxg-installdir "'+arg+'" does not exist')
|
1433
1582
|
exit(1)
|
1434
1583
|
end
|
1435
1584
|
when '--version'
|
@@ -1456,6 +1605,21 @@ begin
|
|
1456
1605
|
puts('--verbose assumed because the environment variable WWINE_VERBOSE is set to 1')
|
1457
1606
|
$verbosity = 1
|
1458
1607
|
end
|
1608
|
+
|
1609
|
+
if $wine != nil
|
1610
|
+
resolvedWine = resolveWine($wine)
|
1611
|
+
if resolvedWine == 'crossover' && overrideCX != nil
|
1612
|
+
$wine = overrideCX
|
1613
|
+
elsif resolvedWine == 'cxgames' && overrideCXG != nil
|
1614
|
+
$wine = overrideCXG
|
1615
|
+
end
|
1616
|
+
end
|
1617
|
+
|
1618
|
+
# Default WINEARCH to win32 if we're not being launched by a script and not
|
1619
|
+
# being run with --from
|
1620
|
+
if $wineArch == nil && $wwineDataFrom == nil && ENV['__WWINE_SCRIPT'] == nil && $wine !~ /64$/
|
1621
|
+
$wineArch = 'win32'
|
1622
|
+
end
|
1459
1623
|
rescue => ex
|
1460
1624
|
if opts.error?
|
1461
1625
|
puts('See --help for more inforation')
|
@@ -1472,8 +1636,8 @@ end
|
|
1472
1636
|
if $killMode != nil
|
1473
1637
|
begin
|
1474
1638
|
killWine($killMode)
|
1475
|
-
rescue
|
1476
|
-
|
1639
|
+
rescue => ex
|
1640
|
+
handleException(ex)
|
1477
1641
|
end
|
1478
1642
|
exit(0)
|
1479
1643
|
end
|
data/wwine.1
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
.IX Title "WWINE 1"
|
2
|
-
.TH WWINE 1 "
|
2
|
+
.TH WWINE 1 "2018-04-21" "wwine 0.4" ""
|
3
3
|
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
4
4
|
.\" way too many mistakes in technical documents.
|
5
5
|
.if n .ad l
|
@@ -8,11 +8,11 @@
|
|
8
8
|
wwine \- a simple wine(1) wrapper
|
9
9
|
.SH "SYNOPSIS"
|
10
10
|
.IX Header "SYNOPSIS"
|
11
|
-
wwine \fI(\s-1WWINE
|
11
|
+
wwine \fI(\s-1WWINE PARAMETERS\s0)\fR \fI\s-1PROGRAM\s0\fR \*(-- \fI[\s-1PROGRAM ARGUMENTS\s0]\fR
|
12
12
|
.SH "DESCRIPTION"
|
13
13
|
.IX Header "DESCRIPTION"
|
14
14
|
\&\fBwwine\fR is a a \fIwine\fR\|(1) wrapper. It wraps various flavours of wine
|
15
|
-
(including vanilla wine and crossover
|
15
|
+
(including vanilla wine and crossover) into a single
|
16
16
|
unified interface, complete with full bottle support for all
|
17
17
|
of them (including vanilla wine).
|
18
18
|
.PP
|
@@ -35,28 +35,64 @@ Display the help screen
|
|
35
35
|
.IX Item "-w, --wine FLAVOUR"
|
36
36
|
Use the supplied flavour of wine. The default is to use vanilla wine.
|
37
37
|
|
38
|
-
Possible parameters: wine,
|
39
|
-
|
38
|
+
Possible parameters: wine, wine64, wine-unstable, wine\-unstable64, crossover,
|
39
|
+
cxgames, cxoffice, cedega, cx (alias for crossover), cxg (alias for cxgames),
|
40
|
+
cxo (alias for cxoffice), /path/to/a/wine.binary or
|
41
|
+
/path/to/a/crossover\-installation. Note that if you have crossover, but not
|
42
|
+
cxgames installed, wwine will alias cxgames to crossover, to provide a simple
|
43
|
+
upgrade path where wrapper scripts 'just work'.
|
40
44
|
|
41
|
-
If this parameter is not supplied, wwine will attempt to autodetect which
|
42
|
-
|
43
|
-
|
45
|
+
If this parameter is not supplied, wwine will attempt to autodetect which wine
|
46
|
+
to use, checking for the existance of flavours in the following order, using
|
47
|
+
the first one found: wine, crossover, cxoffice, cxgames, cedega. To see the
|
44
48
|
default flavour wwine will use, run \fIwwine \-\-debuginfo\fR.
|
45
49
|
|
46
|
-
|
50
|
+
If you supply a path to a crossover installation (or a cxgames installation),
|
51
|
+
wwine will act as if \-\-wine is \*(L"crossover\*(R" (or cxgames), but use the Crossover
|
52
|
+
installation at that path instead of its autodetected one. If you supply the
|
53
|
+
path to a wine binary then it will use that as the \*(L"wine\*(R" command instead of
|
54
|
+
the one in your \s-1PATH.\s0
|
47
55
|
.IP "\fB\-b, \-\-bottle\fR \fI\s-1NAME\s0\fR" 4
|
48
56
|
.IX Item "-b, --bottle NAME"
|
49
|
-
Use the bottle with the name supplied. For cxgames, cxoffice or
|
50
|
-
it uses the flavours builtin bottle support. For vanilla wine it sets
|
51
|
-
\&\s-1WINEPREFIX\s0 to use ~/.wwinebottles/<\s-1NAME\s0>. It defaults to no bottle,
|
52
|
-
|
53
|
-
|
54
|
-
|
57
|
+
Use the bottle with the name supplied. For crossover, cxgames, cxoffice or
|
58
|
+
cedega it uses the flavours builtin bottle support. For vanilla wine it sets
|
59
|
+
\&\s-1WINEPREFIX\s0 to use ~/.wwinebottles/<\s-1NAME\s0>. It defaults to no bottle, in which
|
60
|
+
case vanilla wine will use ~/.wine, crossover/cxoffice/cxgames will use the
|
61
|
+
bottle defined as default and for cedega a bottle named 'wwineFolder' will be
|
62
|
+
used.
|
63
|
+
|
64
|
+
PlayOnLinux wines are a special case. If a bottle with the name supplied exists
|
65
|
+
in ~/.PlayOnLinux/wineprefixes/ then wwine will use that bottle (ie. the existing
|
66
|
+
PlayOnLinux bottle), otherwise it will use a bottle in ~/.wwinebottles.
|
67
|
+
.IP "\fB\-\-arch\fR \fI\s-1ARCH\s0\fR" 4
|
68
|
+
.IX Item "--arch ARCH"
|
69
|
+
Set the wine architecture to use. Accepts win32 and win64. If \fI\-\-wine\fR ends
|
70
|
+
with 64, then it defaults to win64, otherwise it defaults to win32. Usually you
|
71
|
+
won't need to explicitly provied an \fI\-\-arch\fR since wwine will infer it from
|
72
|
+
\&\fI\-\-wine\fR.
|
73
|
+
.IP "\fB\-g, \-\-gamemode\fR" 4
|
74
|
+
.IX Item "-g, --gamemode"
|
75
|
+
Enables Feral Interactive's GameMode library, if it is installed. GameMode will
|
76
|
+
enable certain performance features while the program is running, and then
|
77
|
+
reset them once it exits. Can be used to get a bit of extra performance for
|
78
|
+
games
|
79
|
+
.IP "\fB\-\-no\-gamemode\fR" 4
|
80
|
+
.IX Item "--no-gamemode"
|
81
|
+
Disable GameMode if enabled.
|
82
|
+
.IP "\fB\-l, \-\-list\fR" 4
|
83
|
+
.IX Item "-l, --list"
|
84
|
+
List all available wine versions. This will list the names that can be supplied
|
85
|
+
to \fI\-\-wine\fR as well as the actual wine version in question.
|
55
86
|
.IP "\fB\-k, \-\-kill\fR" 4
|
56
87
|
.IX Item "-k, --kill"
|
57
|
-
Attempt to kill
|
88
|
+
Attempt to kill running wine processes. See also \fI\-\-drykill\fR.
|
89
|
+
|
90
|
+
By default it will kill all running wine processes. If you are on Linux then
|
91
|
+
you can combine this option with the \fI\-\-bottle\fR and/or \fI\-\-wine\fR (or even
|
92
|
+
\&\fI\-\-from\fR) options to limit it to killing only processes in a specific bottle
|
93
|
+
and/or running under a specific wine.
|
58
94
|
|
59
|
-
The default signal is \s-1SIGTERM
|
95
|
+
The default signal is \s-1SIGTERM,\s0 however you can supply any signal number
|
60
96
|
you want (ie. \*(L"wwine \-k9\*(R").
|
61
97
|
.IP "\fB\-\-drykill\fR" 4
|
62
98
|
.IX Item "--drykill"
|
@@ -67,7 +103,7 @@ Print what \fI\-\-kill\fR would have done, without actually doing anything.
|
|
67
103
|
variables, and (optionally) run a native program with those variables
|
68
104
|
set. This lets you run any program that uses the \s-1WINE\s0 and \s-1WINEPREFIX\s0
|
69
105
|
variables with wwine instead of wine (effectively giving you bottle
|
70
|
-
support, as well as support for using cxgames/cxoffice/.. instead
|
106
|
+
support, as well as support for using crossover/cxgames/cxoffice/.. instead
|
71
107
|
of wine).
|
72
108
|
|
73
109
|
When you use \-\-env, wwine will obey \-\-bottle and \-\-wine (or \-\-from) and set
|
@@ -77,14 +113,23 @@ have been set.
|
|
77
113
|
|
78
114
|
See the \s-1EXAMPLES\s0 section for an example of how to use winetricks
|
79
115
|
with cxgames using wwine's \fB\-\-env\fR
|
80
|
-
.IP "\fB\-\-
|
81
|
-
.IX Item "--
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
116
|
+
.IP "\fB\-\-tricks\fR" 4
|
117
|
+
.IX Item "--tricks"
|
118
|
+
Run winetricks with the wine/bottle combination supplied. This is \fIalmost\fR
|
119
|
+
equivalent to \fI\-\-env winetricks \*(-- \-\-no\-isolate\fR (the \fI\-\-\fR would be required
|
120
|
+
if you used \-\-env, and would stop processing the rest of the \fIwwine\fR command-line,
|
121
|
+
\&\-\-tricks does not add the \-\-, so it can be supplied anywhere on the command-line)
|
122
|
+
\&\fI\-\-tricks\fR can be used to quickly call winetricks in a bottle. Examples:
|
123
|
+
.RS 4
|
124
|
+
.IP "Install package (ie. corefonts)" 4
|
125
|
+
.IX Item "Install package (ie. corefonts)"
|
126
|
+
\&\fI\-\-tricks corefonts\fR
|
127
|
+
.IP "Get winetricks help" 4
|
128
|
+
.IX Item "Get winetricks help"
|
129
|
+
\&\fI\-\-tricks \*(-- \-\-help\fR
|
130
|
+
.RE
|
131
|
+
.RS 4
|
132
|
+
.RE
|
88
133
|
.IP "\fB\-\-wrap\fR \fI\s-1PATH\s0\fR" 4
|
89
134
|
.IX Item "--wrap PATH"
|
90
135
|
Generate a wrapper script of the current command-line and write it to
|
@@ -123,7 +168,8 @@ applied.
|
|
123
168
|
.IP "\fB\-v, \-\-verbose\fR" 4
|
124
169
|
.IX Item "-v, --verbose"
|
125
170
|
Increase verbosity. When this is present wwine will tell you the exact
|
126
|
-
commands it is running.
|
171
|
+
commands it is running. Supply multiple times to increase verbosity (ie.
|
172
|
+
to enable wwine debugging output).
|
127
173
|
.IP "\fB\-\-man\fR" 4
|
128
174
|
.IX Item "--man"
|
129
175
|
Show the manpage. Normally 'man wwine' would do, but when wwine is
|
@@ -145,14 +191,14 @@ Runs file.exe in wine, using the 'file' bottle.
|
|
145
191
|
.IP "\fIwwine \-w cxg \-b file file.exe\fR" 4
|
146
192
|
.IX Item "wwine -w cxg -b file file.exe"
|
147
193
|
Runs file.exe in crossover games using the cxgames 'file' bottle
|
148
|
-
.IP "\fIwwine \-\-
|
149
|
-
.IX Item "wwine --
|
194
|
+
.IP "\fIwwine \-\-wine ~/cxgames7.0/ \-b file file.exe\fR" 4
|
195
|
+
.IX Item "wwine --wine ~/cxgames7.0/ -b file file.exe"
|
150
196
|
Runs file.exe in the version of crossover games that is installed at
|
151
197
|
\&\fI~/cxgames7.0\fR, using the cxgames 'file' bottle.
|
152
198
|
|
153
|
-
|
154
|
-
other than your primary one. Ie. if
|
155
|
-
later version.
|
199
|
+
Providing a path to a Crossover installation to \-\-wine can be useful to run
|
200
|
+
something in a version of cxgames/cxoffice other than your primary one. Ie. if
|
201
|
+
a regression causes it to not run in a later version.
|
156
202
|
.IP "\fIwwine \-w cxg \-b file file.exe \-\-wrap ~/bin/startFile\fR" 4
|
157
203
|
.IX Item "wwine -w cxg -b file file.exe --wrap ~/bin/startFile"
|
158
204
|
This causes wwine to create a wrapper shell script at ~/bin/startFile.
|
@@ -171,12 +217,15 @@ using the parameters specified in ~/bin/startFile, with the exception of
|
|
171
217
|
\&\-\-wine, which would be wine instead of cxgames (here assuming this
|
172
218
|
is the file created by the above example).
|
173
219
|
.IP "\fIwwine \-w cxg \-b file \-\-env \*(-- winetricks \-\-no\-isolate vcrun6\fR" 4
|
174
|
-
.IX Item "wwine -w cxg -b file --env
|
175
|
-
This causes wwine to set the environment variables \s-1WINE\s0 and \s-1WINEPREFIX
|
220
|
+
.IX Item "wwine -w cxg -b file --env winetricks --no-isolate vcrun6"
|
221
|
+
This causes wwine to set the environment variables \s-1WINE\s0 and \s-1WINEPREFIX,\s0
|
176
222
|
and then execute the command supplied. In this case it would run
|
177
223
|
winetricks, which would be told to install \*(L"vcrun6\*(R". Because it is running
|
178
224
|
under wwine's \-\-env parameter, winetricks will use wwine to perform
|
179
225
|
the actions, thus allowing you to use winetricks with cxgames.
|
226
|
+
.IP "\fIwwine \-w cxg \-b file \-\-tricks vcrun6\fR" 4
|
227
|
+
.IX Item "wwine -w cxg -b file --tricks vcrun6"
|
228
|
+
This is the same as the above, but using wwine's builtin support for winetricks.
|
180
229
|
.IP "\fIwwine \-k\fR" 4
|
181
230
|
.IX Item "wwine -k"
|
182
231
|
Will make wwine attempt to kill all running wine processes on this system by
|
@@ -185,9 +234,28 @@ sending them the \s-1TERM\s0 signal.
|
|
185
234
|
.IX Item "wwine -k9"
|
186
235
|
Will make wwine attempt to kill all running wine processes on this system by
|
187
236
|
sending them the \s-1KILL\s0 signal. Should only be used if \*(L"wwine \-k\*(R" fails.
|
237
|
+
.IP "\fIwwine \-\-bottle test \-\-wine cx \-\-kill\fR" 4
|
238
|
+
.IX Item "wwine --bottle test --wine cx --kill"
|
239
|
+
Kill any crossover processes running in the bottle \*(L"test\*(R".
|
240
|
+
.SH "SUPPORTED WINE FLAVOURS"
|
241
|
+
.IX Header "SUPPORTED WINE FLAVOURS"
|
242
|
+
The following flavours of wine are supported:
|
243
|
+
.IP "\fBWine\fR" 4
|
244
|
+
.IX Item "Wine"
|
245
|
+
Regular wine. <http://www.winehq.org/>
|
246
|
+
.IP "\fBCrossover\fR and \fBCrossover Office/Games\fR" 4
|
247
|
+
.IX Item "Crossover and Crossover Office/Games"
|
248
|
+
The commercial Crossover release from Codeweavers, as well as the legacy
|
249
|
+
versions \*(L"Crossover Office\*(R" and \*(L"Crossover Games\*(R". <http://www.codeweavers.com/>
|
250
|
+
.IP "\fBPlayOnLinux\fR" 4
|
251
|
+
.IX Item "PlayOnLinux"
|
252
|
+
Wine packages installed via PlayOnLinux. <http://www.playonlinux.com/>
|
253
|
+
.IP "\fBGameTree Linux/Cedega\fR" 4
|
254
|
+
.IX Item "GameTree Linux/Cedega"
|
255
|
+
The unmaintained Cedega flavour of wine.
|
188
256
|
.SH "DEPENDENCIES"
|
189
257
|
.IX Header "DEPENDENCIES"
|
190
|
-
Requires at least one of wine, cxoffice, cxgames or cedega.
|
258
|
+
Requires at least one of wine, crossover, cxoffice, cxgames or cedega.
|
191
259
|
.SH "ENVIRONMENT VARIABLES"
|
192
260
|
.IX Header "ENVIRONMENT VARIABLES"
|
193
261
|
.IP "\fB\s-1WWINE_VERBOSE\s0\fR" 4
|
@@ -202,7 +270,7 @@ If this is not set, wwine will set it to \-all when using \-w wine.
|
|
202
270
|
.IX Item "WINEPREFIX"
|
203
271
|
wwine uses the \s-1WINEPREFIX\s0 environment variable to add bottle support when
|
204
272
|
in \-w wine mode. If \s-1WINEPREFIX\s0 is set and a \-\-bottle is supplied, wwine will override
|
205
|
-
the existing \s-1WINEPREFIX
|
273
|
+
the existing \s-1WINEPREFIX.\s0 If no bottle is supplied, wwine will respect \s-1WINEPREFIX.\s0
|
206
274
|
.PP
|
207
275
|
Any environment variables that wwine sets while it is running will be output
|
208
276
|
by wwine when in \-\-verbose mode.
|
@@ -221,4 +289,4 @@ submit feature requests there as well.
|
|
221
289
|
Copyright (C) Eskild Hustvedt 2009, 2010, 2011
|
222
290
|
.PP
|
223
291
|
This is free software; see the source for copying conditions. There is \s-1NO\s0
|
224
|
-
warranty; not even for \s-1MERCHANTABILITY\s0 or \s-1FITNESS
|
292
|
+
warranty; not even for \s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE.\s0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wwine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eskild Hustvedt
|
8
8
|
autorequire:
|
9
|
-
bindir: .
|
9
|
+
bindir: "."
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: wwine is a a wine(1) wrapper. It wraps various flavours of wine (including
|
14
14
|
vanilla wine and crossover) into a single unified interface, complete with full
|
@@ -19,11 +19,11 @@ executables:
|
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
|
-
- wwine
|
23
|
-
- README
|
22
|
+
- "./wwine"
|
24
23
|
- COPYING
|
24
|
+
- README
|
25
|
+
- wwine
|
25
26
|
- wwine.1
|
26
|
-
- ./wwine
|
27
27
|
homepage: http://random.zerodogg.org/wwine
|
28
28
|
licenses:
|
29
29
|
- GPLv3
|
@@ -34,17 +34,17 @@ require_paths:
|
|
34
34
|
- lib
|
35
35
|
required_ruby_version: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- -
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '0'
|
40
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- -
|
42
|
+
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '0'
|
45
45
|
requirements: []
|
46
46
|
rubyforge_project:
|
47
|
-
rubygems_version: 2.
|
47
|
+
rubygems_version: 2.7.6
|
48
48
|
signing_key:
|
49
49
|
specification_version: 4
|
50
50
|
summary: wwine is a simple wine wrapper.
|