Wine의 모든 파일 형식을 해당 기본 응용 프로그램과 연결하는 방법은 무엇입니까?


8

Wine 내의 파일 형식을 기본 응용 프로그램과 연결하는 방법에 답변 된 것처럼 단일 파일 형식에 대해 쉽게 수행 할 수 있습니다 . .reg원하는 파일 형식에 대한를 만들어서 . 그러나 이것은 AVI 전용입니다. 다양한 파일을 시작할 수있는 와인 응용 프로그램 (uTorrent, Soulseek, Eudora 등)을 사용합니다. 예를 들어 전자 메일 첨부 파일은 JPG, DOC, PDF, PPS 일 수 있습니다. 전자 메일에서 받거나 토렌트로 다운로드 할 수있는 모든 가능한 파일 형식을 추적하는 것은 불가능하고 바람직하지 않습니다.

그래서 더 포괄적이고 광범위한 솔루션을 원했습니다. 현재 구성된 기본 앱을 존중하려면 파일 연결이 필요합니다. 그리고 내 시스템에 구성된 모든 파일 유형에 대해이 작업을 수행 하려고합니다.

나는 솔루션을 일반화하는 방법을 이미 알아 냈습니다. 간단히에 실행 된 응용 프로그램을 교체하기 .reg위해 winebrowser다음과 같이 :

[HKEY_CLASSES_ROOT\.pdf]
@="PDFfile"
"Content Type"="application/pdf"
[HKEY_CLASSES_ROOT\PDFfile\Shell\Open\command]
@="C:\\windows\\system32\\winebrowser.exe \"%1\""

나는 이것을 테스트했고 올바르게 작동합니다. winebrowser는 xdg-open백엔드로 사용 하고 내 Windows 경로를 Unix 경로로 변환하므로 올바른 (Linux) 앱이 시작됩니다.

따라서 와인의 레지스트리에 "배치"업데이터가 필요합니다 wine-update-associations. 새로운 앱이 설치 될 때마다 실행할 수 있는 일종의 스크립트입니다. 다음을 수행 할 수있는 도구 일 수 있습니다.

  • 기본 설치된 앱이 연결된 시스템의 모든 Mime 유형을 나열합니다.
  • 필요한 모든 정보 추출 (글로브, MIME 유형 등)
  • 위 형식으로 .REG 파일을 생성하십시오.

까다로운 부분은 다음과 같습니다. Ubuntu 10.10 이상에서 연결이 수행되는 방법에 대한 정보를 찾기 위해 많은 정보를 찾았으며 문서가 가장 작고 혼란 스럽습니다. Freedesktop.org에는 완전한 사양이 없으며 심지어 Gnome 문서도 더 이상 사용되지 않습니다. 지금까지 연관 정보가 포함 된 4 개의 파일을 수집 했지만 사용할 파일 (또는 이유) 또는 .reg파일 을 생성하는 데 사용하는 방법에 대한 실마리는 없습니다.

~/.local/share/applications/mimeapps.list
~/.local/share/applications/miminfo.cache
/usr/share/applications/miminfo.cache
/etc/gnome/defaults.list

도움, 스크립트 또는 설명이 있으면 대단히 감사하겠습니다!

감사!

답변:


2

몇 년 후, 나는 MIME 데이터베이스 (시스템과 사용자 모두)를 스캔 하고 알려진 모든 기본 MIME 유형을 Windows 레지스트리에 등록하는 작은 유틸리티를 만들었습니다 .

xdg-open해당 MIME 유형에 대한 기본 (기본) 응용 프로그램이있는 경우 파일을 여는 데 사용 되며, 그렇지 않으면 packagekit해당 파일을 처리 할 수있는 패키지를 검색하는 데 사용 됩니다 (노틸러스와 마찬가지로). 따라서 기본 응용 프로그램이 설치된 확장 프로그램 만 등록해야한다는 초기 요구 사항이 더 이상 필요하지 않았습니다. 그러나 초기 버전의 스크립트는 이러한 유형 만 필터링했습니다. 가능하게 한 스 니펫은 다음과 같습니다.

perl -e '
    use strict; use warnings;
    use File::MimeInfo::Magic; use File::MimeInfo::Applications;
    while (my $line = <STDIN>) {
      chomp($line);
      my ($ext, $mime) = (split/\t/, $line);
      my ($def, @apps) = mime_applications_all($mime);
      print "$line\n" if ($def || @apps)
    }'

기본적으로 내 스크립트는 Windows 레지스트리에 핸들러가없는 기본 유형 만 등록하지만 이러한 연관을 무시할 수도 있습니다 (예 : jpeg 파일은 기본 Gecko 와인 브라우저 대신 기본 뷰어에서 열립니다). 또한 창에 핸들러가없는 경우에도 일부 확장을 무시할 수 있습니다.

그것은 winemenubuilder에게 친숙하기 위해 최선을 다합니다. 즉, 그것이 만드는 모든 협회가 winemenubuilder에 의해 네이티브 협회 (또는 x-wine-extension mimetypes)로 출판되지 않으며, 이는 추악하고 잠재적으로 루프를 일으킬 수 있습니다. 이것은 특히 대소 문자 확장 (예 : .C 및 .c)으로 매우 까다 롭고 완벽하지는 않습니다.

즉,이 스크립트가 모든 사람에게 도움이되기를 바랍니다.

https://github.com/MestreLion/wine-tools/blob/master/wine-import-extensions

개선을 환영합니다!


당신의 대본은 그것이 성공했다고 말하지만 와인에는 아무것도 바뀌지 않았습니다. 큰 문제는 없습니다. 와인 앱 Everything자체 에서 또 다른 해결 방법을 찾았 지만 알려 드리고 싶었습니다
phil294

1

편집하다:

이것에 관한 와인 버그가 있습니다 -버그보다 개선 된 것입니다. 요점은 ShellExecutecall xdg-open이며, 찾을 수 없으면 gnome 및 kde 기본값을 찾으십시오. 패치를 적용하고 마지막으로 마술을 가질 수 있어야합니다 :-). 이 솔루션은 레지스트리를 망칠 필요가 없으므로 더 깨끗 합니다.

여기에서 더 완전한 것은 소스에서 와인패치하고 컴파일 하는 방법 입니다.

편집 종료

공통 스크립트 유형 목록을 추가하기 위해 아래 스크립트로 와인 레지스트리를 업데이트합니다.
더 많은 유형을 추가하기 위해 목록을 확장 할 수 있습니다. 파일 에서
사용 하므로 그놈 이외의 데스크톱에서는 그대로 작동하지 않습니다 ./usr/bin/gnome-opengstart.exe

이것을 넣으십시오 conf_wine.sh:

#!/bin/bash

SRC=~
WINE=~/.wine
REG=$WINE/system.reg
GSTART=gstart.exe
GSTART_TARGET=$WINE/drive_c
EXE_TARGET=$WINE/drive_c/windows
FNKEY=/tmp/"key"$(date +%F_%H-%M-%S)".reg"

[ -e $FNKEY ] && { echo "temporary key file exists..try again"; exit 1; }

echo "copying gstart.exe"
cp $SRC/$GSTART $GSTART_TARGET
chmod +x $GSTART_TARGET

echo "backing up the registry"
cp $REG $REG.$(date +%F_%H-%M-%S).old

echo "setting new wine registry keys"
for i in http doc docx ppt pptx xls xlsx odt ods xml txt pdf odt svg zip ; do {
    echo "setting $i"
key='[HKEY_CLASSES_ROOT\.'$i']
@="'$i'file"
"Content Type"="application/'$i'"
[HKEY_CLASSES_ROOT\'$i'file\Shell\Open\command]
@="C:\\gstart.exe \"%1\""'
    echo "$key" > $FNKEY
    regedit $FNKEY
}
done

echo "done"

이것은 gstart.exebash 스크립트입니다. 그리고 두 세계의 다리입니다.

#!/bin/bash

OPEN_HANDLER=/usr/bin/gnome-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG

# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR

# finally open the file
$OPEN_HANDLER "$RESULT"

노트:

  1. 복사 gstart.exe실행하기 전에 현재 작업 디렉토리 conf_wine.sh가에 복사하므로 .wine폴더에 있습니다.
  2. 폴더 위치를 변경할 수 있습니다 (예 : gstart.exe에 앉아 있지 않아도 됨) c:\.
  3. 마술은 없습니다 : 새로운 유형을 수동으로 추가해야합니다. Linux 파일 (mimeapps.list, ..)을 읽고 필요한 경우 와인 레지스트리를 업데이트하도록 개선 할 수 있습니다.
  4. 적어도 와인 1.4에서 작동하도록 테스트되었습니다.

와인 FAQ : 기본 프로그램을 와인의 파일 형식과 어떻게 연결합니까?


노력 +1하지만 이것은 내 문제를 거의 해결하지 못합니다. 먼저, gnome-openover을 사용 하는 것이 적습니다 xdg-open.이 질문에서 이미 언급했으며 훨씬 이식성이 뛰어납니다. 둘째, 파일 확장자 몇 개를 하드 코딩하는 것만으로는 충분하지 않습니다. "현재 기본 응용 프로그램이 구성되어있는 모든 응용 프로그램을 존중하려면 파일 연결이 필요합니다. 시스템에 구성된 모든 파일 형식에 대해이 작업을 수행하려고합니다." 그리고 나는 이것이 까다 롭다는 것을 알고 있습니다. 내가 관심있는 것은 # 3에서 언급 한 "매직"입니다.)
MestreLion

나는 당신의 질문을 처음에 너무 빨리 읽은 것 같습니다. 나는 당신이 xdg-open을 사용하는 것을 보았고 그것을 내 스크립트에서 바꿀 것입니다. 마술에 관하여 : 한 가지 방법은 mime 파일의 모든 항목을 반복적으로 읽는 대신 읽는 것입니다. 그러나 새 확장이 추가되었을 때 시스템을 업데이트 할 때마다 실행해야합니다. 하지만 매일 그런 일은 일어나지 않습니다.
rosch

또는 레지스트리 업데이트를 위해 잔인하게 cronjob을 설정하십시오. 마임이 업데이트 된 경우에만 레지스트리를 수정하십시오.
rosch

까다로운 부분은 언제 레지스트리를 업데이트해야 하는가가 아니라 , 어떤 파일 확장자에 대해 어떻게 또는보다 정확하게 업데이트 하는가? 기본적으로 설치된 앱이 연결된 모든 확장을 검색하기 위해 mime 데이터베이스를 지속적으로 구문 분석하는 방법을 모르겠습니다 . 또는 말했듯 이 mime 파일의 모든 항목을 반복 읽는 방법은 무엇입니까? mimeapps.lst여기에 설치하지 않은 일부 mime 유형이 있으며 , 일부는 Wine 앱으로 돌아갑니다 (무한한 루프가 발생할 수 있음)
MestreLion

내 첫 번째 코멘트에서 영어 실수에 대해 죄송합니다, 나는 그것을 편집하고 조금 엉망이되었습니다. 대답에서 내 편집을 읽으십시오. 모든 파일이 처리 될 때 마술이 있습니다.
rosch

0

나는 모든 곳에서 정보를 수집하고 다음을 작동시키는 것으로 나타났습니다.

~ / .wine / drive_c / gstart.exe라는 파일을 만들었습니다.

다음과 같이 :

#!/bin/bash
OPEN_HANDLER=/usr/bin/xdg-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG
# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR
# finally open the file
$OPEN_HANDLER "$RESULT"

그런 다음 : ~ / bin에 linuxnative.reg라는 파일을 만들었습니다.

다음과 같이 :

REGEDIT4
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.rtf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.odt]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.pdf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.tif]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.docx]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.jpg]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\linuxnative]
[HKEY_CLASSES_ROOT\linuxnative\shell]
[HKEY_CLASSES_ROOT\linuxnative\shell\open]
[HKEY_CLASSES_ROOT\linuxnative\shell\open\command]
@="c:\\gstart.exe \"%1\""

그럼 당신은

regedit linuxnative.reg

도움이 되었기를 바랍니다.


도와 주셔서 감사합니다! 그러나 잘 알려진 몇 가지 확장 프로그램의 하드 코드 된 목록은 내 문제를 해결하지 못합니다. 또한 "모든 곳에서 수집 한 정보"gstart.exe스크립트 의 복사 및 붙여 넣기를 포함하여 나와 나와 rosch가 이미 게시 한 것과 동일한 정보 인 것 같습니다 .
MestreLion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.