X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fphosphor.c;h=0e448f1593224f2c7672e35b6c461f77bbcc4c44;hb=39809ded547bdbb08207d3e514950425215b4410;hp=1238048976d0e3dd6c8eebb1fa36e52f464acdf9;hpb=aa75c7476aeaa84cf3abc192b376a8b03c325213;p=xscreensaver diff --git a/hacks/phosphor.c b/hacks/phosphor.c index 12380489..0e448f15 100644 --- a/hacks/phosphor.c +++ b/hacks/phosphor.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1999-2014 Jamie Zawinski +/* xscreensaver, Copyright (c) 1999-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -70,6 +70,7 @@ typedef struct { const char *program; int grid_width, grid_height; int char_width, char_height; + int xmargin, ymargin; int saved_x, saved_y; int scale; int ticks; @@ -78,7 +79,7 @@ typedef struct { int escstate; int csiparam[NPAR]; int curparam; - int unicruds; char unicrud[7]; + int unicruds; unsigned char unicrud[7]; p_char **chars; p_cell *cells; @@ -211,8 +212,20 @@ phosphor_init (Display *dpy, Window window) state->char_height = font->max_bounds.ascent + font->max_bounds.descent; } - state->grid_width = state->xgwa.width / (state->char_width * state->scale); - state->grid_height = state->xgwa.height /(state->char_height * state->scale); +# ifdef USE_IPHONE + /* Stupid iPhone X bezel. + #### This is the worst of all possible ways to do this! But how else? + */ + if (state->xgwa.width == 2436 || state->xgwa.height == 2436) { + state->xmargin = 96; + state->ymargin = state->xmargin; + } +# endif + + state->grid_width = ((state->xgwa.width - state->xmargin * 2) / + (state->char_width * state->scale)); + state->grid_height = ((state->xgwa.height - state->ymargin * 2) / + (state->char_height * state->scale)); state->cells = (p_cell *) calloc (sizeof(p_cell), state->grid_width * state->grid_height); state->chars = (p_char **) calloc (sizeof(p_char *), 256); @@ -324,8 +337,8 @@ phosphor_init (Display *dpy, Window window) state->tc = textclient_open (dpy); textclient_reshape (state->tc, - state->xgwa.width, - state->xgwa.height, + state->xgwa.width - state->xmargin * 2, + state->xgwa.height - state->ymargin * 2, state->grid_width - 1, state->grid_height - 1, 0); @@ -346,8 +359,17 @@ resize_grid (p_state *state) XGetWindowAttributes (state->dpy, state->window, &state->xgwa); - state->grid_width = state->xgwa.width /(state->char_width * state->scale); - state->grid_height = state->xgwa.height /(state->char_height * state->scale); + /* Would like to ensure here that + state->char_height * state->scale <= state->xgwa.height + but changing scale requires regenerating the bitmaps. */ + + state->grid_width = ((state->xgwa.width - state->xmargin * 2) / + (state->char_width * state->scale)); + state->grid_height = ((state->xgwa.height - state->ymargin * 2) / + (state->char_height * state->scale)); + + if (state->grid_width < 2) state->grid_width = 2; + if (state->grid_height < 2) state->grid_height = 2; if (ow == state->grid_width && oh == state->grid_height) @@ -729,6 +751,56 @@ scroll (p_state *state) } +static int +process_unicrud (p_state *state, int c) +{ + if ((c & 0xE0) == 0xC0) { /* 110xxxxx: 11 bits, 2 bytes */ + state->unicruds = 1; + state->unicrud[0] = c; + state->escstate = 102; + } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx: 16 bits, 3 bytes */ + state->unicruds = 1; + state->unicrud[0] = c; + state->escstate = 103; + } else if ((c & 0xF8) == 0xF0) { /* 11110xxx: 21 bits, 4 bytes */ + state->unicruds = 1; + state->unicrud[0] = c; + state->escstate = 104; + } else if ((c & 0xFC) == 0xF8) { /* 111110xx: 26 bits, 5 bytes */ + state->unicruds = 1; + state->unicrud[0] = c; + state->escstate = 105; + } else if ((c & 0xFE) == 0xFC) { /* 1111110x: 31 bits, 6 bytes */ + state->unicruds = 1; + state->unicrud[0] = c; + state->escstate = 106; + } else if (state->unicruds == 0) { + return c; + } else { + int total = state->escstate - 100; /* see what I did there */ + if (state->unicruds < total) { + /* Buffer more bytes of the UTF-8 sequence */ + state->unicrud[state->unicruds++] = c; + } + + if (state->unicruds >= total) { + /* Done! Convert it to Latin1 and print that. */ + char *s; + state->unicrud[state->unicruds] = 0; + s = utf8_to_latin1 ((const char *) state->unicrud, False); + state->unicruds = 0; + state->escstate = 0; + if (s) { + c = (unsigned char) s[0]; + free (s); + return c; + } + } + } + return 0; +} + + static void print_char (p_state *state, int c) { @@ -831,36 +903,10 @@ print_char (p_state *state, int c) break; default: - /* states 102-106 are for UTF-8 decoding */ - - if ((c & 0xE0) == 0xC0) { /* 110xxxxx: 11 bits, 2 bytes */ - state->unicruds = 1; - state->unicrud[0] = c; - state->escstate = 102; + PRINT: /* Come from states 102-106 */ + c = process_unicrud (state, c); + if (! c) break; - } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx: 16 bits, 3 bytes */ - state->unicruds = 1; - state->unicrud[0] = c; - state->escstate = 103; - break; - } else if ((c & 0xF8) == 0xF0) { /* 11110xxx: 21 bits, 4 bytes */ - state->unicruds = 1; - state->unicrud[0] = c; - state->escstate = 104; - break; - } else if ((c & 0xFC) == 0xF8) { /* 111110xx: 26 bits, 5 bytes */ - state->unicruds = 1; - state->unicrud[0] = c; - state->escstate = 105; - break; - } else if ((c & 0xFE) == 0xFC) { /* 1111110x: 31 bits, 6 bytes */ - state->unicruds = 1; - state->unicrud[0] = c; - state->escstate = 106; - break; - } - - PRINT: /* If the cursor is in column 39 and we print a character, then that character shows up in column 39, and the cursor is no @@ -1137,35 +1183,12 @@ print_char (p_state *state, int c) state->escstate = 0; break; - case 102: + case 102: /* states 102-106 are for UTF-8 decoding */ case 103: case 104: case 105: case 106: - { - int total = state->escstate - 100; /* see what I did there */ - if (state->unicruds < total) { - /* Buffer more bytes of the UTF-8 sequence */ - state->unicrud[state->unicruds++] = c; - } - - if (state->unicruds >= total) { - /* Done! Convert it to Latin1 and print that. */ - char *s; - state->unicrud[state->unicruds] = 0; - s = utf8_to_latin1 ((const char *) state->unicrud, False); - state->unicruds = 0; - state->escstate = 0; - if (s) { - c = (unsigned char) s[0]; - free (s); - goto PRINT; - } else { - c = 0; - } - } - } - break; + goto PRINT; default: abort(); @@ -1196,7 +1219,8 @@ print_char (p_state *state, int c) } else { - /* #### This should do UTF-8 decoding */ + c = process_unicrud (state, c); + if (!c) return; cell->state = FLARE; cell->p_char = state->chars[c]; @@ -1236,10 +1260,10 @@ update_display (p_state *state, Bool changed_only) if (changed_only && !cell->changed) continue; - width = state->char_width * state->scale; + width = state->char_width * state->scale; height = state->char_height * state->scale; - tx = x * width; - ty = y * height; + tx = x * width + state->xmargin; + ty = y * height + state->ymargin; if (cell->state == BLANK || cell->p_char->blank_p) { @@ -1305,7 +1329,9 @@ phosphor_reshape (Display *dpy, Window window, void *closure, if (! changed_p) return; - textclient_reshape (state->tc, w, h, + textclient_reshape (state->tc, + w - state->xmargin * 2, + h - state->ymargin * 2, state->grid_width - 1, state->grid_height - 1, 0); @@ -1341,6 +1367,7 @@ phosphor_free (Display *dpy, Window window, void *closure) static const char *phosphor_defaults [] = { +/* ".lowrez: true",*/ ".background: Black", ".foreground: #00FF00", "*fpsSolid: true",