Make multi-monitor CM work better with xiccd
Let's assume the profile it picks is appropriate for all monitors.
This commit is contained in:
parent
72bf913f3d
commit
b07fba0c9c
38
fiv-view.c
38
fiv-view.c
@ -459,6 +459,26 @@ out:
|
|||||||
//
|
//
|
||||||
// Note that Wayland does not have any appropriate protocol, as of writing:
|
// Note that Wayland does not have any appropriate protocol, as of writing:
|
||||||
// https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/14
|
// https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/14
|
||||||
|
static FivIoProfile
|
||||||
|
monitor_cms_profile(GdkWindow *root, int num)
|
||||||
|
{
|
||||||
|
char atom[32] = "";
|
||||||
|
g_snprintf(atom, sizeof atom, "_ICC_PROFILE%c%d", num ? '_' : '\0', num);
|
||||||
|
|
||||||
|
// Sadly, there is no nice GTK+/GDK mechanism to watch this for changes.
|
||||||
|
int format = 0, length = 0;
|
||||||
|
GdkAtom type = GDK_NONE;
|
||||||
|
guchar *data = NULL;
|
||||||
|
FivIoProfile result = NULL;
|
||||||
|
if (gdk_property_get(root, gdk_atom_intern(atom, FALSE), GDK_NONE, 0,
|
||||||
|
8 << 20 /* MiB */, FALSE, &type, &format, &length, &data)) {
|
||||||
|
if (format == 8 && length > 0)
|
||||||
|
result = fiv_io_profile_new(data, length);
|
||||||
|
g_free(data);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reload_screen_cms_profile(FivView *self, GdkWindow *window)
|
reload_screen_cms_profile(FivView *self, GdkWindow *window)
|
||||||
{
|
{
|
||||||
@ -488,6 +508,7 @@ reload_screen_cms_profile(FivView *self, GdkWindow *window)
|
|||||||
|
|
||||||
GdkDisplay *display = gdk_window_get_display(window);
|
GdkDisplay *display = gdk_window_get_display(window);
|
||||||
GdkMonitor *monitor = gdk_display_get_monitor_at_window(display, window);
|
GdkMonitor *monitor = gdk_display_get_monitor_at_window(display, window);
|
||||||
|
GdkWindow *root = gdk_screen_get_root_window(gdk_window_get_screen(window));
|
||||||
|
|
||||||
int num = -1;
|
int num = -1;
|
||||||
for (int i = gdk_display_get_n_monitors(display); num < 0 && i--; )
|
for (int i = gdk_display_get_n_monitors(display); num < 0 && i--; )
|
||||||
@ -496,20 +517,9 @@ reload_screen_cms_profile(FivView *self, GdkWindow *window)
|
|||||||
if (num < 0)
|
if (num < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
char atom[32] = "";
|
// Cater to xiccd limitations (agalakhov/xiccd#33).
|
||||||
g_snprintf(atom, sizeof atom, "_ICC_PROFILE%c%d", num ? '_' : '\0', num);
|
if (!(self->screen_cms_profile = monitor_cms_profile(root, num)) && num)
|
||||||
|
self->screen_cms_profile = monitor_cms_profile(root, 0);
|
||||||
// Sadly, there is no nice GTK+/GDK mechanism to watch this for changes.
|
|
||||||
int format = 0, length = 0;
|
|
||||||
GdkAtom type = GDK_NONE;
|
|
||||||
guchar *data = NULL;
|
|
||||||
GdkWindow *root = gdk_screen_get_root_window(gdk_window_get_screen(window));
|
|
||||||
if (gdk_property_get(root, gdk_atom_intern(atom, FALSE), GDK_NONE, 0,
|
|
||||||
8 << 20 /* MiB */, FALSE, &type, &format, &length, &data)) {
|
|
||||||
if (format == 8 && length > 0)
|
|
||||||
self->screen_cms_profile = fiv_io_profile_new(data, length);
|
|
||||||
g_free(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (!self->screen_cms_profile)
|
if (!self->screen_cms_profile)
|
||||||
|
Loading…
Reference in New Issue
Block a user