From df5c225b5a839a29ff761fc65cca53939d43c445 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jan 2017 20:52:06 +0530 Subject: [PATCH] Set window icon on linux --- kitty/constants.py | 4 +++- kitty/glfw.c | 10 ++++++++++ kitty/main.py | 5 ++++- logo/kitty.rgba | Bin 0 -> 262144 bytes logo/make.py | 1 + setup.py | 2 ++ 6 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 logo/kitty.rgba diff --git a/kitty/constants.py b/kitty/constants.py index f36243af6..82e8852d4 100644 --- a/kitty/constants.py +++ b/kitty/constants.py @@ -75,7 +75,9 @@ mouse_button_pressed = defaultdict(lambda: False) mouse_cursor_pos = [0, 0] viewport_size = ViewportSize() cell_size = ViewportSize() -terminfo_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'terminfo') +base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +terminfo_dir = os.path.join(base_dir, 'terminfo') +logo_data_file = os.path.join(base_dir, 'logo', 'kitty.rgba') main_thread = threading.current_thread() shell_path = pwd.getpwuid(os.geteuid()).pw_shell or '/bin/sh' diff --git a/kitty/glfw.c b/kitty/glfw.c index 8fb5763eb..457a7084c 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -285,6 +285,15 @@ set_clipboard_string(Window *self, PyObject *args) { Py_RETURN_NONE; } +static PyObject* +set_window_icon(Window *self, PyObject *args) { + GLFWimage logo; + Py_ssize_t sz; + if(!PyArg_ParseTuple(args, "s#ii", &(logo.pixels), &sz, &(logo.width), &(logo.height))) return NULL; + glfwSetWindowIcon(self->window, 1, &logo); + Py_RETURN_NONE; +} + static PyObject* _set_title(Window *self, PyObject *args) { @@ -327,6 +336,7 @@ static PyMethodDef methods[] = { MND(set_clipboard_string, METH_VARARGS), MND(make_context_current, METH_NOARGS), {"set_title", (PyCFunction)_set_title, METH_VARARGS, ""}, + {"set_icon", (PyCFunction)set_window_icon, METH_VARARGS, ""}, {NULL} /* Sentinel */ }; diff --git a/kitty/main.py b/kitty/main.py index 076f26c69..bde12d0e6 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -11,7 +11,7 @@ from gettext import gettext as _ from .config import load_config, load_cached_values, cached_values, save_cached_values -from .constants import appname, str_version, config_dir, viewport_size, isosx +from .constants import appname, str_version, config_dir, viewport_size, isosx, logo_data_file from .layout import all_layouts from .boss import Boss from .shaders import GL_VERSION @@ -104,6 +104,9 @@ def run_app(opts, args): viewport_size.width, viewport_size.height, args.cls) window.set_title(appname) window.make_context_current() + if not isosx: + with open(logo_data_file, 'rb') as f: + window.set_icon(f.read(), 256, 256) viewport_size.width, viewport_size.height = window.get_framebuffer_size() glewInit() boss = Boss(window, opts, args) diff --git a/logo/kitty.rgba b/logo/kitty.rgba new file mode 100644 index 0000000000000000000000000000000000000000..a3ad94652b47f8159afed78b0d9b95c94c0d9e97 GIT binary patch literal 262144 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 literal 0 HcmV?d00001 diff --git a/logo/make.py b/logo/make.py index ca57147cf..8b03144c8 100755 --- a/logo/make.py +++ b/logo/make.py @@ -17,6 +17,7 @@ def render(output, sz=256): render('kitty.png') +subprocess.check_call(['convert', 'kitty.png', 'kitty.rgba']) iconset = 'kitty.iconset' if os.path.exists(iconset): shutil.rmtree(iconset) diff --git a/setup.py b/setup.py index 49733b389..b4e23056d 100755 --- a/setup.py +++ b/setup.py @@ -219,10 +219,12 @@ def package(args): # {{{ if os.path.exists(libdir): shutil.rmtree(libdir) os.makedirs(os.path.join(libdir, 'terminfo/x')) + os.makedirs(os.path.join(libdir, 'logo')) safe_makedirs(terminfo_dir) shutil.copy2('__main__.py', libdir) shutil.copy2('terminfo/x/xterm-kitty', terminfo_dir) shutil.copy2('terminfo/x/xterm-kitty', os.path.join(libdir, 'terminfo/x')) + shutil.copy2('logo/kitty.rgba', os.path.join(libdir, 'logo')) def src_ignore(parent, entries): return [x for x in entries if '.' in x and x.rpartition('.')[2] not in ('py', 'so', 'conf')]