%PDF- %PDF-
| Direktori : /lib/calibre/calibre/utils/open_with/ |
| Current File : //lib/calibre/calibre/utils/open_with/windows.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
import re
import sys
from qt.core import QBuffer, QByteArray, QPixmap, Qt, QtWin, QIODevice
from calibre.gui2 import must_use_qt
from calibre.utils.winreg.default_programs import split_commandline
from calibre_extensions import winutil
ICON_SIZE = 256
def hicon_to_pixmap(hicon):
return QtWin.fromHICON(int(hicon))
def pixmap_to_data(pixmap):
ba = QByteArray()
buf = QBuffer(ba)
buf.open(QIODevice.OpenModeFlag.WriteOnly)
pixmap.save(buf, 'PNG')
return bytes(bytearray(ba.data()))
def load_icon_resource_as_pixmap(icon_resource, size=ICON_SIZE):
if not icon_resource:
return
parts = tuple(filter(None, re.split(r',([-0-9]+$)', icon_resource)))
if len(parts) != 2:
return
module, index = parts
index = int(index)
if module.startswith('"') and module.endswith('"'):
module = split_commandline(module)[0]
hmodule = winutil.load_library(module, winutil.LOAD_LIBRARY_AS_DATAFILE | winutil.LOAD_LIBRARY_AS_IMAGE_RESOURCE)
icons = winutil.load_icons(hmodule, index)
pixmaps = []
must_use_qt()
for icon_data, icon_handle in icons:
pixmap = QPixmap()
pixmap.loadFromData(icon_data)
if pixmap.isNull() and bool(icon_handle):
pixmap = hicon_to_pixmap(icon_handle)
if pixmap.isNull():
continue
pixmaps.append(pixmap)
if not pixmaps:
return
def area(p):
return p.width() * p.height()
pixmaps.sort(key=area)
q = size * size
for pmap in pixmaps:
if area(pmap) >= q:
if area(pmap) == q:
return pmap
return pmap.scaled(
int(size), int(size), aspectRatioMode=Qt.AspectRatioMode.KeepAspectRatio, transformMode=Qt.TransformationMode.SmoothTransformation)
return pixmaps[-1].scaled(
int(size), int(size), aspectRatioMode=Qt.AspectRatioMode.KeepAspectRatio, transformMode=Qt.TransformationMode.SmoothTransformation)
def load_icon_resource(icon_resource, as_data=False, size=ICON_SIZE):
ans = load_icon_resource_as_pixmap(icon_resource, size=size)
if ans is not None:
if as_data:
ans = pixmap_to_data(ans)
return ans
def load_icon_for_file(path: str, as_data=False, size=ICON_SIZE):
try:
hicon = winutil.get_icon_for_file(path)
except Exception:
return
must_use_qt()
pmap = hicon_to_pixmap(hicon)
if not pmap.isNull():
if pmap.width() != size:
pmap = pmap.scaled(
int(size), int(size), aspectRatioMode=Qt.AspectRatioMode.KeepAspectRatio, transformMode=Qt.TransformationMode.SmoothTransformation)
return pixmap_to_data(pmap) if as_data else pmap
def load_icon_for_cmdline(cmdline: str, as_data=False, size=ICON_SIZE):
return load_icon_for_file(split_commandline(cmdline)[0], as_data=as_data, size=size)
def display_image(png_data):
from base64 import standard_b64encode
def serialize_gr_command(cmd, payload=None):
cmd = ','.join(f'{k}={v}' for k, v in cmd.items())
ans = []
w = ans.append
w(b'\033_G'), w(cmd.encode('ascii'))
if payload:
w(b';')
w(payload)
w(b'\033\\')
return b''.join(ans)
def write_chunked(cmd, data):
data = standard_b64encode(data)
while data:
chunk, data = data[:4096], data[4096:]
m = 1 if data else 0
cmd['m'] = m
sys.stdout.buffer.write(serialize_gr_command(cmd, chunk))
sys.stdout.buffer.flush()
cmd.clear()
sys.stdout.flush()
write_chunked({'a': 'T', 'f': 100}, png_data)
def test():
png_data = load_icon_resource(sys.argv[-1], as_data=True)
display_image(png_data)
def test_shell():
png_data = load_icon_for_file(sys.argv[-1], as_data=True)
display_image(png_data)