diff options
| author | Justin M. Keyes <justinkz@gmail.com> | 2019-01-16 01:09:47 +0100 | 
|---|---|---|
| committer | Justin M. Keyes <justinkz@gmail.com> | 2019-01-17 13:05:51 +0100 | 
| commit | 7e9b99d55be68938689b9f593e200054533c3783 (patch) | |
| tree | 64367007412114abea467c71640fec0323bcd38d /src/nvim/tui/input.c | |
| parent | 279043d62526674118e4ddb531f8cf7195060928 (diff) | |
| parent | 5372d9a705b849459bcb5ed52823fa422d0745de (diff) | |
| download | rneovim-7e9b99d55be68938689b9f593e200054533c3783.tar.gz rneovim-7e9b99d55be68938689b9f593e200054533c3783.tar.bz2 rneovim-7e9b99d55be68938689b9f593e200054533c3783.zip  | |
Merge #5027 'TUI: detect background color'
Diffstat (limited to 'src/nvim/tui/input.c')
| -rw-r--r-- | src/nvim/tui/input.c | 65 | 
1 files changed, 64 insertions, 1 deletions
diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c index a0df80a8e8..e0dd4022ed 100644 --- a/src/nvim/tui/input.c +++ b/src/nvim/tui/input.c @@ -7,8 +7,10 @@  #include "nvim/api/vim.h"  #include "nvim/api/private/helpers.h"  #include "nvim/ascii.h" +#include "nvim/charset.h"  #include "nvim/main.h"  #include "nvim/aucmd.h" +#include "nvim/option.h"  #include "nvim/os/os.h"  #include "nvim/os/input.h"  #include "nvim/event/rstream.h" @@ -352,6 +354,66 @@ static bool handle_forced_escape(TermInput *input)    return false;  } +static void set_bg_deferred(void **argv) +{ +  char *bgvalue = argv[0]; +  set_string_default("bg", bgvalue, false); +  if (!option_was_set("bg")) { +    set_option_value("bg", 0, bgvalue, 0); +  } +} + +static bool handle_background_color(TermInput *input) +{ +  size_t count = 0; +  size_t component = 0; +  uint16_t rgb[] = { 0, 0, 0 }; +  uint16_t rgb_max[] = { 0, 0, 0 }; +  bool eat_backslash = false; +  bool done = false; +  bool bad = false; +  if (rbuffer_size(input->read_stream.buffer) >= 9 +      && !rbuffer_cmp(input->read_stream.buffer, "\x1b]11;rgb:", 9)) { +    rbuffer_consumed(input->read_stream.buffer, 9); +    RBUFFER_EACH(input->read_stream.buffer, c, i) { +      count = i + 1; +      if (eat_backslash) { +        done = true; +        break; +      } else if (c == '\x07') { +        done = true; +        break; +      } else if (c == '\x1b') { +        eat_backslash = true; +      } else if (bad) { +        // ignore +      } else if (c == '/') { +        if (component < 3) { +          component++; +        } +      } else if (ascii_isxdigit(c)) { +        if (component < 3 && rgb_max[component] != 0xffff) { +          rgb_max[component] = (uint16_t)((rgb_max[component] << 4) | 0xf); +          rgb[component] = (uint16_t)((rgb[component] << 4) | hex2nr(c)); +        } +      } else { +        bad = true; +      } +    } +    rbuffer_consumed(input->read_stream.buffer, count); +    if (done && !bad && rgb_max[0] && rgb_max[1] && rgb_max[2]) { +      double r = (double)rgb[0] / (double)rgb_max[0]; +      double g = (double)rgb[1] / (double)rgb_max[1]; +      double b = (double)rgb[2] / (double)rgb_max[2]; +      double luminance = (0.299 * r) + (0.587 * g) + (0.114 * b);  // CCIR 601 +      char *bgvalue = luminance < 0.5 ? "dark" : "light"; +      loop_schedule(&main_loop, event_create(set_bg_deferred, 1, bgvalue)); +    } +    return true; +  } +  return false; +} +  static void read_cb(Stream *stream, RBuffer *buf, size_t count_, void *data,                      bool eof)  { @@ -381,7 +443,8 @@ static void read_cb(Stream *stream, RBuffer *buf, size_t count_, void *data,    do {      if (handle_focus_event(input)          || handle_bracketed_paste(input) -        || handle_forced_escape(input)) { +        || handle_forced_escape(input) +        || handle_background_color(input)) {        continue;      }  | 
