diff --git a/glfw_constants.py b/glfw_constants.py deleted file mode 100644 index a85792483..000000000 --- a/glfw_constants.py +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -# License: GPL v3 Copyright: 2016, Kovid Goyal - -# --- Input handling definitions ---------------------------------------------- -GLFW_RELEASE = 0 -GLFW_PRESS = 1 -GLFW_REPEAT = 2 - -# --- Keys -------------------------------------------------------------------- - -# --- The unknown key --------------------------------------------------------- -GLFW_KEY_UNKNOWN = -1 - -# --- Printable keys ---------------------------------------------------------- -GLFW_KEY_SPACE = 32 -GLFW_KEY_APOSTROPHE = 39 # '' -GLFW_KEY_COMMA = 44 # , -GLFW_KEY_MINUS = 45 # - -GLFW_KEY_PERIOD = 46 # . -GLFW_KEY_SLASH = 47 # / -GLFW_KEY_0 = 48 -GLFW_KEY_1 = 49 -GLFW_KEY_2 = 50 -GLFW_KEY_3 = 51 -GLFW_KEY_4 = 52 -GLFW_KEY_5 = 53 -GLFW_KEY_6 = 54 -GLFW_KEY_7 = 55 -GLFW_KEY_8 = 56 -GLFW_KEY_9 = 57 -GLFW_KEY_SEMICOLON = 59 # ; -GLFW_KEY_EQUAL = 61 # = -GLFW_KEY_A = 65 -GLFW_KEY_B = 66 -GLFW_KEY_C = 67 -GLFW_KEY_D = 68 -GLFW_KEY_E = 69 -GLFW_KEY_F = 70 -GLFW_KEY_G = 71 -GLFW_KEY_H = 72 -GLFW_KEY_I = 73 -GLFW_KEY_J = 74 -GLFW_KEY_K = 75 -GLFW_KEY_L = 76 -GLFW_KEY_M = 77 -GLFW_KEY_N = 78 -GLFW_KEY_O = 79 -GLFW_KEY_P = 80 -GLFW_KEY_Q = 81 -GLFW_KEY_R = 82 -GLFW_KEY_S = 83 -GLFW_KEY_T = 84 -GLFW_KEY_U = 85 -GLFW_KEY_V = 86 -GLFW_KEY_W = 87 -GLFW_KEY_X = 88 -GLFW_KEY_Y = 89 -GLFW_KEY_Z = 90 -GLFW_KEY_LEFT_BRACKET = 91 # [ -GLFW_KEY_BACKSLASH = 92 # \ -GLFW_KEY_RIGHT_BRACKET = 93 # ] -GLFW_KEY_GRAVE_ACCENT = 96 # ` -GLFW_KEY_WORLD_1 = 161 # non-US #1 -GLFW_KEY_WORLD_2 = 162 # non-US #2 - -# --- Function keys ----------------------------------------------------------- -GLFW_KEY_ESCAPE = 256 -GLFW_KEY_ENTER = 257 -GLFW_KEY_TAB = 258 -GLFW_KEY_BACKSPACE = 259 -GLFW_KEY_INSERT = 260 -GLFW_KEY_DELETE = 261 -GLFW_KEY_RIGHT = 262 -GLFW_KEY_LEFT = 263 -GLFW_KEY_DOWN = 264 -GLFW_KEY_UP = 265 -GLFW_KEY_PAGE_UP = 266 -GLFW_KEY_PAGE_DOWN = 267 -GLFW_KEY_HOME = 268 -GLFW_KEY_END = 269 -GLFW_KEY_CAPS_LOCK = 280 -GLFW_KEY_SCROLL_LOCK = 281 -GLFW_KEY_NUM_LOCK = 282 -GLFW_KEY_PRINT_SCREEN = 283 -GLFW_KEY_PAUSE = 284 -GLFW_KEY_F1 = 290 -GLFW_KEY_F2 = 291 -GLFW_KEY_F3 = 292 -GLFW_KEY_F4 = 293 -GLFW_KEY_F5 = 294 -GLFW_KEY_F6 = 295 -GLFW_KEY_F7 = 296 -GLFW_KEY_F8 = 297 -GLFW_KEY_F9 = 298 -GLFW_KEY_F10 = 299 -GLFW_KEY_F11 = 300 -GLFW_KEY_F12 = 301 -GLFW_KEY_F13 = 302 -GLFW_KEY_F14 = 303 -GLFW_KEY_F15 = 304 -GLFW_KEY_F16 = 305 -GLFW_KEY_F17 = 306 -GLFW_KEY_F18 = 307 -GLFW_KEY_F19 = 308 -GLFW_KEY_F20 = 309 -GLFW_KEY_F21 = 310 -GLFW_KEY_F22 = 311 -GLFW_KEY_F23 = 312 -GLFW_KEY_F24 = 313 -GLFW_KEY_F25 = 314 -GLFW_KEY_KP_0 = 320 -GLFW_KEY_KP_1 = 321 -GLFW_KEY_KP_2 = 322 -GLFW_KEY_KP_3 = 323 -GLFW_KEY_KP_4 = 324 -GLFW_KEY_KP_5 = 325 -GLFW_KEY_KP_6 = 326 -GLFW_KEY_KP_7 = 327 -GLFW_KEY_KP_8 = 328 -GLFW_KEY_KP_9 = 329 -GLFW_KEY_KP_DECIMAL = 330 -GLFW_KEY_KP_DIVIDE = 331 -GLFW_KEY_KP_MULTIPLY = 332 -GLFW_KEY_KP_SUBTRACT = 333 -GLFW_KEY_KP_ADD = 334 -GLFW_KEY_KP_ENTER = 335 -GLFW_KEY_KP_EQUAL = 336 -GLFW_KEY_LEFT_SHIFT = 340 -GLFW_KEY_LEFT_CONTROL = 341 -GLFW_KEY_LEFT_ALT = 342 -GLFW_KEY_LEFT_SUPER = 343 -GLFW_KEY_RIGHT_SHIFT = 344 -GLFW_KEY_RIGHT_CONTROL = 345 -GLFW_KEY_RIGHT_ALT = 346 -GLFW_KEY_RIGHT_SUPER = 347 -GLFW_KEY_MENU = 348 -GLFW_KEY_LAST = GLFW_KEY_MENU -MODIFIER_KEYS = ( - GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT, GLFW_KEY_LEFT_ALT, - GLFW_KEY_RIGHT_ALT, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_RIGHT_CONTROL, - GLFW_KEY_LEFT_SUPER, GLFW_KEY_RIGHT_SUPER) - - -# --- Modifiers --------------------------------------------------------------- -GLFW_MOD_SHIFT = 0x0001 -GLFW_MOD_CONTROL = 0x0002 -GLFW_MOD_ALT = 0x0004 -GLFW_MOD_SUPER = 0x0008 - -# --- Mouse ------------------------------------------------------------------- -GLFW_MOUSE_BUTTON_1 = 0 -GLFW_MOUSE_BUTTON_2 = 1 -GLFW_MOUSE_BUTTON_3 = 2 -GLFW_MOUSE_BUTTON_4 = 3 -GLFW_MOUSE_BUTTON_5 = 4 -GLFW_MOUSE_BUTTON_6 = 5 -GLFW_MOUSE_BUTTON_7 = 6 -GLFW_MOUSE_BUTTON_8 = 7 -GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8 -GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1 -GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2 -GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3 - - -# --- Joystick ---------------------------------------------------------------- -GLFW_JOYSTICK_1 = 0 -GLFW_JOYSTICK_2 = 1 -GLFW_JOYSTICK_3 = 2 -GLFW_JOYSTICK_4 = 3 -GLFW_JOYSTICK_5 = 4 -GLFW_JOYSTICK_6 = 5 -GLFW_JOYSTICK_7 = 6 -GLFW_JOYSTICK_8 = 7 -GLFW_JOYSTICK_9 = 8 -GLFW_JOYSTICK_10 = 9 -GLFW_JOYSTICK_11 = 10 -GLFW_JOYSTICK_12 = 11 -GLFW_JOYSTICK_13 = 12 -GLFW_JOYSTICK_14 = 13 -GLFW_JOYSTICK_15 = 14 -GLFW_JOYSTICK_16 = 15 -GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16 - - -# --- Error codes ------------------------------------------------------------- -GLFW_NOT_INITIALIZED = 0x00010001 -GLFW_NO_CURRENT_CONTEXT = 0x00010002 -GLFW_INVALID_ENUM = 0x00010003 -GLFW_INVALID_VALUE = 0x00010004 -GLFW_OUT_OF_MEMORY = 0x00010005 -GLFW_API_UNAVAILABLE = 0x00010006 -GLFW_VERSION_UNAVAILABLE = 0x00010007 -GLFW_PLATFORM_ERROR = 0x00010008 -GLFW_FORMAT_UNAVAILABLE = 0x00010009 - -# --- -GLFW_FOCUSED = 0x00020001 -GLFW_ICONIFIED = 0x00020002 -GLFW_RESIZABLE = 0x00020003 -GLFW_VISIBLE = 0x00020004 -GLFW_DECORATED = 0x00020005 -GLFW_AUTO_ICONIFY = 0x00020006 -GLFW_FLOATING = 0x00020007 - -# --- -GLFW_RED_BITS = 0x00021001 -GLFW_GREEN_BITS = 0x00021002 -GLFW_BLUE_BITS = 0x00021003 -GLFW_ALPHA_BITS = 0x00021004 -GLFW_DEPTH_BITS = 0x00021005 -GLFW_STENCIL_BITS = 0x00021006 -GLFW_ACCUM_RED_BITS = 0x00021007 -GLFW_ACCUM_GREEN_BITS = 0x00021008 -GLFW_ACCUM_BLUE_BITS = 0x00021009 -GLFW_ACCUM_ALPHA_BITS = 0x0002100A -GLFW_AUX_BUFFERS = 0x0002100B -GLFW_STEREO = 0x0002100C -GLFW_SAMPLES = 0x0002100D -GLFW_SRGB_CAPABLE = 0x0002100E -GLFW_REFRESH_RATE = 0x0002100F -GLFW_DOUBLEBUFFER = 0x00021010 - -# --- -GLFW_CLIENT_API = 0x00022001 -GLFW_CONTEXT_VERSION_MAJOR = 0x00022002 -GLFW_CONTEXT_VERSION_MINOR = 0x00022003 -GLFW_CONTEXT_REVISION = 0x00022004 -GLFW_CONTEXT_ROBUSTNESS = 0x00022005 -GLFW_OPENGL_FORWARD_COMPAT = 0x00022006 -GLFW_OPENGL_DEBUG_CONTEXT = 0x00022007 -GLFW_OPENGL_PROFILE = 0x00022008 - -# --- -GLFW_OPENGL_API = 0x00030001 -GLFW_OPENGL_ES_API = 0x00030002 - -# --- -GLFW_NO_ROBUSTNESS = 0 -GLFW_NO_RESET_NOTIFICATION = 0x00031001 -GLFW_LOSE_CONTEXT_ON_RESET = 0x00031002 - -# --- -GLFW_OPENGL_ANY_PROFILE = 0 -GLFW_OPENGL_CORE_PROFILE = 0x00032001 -GLFW_OPENGL_COMPAT_PROFILE = 0x00032002 - -# --- -GLFW_CURSOR = 0x00033001 -GLFW_STICKY_KEYS = 0x00033002 -GLFW_STICKY_MOUSE_BUTTONS = 0x00033003 - -# --- -GLFW_CURSOR_NORMAL = 0x00034001 -GLFW_CURSOR_HIDDEN = 0x00034002 -GLFW_CURSOR_DISABLED = 0x00034003 - -# --- -GLFW_CONNECTED = 0x00040001 -GLFW_DISCONNECTED = 0x00040002 diff --git a/kitty/config.py b/kitty/config.py index db85893a5..05debbffc 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -7,9 +7,10 @@ import sys import os from collections import namedtuple -import glfw_constants as glfw - -from .fast_data_types import CURSOR_BLOCK, CURSOR_BEAM, CURSOR_UNDERLINE +from .fast_data_types import ( + CURSOR_BLOCK, CURSOR_BEAM, CURSOR_UNDERLINE +) +import kitty.fast_data_types as defines from .utils import to_color key_pat = re.compile(r'([a-zA-Z][a-zA-Z0-9_-]*)\s+(.+)$') @@ -67,12 +68,12 @@ def parse_key(val, keymap): mods = 0 for m in parts[:-1]: try: - mods |= getattr(glfw, 'GLFW_MOD_' + map_mod(m.upper())) + mods |= getattr(defines, 'GLFW_MOD_' + map_mod(m.upper())) except AttributeError: print('Shortcut: {} has an unknown modifier, ignoring'.format(val), file=sys.stderr) return - key = getattr(glfw, 'GLFW_KEY_' + parts[-1].upper(), None) + key = getattr(defines, 'GLFW_KEY_' + parts[-1].upper(), None) if key is None: print('Shortcut: {} has an unknown key, ignoring'.format(val), file=sys.stderr) return diff --git a/kitty/constants.py b/kitty/constants.py index c15e4a202..8d5a6ac2d 100644 --- a/kitty/constants.py +++ b/kitty/constants.py @@ -8,6 +8,11 @@ import pwd import ctypes from collections import namedtuple +from .fast_data_types import ( + GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT, GLFW_KEY_LEFT_ALT, + GLFW_KEY_RIGHT_ALT, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_RIGHT_CONTROL, + GLFW_KEY_LEFT_SUPER, GLFW_KEY_RIGHT_SUPER) + appname = 'kitty' version = (0, 1, 0) str_version = '.'.join(map(str, version)) @@ -73,3 +78,8 @@ if ctypes.sizeof(GLfloat) != 4: raise RuntimeError('float size is not 4') if ctypes.sizeof(GLint) != 4: raise RuntimeError('int size is not 4') + +MODIFIER_KEYS = ( + GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT, GLFW_KEY_LEFT_ALT, + GLFW_KEY_RIGHT_ALT, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_RIGHT_CONTROL, + GLFW_KEY_LEFT_SUPER, GLFW_KEY_RIGHT_SUPER) diff --git a/kitty/data-types.c b/kitty/data-types.c index 1c0684051..06383164e 100644 --- a/kitty/data-types.c +++ b/kitty/data-types.c @@ -6,6 +6,7 @@ */ #include "data-types.h" +#include "glfw.h" #include "gl.h" #include "modes.h" @@ -46,6 +47,7 @@ PyInit_fast_data_types(void) { if (!init_freetype_library(m)) return NULL; if (!init_Face(m)) return NULL; if (!add_module_gl_constants(m)) return NULL; + if (!init_glfw(m)) return NULL; PyModule_AddIntConstant(m, "BOLD", BOLD_SHIFT); PyModule_AddIntConstant(m, "ITALIC", ITALIC_SHIFT); PyModule_AddIntConstant(m, "REVERSE", REVERSE_SHIFT); diff --git a/kitty/develop_gl.py b/kitty/develop_gl.py index 21898ca67..d661257ac 100644 --- a/kitty/develop_gl.py +++ b/kitty/develop_gl.py @@ -3,7 +3,6 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal import glfw -import glfw_constants import sys import ctypes @@ -15,7 +14,9 @@ from kitty.fast_data_types import ( glUniform2f, glUniform4f, glUniform2ui, glUniform1i, glewInit, glGetString, GL_VERSION as GL_VERSION_C, GL_VENDOR, GL_SHADING_LANGUAGE_VERSION, GL_RENDERER, glClear, GL_COLOR_BUFFER_BIT, GL_TRIANGLE_FAN, glDrawArraysInstanced, - Cursor, LineBuf, ColorProfile, DATA_CELL_SIZE + Cursor, LineBuf, ColorProfile, DATA_CELL_SIZE, GLFW_CONTEXT_VERSION_MAJOR, + GLFW_CONTEXT_VERSION_MINOR, GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE, + GLFW_OPENGL_FORWARD_COMPAT ) @@ -109,11 +110,11 @@ def _main(): # These Window hints are used to specify # which opengl version to use and other details # for the opengl context that will be created - glfw.glfwWindowHint(glfw_constants.GLFW_CONTEXT_VERSION_MAJOR, GL_VERSION[0]) - glfw.glfwWindowHint(glfw_constants.GLFW_CONTEXT_VERSION_MINOR, GL_VERSION[1]) - glfw.glfwWindowHint(glfw_constants.GLFW_OPENGL_PROFILE, - glfw_constants.GLFW_OPENGL_CORE_PROFILE) - glfw.glfwWindowHint(glfw_constants.GLFW_OPENGL_FORWARD_COMPAT, True) + glfw.glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, GL_VERSION[0]) + glfw.glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, GL_VERSION[1]) + glfw.glfwWindowHint(GLFW_OPENGL_PROFILE, + GLFW_OPENGL_CORE_PROFILE) + glfw.glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, True) window = glfw.glfwCreateWindow( 1024, 1024, "Trying this crap".encode('utf-8'), None, None) diff --git a/kitty/glfw.c b/kitty/glfw.c new file mode 100644 index 000000000..d79fce69c --- /dev/null +++ b/kitty/glfw.c @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2016 Kovid Goyal + * + * Distributed under terms of the GPL3 license. + */ + +#include "data-types.h" +#include + +bool +init_glfw(PyObject *m) { +#define ADDC(n) if(PyModule_AddIntConstant(m, #n, n) != 0) return false; + ADDC(GLFW_RELEASE); + ADDC(GLFW_PRESS); + ADDC(GLFW_REPEAT); + +// --- Keys -------------------------------------------------------------------- + +// --- The unknown key --------------------------------------------------------- + ADDC(GLFW_KEY_UNKNOWN); + +// --- Printable keys ---------------------------------------------------------- + ADDC(GLFW_KEY_SPACE); + ADDC(GLFW_KEY_APOSTROPHE); + ADDC(GLFW_KEY_COMMA); + ADDC(GLFW_KEY_MINUS); + ADDC(GLFW_KEY_PERIOD); + ADDC(GLFW_KEY_SLASH); + ADDC(GLFW_KEY_0); + ADDC(GLFW_KEY_1); + ADDC(GLFW_KEY_2); + ADDC(GLFW_KEY_3); + ADDC(GLFW_KEY_4); + ADDC(GLFW_KEY_5); + ADDC(GLFW_KEY_6); + ADDC(GLFW_KEY_7); + ADDC(GLFW_KEY_8); + ADDC(GLFW_KEY_9); + ADDC(GLFW_KEY_SEMICOLON); + ADDC(GLFW_KEY_EQUAL); + ADDC(GLFW_KEY_A); + ADDC(GLFW_KEY_B); + ADDC(GLFW_KEY_C); + ADDC(GLFW_KEY_D); + ADDC(GLFW_KEY_E); + ADDC(GLFW_KEY_F); + ADDC(GLFW_KEY_G); + ADDC(GLFW_KEY_H); + ADDC(GLFW_KEY_I); + ADDC(GLFW_KEY_J); + ADDC(GLFW_KEY_K); + ADDC(GLFW_KEY_L); + ADDC(GLFW_KEY_M); + ADDC(GLFW_KEY_N); + ADDC(GLFW_KEY_O); + ADDC(GLFW_KEY_P); + ADDC(GLFW_KEY_Q); + ADDC(GLFW_KEY_R); + ADDC(GLFW_KEY_S); + ADDC(GLFW_KEY_T); + ADDC(GLFW_KEY_U); + ADDC(GLFW_KEY_V); + ADDC(GLFW_KEY_W); + ADDC(GLFW_KEY_X); + ADDC(GLFW_KEY_Y); + ADDC(GLFW_KEY_Z); + ADDC(GLFW_KEY_LEFT_BRACKET); + ADDC(GLFW_KEY_BACKSLASH); + ADDC(GLFW_KEY_RIGHT_BRACKET); + ADDC(GLFW_KEY_GRAVE_ACCENT); + ADDC(GLFW_KEY_WORLD_1); + ADDC(GLFW_KEY_WORLD_2); + +// --- Function keys ----------------------------------------------------------- + ADDC(GLFW_KEY_ESCAPE); + ADDC(GLFW_KEY_ENTER); + ADDC(GLFW_KEY_TAB); + ADDC(GLFW_KEY_BACKSPACE); + ADDC(GLFW_KEY_INSERT); + ADDC(GLFW_KEY_DELETE); + ADDC(GLFW_KEY_RIGHT); + ADDC(GLFW_KEY_LEFT); + ADDC(GLFW_KEY_DOWN); + ADDC(GLFW_KEY_UP); + ADDC(GLFW_KEY_PAGE_UP); + ADDC(GLFW_KEY_PAGE_DOWN); + ADDC(GLFW_KEY_HOME); + ADDC(GLFW_KEY_END); + ADDC(GLFW_KEY_CAPS_LOCK); + ADDC(GLFW_KEY_SCROLL_LOCK); + ADDC(GLFW_KEY_NUM_LOCK); + ADDC(GLFW_KEY_PRINT_SCREEN); + ADDC(GLFW_KEY_PAUSE); + ADDC(GLFW_KEY_F1); + ADDC(GLFW_KEY_F2); + ADDC(GLFW_KEY_F3); + ADDC(GLFW_KEY_F4); + ADDC(GLFW_KEY_F5); + ADDC(GLFW_KEY_F6); + ADDC(GLFW_KEY_F7); + ADDC(GLFW_KEY_F8); + ADDC(GLFW_KEY_F9); + ADDC(GLFW_KEY_F10); + ADDC(GLFW_KEY_F11); + ADDC(GLFW_KEY_F12); + ADDC(GLFW_KEY_F13); + ADDC(GLFW_KEY_F14); + ADDC(GLFW_KEY_F15); + ADDC(GLFW_KEY_F16); + ADDC(GLFW_KEY_F17); + ADDC(GLFW_KEY_F18); + ADDC(GLFW_KEY_F19); + ADDC(GLFW_KEY_F20); + ADDC(GLFW_KEY_F21); + ADDC(GLFW_KEY_F22); + ADDC(GLFW_KEY_F23); + ADDC(GLFW_KEY_F24); + ADDC(GLFW_KEY_F25); + ADDC(GLFW_KEY_KP_0); + ADDC(GLFW_KEY_KP_1); + ADDC(GLFW_KEY_KP_2); + ADDC(GLFW_KEY_KP_3); + ADDC(GLFW_KEY_KP_4); + ADDC(GLFW_KEY_KP_5); + ADDC(GLFW_KEY_KP_6); + ADDC(GLFW_KEY_KP_7); + ADDC(GLFW_KEY_KP_8); + ADDC(GLFW_KEY_KP_9); + ADDC(GLFW_KEY_KP_DECIMAL); + ADDC(GLFW_KEY_KP_DIVIDE); + ADDC(GLFW_KEY_KP_MULTIPLY); + ADDC(GLFW_KEY_KP_SUBTRACT); + ADDC(GLFW_KEY_KP_ADD); + ADDC(GLFW_KEY_KP_ENTER); + ADDC(GLFW_KEY_KP_EQUAL); + ADDC(GLFW_KEY_LEFT_SHIFT); + ADDC(GLFW_KEY_LEFT_CONTROL); + ADDC(GLFW_KEY_LEFT_ALT); + ADDC(GLFW_KEY_LEFT_SUPER); + ADDC(GLFW_KEY_RIGHT_SHIFT); + ADDC(GLFW_KEY_RIGHT_CONTROL); + ADDC(GLFW_KEY_RIGHT_ALT); + ADDC(GLFW_KEY_RIGHT_SUPER); + ADDC(GLFW_KEY_MENU); + ADDC(GLFW_KEY_LAST); + +// --- Modifiers --------------------------------------------------------------- + ADDC(GLFW_MOD_SHIFT); + ADDC(GLFW_MOD_CONTROL); + ADDC(GLFW_MOD_ALT); + ADDC(GLFW_MOD_SUPER); + +// --- Mouse ------------------------------------------------------------------- + ADDC(GLFW_MOUSE_BUTTON_1); + ADDC(GLFW_MOUSE_BUTTON_2); + ADDC(GLFW_MOUSE_BUTTON_3); + ADDC(GLFW_MOUSE_BUTTON_4); + ADDC(GLFW_MOUSE_BUTTON_5); + ADDC(GLFW_MOUSE_BUTTON_6); + ADDC(GLFW_MOUSE_BUTTON_7); + ADDC(GLFW_MOUSE_BUTTON_8); + ADDC(GLFW_MOUSE_BUTTON_LAST); + ADDC(GLFW_MOUSE_BUTTON_LEFT); + ADDC(GLFW_MOUSE_BUTTON_RIGHT); + ADDC(GLFW_MOUSE_BUTTON_MIDDLE); + + +// --- Joystick ---------------------------------------------------------------- + ADDC(GLFW_JOYSTICK_1); + ADDC(GLFW_JOYSTICK_2); + ADDC(GLFW_JOYSTICK_3); + ADDC(GLFW_JOYSTICK_4); + ADDC(GLFW_JOYSTICK_5); + ADDC(GLFW_JOYSTICK_6); + ADDC(GLFW_JOYSTICK_7); + ADDC(GLFW_JOYSTICK_8); + ADDC(GLFW_JOYSTICK_9); + ADDC(GLFW_JOYSTICK_10); + ADDC(GLFW_JOYSTICK_11); + ADDC(GLFW_JOYSTICK_12); + ADDC(GLFW_JOYSTICK_13); + ADDC(GLFW_JOYSTICK_14); + ADDC(GLFW_JOYSTICK_15); + ADDC(GLFW_JOYSTICK_16); + ADDC(GLFW_JOYSTICK_LAST); + + +// --- Error codes ------------------------------------------------------------- + ADDC(GLFW_NOT_INITIALIZED); + ADDC(GLFW_NO_CURRENT_CONTEXT); + ADDC(GLFW_INVALID_ENUM); + ADDC(GLFW_INVALID_VALUE); + ADDC(GLFW_OUT_OF_MEMORY); + ADDC(GLFW_API_UNAVAILABLE); + ADDC(GLFW_VERSION_UNAVAILABLE); + ADDC(GLFW_PLATFORM_ERROR); + ADDC(GLFW_FORMAT_UNAVAILABLE); + +// --- + ADDC(GLFW_FOCUSED); + ADDC(GLFW_ICONIFIED); + ADDC(GLFW_RESIZABLE); + ADDC(GLFW_VISIBLE); + ADDC(GLFW_DECORATED); + ADDC(GLFW_AUTO_ICONIFY); + ADDC(GLFW_FLOATING); + +// --- + ADDC(GLFW_RED_BITS); + ADDC(GLFW_GREEN_BITS); + ADDC(GLFW_BLUE_BITS); + ADDC(GLFW_ALPHA_BITS); + ADDC(GLFW_DEPTH_BITS); + ADDC(GLFW_STENCIL_BITS); + ADDC(GLFW_ACCUM_RED_BITS); + ADDC(GLFW_ACCUM_GREEN_BITS); + ADDC(GLFW_ACCUM_BLUE_BITS); + ADDC(GLFW_ACCUM_ALPHA_BITS); + ADDC(GLFW_AUX_BUFFERS); + ADDC(GLFW_STEREO); + ADDC(GLFW_SAMPLES); + ADDC(GLFW_SRGB_CAPABLE); + ADDC(GLFW_REFRESH_RATE); + ADDC(GLFW_DOUBLEBUFFER); + +// --- + ADDC(GLFW_CLIENT_API); + ADDC(GLFW_CONTEXT_VERSION_MAJOR); + ADDC(GLFW_CONTEXT_VERSION_MINOR); + ADDC(GLFW_CONTEXT_REVISION); + ADDC(GLFW_CONTEXT_ROBUSTNESS); + ADDC(GLFW_OPENGL_FORWARD_COMPAT); + ADDC(GLFW_OPENGL_DEBUG_CONTEXT); + ADDC(GLFW_OPENGL_PROFILE); + +// --- + ADDC(GLFW_OPENGL_API); + ADDC(GLFW_OPENGL_ES_API); + +// --- + ADDC(GLFW_NO_ROBUSTNESS); + ADDC(GLFW_NO_RESET_NOTIFICATION); + ADDC(GLFW_LOSE_CONTEXT_ON_RESET); + +// --- + ADDC(GLFW_OPENGL_ANY_PROFILE); + ADDC(GLFW_OPENGL_CORE_PROFILE); + ADDC(GLFW_OPENGL_COMPAT_PROFILE); + +// --- + ADDC(GLFW_CURSOR); + ADDC(GLFW_STICKY_KEYS); + ADDC(GLFW_STICKY_MOUSE_BUTTONS); + +// --- + ADDC(GLFW_CURSOR_NORMAL); + ADDC(GLFW_CURSOR_HIDDEN); + ADDC(GLFW_CURSOR_DISABLED); + +// --- + ADDC(GLFW_CONNECTED); + ADDC(GLFW_DISCONNECTED); + +return true; +#undef ADDC +} + + diff --git a/kitty/glfw.h b/kitty/glfw.h new file mode 100644 index 000000000..d682cd005 --- /dev/null +++ b/kitty/glfw.h @@ -0,0 +1,11 @@ +/* + * Copyright (C) 2016 Kovid Goyal + * + * Distributed under terms of the GPL3 license. + */ + +#pragma once + + +bool init_glfw(PyObject *m); + diff --git a/kitty/keys.py b/kitty/keys.py index b66b09ae8..182b567a1 100644 --- a/kitty/keys.py +++ b/kitty/keys.py @@ -2,7 +2,7 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2016, Kovid Goyal -import glfw_constants as defines +import kitty.fast_data_types as defines from .terminfo import key_as_bytes key_map = { diff --git a/kitty/main.py b/kitty/main.py index f43bae135..8ea30a434 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -13,9 +13,13 @@ from .config import load_config from .constants import appname, str_version, config_dir, viewport_size from .tabs import TabManager from .shaders import GL_VERSION -from .fast_data_types import glewInit, enable_automatic_opengl_error_checking, glClear, glClearColor, GL_COLOR_BUFFER_BIT +from .fast_data_types import ( + glewInit, enable_automatic_opengl_error_checking, glClear, glClearColor, + GL_COLOR_BUFFER_BIT, GLFW_CONTEXT_VERSION_MAJOR, + GLFW_CONTEXT_VERSION_MINOR, GLFW_OPENGL_PROFILE, + GLFW_OPENGL_FORWARD_COMPAT, GLFW_OPENGL_CORE_PROFILE, GLFW_SAMPLES +) import glfw -import glfw_constants def option_parser(): @@ -36,11 +40,11 @@ def option_parser(): def setup_opengl(): - glfw.glfwWindowHint(glfw_constants.GLFW_CONTEXT_VERSION_MAJOR, GL_VERSION[0]) - glfw.glfwWindowHint(glfw_constants.GLFW_CONTEXT_VERSION_MINOR, GL_VERSION[1]) - glfw.glfwWindowHint(glfw_constants.GLFW_OPENGL_PROFILE, glfw_constants.GLFW_OPENGL_CORE_PROFILE) - glfw.glfwWindowHint(glfw_constants.GLFW_OPENGL_FORWARD_COMPAT, True) - glfw.glfwWindowHint(glfw_constants.GLFW_SAMPLES, 0) + glfw.glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, GL_VERSION[0]) + glfw.glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, GL_VERSION[1]) + glfw.glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE) + glfw.glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, True) + glfw.glfwWindowHint(GLFW_SAMPLES, 0) def clear_buffers(window, opts): diff --git a/kitty/tabs.py b/kitty/tabs.py index 9f58e0ce2..5bf5e8ee9 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -15,10 +15,12 @@ from time import monotonic from queue import Queue, Empty import glfw -import glfw_constants from .child import Child -from .constants import viewport_size, shell_path, appname, set_tab_manager, tab_manager, wakeup, cell_size -from .fast_data_types import glViewport, glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA +from .constants import viewport_size, shell_path, appname, set_tab_manager, tab_manager, wakeup, cell_size, MODIFIER_KEYS +from .fast_data_types import ( + glViewport, glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GLFW_PRESS, + GLFW_REPEAT, GLFW_MOUSE_BUTTON_1 +) from .fonts import set_font_family from .borders import Borders, BordersProgram from .char_grid import cursor_shader, cell_shader @@ -137,6 +139,9 @@ class TabManager(Thread): glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) self.sprites.do_layout(cell_size.width, cell_size.height) self.queue_action(self.active_tab.new_window, False) + # self.standard_cursor = glfw.glfwCreateStandardCursor(GLFW_IBEAM_CURSOR) + # self.click_cursor = glfw.glfwCreateStandardCursor(GLFW_HAND_CURSOR) + # glfw.glfwSetCursor(self.glfw_window, self.standard_cursor) def signal_received(self): try: @@ -295,7 +300,7 @@ class TabManager(Thread): w.write_to_child(data) def on_key(self, window, key, scancode, action, mods): - if action == glfw_constants.GLFW_PRESS or action == glfw_constants.GLFW_REPEAT: + if action == GLFW_PRESS or action == GLFW_REPEAT: func = get_shortcut(self.opts.keymap, mods, key) tab = self.active_tab window = self.active_window @@ -306,7 +311,7 @@ class TabManager(Thread): if not passthrough: return if window: - if window.char_grid.scrolled_by and key not in glfw_constants.MODIFIER_KEYS: + if window.char_grid.scrolled_by and key not in MODIFIER_KEYS: window.scroll_end() data = interpret_key_event(key, scancode, mods) if data: @@ -325,7 +330,7 @@ class TabManager(Thread): def on_mouse_button(self, window, button, action, mods): w = self.window_for_pos(*glfw.glfwGetCursorPos(window)) if w is not None: - if button == glfw_constants.GLFW_MOUSE_BUTTON_1 and w is not self.active_window: + if button == GLFW_MOUSE_BUTTON_1 and w is not self.active_window: pass # TODO: Switch focus to this window w.on_mouse_button(window, button, action, mods) diff --git a/kitty/window.py b/kitty/window.py index 1d7c4f961..57f749ba1 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -9,11 +9,13 @@ from functools import partial from time import monotonic import glfw -import glfw_constants from .char_grid import CharGrid from .constants import wakeup, tab_manager, appname, WindowGeometry from .fast_data_types import ( - BRACKETED_PASTE_START, BRACKETED_PASTE_END, Screen, read_bytes_dump, read_bytes + BRACKETED_PASTE_START, BRACKETED_PASTE_END, Screen, read_bytes_dump, + read_bytes, GLFW_MOD_SHIFT, GLFW_MOUSE_BUTTON_1, GLFW_PRESS, + GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE, GLFW_KEY_LEFT_SHIFT, + GLFW_KEY_RIGHT_SHIFT ) from .terminfo import get_capabilities from .utils import sanitize_title, get_primary_selection @@ -125,18 +127,22 @@ class Window: glfw.glfwPostEmptyEvent() def on_mouse_button(self, window, button, action, mods): - handle_event = mods == glfw_constants.GLFW_MOD_SHIFT or not self.screen.mouse_button_tracking_enabled() + handle_event = mods == GLFW_MOD_SHIFT or not self.screen.mouse_button_tracking_enabled() if handle_event: - if button == glfw_constants.GLFW_MOUSE_BUTTON_1: + if button == GLFW_MOUSE_BUTTON_1: x, y = glfw.glfwGetCursorPos(window) x, y = max(0, x - self.geometry.left), max(0, y - self.geometry.top) - self.char_grid.update_drag(action == glfw_constants.GLFW_PRESS, x, y) - if action == glfw_constants.GLFW_RELEASE: + self.char_grid.update_drag(action == GLFW_PRESS, x, y) + if action == GLFW_RELEASE: self.click_queue.append(monotonic()) self.dispatch_multi_click(x, y) - elif button == glfw_constants.GLFW_MOUSE_BUTTON_MIDDLE: - if action == glfw_constants.GLFW_RELEASE: + elif button == GLFW_MOUSE_BUTTON_MIDDLE: + if action == GLFW_RELEASE: self.paste_from_selection() + else: + x, y = glfw.glfwGetCursorPos(window) + x, y = max(0, x - self.geometry.left), max(0, y - self.geometry.top) + x, y = self.char_grid.cell_for_pos(x, y) def on_mouse_move(self, window, x, y): if self.char_grid.current_selection.in_progress: @@ -144,8 +150,8 @@ class Window: def on_mouse_scroll(self, window, x, y): handle_event = ( - glfw.glfwGetKey(window, glfw_constants.GLFW_KEY_LEFT_SHIFT) == glfw_constants.GLFW_PRESS or - glfw.glfwGetKey(window, glfw_constants.GLFW_KEY_RIGHT_SHIFT) == glfw_constants.GLFW_PRESS or + glfw.glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS or + glfw.glfwGetKey(window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS or not self.screen.mouse_button_tracking_enabled()) if handle_event: s = int(round(y * self.opts.wheel_scroll_multiplier)) diff --git a/setup.py b/setup.py index 67c4b8610..ce527ed9e 100755 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ cflags = ldflags = cc = ldpaths = None def pkg_config(pkg, *args): - return shlex.split(subprocess.check_output(['pkg-config', pkg] + list(args)).decode('utf-8')) + return list(filter(None, shlex.split(subprocess.check_output(['pkg-config', pkg] + list(args)).decode('utf-8')))) def cc_version(): @@ -60,11 +60,13 @@ def init_env(debug=False): cflags.append('-pthread') cflags.extend(pkg_config('glew', '--cflags-only-I')) cflags.extend(pkg_config('freetype2', '--cflags-only-I')) + cflags.extend(pkg_config('glfw3', '--cflags-only-I')) ldflags.append('-pthread') ldflags.append('-shared') cflags.append('-I' + sysconfig.get_config_var('CONFINCLUDEPY')) lib = sysconfig.get_config_var('LDLIBRARY')[3:-3] - ldpaths = ['-L' + sysconfig.get_config_var('LIBDIR'), '-l' + lib] + pkg_config('glew', '--libs') + pkg_config('freetype2', '--libs') + ldpaths = ['-L' + sysconfig.get_config_var('LIBDIR'), '-l' + lib] + \ + pkg_config('glew', '--libs') + pkg_config('freetype2', '--libs') + pkg_config('glfw3', '--libs') try: os.mkdir(build_dir)