comparison Generic/openwith.py @ 23:65e7ae0d0e63

GTK2 to GTK3
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Thu, 02 May 2019 16:31:17 +0200
parents a7b9f7e7dfa4
children
comparison
equal deleted inserted replaced
22:7bd4ca56607d 23:65e7ae0d0e63
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 ## File openwith.py 3 ## File openwith.py
4 ## This file is part of pyArq-Presupuestos. 4 ## This file is part of pyArq-Presupuestos.
5 ## 5 ##
6 ## Copyright (C) 2010-2013 Miguel Ángel Bárcena Rodríguez 6 ## Copyright (C) 2010-2019 Miguel Ángel Bárcena Rodríguez
7 ## <miguelangel@obraencurso.es> 7 ## <miguelangel@obraencurso.es>
8 ## 8 ##
9 ## This file is based in gtkgui_helpers.py and common/helpers.py from gajim 9 ## This file is based in common/helpers.py from gajim
10 ## 10 ##
11 ## Copyright (C) 2003-2008 Yann Leboulanger <asterix AT lagaule.org> 11 ## Copyright (C) 2003-2008 Yann Leboulanger <asterix AT lagaule.org>
12 ## Copyright (C) 2005-2006 Dimitur Kirov <dkirov AT gmail.com> 12 ## Copyright (C) 2005-2006 Dimitur Kirov <dkirov AT gmail.com>
13 ## Nikos Kouremenos <kourem AT gmail.com> 13 ## Nikos Kouremenos <kourem AT gmail.com>
14 ## Copyright (C) 2006 Alex Mauer <hawke AT hawkesnest.net> 14 ## Copyright (C) 2006 Alex Mauer <hawke AT hawkesnest.net>
31 ## 31 ##
32 ## You should have received a copy of the GNU General Public License 32 ## You should have received a copy of the GNU General Public License
33 ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 33 ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
34 ## 34 ##
35 # Modules 35 # Modules
36
37 # python 2/3 compatibility
38 from __future__ import absolute_import, division, print_function, unicode_literals
39
36 import subprocess 40 import subprocess
37 import os 41 import os
42 import platform
43 import sys
38 44
39 # pyArq-Presupuestos modules 45 # pyArq-Presupuestos modules
40 import globalVars 46 from Generic import globalVars
41 47
42 # from gtkgui_helpers.py
43 def autodetect_desktop(): 48 def autodetect_desktop():
44 # recognize the environment and sets it in globalVars 49 """
45 if os.name == 'nt': 50 recognize the environment and sets it in globalVars
51 os.name:
52 python2 'posix', 'nt', 'os2', 'ce', 'java', 'riscos'.
53 python3 'posix', 'nt', 'java'.
54 sys.platform
55 unix: return by uname
56 Linux 'linux', 'linux2'
57 Windows 'win32'
58 Windows/Cygwin 'cygwin'
59 Mac OS X 'darwin'
60 """
61 if os.name == "nt":
46 globalVars.desktop["desktop"] = "windows" 62 globalVars.desktop["desktop"] = "windows"
63 elif sys.platform == "darwin":
64 globalVars.desktop["desktop"] = "macosx"
65 elif sys.platform.startswith('linux'):
66 globalVars.desktop["desktop"] = "linux"
47 else: 67 else:
48 _processes = get_running_processes() 68 globalVars.desktop["desktop"] = sys.platform
49 if 'gnome-session' in _processes:
50 globalVars.desktop["desktop"] = "gnome"
51 elif 'startkde' in _processes:
52 globalVars.desktop["desktop"] = "kde"
53 elif 'startxfce4' in _processes or 'xfce4-session' in _processes:
54 globalVars.desktop["desktop"] = "xfce"
55 elif 'startlxde' in _processes or 'lxsession' in _processes:
56 globalVars.desktop["desktop"] = "lxde"
57 elif 'awesome' in _processes:
58 globalVars.desktop["desktop"] = "awesome"
59 elif 'dwm' in _processes:
60 globalVars.desktop["desktop"] = "dwm"
61 elif 'startfluxbox' in _processes:
62 globalVars.desktop["desktop"] = "fluxbox"
63 elif 'fvwm2' in _processes:
64 globalVars.desktop["desktop"] = "fvwm"
65 else:
66 globalVars.desktop["desktop"] = ""
67
68 def get_running_processes():
69 '''returns running processes or None (if not /proc exists)'''
70 if os.path.isdir('/proc'):
71 # under Linux: checking if 'gnome-session' or
72 # 'startkde' programs were run before gajim, by
73 # checking /proc (if it exists)
74 #
75 # if something is unclear, read `man proc`;
76 # if /proc exists, directories that have only numbers
77 # in their names contain data about processes.
78 # /proc/[xxx]/exe is a symlink to executable started
79 # as process number [xxx].
80 # filter out everything that we are not interested in:
81 files = os.listdir('/proc')
82
83 # files that doesn't have only digits in names...
84 files = filter(str.isdigit, files)
85
86 # files that aren't directories...
87 files = [f for f in files if os.path.isdir('/proc/' + f)]
88
89 # processes owned by somebody not running gajim...
90 # (we check if we have access to that file)
91 files = [f for f in files if os.access('/proc/' + f +'/exe', os.F_OK)]
92
93 # be sure that /proc/[number]/exe is really a symlink
94 # to avoid TBs in incorrectly configured systems
95 files = [f for f in files if os.path.islink('/proc/' + f + '/exe')]
96
97 # list of processes
98 processes = [os.path.basename(os.readlink('/proc/' + f +'/exe')) for f in files]
99
100 return processes
101 return []
102 69
103 # from common/helpers.py 70 # from common/helpers.py
104 71
105 def exec_command(command): 72 def exec_command(command):
106 subprocess.Popen('%s &' % command, shell=True).wait() 73 subprocess.Popen('%s &' % command, shell=True).wait()
111 parameter = parameter.replace('"', '\\"') # but first escape " 78 parameter = parameter.replace('"', '\\"') # but first escape "
112 command = '%s "%s"' % (executable, parameter) 79 command = '%s "%s"' % (executable, parameter)
113 return command 80 return command
114 81
115 def launch_file(kind, uri): 82 def launch_file(kind, uri):
116 # kind = "url" ,"mail", "image", "dxf" 83 """
84 kind = "url" ,"mail", "image", "dxf", "wmf", "pdf", video",
85 "office-document", "office-presentation", "office-spreadsheet",
86 "html", "rtf", "txt", ""
87 Linux: xdg-open supports:
88 Xfce (exo-open "$1"),
89 Gnome (gvfs-open "$1", gnome-open "$1" with fallback to generic open),
90 KDE (kde-open "$1" with fallback to kfmclient exec "$1"),
91 Mate (gvfs-open "$1", mate-open $1),
92 LXDE (pcmanfm $1 with fallback to generic open),
93 Enlightenment (enlightenment_open $1),
94 Cinnamon (open_gnome3 $1, which is gvfs-open "$1" with fallback to generic open),
95 Cygwin (cygstart "$1"),
96 Darwin (open "$1").
97
98
99 """
100 # TODO: test in Mac os X
101 # TODO: test in Windows
102 # TODO: configured apps in windows?
103
104 if kind == "mail" and not uri.startswith("mailto:"):
105 uri = "mailto:" + uri
106
117 _desktop = globalVars.desktop["desktop"] 107 _desktop = globalVars.desktop["desktop"]
108
118 if _desktop == "windows": 109 if _desktop == "windows":
119 try: 110 try:
120 os.startfile(uri) # if pywin32 is installed we open 111 os.startfile(uri) # if pywin32 is installed we open
121 except Exception: 112 except Exception:
122 pass 113 pass
123 else: 114 else:
124 if kind == 'mail' and not uri.startswith('mailto:'): 115 # if app is configured in globarVars use it
125 uri = 'mailto:' + uri 116 if kind in ("url", "html") and globalVars.desktop["browser"] != "":
126 if _desktop == "gnome": 117 command = globalVars.desktop["browser"]
127 command = 'gnome-open' 118 elif kind == "mail" and globalVars.desktop["mailapp"] != "":
128 elif _desktop == "kde": 119 command = globalVars.desktop["mailapp"]
129 command = 'kfmclient exec' 120 elif kind == "image" and globalVars.desktop["imageapp"] != "":
130 elif _desktop == "xfce": 121 command = globalVars.desktop["imageapp"]
131 command = 'exo-open' 122 elif kind == "wmf" and globalVars.desktop["wmfapp"] != "":
123 command = globalVars.desktop["wmfapp"]
124 elif kind == "dxf" and globalVars.desktop["cadapp"] != "":
125 command = globalVars.desktop["cadapp"]
126 elif kind == "video" and globalVars.desktop["videoapp"] != "":
127 command = globalVars.desktop["videoapp"]
128 elif kind in ("office-document", "office-presentation",
129 "office-spreadsheet") and \
130 globalVars.desktop["officeapp"] != "":
131 command = globalVars.desktop["officeapp"]
132 elif kind == "txt" and globalVars.desktop["txtapp"] != "":
133 command = globalVars.desktop["txtapp"]
134 elif kind == "rtf" and globalVars.desktop["rtfapp"] != "":
135 command = globalVars.desktop["rtfapp"]
136 # if no app is configured
137 elif _desktop == "macosx":
138 command = "open"
139 elif _desktop == "linux":
140 command = "xdg-open"
132 else: 141 else:
133 if kind == 'url': 142 # if no desktop is detected
134 command = globalVars.desktop["browser"] 143 # try xdg-open and cross your fingers
135 elif kind == 'mail': 144 command = "xdg-open"
136 command = globalVars.desktop["mailapp"] 145
137 elif kind == 'image':
138 command = globalVars.desktop["imageapp"]
139 elif kind == 'dxf':
140 command = globalVars.desktop["cadapp"]
141 else: # if no app is configured
142 return
143 command = build_command(command, uri) 146 command = build_command(command, uri)
144 try: 147 try:
145 exec_command(command) 148 exec_command(command)
146 except Exception: 149 except Exception:
147 pass 150 pass