⛏️ index : haiku.git

author Pascal Abresch <nep-git@packageloss.eu> 2025-03-09 11:31:39.0 +01:00:00
committer nephele nephele <nep-git@packageloss.eu> 2025-11-16 21:04:58.0 +00:00:00
commit
ac14f84c5263c4be3f86b6f2c528227352a87686 [patch]
tree
6846087cf6bc812aa52cd7f8140463fcbccc9555
parent
d640e20575c2fa8a032dd3853c532da8aa592e49
download
ac14f84c5263c4be3f86b6f2c528227352a87686.tar.gz

Appearance: Send only one color update message.

This will Batch the colors into one update, the app_server also
consolidates color updates, but does so based on timeframe. This will
prevent colors from beeing send in two different batches which may be
severall ms apart based on the batch timing

Change-Id: I9cdda57f07e1efb6ce685cd984a96ea95ae3190c
Reviewed-on: https://review.haiku-os.org/c/haiku/+/9094
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Reviewed-by: John Scipione <jscipione@gmail.com>
Reviewed-by: nephele nephele <nep-git@packageloss.eu>

Diff

 src/preferences/appearance/ColorsView.cpp | 61 +++++++++++++++++++++++++++++++------------------------------
 src/preferences/appearance/ColorsView.h   |  1 -
 2 files changed, 30 insertions(+), 32 deletions(-)

diff --git a/src/preferences/appearance/ColorsView.cpp b/src/preferences/appearance/ColorsView.cpp
index b640c59..625c3e6 100644
--- a/src/preferences/appearance/ColorsView.cpp
+++ b/src/preferences/appearance/ColorsView.cpp
@@ -310,10 +310,13 @@
void
ColorsView::_SetColor(color_which which, rgb_color color)
{
	_SetOneColor(which, color);
	fCurrentColors.SetColor(ui_color_name(which), color);

	if (!fAutoSelectCheckBox->Value())
	if (!fAutoSelectCheckBox->Value()) {
		if (ui_color(which) != color)
			set_ui_color(which, color);
		return;
	}

	// Protect against accidentally overwriting colors.
	if (ui_color(which) == color)
@@ -322,31 +325,35 @@
	if (which == B_PANEL_BACKGROUND_COLOR) {
		const bool isDark = color.IsDark();

		_SetOneColor(B_MENU_BACKGROUND_COLOR, color);
		fCurrentColors.SetColor(ui_color_name(B_MENU_BACKGROUND_COLOR), color);

		const rgb_color menuSelectedBackground
			= tint_color(color, isDark ? 0.8 /* lighten "< 1" */ : B_DARKEN_2_TINT);
		_SetOneColor(B_MENU_SELECTED_BACKGROUND_COLOR, menuSelectedBackground);
		fCurrentColors.SetColor(ui_color_name(B_MENU_SELECTED_BACKGROUND_COLOR),
			menuSelectedBackground);

		const rgb_color controlBackground = tint_color(color,
			0.84 /* lighten "< 1" */);
		_SetOneColor(B_CONTROL_BACKGROUND_COLOR, controlBackground);
		_SetOneColor(B_SCROLL_BAR_THUMB_COLOR, controlBackground);
		fCurrentColors.SetColor(ui_color_name(B_CONTROL_BACKGROUND_COLOR), controlBackground);
		fCurrentColors.SetColor(ui_color_name(B_SCROLL_BAR_THUMB_COLOR), controlBackground);

		const rgb_color controlBorder
			= tint_color(color, isDark ? 0.4875 : 1.20 /* lighten/darken "1.5" */);
		_SetOneColor(B_CONTROL_BORDER_COLOR, controlBorder);
		fCurrentColors.SetColor(ui_color_name(B_CONTROL_BORDER_COLOR), controlBorder);

		const rgb_color windowBorder = tint_color(color, 0.75);
		_SetOneColor(B_WINDOW_BORDER_COLOR, windowBorder);
		fCurrentColors.SetColor(ui_color_name(B_WINDOW_BORDER_COLOR), windowBorder);

		const rgb_color inactiveWindowBorder = tint_color(color, B_LIGHTEN_1_TINT);
		_SetOneColor(B_WINDOW_INACTIVE_TAB_COLOR, inactiveWindowBorder);
		_SetOneColor(B_WINDOW_INACTIVE_BORDER_COLOR, inactiveWindowBorder);
		fCurrentColors.SetColor(ui_color_name(B_WINDOW_INACTIVE_TAB_COLOR),
			inactiveWindowBorder);
		fCurrentColors.SetColor(ui_color_name(B_WINDOW_INACTIVE_BORDER_COLOR),
			inactiveWindowBorder);

		const rgb_color listSelectedBackground
			= tint_color(color, isDark ? 0.77 : 1.12 /* lighten/darken "< 1" */ );
		_SetOneColor(B_LIST_SELECTED_BACKGROUND_COLOR, listSelectedBackground);
		fCurrentColors.SetColor(ui_color_name(B_LIST_SELECTED_BACKGROUND_COLOR),
			listSelectedBackground);

		const color_which fromDefaults[] = {
			B_MENU_ITEM_TEXT_COLOR,
@@ -371,18 +378,20 @@
			B_LINK_VISITED_COLOR,
		};
		for (size_t i = 0; i < B_COUNT_OF(fromDefaults); i++)
			_SetOneColor(fromDefaults[i], BPrivate::GetSystemColor(fromDefaults[i], isDark));
			fCurrentColors.SetColor(ui_color_name(fromDefaults[i])
				, BPrivate::GetSystemColor(fromDefaults[i], isDark));
	} else if (which == B_STATUS_BAR_COLOR) {
		const hsl_color statusColorHSL = hsl_color::from_rgb(color);

		hsl_color controlHighlight = statusColorHSL;
		controlHighlight.saturation = max_c(0.2f, controlHighlight.saturation / 2.f);
		_SetOneColor(B_CONTROL_HIGHLIGHT_COLOR, controlHighlight.to_rgb());
		fCurrentColors.SetColor(ui_color_name(B_CONTROL_HIGHLIGHT_COLOR)
			, controlHighlight.to_rgb());

		hsl_color controlMark = statusColorHSL;
		controlMark.saturation = max_c(0.2f, controlMark.saturation * 0.67f);
		controlMark.lightness = max_c(0.25f, controlMark.lightness * 0.55f);
		_SetOneColor(B_CONTROL_MARK_COLOR, controlMark.to_rgb());
		fCurrentColors.SetColor(ui_color_name(B_CONTROL_MARK_COLOR), controlMark.to_rgb());

		rgb_color keyboardNav; {
			hsl_color keyboardNavHSL = statusColorHSL;
@@ -397,38 +406,28 @@
			else
				keyboardNav.red = keyboardNav.blue = 0;
		}
		_SetOneColor(B_KEYBOARD_NAVIGATION_COLOR, keyboardNav);
		fCurrentColors.SetColor(ui_color_name(B_KEYBOARD_NAVIGATION_COLOR), keyboardNav);
	} else if (which == B_WINDOW_TAB_COLOR) {
		const bool isDark = color.IsDark();
		const hsl_color tabColorHSL = hsl_color::from_rgb(color);
		const float tabColorSaturation
			= tabColorHSL.saturation != 0 ? tabColorHSL.saturation : tabColorHSL.lightness;

		_SetOneColor(B_WINDOW_TEXT_COLOR,
		fCurrentColors.SetColor(ui_color_name(B_WINDOW_TEXT_COLOR),
			BPrivate::GetSystemColor(B_WINDOW_TEXT_COLOR, isDark));
		_SetOneColor(B_TOOL_TIP_TEXT_COLOR,
		fCurrentColors.SetColor(ui_color_name(B_TOOL_TIP_TEXT_COLOR),
			BPrivate::GetSystemColor(B_TOOL_TIP_TEXT_COLOR, isDark));

		const rgb_color toolTipBackground = tint_color(color, isDark ? 1.7 : 0.15);
		_SetOneColor(B_TOOL_TIP_BACKGROUND_COLOR, toolTipBackground);
		fCurrentColors.SetColor(ui_color_name(B_TOOL_TIP_BACKGROUND_COLOR), toolTipBackground);

		hsl_color success = hsl_color::from_rgb(BPrivate::GetSystemColor(B_SUCCESS_COLOR, isDark));
		success.saturation = max_c(0.25f, tabColorSaturation * 0.68f);
		_SetOneColor(B_SUCCESS_COLOR, success.to_rgb());
		fCurrentColors.SetColor(ui_color_name(B_SUCCESS_COLOR), success.to_rgb());

		hsl_color failure = hsl_color::from_rgb(BPrivate::GetSystemColor(B_FAILURE_COLOR, isDark));
		failure.saturation = max_c(0.25f, tabColorSaturation);
		_SetOneColor(B_FAILURE_COLOR, failure.to_rgb());
		fCurrentColors.SetColor(ui_color_name(B_FAILURE_COLOR), failure.to_rgb());
	}
}


void
ColorsView::_SetOneColor(color_which which, rgb_color color)
{
	if (ui_color(which) == color)
		return;

	set_ui_color(which, color);
	fCurrentColors.SetColor(ui_color_name(which), color);
	set_ui_colors(&fCurrentColors);
}
diff --git a/src/preferences/appearance/ColorsView.h b/src/preferences/appearance/ColorsView.h
index e4e4afc..4e071e8 100644
--- a/src/preferences/appearance/ColorsView.h
+++ b/src/preferences/appearance/ColorsView.h
@@ -54,7 +54,6 @@

			void				_SetColor(int32 index, rgb_color color);
			void				_SetColor(color_which which, rgb_color color);
			void				_SetOneColor(color_which which, rgb_color color);
			void				_SetCurrentColor(rgb_color color);
			void				_SetUIColors(const BMessage& colors);