FarManager icon indicating copy to clipboard operation
FarManager copied to clipboard

FARCOLORFLAGS docs are outdated

Open johnd0e opened this issue 10 months ago • 11 comments

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

johnd0e avatar Feb 10 '25 22:02 johnd0e

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.

johnd0e avatar Feb 10 '25 23:02 johnd0e

The whole page is outdated. PRs are welcome. You can use this cheat sheet as a reference:

Image

alabuzhev avatar Feb 10 '25 23:02 alabuzhev

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?]

johnd0e avatar Feb 11 '25 17:02 johnd0e

@alabuzhev

  • В нескольких местах текста, где требуются дополнительные пояснения, сейчас стоят знаки вопроса.
  • Непонятно, как должна работать прозрачность: например я устанавливаю для Help / Normal Text (FG/BG) прозрачность 77, жму F1 и ничего вообще не меняется. Это об этом предупреждение что "в данный момент прозрачность поддерживается не везде"? На чём тогда сейчас можно проверить?
  • (тема для отдельного тикета) Заметил что работа атрибутов Bold/Faint/Blink неодинакова для всех цветов, и ещё зависит от того, используется ли цвет из палитры или RGB. Например, с умолчательным Dialog / Normal text работает только Bold (хотя цвет парадоксально меняется на более бледный). А если установить дефолтные цвета RGB, то ни один из трёх перечисленных атрибутов не оказывает влияния.
  • (оффтопик) Не вполне очевидно что именно делает настройка Colors / Palette / [x] Classic palette. Похоже сбрасывает консольную палитру к стандартным значениям.

johnd0e avatar Feb 11 '25 18:02 johnd0e

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.

alabuzhev avatar Feb 11 '25 20:02 alabuzhev

Исправил. Надо ли все хелперы перечислить, и описать?

Yes, to pre-Windows 10 values. Same as "Vintage" in WT.

Из того, что это чекбокс, а не просто кнопка, предполагается что фар активно препятствует изменению палитры?

johnd0e avatar Feb 11 '25 22:02 johnd0e

Up to you.

If checked, we set the palette at startup and then every time something is executed from the command line.

alabuzhev avatar Feb 11 '25 22:02 alabuzhev

FCF_INHERIT_STYLE действует также и для Editor -> Selected text, и ECTL_ADDCOLOR?

Про LVB console attributes ничего конкретного больше не надо сказать? Сейчас упоминается только маска.

johnd0e avatar Feb 11 '25 23:02 johnd0e

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.

HamRusTal avatar Feb 11 '25 23:02 HamRusTal

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.

alabuzhev avatar Feb 12 '25 00:02 alabuzhev

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.

johnd0e avatar Feb 12 '25 11:02 johnd0e