Get rid of the cursor program
Cursors will now be drawn in the cell program using a sprite
This commit is contained in:
parent
c49dd12855
commit
2c27316c4a
@ -491,14 +491,6 @@ pyset_iutf8(ChildMonitor *self, PyObject *args) {
|
|||||||
|
|
||||||
static double last_render_at = -DBL_MAX;
|
static double last_render_at = -DBL_MAX;
|
||||||
|
|
||||||
static inline double
|
|
||||||
cursor_width(double w, bool vert, OSWindow *os_window) {
|
|
||||||
double dpi = vert ? os_window->fonts_data->logical_dpi_x : os_window->fonts_data->logical_dpi_y;
|
|
||||||
double ans = w * dpi / 72.0; // as pixels
|
|
||||||
double factor = 2.0 / (vert ? os_window->viewport_width : os_window->viewport_height);
|
|
||||||
return ans * factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void cocoa_update_title(PyObject*);
|
extern void cocoa_update_title(PyObject*);
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@ -526,23 +518,6 @@ collect_cursor_info(CursorRenderInfo *ans, Window *w, double now, OSWindow *os_w
|
|||||||
ans->shape = cursor->shape ? cursor->shape : OPT(cursor_shape);
|
ans->shape = cursor->shape ? cursor->shape : OPT(cursor_shape);
|
||||||
ans->color = colorprofile_to_color(cp, cp->overridden.cursor_color, cp->configured.cursor_color);
|
ans->color = colorprofile_to_color(cp, cp->overridden.cursor_color, cp->configured.cursor_color);
|
||||||
ans->is_focused = os_window->is_focused;
|
ans->is_focused = os_window->is_focused;
|
||||||
if (ans->shape == CURSOR_BLOCK && ans->is_focused) return;
|
|
||||||
double left = rd->xstart + cursor->x * rd->dx;
|
|
||||||
double top = rd->ystart - cursor->y * rd->dy;
|
|
||||||
unsigned long mult = MAX(1, screen_current_char_width(rd->screen));
|
|
||||||
double right = left + (ans->shape == CURSOR_BEAM ? cursor_width(1.5, true, os_window) : rd->dx * mult);
|
|
||||||
double bottom = top - rd->dy;
|
|
||||||
switch (ans->shape) {
|
|
||||||
case CURSOR_UNDERLINE:
|
|
||||||
top = bottom + cursor_width(2.0, false, os_window);
|
|
||||||
break;
|
|
||||||
case CURSOR_BLOCK:
|
|
||||||
top -= 2.0 / os_window->viewport_height; // 1px adjustment for width of line
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ans->left = left; ans->right = right; ans->top = top; ans->bottom = bottom;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
@ -614,9 +589,6 @@ render_os_window(OSWindow *os_window, double now, unsigned int active_window_id,
|
|||||||
if (w->visible && WD.screen) {
|
if (w->visible && WD.screen) {
|
||||||
bool is_active_window = i == tab->active_window;
|
bool is_active_window = i == tab->active_window;
|
||||||
draw_cells(WD.vao_idx, WD.gvao_idx, WD.xstart, WD.ystart, WD.dx, WD.dy, WD.screen, os_window, is_active_window, true);
|
draw_cells(WD.vao_idx, WD.gvao_idx, WD.xstart, WD.ystart, WD.dx, WD.dy, WD.screen, os_window, is_active_window, true);
|
||||||
if (is_active_window && WD.screen->cursor_render_info.is_visible && (!WD.screen->cursor_render_info.is_focused || WD.screen->cursor_render_info.shape != CURSOR_BLOCK)) {
|
|
||||||
draw_cursor(&WD.screen->cursor_render_info, os_window->is_focused);
|
|
||||||
}
|
|
||||||
if (WD.screen->start_visual_bell_at != 0) {
|
if (WD.screen->start_visual_bell_at != 0) {
|
||||||
double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at);
|
double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at);
|
||||||
set_maximum_wait(bell_left);
|
set_maximum_wait(bell_left);
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
#version GLSL_VERSION
|
|
||||||
uniform vec3 color;
|
|
||||||
out vec4 final_color;
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
final_color = vec4(color, 1);
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
#version GLSL_VERSION
|
|
||||||
uniform vec4 pos;
|
|
||||||
|
|
||||||
const uvec2 pos_map[] = uvec2[4](
|
|
||||||
uvec2(1, 0), // right, top
|
|
||||||
uvec2(1, 1), // right, bottom
|
|
||||||
uvec2(0, 1), // left, bottom
|
|
||||||
uvec2(0, 0) // left, top
|
|
||||||
);
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
vec2 xpos = vec2(pos[0], pos[2]);
|
|
||||||
vec2 ypos = vec2(pos[1], pos[3]);
|
|
||||||
uvec2 pos = pos_map[gl_VertexID];
|
|
||||||
gl_Position = vec4(xpos[pos[0]], ypos[pos[1]], 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@ -197,7 +197,6 @@ typedef struct {
|
|||||||
bool is_visible, is_focused;
|
bool is_visible, is_focused;
|
||||||
CursorShape shape;
|
CursorShape shape;
|
||||||
unsigned int x, y;
|
unsigned int x, y;
|
||||||
double left, right, top, bottom;
|
|
||||||
color_type color;
|
color_type color;
|
||||||
} CursorRenderInfo;
|
} CursorRenderInfo;
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include "fonts.h"
|
#include "fonts.h"
|
||||||
#include "gl.h"
|
#include "gl.h"
|
||||||
|
|
||||||
enum { CELL_PROGRAM, CELL_BG_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FG_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, GRAPHICS_PREMULT_PROGRAM, BLIT_PROGRAM, NUM_PROGRAMS };
|
enum { CELL_PROGRAM, CELL_BG_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FG_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, GRAPHICS_PREMULT_PROGRAM, BLIT_PROGRAM, NUM_PROGRAMS };
|
||||||
enum { SPRITE_MAP_UNIT, GRAPHICS_UNIT, BLIT_UNIT };
|
enum { SPRITE_MAP_UNIT, GRAPHICS_UNIT, BLIT_UNIT };
|
||||||
|
|
||||||
// Sprites {{{
|
// Sprites {{{
|
||||||
@ -158,7 +158,7 @@ static ssize_t blit_vertex_array;
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
init_cell_program() {
|
init_cell_program() {
|
||||||
for (int i = CELL_PROGRAM; i < CURSOR_PROGRAM; i++) {
|
for (int i = CELL_PROGRAM; i < BORDERS_PROGRAM; i++) {
|
||||||
cell_program_layouts[i].render_data.index = block_index(i, "CellRenderData");
|
cell_program_layouts[i].render_data.index = block_index(i, "CellRenderData");
|
||||||
cell_program_layouts[i].render_data.size = block_size(i, cell_program_layouts[i].render_data.index);
|
cell_program_layouts[i].render_data.size = block_size(i, cell_program_layouts[i].render_data.index);
|
||||||
cell_program_layouts[i].color_table.size = get_uniform_information(i, "color_table[0]", GL_UNIFORM_SIZE);
|
cell_program_layouts[i].color_table.size = get_uniform_information(i, "color_table[0]", GL_UNIFORM_SIZE);
|
||||||
@ -167,7 +167,7 @@ init_cell_program() {
|
|||||||
}
|
}
|
||||||
// Sanity check to ensure the attribute location binding worked
|
// Sanity check to ensure the attribute location binding worked
|
||||||
#define C(p, name, expected) { int aloc = attrib_location(p, #name); if (aloc != expected && aloc != -1) fatal("The attribute location for %s is %d != %d in program: %d", #name, aloc, expected, p); }
|
#define C(p, name, expected) { int aloc = attrib_location(p, #name); if (aloc != expected && aloc != -1) fatal("The attribute location for %s is %d != %d in program: %d", #name, aloc, expected, p); }
|
||||||
for (int p = CELL_PROGRAM; p < CURSOR_PROGRAM; p++) {
|
for (int p = CELL_PROGRAM; p < BORDERS_PROGRAM; p++) {
|
||||||
C(p, colors, 0); C(p, sprite_coords, 1); C(p, is_selected, 2);
|
C(p, colors, 0); C(p, sprite_coords, 1); C(p, is_selected, 2);
|
||||||
}
|
}
|
||||||
#undef C
|
#undef C
|
||||||
@ -468,36 +468,6 @@ draw_cells(ssize_t vao_idx, ssize_t gvao_idx, GLfloat xstart, GLfloat ystart, GL
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
// Cursor {{{
|
|
||||||
enum CursorUniforms { CURSOR_color, CURSOR_pos, NUM_CURSOR_UNIFORMS };
|
|
||||||
static GLint cursor_uniform_locations[NUM_CURSOR_UNIFORMS] = {0};
|
|
||||||
static ssize_t cursor_vertex_array;
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_cursor_program() {
|
|
||||||
Program *p = programs + CURSOR_PROGRAM;
|
|
||||||
int left = NUM_CURSOR_UNIFORMS;
|
|
||||||
cursor_vertex_array = create_vao();
|
|
||||||
for (int i = 0; i < p->num_of_uniforms; i++, left--) {
|
|
||||||
#define SET_LOC(which) if (strcmp(p->uniforms[i].name, #which) == 0) cursor_uniform_locations[CURSOR_##which] = p->uniforms[i].location
|
|
||||||
SET_LOC(color);
|
|
||||||
else SET_LOC(pos);
|
|
||||||
else { fatal("Unknown uniform in cursor program: %s", p->uniforms[i].name); }
|
|
||||||
}
|
|
||||||
if (left) { fatal("Left over uniforms in cursor program"); }
|
|
||||||
#undef SET_LOC
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
draw_cursor(CursorRenderInfo *cursor, bool is_focused) {
|
|
||||||
bind_program(CURSOR_PROGRAM); bind_vertex_array(cursor_vertex_array);
|
|
||||||
glUniform3f(cursor_uniform_locations[CURSOR_color], ((cursor->color >> 16) & 0xff) / 255.0, ((cursor->color >> 8) & 0xff) / 255.0, (cursor->color & 0xff) / 255.0);
|
|
||||||
glUniform4f(cursor_uniform_locations[CURSOR_pos], cursor->left, cursor->top, cursor->right, cursor->bottom);
|
|
||||||
glDrawArrays(is_focused ? GL_TRIANGLE_FAN : GL_LINE_LOOP, 0, 4);
|
|
||||||
unbind_vertex_array(); unbind_program();
|
|
||||||
}
|
|
||||||
// }}}
|
|
||||||
|
|
||||||
// Borders {{{
|
// Borders {{{
|
||||||
enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, NUM_BORDER_UNIFORMS };
|
enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, NUM_BORDER_UNIFORMS };
|
||||||
static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0};
|
static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0};
|
||||||
@ -623,8 +593,6 @@ ONE_INT(bind_vertex_array)
|
|||||||
NO_ARG(unbind_vertex_array)
|
NO_ARG(unbind_vertex_array)
|
||||||
TWO_INT(unmap_vao_buffer)
|
TWO_INT(unmap_vao_buffer)
|
||||||
|
|
||||||
NO_ARG(init_cursor_program)
|
|
||||||
|
|
||||||
NO_ARG(init_borders_program)
|
NO_ARG(init_borders_program)
|
||||||
|
|
||||||
NO_ARG(init_cell_program)
|
NO_ARG(init_cell_program)
|
||||||
@ -651,7 +619,6 @@ static PyMethodDef module_methods[] = {
|
|||||||
MW(unmap_vao_buffer, METH_VARARGS),
|
MW(unmap_vao_buffer, METH_VARARGS),
|
||||||
MW(bind_program, METH_O),
|
MW(bind_program, METH_O),
|
||||||
MW(unbind_program, METH_NOARGS),
|
MW(unbind_program, METH_NOARGS),
|
||||||
MW(init_cursor_program, METH_NOARGS),
|
|
||||||
MW(init_borders_program, METH_NOARGS),
|
MW(init_borders_program, METH_NOARGS),
|
||||||
MW(init_cell_program, METH_NOARGS),
|
MW(init_cell_program, METH_NOARGS),
|
||||||
|
|
||||||
@ -661,7 +628,7 @@ static PyMethodDef module_methods[] = {
|
|||||||
bool
|
bool
|
||||||
init_shaders(PyObject *module) {
|
init_shaders(PyObject *module) {
|
||||||
#define C(x) if (PyModule_AddIntConstant(module, #x, x) != 0) { PyErr_NoMemory(); return false; }
|
#define C(x) if (PyModule_AddIntConstant(module, #x, x) != 0) { PyErr_NoMemory(); return false; }
|
||||||
C(CELL_PROGRAM); C(CELL_BG_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FG_PROGRAM); C(CURSOR_PROGRAM); C(BORDERS_PROGRAM); C(GRAPHICS_PROGRAM); C(GRAPHICS_PREMULT_PROGRAM); C(BLIT_PROGRAM);
|
C(CELL_PROGRAM); C(CELL_BG_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FG_PROGRAM); C(BORDERS_PROGRAM); C(GRAPHICS_PROGRAM); C(GRAPHICS_PREMULT_PROGRAM); C(BLIT_PROGRAM);
|
||||||
C(GLSL_VERSION);
|
C(GLSL_VERSION);
|
||||||
C(GL_VERSION);
|
C(GL_VERSION);
|
||||||
C(GL_VENDOR);
|
C(GL_VENDOR);
|
||||||
|
|||||||
@ -181,7 +181,6 @@ ssize_t create_graphics_vao();
|
|||||||
ssize_t create_border_vao();
|
ssize_t create_border_vao();
|
||||||
bool send_cell_data_to_gpu(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *);
|
bool send_cell_data_to_gpu(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *);
|
||||||
void draw_cells(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *, bool, bool);
|
void draw_cells(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *, bool, bool);
|
||||||
void draw_cursor(CursorRenderInfo *, bool);
|
|
||||||
void update_surface_size(int, int, uint32_t);
|
void update_surface_size(int, int, uint32_t);
|
||||||
void free_texture(uint32_t*);
|
void free_texture(uint32_t*);
|
||||||
void send_image_to_gpu(uint32_t*, const void*, int32_t, int32_t, bool, bool);
|
void send_image_to_gpu(uint32_t*, const void*, int32_t, int32_t, bool, bool);
|
||||||
|
|||||||
@ -16,13 +16,13 @@ from .constants import (
|
|||||||
)
|
)
|
||||||
from .fast_data_types import (
|
from .fast_data_types import (
|
||||||
BLIT_PROGRAM, CELL_BG_PROGRAM, CELL_FG_PROGRAM, CELL_PROGRAM,
|
BLIT_PROGRAM, CELL_BG_PROGRAM, CELL_FG_PROGRAM, CELL_PROGRAM,
|
||||||
CELL_SPECIAL_PROGRAM, CSI, CURSOR_PROGRAM, DCS, DECORATION, DIM,
|
CELL_SPECIAL_PROGRAM, CSI, DCS, DECORATION, DIM,
|
||||||
GRAPHICS_PREMULT_PROGRAM, GRAPHICS_PROGRAM, OSC, REVERSE, SCROLL_FULL,
|
GRAPHICS_PREMULT_PROGRAM, GRAPHICS_PROGRAM, OSC, REVERSE, SCROLL_FULL,
|
||||||
SCROLL_LINE, SCROLL_PAGE, STRIKETHROUGH, Screen, add_window,
|
SCROLL_LINE, SCROLL_PAGE, STRIKETHROUGH, Screen, add_window,
|
||||||
cell_size_for_window, compile_program, get_clipboard_string,
|
cell_size_for_window, compile_program, get_clipboard_string,
|
||||||
glfw_post_empty_event, init_cell_program, init_cursor_program,
|
glfw_post_empty_event, init_cell_program, set_clipboard_string,
|
||||||
set_clipboard_string, set_titlebar_color, set_window_render_data,
|
set_titlebar_color, set_window_render_data, update_window_title,
|
||||||
update_window_title, update_window_visibility, viewport_for_window
|
update_window_visibility, viewport_for_window
|
||||||
)
|
)
|
||||||
from .keys import keyboard_mode_name
|
from .keys import keyboard_mode_name
|
||||||
from .rgb import to_color
|
from .rgb import to_color
|
||||||
@ -91,8 +91,6 @@ def load_shader_programs(semi_transparent=0, cursor_text_color=None):
|
|||||||
ff = f.replace('ALPHA_TYPE', which)
|
ff = f.replace('ALPHA_TYPE', which)
|
||||||
compile_program(p, v, ff)
|
compile_program(p, v, ff)
|
||||||
init_cell_program()
|
init_cell_program()
|
||||||
compile_program(CURSOR_PROGRAM, *load_shaders('cursor'))
|
|
||||||
init_cursor_program()
|
|
||||||
|
|
||||||
|
|
||||||
def setup_colors(screen, opts):
|
def setup_colors(screen, opts):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user