1 /*@ S-nail - a mail user agent derived from Berkeley Mail.
2 *@ `(un)?colour' commands, and anything working with it.
4 * Copyright (c) 2014 - 2020 Steffen (Daode) Nurpmeso <steffen@sdaoden.eu>.
5 * SPDX-License-Identifier: ISC
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 #include <su/code-in.h>
30 /* Injection, if mx_HAVE_COLOUR */
31 #define mx_COLOUR(X) X
33 /* We do have several contexts of colour IDs; since only one of them can be
34 * active at any given time let's share the value range */
44 mx_COLOUR_ID_SUM_DOTMARK
= 0,
45 mx_COLOUR_ID_SUM_HEADER
,
46 mx_COLOUR_ID_SUM_THREAD
,
49 mx_COLOUR_ID_VIEW_FROM_
= 0,
50 mx_COLOUR_ID_VIEW_HEADER
,
51 mx_COLOUR_ID_VIEW_MSGINFO
,
52 mx_COLOUR_ID_VIEW_PARTINFO
,
54 /* Mailx-Line-Editor */
55 mx_COLOUR_ID_MLE_POSITION
= 0,
56 mx_COLOUR_ID_MLE_PROMPT
,
57 mx_COLOUR_ID_MLE_ERROR
,
59 mx__COLOUR_IDS
= mx_COLOUR_ID_VIEW_PARTINFO
+ 1
62 /* Some non-string colour precondition constants, let us call them tags */
63 #define mx_COLOUR_TAG_SUM_DOT R(char*,-2)
64 #define mx_COLOUR_TAG_SUM_OLDER R(char*,-3)
66 enum mx_colour_get_flags
{
67 mx_COLOUR_GET_FORCED
= 1u<<0, /* Act even if COLOUR_IS_ACTIVE() is false */
68 mx_COLOUR_PAGER_USED
= 1u<<1 /* Assume output goes to pager */
72 struct mx_colour_env
*ce_last
;
73 boole ce_enabled
; /* Colour enabled on this level */
74 u8 ce_ctx
; /* enum mx_colour_ctx */
75 u8 ce_ispipe
; /* .ce_outfp known to be a pipe */
78 struct a_colour_map
*ce_current
; /* Active colour or NIL */
84 EXPORT
int c_colour(void *v
);
85 EXPORT
int c_uncolour(void *v
);
87 /* TODO All the colour (pen etc. ) interfaces below have to vanish.
88 * TODO What we need here is a series of query functions which take context,
89 * TODO like a message* for the _VIEW_ series, and which return a 64-bit
90 * TODO flag carrier which returns font-attributes as well as foreground and
91 * TODO background colours (at least 24-bit each).
92 * TODO And the actual drawing stuff is up to the backend, maybe in termios,
93 * TODO or better termcap, or in ui-str. I do not know */
95 /* An execution context is teared down, and it finds to have a colour stack.
96 * Signals are blocked */
97 EXPORT
void mx_colour_stack_del(struct n_go_data_ctx
*gdcp
);
99 /* We want coloured output (in this autorec memory cycle), pager_used is used
100 * to test whether *colour-pager* is to be inspected, if fp is given, the reset
101 * sequence will be written as necessary by _stack_del()
102 * env_gut() will reset() as necessary if fp is not NIL */
103 EXPORT
void mx_colour_env_create(enum mx_colour_ctx cctx
, FILE *fp
,
105 EXPORT
void mx_colour_env_gut(void);
107 /* Putting anything (for pens: including NIL) resets current state first */
108 EXPORT
void mx_colour_put(enum mx_colour_id cid
, char const *ctag
);
109 EXPORT
void mx_colour_reset(void);
111 /* Of course temporary only and may return NIL. Does not affect state! */
112 EXPORT
struct str
const *mx_colour_reset_to_str(void);
114 /* A pen is bound to its environment and automatically reclaimed; it may be
115 * NULL but that can be used anyway for simplicity.
116 * This includes pen_to_str() -- which doesn't affect state! */
117 EXPORT
struct mx_colour_pen
*mx_colour_pen_create(enum mx_colour_id cid
,
119 EXPORT
void mx_colour_pen_put(struct mx_colour_pen
*self
);
121 /* Get an escape sequence (or NIL, if self is, or no colour there is) */
122 EXPORT
struct str
const *mx_colour_pen_to_str(struct mx_colour_pen
*self
);
124 /* Get terminal reset control sequence (or NIL if no colour there is).
125 * The return value is "volatile" to colour change commands */
126 EXPORT
struct str
const *mx_colour_get_reset_cseq(u32 get_flags
);
128 /* Just get the pen for the given combination, or NIL.
129 * The return value is "volatile" to colour change commands */
130 EXPORT
struct mx_colour_pen
*mx_colour_get_pen(u32 get_flags
,
131 enum mx_colour_ctx cctx
, enum mx_colour_id cid
, char const *ctag
);
133 /* Get terminal control sequence (or NIL, if self is, or no colour there is) */
134 EXPORT
struct str
const *mx_colour_pen_get_cseq(
135 struct mx_colour_pen
const *self
);
137 #include <su/code-ou.h>
139 # define mx_COLOUR(X)
140 #endif /* mx_HAVE_COLOUR */
141 #endif /* mx_COLOUR_H */