Skip to content

Commit

Permalink
Fix random segfaults on start, add pointer options
Browse files Browse the repository at this point in the history
  • Loading branch information
91861 committed Jan 11, 2021
1 parent f475e25 commit 496f281
Show file tree
Hide file tree
Showing 16 changed files with 439 additions and 298 deletions.
23 changes: 20 additions & 3 deletions src/colors.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ typedef struct
#define COLOR_RGBA_FMT "rgb(%d, %d, %d, %f)"
#define COLOR_RGBA_AP(c) (c.r), (c.g), (c.b), (ColorRGBA_get_float(c, 3))

_Thread_local static char _termcolorbuf[64];

static char* termcolor_fg_rgb(uint8_t r, uint8_t g, uint8_t b)
{
_Thread_local static char _termcolorbuf[64];
sprintf(_termcolorbuf, "\e[38;2;%u;%u;%um", r, g, b);
return _termcolorbuf;
}

static char* termcolor_bg_rgb(uint8_t r, uint8_t g, uint8_t b)
{
_Thread_local static char _termcolorbuf[64];
sprintf(_termcolorbuf, "\e[48;2;%u;%u;%um", r, g, b);
return _termcolorbuf;
}
Expand Down Expand Up @@ -279,7 +279,24 @@ static inline float ColorRGB_get_saturation(const ColorRGB c)
return ((float)delta / 255.0f) / (1 - ABS(2 * lightness - 1.0));
}


float ColorRGB_get_readability_WCAG(const ColorRGB* color1, const ColorRGB* color2);

bool ColorRGB_is_readable_WCAG(const ColorRGB* color1, const ColorRGB* color2);

_Thread_local static char _ColorRGB_term_string[128];
static char* ColorRGB_to_term_string(ColorRGB color)
{
uint8_t fg_cmp = ColorRGB_get_luma(color) < 0.5 ? 255 : 0;
char* t_bg = termcolor_bg_rgb(color.r, color.g, color.b);
size_t off = strlen(t_bg);
memccpy(_ColorRGB_term_string, t_bg, 1, off);
off += snprintf(_ColorRGB_term_string + off,
ARRAY_SIZE(_ColorRGB_term_string) - off,
"%s",
termcolor_fg_rgb(fg_cmp, fg_cmp, fg_cmp));
snprintf(_ColorRGB_term_string + off,
ARRAY_SIZE(_ColorRGB_term_string) - off,
COLOR_RGB_FMT,
COLOR_RGB_AP(color));
return _ColorRGB_term_string;
}
48 changes: 47 additions & 1 deletion src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ static void App_handle_uri(App* self, const char* uri);
static void App_update_hover(App* self, int32_t x, int32_t y);
static void App_update_padding(App* self);
static void App_set_title(void* self);
static void App_focus_changed(void* self, bool current_state);

static void* App_load_extension_proc_address(void* self, const char* name)
{
Expand Down Expand Up @@ -193,6 +194,9 @@ static void App_init(App* self)
App_create_window(self, Gfx_pixels(self->gfx, settings.cols, settings.rows));
App_set_callbacks(self);

/* We may have gotten events during initialization. We can ignore everything except for focus */
App_focus_changed(self, FLAG_IS_SET(self->win->state_flags, WINDOW_IS_IN_FOCUS));

settings_after_window_system_connected();
Window_set_swap_interval(self->win, 0);
Gfx_init_with_context_activated(self->gfx);
Expand Down Expand Up @@ -1165,11 +1169,52 @@ static bool App_maybe_handle_application_key(App* self,
return false;
}

void App_gui_pointer_mode_change_handler(void* self)
{
#define L_SET_POINTER_STYLE \
if (app->selection_dragging_left || app->selection_dragging_right) { \
Window_set_pointer_style(app->win, MOUSE_POINTER_I_BEAM); \
} else { \
Window_set_pointer_style(app->win, MOUSE_POINTER_ARROW); \
}

App* app = self;
switch (app->vt.gui_pointer_mode) {
case VT_GUI_POINTER_MODE_FORCE_HIDE:
case VT_GUI_POINTER_MODE_HIDE:
Window_set_pointer_style(app->win, MOUSE_POINTER_HIDDEN);
break;
case VT_GUI_POINTER_MODE_FORCE_SHOW:
case VT_GUI_POINTER_MODE_SHOW:
L_SET_POINTER_STYLE;
break;
case VT_GUI_POINTER_MODE_SHOW_IF_REPORTING:
if (Vt_is_reporting_mouse(&app->vt)) {
L_SET_POINTER_STYLE;
} else {
Window_set_pointer_style(app->win, MOUSE_POINTER_HIDDEN);
}
break;
}
}

void App_key_handler(void* self, uint32_t key, uint32_t rawkey, uint32_t mods)
{
if (!App_maybe_handle_application_key(self, key, rawkey, mods)) {
App* app = self;
Window_set_pointer_style(app->win, MOUSE_POINTER_HIDDEN);
switch (app->vt.gui_pointer_mode) {
case VT_GUI_POINTER_MODE_FORCE_HIDE:
case VT_GUI_POINTER_MODE_HIDE:
Window_set_pointer_style(app->win, MOUSE_POINTER_HIDDEN);
break;

case VT_GUI_POINTER_MODE_SHOW_IF_REPORTING:
if (!Vt_reports_mouse(&app->vt)) {
Window_set_pointer_style(app->win, MOUSE_POINTER_HIDDEN);
}
break;
default:;
}
Vt_handle_key(&app->vt, key, rawkey, mods);
}
}
Expand Down Expand Up @@ -1811,6 +1856,7 @@ static void App_set_callbacks(App* self)
self->vt.callbacks.on_command_state_changed = App_command_changed;
self->vt.callbacks.on_mouse_report_state_changed = App_mouse_report_changed;
self->vt.callbacks.on_buffer_changed = App_buffer_changed;
self->vt.callbacks.on_gui_pointer_mode_changed = App_gui_pointer_mode_change_handler;

self->win->callbacks.user_data = self;
self->win->callbacks.key_handler = App_key_handler;
Expand Down
Loading

0 comments on commit 496f281

Please sign in to comment.