FARCOLORFLAGS docs are outdated
E.g. FCF_FG_UNDERLINE does not exist anymore, but there are FCF_FG_UNDERLINE_INDEX, FCF_FG_U_DATA0, FCF_FG_U_DATA1, FCF_FG_U_DATA2 and FCF_FG_UNDERLINE_MASK instead.
Other not yet documented flags include FCF_FG_OVERLINE, FCF_FG_STRIKEOUT, FCF_FG_FAINT, FCF_FG_BLINK, FCF_FG_INVERSE, FCF_FG_INVISIBLE, FCF_STYLEMASK, FCF_RAWATTR_MASK.
Compare https://api.farmanager.com/ru/structures/farcolor.html with the sources:
Details
https://github.com/FarGroup/FarManager/blob/283c2a1c5622e3528e4ee1bffe84a89242027900/far/plugin.hpp#L104-L142
Also from color picker we can know possible underline types:
- Single
- Double
- Curly
- Dotted
- Dashed
So currently 5 types are mapped to 4 flags in some (unobvious) way. As for me, it would be more convenient to have 5 separate flags, and just document that they are mutually exclusive.
Otherwise, we could introduce five more constants for the allowed combinations of the four existing flags.
The whole page is outdated. PRs are welcome. You can use this cheat sheet as a reference:
FarColor
https://api.farmanager.com/ru/structures/farcolor.html
Структура FarColor описывает код цвета, используется, например, в функции Text.
struct rgba
{
unsigned char
r,
g,
b,
a;
};
struct color_index
{
unsigned char
i,
reserved0,
reserved1,
a;
};
struct FarColor
{
FARCOLORFLAGS Flags;
union
{
COLORREF ForegroundColor;
struct color_index ForegroundIndex;
struct rgba ForegroundRGBA;
};
union
{
COLORREF BackgroundColor;
struct color_index BackgroundIndex;
struct rgba BackgroundRGBA;
};
union
{
COLORREF UnderlineColor;
struct color_index UnderlineIndex;
struct rgba UnderlineRGBA;
};
DWORD Reserved;
// ...
UNDERLINE_STYLE GetUnderline() const {/* ... */}
FarColor& SetUnderline(UNDERLINE_STYLE UnderlineStyle) {/* ... */}
// ... кроме того определён ряд других хелперов, полное определение см. в plugin.hpp
};
Элементы
Flags
Может быть комбинацией следующих значений (тип FARCOLORFLAGS):
| Флаг | Описание |
|---|---|
| FCF_FG_INDEX | цвет символа задан индексом |
| FCF_BG_INDEX | цвет фона символа задан индексом |
| FCF_FG_UNDERLINE_INDEX | цвет подчёркивания задан индексом |
| FCF_INHERIT_STYLE | "Наследовать" расширенные атрибуты; используется в группах раскраски файлов, в цвете выделения, и в раскраске редактора, потенциально - и в других местах |
| FCF_NONE | нулевой флаг |
Расширенные атрибуты, задающие стиль (см. также Замечания):
| Флаг | Описание |
|---|---|
| FCF_FG_BLINK | "мигающий" |
| FCF_FG_BOLD | "жирный" (или "яркий") |
| FCF_FG_FAINT | "блёклый" |
| FCF_INVERSE | "инверсный" ("негатив") |
| FCF_FG_INVISIBLE | "невидимый" ("скрытый") |
| FCF_FG_ITALIC | "наклонный" ("курсив") |
| FCF_FG_OVERLINE | "надчёркнутый" |
| FCF_FG_STRIKEOUT | "зачёркнутый" |
| FCF_FG_U_DATA0, FCF_FG_U_DATA1, FCF_FG_U_DATA2 | "подчёркнутый"; стиль подчёркивания определяется комбинацией значений этих трёх битов.* |
* Для работы со стилями подчёркивания предусмотрены хелперы GetUnderline() и SetUnderline(). Возможные стили подчёркивания (enum UNDERLINE_STYLE): UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE, UNDERLINE_CURLY, UNDERLINE_DOT, UNDERLINE_DASH.
Маски
| Флаг | Описание |
|---|---|
| FCF_INDEXMASK | FCF_FG_INDEX | FCF_BG_INDEX | FCF_FG_UNDERLINE_INDEX |
| FCF_FG_UNDERLINE_MASK | FCF_FG_U_DATA0 | FCF_FG_U_DATA1 | FCF_FG_U_DATA2 |
| FCF_RAWATTR_MASK | LVB console attributes |
| FCF_STYLE_MASK | объединение всех расширенных атрибутов |
ForegroundIndex | ForegroundRGBA | ForegroundColor
Цвет символа может быть представлен в виде struct color_index, struct rgba или COLORREF, в зависимости от флага FCF_FG_INDEX:
- Если флаг установлен, то значение соответствует типу
struct color_index, гдеiэто индекс в палитре (см. Замечания),a- Alpha-канал, определяющий степень прозрачности, от полностью прозрачного00до совсем непрозрачногоFF. - Если флаг снят, то значение соответствует типу
struct rgba, гдеa- Alpha-канал, аr,g,b- красный, зелёный, и синий каналы в цветовом пространстве RGB, со значениями от00доFF. - Значение типа
COLORREFможно использовать в обоих случаях:- при установленном флаге: значение в формате
0xAA000000-0xAA0000FF, где младший байт представляет собой индекс в палитре, а старший (AA) - Alpha-канал. - при снятом флаге: значение в формате
0xAABBGGRR, гдеAA- Alpha-канал, аRR,GG,BB- красный, зелёный, и синий каналы.
- при установленном флаге: значение в формате
[!WARNING] В данный момент прозрачность поддерживается не везде. Чтобы в будущем избежать неприятных сюрпризов, всегда устанавливайте Alpha-канал (старший байт значения
COLORREF) в0xFF.
[!NOTE] Для комфортной работы со структурами также предусмотрен ряд хелперов, см.
plugin.hpp
BackgroundIndex | BackgroundRGBA | BackgroundColor
Цвет фона символа, в зависимости от флага FCF_BG_INDEX, формат тот же что у Foreground*
UnderlineIndex | UnderlineRGBA | UnderlineColor
Цвет подчёркивания, в зависимости от флага FCF_FG_UNDERLINE_INDEX, формат тот же что у Foreground*.
Reserved
Не используется и должен быть установлен в 0.
Замечания
При использовании цветов из палитры обязательно указывайте флаги FCF_FG_INDEX, FCF_BG_INDEX (и FCF_FG_UNDERLINE_INDEX, если используется подчёркивание).
Стандартные цвета консоли Windows представляют собой палитру из 16 цветов, с индексами 0 - 15.
Также можно использовать цвета из палитры VT100 (16 - 255). В этом случае значения (16 - 231) кодируются как 36R+6G+B, где уровень каждого из основных цветов 0-5, а последние 24 значения (232 - 255) используются для оттенков серого [желательна ссылка на определение VT color cube].
[!WARNING]
- Гарантированно везде работает только стандартная 16-цветная палитра. Поддержка всего остального условна и определяется вашим терминалом.
- Расширенные (RGB) цвета и стили требуют рендеринга на основе Virtual Terminal, который можно включить в настройках интерфейса. Если он не включен или если ваш терминал не поддерживает цвета RGB, то цвета будут аппроксимированы до ближайших индексов консольной палитры.
Смотрите также:
[вероятно стоит приложить и cheat sheet?]
@alabuzhev
- В нескольких местах текста, где требуются дополнительные пояснения, сейчас стоят знаки вопроса.
- Непонятно, как должна работать прозрачность: например я устанавливаю для Help / Normal Text (FG/BG) прозрачность 77, жму F1 и ничего вообще не меняется. Это об этом предупреждение что "в данный момент прозрачность поддерживается не везде"? На чём тогда сейчас можно проверить?
- (тема для отдельного тикета) Заметил что работа атрибутов Bold/Faint/Blink неодинакова для всех цветов, и ещё зависит от того, используется ли цвет из палитры или RGB. Например, с умолчательным Dialog / Normal text работает только Bold (хотя цвет парадоксально меняется на более бледный). А если установить дефолтные цвета RGB, то ни один из трёх перечисленных атрибутов не оказывает влияния.
- (оффтопик) Не вполне очевидно что именно делает настройка Colors / Palette / [x] Classic palette. Похоже сбрасывает консольную палитру к стандартным значениям.
struct FarColor
Outdated.
| FCF_INHERIT_STYLE | ? |
https://forum.farmanager.com/viewtopic.php?p=168086
FCF_FG_INVERSE
It is FCF_INVERSE now.
| FCF_FG_UNDERLINE_INDEX | "подчёркнутый", стиль подчёркивания должен быть задан в FCF_FG_U_DATA* |
This is not a style flag, but a switch between index and RGB. It belongs to the other table, next to FCF_FG_INDEX & FCF_BG_INDEX.
- Single: FCF_FG_U_DATA0
- Double: FCF_FG_U_DATA1
- Curly: FCF_FG_U_DATA1 | FCF_FG_U_DATA0
- Dotted: FCF_FG_U_DATA2
- Dashed: FCF_FG_U_DATA2 | FCF_FG_U_DATA0
Users are not supposed to do that manually, so no need to document. There's UNDERLINE_STYLE enum and GetUnderline() & SetUnderline() helpers in FarColor.
Reserved Не используется и должен быть установлен в 0.
It's UnderlineColor now.
Это об этом предупреждение что "в данный момент прозрачность поддерживается не везде"?
Yep.
На чём тогда сейчас можно проверить?
Files highlighting. Colors -> Editor -> Selected text. ECTL_ADDCOLOR
Bold/Faint/Blink
Faint is "reduce text intenseness". Blink is "Faint in a loop". Bold is either actually "bold font" or "increase text intenseness", depending on your terminal and/or its settings.
We do not do anything funny with these flags, just pass them to the terminal. If something doesn't match your expectations it's better to report it there.
сбрасывает консольную палитру к стандартным значениям
Yes, to pre-Windows 10 values. Same as "Vintage" in WT.
Исправил. Надо ли все хелперы перечислить, и описать?
Yes, to pre-Windows 10 values. Same as "Vintage" in WT.
Из того, что это чекбокс, а не просто кнопка, предполагается что фар активно препятствует изменению палитры?
Up to you.
If checked, we set the palette at startup and then every time something is executed from the command line.
FCF_INHERIT_STYLE действует также и для Editor -> Selected text, и ECTL_ADDCOLOR?
Про LVB console attributes ничего конкретного больше не надо сказать? Сейчас упоминается только маска.
I propose my help in Russian proofreading (spelling, punctuation, grammar, style, etc). If nobody minds, please let me know when the text is ready for a clean-up.
Probably.
LVB should be treated as opaque. We might encounter them in the output after executing something, such attributes need to be preserved and put back when we show the user screen.
please let me know when the text is ready for a clean-up.
It is ready, more or less. Probably there can be some changes later, when it will be converted to html.