wwine 0.3 → 0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|