mirror of
https://github.com/tmux/tmux.git
synced 2024-12-12 17:38:48 +00:00
Split colour functions from screen.
This commit is contained in:
parent
19a2c87f04
commit
ded348064a
6
CHANGES
6
CHANGES
@ -1,3 +1,7 @@
|
||||
10 September 2008
|
||||
|
||||
* Split off colour conversion code from screen code.
|
||||
|
||||
09 September 2008
|
||||
|
||||
* Initial UTF-8 support. A bit ugly and with a limit of 4096 UTF-8
|
||||
@ -660,4 +664,4 @@
|
||||
(including mutt, emacs). No status bar yet and no key remapping or other
|
||||
customisation.
|
||||
|
||||
$Id: CHANGES,v 1.159 2008-09-09 22:16:36 nicm Exp $
|
||||
$Id: CHANGES,v 1.160 2008-09-10 18:59:29 nicm Exp $
|
||||
|
7
Makefile
7
Makefile
@ -1,4 +1,4 @@
|
||||
# $Id: Makefile,v 1.73 2008-09-09 22:16:36 nicm Exp $
|
||||
# $Id: Makefile,v 1.74 2008-09-10 18:59:29 nicm Exp $
|
||||
|
||||
.SUFFIXES: .c .o .y .h
|
||||
.PHONY: clean update-index.html upload-index.html
|
||||
@ -16,7 +16,8 @@ DEBUG=
|
||||
META?= \002 # C-b
|
||||
|
||||
SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
|
||||
xmalloc.c xmalloc-debug.c input.c input-keys.c screen.c screen-display.c \
|
||||
xmalloc.c xmalloc-debug.c input.c input-keys.c \
|
||||
screen.c screen-display.c screen-write.c screen-redraw.c \
|
||||
window.c session.c log.c client.c client-msg.c client-fn.c cfg.c \
|
||||
key-string.c key-bindings.c resize.c arg.c mode-key.c \
|
||||
cmd.c cmd-generic.c cmd-string.c \
|
||||
@ -35,7 +36,7 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \
|
||||
cmd-list-commands.c cmd-move-window.c cmd-select-prompt.c \
|
||||
cmd-respawn-window.c \
|
||||
window-scroll.c window-more.c window-copy.c options.c paste.c \
|
||||
tty.c tty-keys.c tty-write.c screen-write.c screen-redraw.c utf8.c
|
||||
tty.c tty-keys.c tty-write.c colour.c utf8.c
|
||||
|
||||
CC?= cc
|
||||
INCDIRS+= -I. -I- -I/usr/local/include
|
||||
|
91
TODO
91
TODO
@ -41,6 +41,18 @@
|
||||
|
||||
-- For 0.5 --------------------------------------------------------------------
|
||||
|
||||
XXX
|
||||
screen contains grid
|
||||
|
||||
screen_write <-- write to TTY and to screen using close-to-ANSI functions
|
||||
screen_redraw <-- write areas of screen to TTY
|
||||
grid_view <-- write to viewable area of grid
|
||||
grid <-- manipulate grid and history
|
||||
|
||||
XXX
|
||||
grid_view has ox,oy
|
||||
XXX
|
||||
|
||||
- FINISH UTF8: fix copy and paste
|
||||
- SPLIT u_short attr into attr,flags?
|
||||
- maybe rethink backend data structure?
|
||||
@ -54,6 +66,16 @@
|
||||
- write to ttys without updating screen
|
||||
|
||||
---
|
||||
NEED to be able to:
|
||||
resize screen
|
||||
apply ops to both screen and tty simultaneously
|
||||
both when parsing input and when eg scrolling history
|
||||
draw on the top of the screen without modifying it
|
||||
display arbitrary parts of the history
|
||||
redraw arbitrary parts of the visible screen
|
||||
---
|
||||
NEVER need to draw into the history
|
||||
|
||||
split off grid manip:
|
||||
16-bit characters
|
||||
8-bit flags
|
||||
@ -62,9 +84,14 @@ split off grid manip:
|
||||
8-bit bg colour
|
||||
|
||||
struct grid_data {
|
||||
struct grid_cell **cells;
|
||||
u_int sx;
|
||||
u_int sy;
|
||||
struct grid_cell **data;
|
||||
int *sizes;
|
||||
|
||||
int sx;
|
||||
int sy;
|
||||
|
||||
int hsize;
|
||||
int hlimit;
|
||||
};
|
||||
struct grid_cell {
|
||||
u_short data;
|
||||
@ -72,7 +99,63 @@ struct grid_cell {
|
||||
u_char flags;
|
||||
u_char fg;
|
||||
u_char bg;
|
||||
}
|
||||
};
|
||||
const struct grid_default_cell = { 0x20, 0, 0, 8, 8 };
|
||||
|
||||
; grid logically split from
|
||||
; -hlimit to 0 and 0 to sy
|
||||
|
||||
; ALWAYS fill with default
|
||||
|
||||
const struct grid_cell *grid_get(int x, int y);
|
||||
void grid_set(int x, int y, const struct grid_cell *cell);
|
||||
|
||||
void grid_resize()
|
||||
void grid_shift() /* shift lines into history */
|
||||
|
||||
struct grid_view {
|
||||
int ox;
|
||||
int oy;
|
||||
|
||||
int sx;
|
||||
int sy;
|
||||
|
||||
struct grid_data *gdata;
|
||||
struct grid_view *parent;
|
||||
};
|
||||
|
||||
struct grid_cell *grid_view_get_cell(int x, int y)
|
||||
void grid_view_set_cell(int x, int y, const struct grid_cell *cell);
|
||||
|
||||
int grid_view_absolute_x(int x);
|
||||
int grid_view_absolute_y(int y);
|
||||
|
||||
int grid_view_relative_x(int x);
|
||||
int grid_view_relative_y(int y);
|
||||
|
||||
void grid_view_delete_lines(int y, int ny)
|
||||
void grid_view_insert_lines(int y, int ny)
|
||||
void grid_view_clear_lines(int y, int ny)
|
||||
void grid_view_fill_lines(int y, int ny, const struct grid_cell *cell)
|
||||
|
||||
void grid_view_delete_cells(int x, int y, int nx)
|
||||
void grid_view_insert_cells(int x, int y, int nx)
|
||||
void grid_view_clear_cells(int x, int y, int nx)
|
||||
void grid_view_fill_cells(int x, int nx, const struct grid_cell *cell)
|
||||
|
||||
void grid_view_clear_area(int x, int y, int nx, int ny)
|
||||
void grid_view_fill_area(int x, int y, int nx, int ny, const struct grid_cell *cell)
|
||||
|
||||
---
|
||||
|
||||
screen has two (both grid_view):
|
||||
base and overlay
|
||||
|
||||
---
|
||||
screen_write writes into overlay if it exists and then base, also optionally to tty
|
||||
screen_draw draws overlay + base to display
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
Would it be better to just expand char to 16-bits and use it as an index only
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: cmd-set-option.c,v 1.40 2008-07-19 10:07:50 nicm Exp $ */
|
||||
/* $Id: cmd-set-option.c,v 1.41 2008-09-10 18:59:29 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -271,7 +271,7 @@ set_option_colour(struct cmd_ctx *ctx, struct options *oo,
|
||||
return;
|
||||
}
|
||||
|
||||
if ((colour = screen_stringcolour(value)) > 8) {
|
||||
if ((colour = colour_fromstring(value)) > 8) {
|
||||
ctx->error(ctx, "bad colour: %s", value);
|
||||
return;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: cmd-show-options.c,v 1.5 2008-06-23 22:12:29 nicm Exp $ */
|
||||
/* $Id: cmd-show-options.c,v 1.6 2008-09-10 18:59:29 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -135,7 +135,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
|
||||
case SET_OPTION_COLOUR:
|
||||
vn = options_get_number(oo, entry->name);
|
||||
ctx->print(ctx, "%s %s",
|
||||
entry->name, screen_colourstring(vn));
|
||||
entry->name, colour_tostring(vn));
|
||||
break;
|
||||
case SET_OPTION_FLAG:
|
||||
vn = options_get_number(oo, entry->name);
|
||||
|
74
colour.c
Normal file
74
colour.c
Normal file
@ -0,0 +1,74 @@
|
||||
/* $Id: colour.c,v 1.1 2008-09-10 18:59:29 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "tmux.h"
|
||||
|
||||
const char *
|
||||
colour_tostring(u_char c)
|
||||
{
|
||||
switch (c) {
|
||||
case 0:
|
||||
return ("black");
|
||||
case 1:
|
||||
return ("red");
|
||||
case 2:
|
||||
return ("green");
|
||||
case 3:
|
||||
return ("yellow");
|
||||
case 4:
|
||||
return ("blue");
|
||||
case 5:
|
||||
return ("magenta");
|
||||
case 6:
|
||||
return ("cyan");
|
||||
case 7:
|
||||
return ("white");
|
||||
case 8:
|
||||
return ("default");
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* String to colour. */
|
||||
u_char
|
||||
colour_fromstring(const char *s)
|
||||
{
|
||||
if (strcasecmp(s, "black") == 0 || (s[0] == '0' && s[1] == '\0'))
|
||||
return (0);
|
||||
if (strcasecmp(s, "red") == 0 || (s[0] == '1' && s[1] == '\0'))
|
||||
return (1);
|
||||
if (strcasecmp(s, "green") == 0 || (s[0] == '2' && s[1] == '\0'))
|
||||
return (2);
|
||||
if (strcasecmp(s, "yellow") == 0 || (s[0] == '3' && s[1] == '\0'))
|
||||
return (3);
|
||||
if (strcasecmp(s, "blue") == 0 || (s[0] == '4' && s[1] == '\0'))
|
||||
return (4);
|
||||
if (strcasecmp(s, "magenta") == 0 || (s[0] == '5' && s[1] == '\0'))
|
||||
return (5);
|
||||
if (strcasecmp(s, "cyan") == 0 || (s[0] == '6' && s[1] == '\0'))
|
||||
return (6);
|
||||
if (strcasecmp(s, "white") == 0 || (s[0] == '7' && s[1] == '\0'))
|
||||
return (7);
|
||||
if (strcasecmp(s, "default") == 0 || (s[0] == '8' && s[1] == '\0'))
|
||||
return (8);
|
||||
return (255);
|
||||
}
|
54
screen.c
54
screen.c
@ -1,4 +1,4 @@
|
||||
/* $Id: screen.c,v 1.69 2008-09-09 22:16:36 nicm Exp $ */
|
||||
/* $Id: screen.c,v 1.70 2008-09-10 18:59:29 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -74,58 +74,6 @@
|
||||
* If you're thinking this all seems too complicated, that's because it is :-/.
|
||||
*/
|
||||
|
||||
/* Colour to string. */
|
||||
const char *
|
||||
screen_colourstring(u_char c)
|
||||
{
|
||||
switch (c) {
|
||||
case 0:
|
||||
return ("black");
|
||||
case 1:
|
||||
return ("red");
|
||||
case 2:
|
||||
return ("green");
|
||||
case 3:
|
||||
return ("yellow");
|
||||
case 4:
|
||||
return ("blue");
|
||||
case 5:
|
||||
return ("magenta");
|
||||
case 6:
|
||||
return ("cyan");
|
||||
case 7:
|
||||
return ("white");
|
||||
case 8:
|
||||
return ("default");
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* String to colour. */
|
||||
u_char
|
||||
screen_stringcolour(const char *s)
|
||||
{
|
||||
if (strcasecmp(s, "black") == 0 || (s[0] == '0' && s[1] == '\0'))
|
||||
return (0);
|
||||
if (strcasecmp(s, "red") == 0 || (s[0] == '1' && s[1] == '\0'))
|
||||
return (1);
|
||||
if (strcasecmp(s, "green") == 0 || (s[0] == '2' && s[1] == '\0'))
|
||||
return (2);
|
||||
if (strcasecmp(s, "yellow") == 0 || (s[0] == '3' && s[1] == '\0'))
|
||||
return (3);
|
||||
if (strcasecmp(s, "blue") == 0 || (s[0] == '4' && s[1] == '\0'))
|
||||
return (4);
|
||||
if (strcasecmp(s, "magenta") == 0 || (s[0] == '5' && s[1] == '\0'))
|
||||
return (5);
|
||||
if (strcasecmp(s, "cyan") == 0 || (s[0] == '6' && s[1] == '\0'))
|
||||
return (6);
|
||||
if (strcasecmp(s, "white") == 0 || (s[0] == '7' && s[1] == '\0'))
|
||||
return (7);
|
||||
if (strcasecmp(s, "default") == 0 || (s[0] == '8' && s[1] == '\0'))
|
||||
return (8);
|
||||
return (255);
|
||||
}
|
||||
|
||||
/* Create a new screen. */
|
||||
void
|
||||
screen_create(struct screen *s, u_int dx, u_int dy, u_int hlimit)
|
||||
|
8
tmux.h
8
tmux.h
@ -1,4 +1,4 @@
|
||||
/* $Id: tmux.h,v 1.186 2008-09-09 22:16:37 nicm Exp $ */
|
||||
/* $Id: tmux.h,v 1.187 2008-09-10 18:59:29 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -1171,6 +1171,10 @@ void input_parse(struct window *);
|
||||
/* input-key.c */
|
||||
void input_key(struct window *, int);
|
||||
|
||||
/* colour.c */
|
||||
const char *colour_tostring(u_char);
|
||||
u_char colour_fromstring(const char *);
|
||||
|
||||
/* screen-display.c */
|
||||
void screen_display_get_cell(struct screen *,
|
||||
u_int, u_int, u_char *, u_short *, u_char *, u_char *);
|
||||
@ -1251,8 +1255,6 @@ void screen_redraw_lines(struct screen_redraw_ctx *, u_int, u_int);
|
||||
void screen_redraw_columns(struct screen_redraw_ctx *, u_int, u_int);
|
||||
|
||||
/* screen.c */
|
||||
const char *screen_colourstring(u_char);
|
||||
u_char screen_stringcolour(const char *);
|
||||
void screen_create(struct screen *, u_int, u_int, u_int);
|
||||
void screen_reset(struct screen *);
|
||||
void screen_destroy(struct screen *);
|
||||
|
Loading…
Reference in New Issue
Block a user