mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-01-14 23:58:17 +03:00
vrclient: Translate filepath for SetActionManifestPath
This commit is contained in:
parent
9b645bae1f
commit
1ff16641fd
@ -91,6 +91,17 @@ files = [
|
|||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
path_conversions = [
|
||||||
|
{
|
||||||
|
"parent_name": "SetActionManifestPath",
|
||||||
|
"l2w_names":[],
|
||||||
|
"l2w_lens":[],
|
||||||
|
"w2l_names": ["pchActionManifestPath"],
|
||||||
|
"w2l_arrays": [False],
|
||||||
|
"return_is_size": False
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
aliases = {
|
aliases = {
|
||||||
#Some interface versions are not present in the public SDK
|
#Some interface versions are not present in the public SDK
|
||||||
#headers, but are actually requested by games. It would be nice
|
#headers, but are actually requested by games. It would be nice
|
||||||
@ -211,6 +222,21 @@ def display_sdkver(s):
|
|||||||
def strip_ns(name):
|
def strip_ns(name):
|
||||||
return name.replace("vr::","")
|
return name.replace("vr::","")
|
||||||
|
|
||||||
|
def get_path_converter(parent):
|
||||||
|
for conv in path_conversions:
|
||||||
|
if conv["parent_name"] in parent.spelling:
|
||||||
|
if None in conv["l2w_names"]:
|
||||||
|
return conv
|
||||||
|
if type(parent) == clang.cindex.Type:
|
||||||
|
children = list(parent.get_fields())
|
||||||
|
else:
|
||||||
|
children = list(parent.get_children())
|
||||||
|
for child in children:
|
||||||
|
if child.spelling in conv["w2l_names"] or \
|
||||||
|
child.spelling in conv["l2w_names"]:
|
||||||
|
return conv
|
||||||
|
return None
|
||||||
|
|
||||||
def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, existing_methods, iface_version):
|
def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, existing_methods, iface_version):
|
||||||
used_name = method.spelling
|
used_name = method.spelling
|
||||||
if used_name in existing_methods:
|
if used_name in existing_methods:
|
||||||
@ -283,13 +309,23 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e
|
|||||||
cpp.write(")\n{\n")
|
cpp.write(")\n{\n")
|
||||||
cpp_h.write(");\n")
|
cpp_h.write(");\n")
|
||||||
|
|
||||||
char_param_is_unix_path = "GetAppInstallDir" in used_name or \
|
path_conv = get_path_converter(method)
|
||||||
"GetItemInstallInfo" in used_name
|
|
||||||
path_param_name = None
|
|
||||||
path_size_param_name = None
|
|
||||||
|
|
||||||
if char_param_is_unix_path:
|
if path_conv:
|
||||||
cfile.write(" uint32 path_result;\n")
|
for i in range(len(path_conv["w2l_names"])):
|
||||||
|
if path_conv["w2l_arrays"][i]:
|
||||||
|
cfile.write(" const char **lin_%s = steamclient_dos_to_unix_stringlist(%s);\n" % (path_conv["w2l_names"][i], path_conv["w2l_names"][i]))
|
||||||
|
# TODO
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
cfile.write(" char lin_%s[PATH_MAX];\n" % path_conv["w2l_names"][i])
|
||||||
|
cfile.write(" steamclient_dos_path_to_unix_path(%s, lin_%s);\n" % (path_conv["w2l_names"][i], path_conv["w2l_names"][i]))
|
||||||
|
if None in path_conv["l2w_names"]:
|
||||||
|
cfile.write(" const char *path_result;\n")
|
||||||
|
elif path_conv["return_is_size"]:
|
||||||
|
cfile.write(" uint32 path_result;\n")
|
||||||
|
elif len(path_conv["l2w_names"]) > 0:
|
||||||
|
cfile.write(" %s path_result;\n" % method.result_type.spelling)
|
||||||
|
|
||||||
if do_lin_to_win:
|
if do_lin_to_win:
|
||||||
cpp.write(" %s lin;\n" % do_lin_to_win[0])
|
cpp.write(" %s lin;\n" % do_lin_to_win[0])
|
||||||
@ -304,7 +340,7 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e
|
|||||||
if method.result_type.kind == clang.cindex.TypeKind.VOID:
|
if method.result_type.kind == clang.cindex.TypeKind.VOID:
|
||||||
cfile.write(" ")
|
cfile.write(" ")
|
||||||
cpp.write(" ")
|
cpp.write(" ")
|
||||||
elif char_param_is_unix_path:
|
elif path_conv and (len(path_conv["l2w_names"]) > 0 or path_conv["return_is_size"]):
|
||||||
cfile.write(" path_result = ")
|
cfile.write(" path_result = ")
|
||||||
cpp.write(" return ")
|
cpp.write(" return ")
|
||||||
elif returns_record:
|
elif returns_record:
|
||||||
@ -344,37 +380,37 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e
|
|||||||
cpp.write(", ")
|
cpp.write(", ")
|
||||||
else:
|
else:
|
||||||
first = False
|
first = False
|
||||||
if char_param_is_unix_path:
|
|
||||||
if param.type.spelling == "char *":
|
|
||||||
path_param_name = param.spelling
|
|
||||||
elif not path_param_name is None and \
|
|
||||||
(param.type.spelling == "uint32" or
|
|
||||||
param.type.spelling == "int"):
|
|
||||||
path_size_param_name = param.spelling
|
|
||||||
if param.spelling == "":
|
if param.spelling == "":
|
||||||
cfile.write(", _%s" % unnamed)
|
cfile.write(", _%s" % unnamed)
|
||||||
cpp.write("(%s)_%s" % (param.type.spelling, unnamed))
|
cpp.write("(%s)_%s" % (param.type.spelling, unnamed))
|
||||||
unnamed = chr(ord(unnamed) + 1)
|
unnamed = chr(ord(unnamed) + 1)
|
||||||
else:
|
else:
|
||||||
cfile.write(", %s" % param.spelling)
|
|
||||||
if do_lin_to_win and do_lin_to_win[1] == param.spelling or \
|
if do_lin_to_win and do_lin_to_win[1] == param.spelling or \
|
||||||
do_wrap and do_wrap[1] == param.spelling:
|
do_wrap and do_wrap[1] == param.spelling:
|
||||||
|
cfile.write(", %s" % param.spelling)
|
||||||
cpp.write("&lin")
|
cpp.write("&lin")
|
||||||
if do_lin_to_win and \
|
if do_lin_to_win and \
|
||||||
(do_lin_to_win[0] == "VREvent_t" or \
|
(do_lin_to_win[0] == "VREvent_t" or \
|
||||||
do_lin_to_win[0] == "VRControllerState001_t"):
|
do_lin_to_win[0] == "VRControllerState001_t"):
|
||||||
next_is_size = True
|
next_is_size = True
|
||||||
elif do_unwrap and do_unwrap[1] == param.spelling:
|
elif do_unwrap and do_unwrap[1] == param.spelling:
|
||||||
|
cfile.write(", %s" % param.spelling)
|
||||||
cpp.write("struct_%s_%s_unwrap(%s)" % (strip_ns(do_unwrap[0]), display_sdkver(sdkver), do_unwrap[1]))
|
cpp.write("struct_%s_%s_unwrap(%s)" % (strip_ns(do_unwrap[0]), display_sdkver(sdkver), do_unwrap[1]))
|
||||||
|
elif path_conv and param.spelling in path_conv["w2l_names"]:
|
||||||
|
cfile.write(", %s ? lin_%s : NULL" % (param.spelling, param.spelling))
|
||||||
|
cpp.write("(%s)%s" % (param.type.spelling, param.spelling))
|
||||||
elif next_is_size:
|
elif next_is_size:
|
||||||
|
cfile.write(", %s" % param.spelling)
|
||||||
next_is_size = False
|
next_is_size = False
|
||||||
if param.type.spelling == "uint32_t":
|
if param.type.spelling == "uint32_t":
|
||||||
cpp.write("sizeof(lin)")
|
cpp.write("sizeof(lin)")
|
||||||
else:
|
else:
|
||||||
cpp.write("(%s)%s" % (param.type.spelling, param.spelling))
|
cpp.write("(%s)%s" % (param.type.spelling, param.spelling))
|
||||||
elif "&" in param.type.spelling:
|
elif "&" in param.type.spelling:
|
||||||
|
cfile.write(", %s" % param.spelling)
|
||||||
cpp.write("*%s" % param.spelling)
|
cpp.write("*%s" % param.spelling)
|
||||||
else:
|
else:
|
||||||
|
cfile.write(", %s" % param.spelling)
|
||||||
cpp.write("(%s)%s" % (param.type.spelling, param.spelling))
|
cpp.write("(%s)%s" % (param.type.spelling, param.spelling))
|
||||||
if should_gen_wrapper:
|
if should_gen_wrapper:
|
||||||
cfile.write(")")
|
cfile.write(")")
|
||||||
@ -388,8 +424,18 @@ def handle_method(cfile, classname, winclassname, cppname, method, cpp, cpp_h, e
|
|||||||
cpp.write(");\n")
|
cpp.write(");\n")
|
||||||
if returns_record:
|
if returns_record:
|
||||||
cfile.write(" return _r;\n")
|
cfile.write(" return _r;\n")
|
||||||
if char_param_is_unix_path and not path_param_name is None and not path_size_param_name is None:
|
if path_conv and len(path_conv["l2w_names"]) > 0:
|
||||||
cfile.write(" return steamclient_unix_path_to_dos_path(path_result, %s, %s);\n" % (path_param_name, path_size_param_name))
|
for i in range(len(path_conv["l2w_names"])):
|
||||||
|
assert(path_conv["l2w_names"][i]) #otherwise, no name means string is in return value. needs special handling.
|
||||||
|
cfile.write(" ")
|
||||||
|
if path_conv["return_is_size"]:
|
||||||
|
cfile.write("path_result = ")
|
||||||
|
cfile.write("steamclient_unix_path_to_dos_path(path_result, %s, %s, %s);\n" % (path_conv["l2w_names"][i], path_conv["l2w_names"][i], path_conv["l2w_lens"][i]))
|
||||||
|
cfile.write(" return path_result;\n")
|
||||||
|
if path_conv:
|
||||||
|
for i in range(len(path_conv["w2l_names"])):
|
||||||
|
if path_conv["w2l_arrays"][i]:
|
||||||
|
cfile.write(" steamclient_free_stringlist(lin_%s);\n" % path_conv["w2l_names"][i])
|
||||||
if do_lin_to_win:
|
if do_lin_to_win:
|
||||||
cpp.write(" struct_%s_%s_lin_to_win(&lin, %s);\n" % (strip_ns(do_lin_to_win[0]), display_sdkver(sdkver), do_lin_to_win[1]))
|
cpp.write(" struct_%s_%s_lin_to_win(&lin, %s);\n" % (strip_ns(do_lin_to_win[0]), display_sdkver(sdkver), do_lin_to_win[1]))
|
||||||
cpp.write(" return _ret;\n")
|
cpp.write(" return _ret;\n")
|
||||||
@ -975,7 +1021,7 @@ for sdkver in sdk_versions:
|
|||||||
if not os.path.isfile(input_name):
|
if not os.path.isfile(input_name):
|
||||||
continue
|
continue
|
||||||
index = clang.cindex.Index.create()
|
index = clang.cindex.Index.create()
|
||||||
tu = index.parse(input_name, args=['-x', 'c++', '-std=c++11', '-DGNUC', '-Iopenvr_%s/' % sdkver, '-I/usr/lib/clang/7.0.0/include/'])
|
tu = index.parse(input_name, args=['-x', 'c++', '-std=c++11', '-DGNUC', '-Iopenvr_%s/' % sdkver, '-I/usr/lib/clang/7.0.1/include/'])
|
||||||
|
|
||||||
diagnostics = list(tu.diagnostics)
|
diagnostics = list(tu.diagnostics)
|
||||||
if len(diagnostics) > 0:
|
if len(diagnostics) > 0:
|
||||||
|
@ -52,6 +52,53 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define IS_ABSOLUTE(x) (*x == '/' || *x == '\\' || (*x && *(x + 1) == ':'))
|
||||||
|
|
||||||
|
/* returns non-zero on success, zero on failure */
|
||||||
|
bool steamclient_dos_path_to_unix_path(const char *src, char *dst)
|
||||||
|
{
|
||||||
|
*dst = 0;
|
||||||
|
|
||||||
|
if(!src || !*src)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(IS_ABSOLUTE(src)){
|
||||||
|
/* absolute path, use wine conversion */
|
||||||
|
WCHAR srcW[PATH_MAX];
|
||||||
|
char *unix_path;
|
||||||
|
uint32_t r;
|
||||||
|
|
||||||
|
r = MultiByteToWideChar(CP_UNIXCP, 0, src, -1, srcW, PATH_MAX);
|
||||||
|
if(r == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unix_path = wine_get_unix_file_name(srcW);
|
||||||
|
if(!unix_path){
|
||||||
|
WARN("Unable to convert DOS filename to unix: %s\n", src);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(dst, unix_path, PATH_MAX);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, unix_path);
|
||||||
|
}else{
|
||||||
|
/* relative path, just fix up backslashes */
|
||||||
|
const char *s;
|
||||||
|
char *d;
|
||||||
|
|
||||||
|
for(s = src, d = dst; *src; ++s, ++d){
|
||||||
|
if(*s == '\\')
|
||||||
|
*d = '/';
|
||||||
|
else
|
||||||
|
*d = *s;
|
||||||
|
}
|
||||||
|
|
||||||
|
*d = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
|
static BOOL array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
|
||||||
{
|
{
|
||||||
SIZE_T max_capacity, new_capacity;
|
SIZE_T max_capacity, new_capacity;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <linux/limits.h>
|
||||||
|
|
||||||
/* 32-bit Mac doesn't support Vulkan and thus DXVK */
|
/* 32-bit Mac doesn't support Vulkan and thus DXVK */
|
||||||
#if !defined(__APPLE__) || defined(__x86_64__)
|
#if !defined(__APPLE__) || defined(__x86_64__)
|
||||||
@ -37,6 +38,7 @@ typedef struct __winX winX;
|
|||||||
|
|
||||||
void *create_win_interface(const char *name, void *linux_side);
|
void *create_win_interface(const char *name, void *linux_side);
|
||||||
unsigned int steamclient_unix_path_to_dos_path(unsigned int api_result, char *inout, unsigned int inout_bytes);
|
unsigned int steamclient_unix_path_to_dos_path(unsigned int api_result, char *inout, unsigned int inout_bytes);
|
||||||
|
bool steamclient_dos_path_to_unix_path(const char *src, char *dst);
|
||||||
void *create_LinuxMatchmakingServerListResponse(void *win);
|
void *create_LinuxMatchmakingServerListResponse(void *win);
|
||||||
|
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
|
@ -28,8 +28,10 @@ typedef struct __winIVRInput_IVRInput_005 {
|
|||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_005_SetActionManifestPath, 12)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_005_SetActionManifestPath, 12)
|
||||||
EVRInputError __thiscall winIVRInput_IVRInput_005_SetActionManifestPath(winIVRInput_IVRInput_005 *_this, const char * pchActionManifestPath)
|
EVRInputError __thiscall winIVRInput_IVRInput_005_SetActionManifestPath(winIVRInput_IVRInput_005 *_this, const char * pchActionManifestPath)
|
||||||
{
|
{
|
||||||
|
char lin_pchActionManifestPath[PATH_MAX];
|
||||||
|
steamclient_dos_path_to_unix_path(pchActionManifestPath, lin_pchActionManifestPath);
|
||||||
TRACE("%p\n", _this);
|
TRACE("%p\n", _this);
|
||||||
return cppIVRInput_IVRInput_005_SetActionManifestPath(_this->linux_side, pchActionManifestPath);
|
return cppIVRInput_IVRInput_005_SetActionManifestPath(_this->linux_side, pchActionManifestPath ? lin_pchActionManifestPath : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_005_GetActionSetHandle, 20)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_005_GetActionSetHandle, 20)
|
||||||
@ -301,8 +303,10 @@ typedef struct __winIVRInput_IVRInput_004 {
|
|||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_004_SetActionManifestPath, 12)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_004_SetActionManifestPath, 12)
|
||||||
EVRInputError __thiscall winIVRInput_IVRInput_004_SetActionManifestPath(winIVRInput_IVRInput_004 *_this, const char * pchActionManifestPath)
|
EVRInputError __thiscall winIVRInput_IVRInput_004_SetActionManifestPath(winIVRInput_IVRInput_004 *_this, const char * pchActionManifestPath)
|
||||||
{
|
{
|
||||||
|
char lin_pchActionManifestPath[PATH_MAX];
|
||||||
|
steamclient_dos_path_to_unix_path(pchActionManifestPath, lin_pchActionManifestPath);
|
||||||
TRACE("%p\n", _this);
|
TRACE("%p\n", _this);
|
||||||
return cppIVRInput_IVRInput_004_SetActionManifestPath(_this->linux_side, pchActionManifestPath);
|
return cppIVRInput_IVRInput_004_SetActionManifestPath(_this->linux_side, pchActionManifestPath ? lin_pchActionManifestPath : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_004_GetActionSetHandle, 20)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_004_GetActionSetHandle, 20)
|
||||||
@ -520,8 +524,10 @@ typedef struct __winIVRInput_IVRInput_003 {
|
|||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_003_SetActionManifestPath, 12)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_003_SetActionManifestPath, 12)
|
||||||
EVRInputError __thiscall winIVRInput_IVRInput_003_SetActionManifestPath(winIVRInput_IVRInput_003 *_this, const char * pchActionManifestPath)
|
EVRInputError __thiscall winIVRInput_IVRInput_003_SetActionManifestPath(winIVRInput_IVRInput_003 *_this, const char * pchActionManifestPath)
|
||||||
{
|
{
|
||||||
|
char lin_pchActionManifestPath[PATH_MAX];
|
||||||
|
steamclient_dos_path_to_unix_path(pchActionManifestPath, lin_pchActionManifestPath);
|
||||||
TRACE("%p\n", _this);
|
TRACE("%p\n", _this);
|
||||||
return cppIVRInput_IVRInput_003_SetActionManifestPath(_this->linux_side, pchActionManifestPath);
|
return cppIVRInput_IVRInput_003_SetActionManifestPath(_this->linux_side, pchActionManifestPath ? lin_pchActionManifestPath : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_003_GetActionSetHandle, 20)
|
DEFINE_THISCALL_WRAPPER(winIVRInput_IVRInput_003_GetActionSetHandle, 20)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user