commit:     dd0c7bedf719a3fc3eab0f2277ba35cd32946262
Author:     Kostadin Shishmanov <kostadinshishmanov <AT> protonmail <DOT> com>
AuthorDate: Thu Feb 27 15:00:42 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Thu Feb 27 16:03:41 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=dd0c7bed

app-misc/ddcutil: add patch to fix build with USE=-X

Upstream added a feature [1] that uses X11 API unconditionally which
broke building with USE=-X. The patch [2] changes it, so support for
this feature is enabled only if ddcutil is built with X support.

[1] https://github.com/rockowitz/ddcutil/commit/6bf1062d
[2] https://github.com/rockowitz/ddcutil/commit/a35d1dc

Closes: https://bugs.gentoo.org/950320
Signed-off-by: Kostadin Shishmanov <kostadinshishmanov <AT> protonmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 app-misc/ddcutil/ddcutil-2.2.0.ebuild              |   1 +
 .../files/ddcutil-2.2.0-fix-build-without-X.patch  | 280 +++++++++++++++++++++
 2 files changed, 281 insertions(+)

diff --git a/app-misc/ddcutil/ddcutil-2.2.0.ebuild 
b/app-misc/ddcutil/ddcutil-2.2.0.ebuild
index 695f47f630e6..fe7e24722485 100644
--- a/app-misc/ddcutil/ddcutil-2.2.0.ebuild
+++ b/app-misc/ddcutil/ddcutil-2.2.0.ebuild
@@ -46,6 +46,7 @@ PATCHES=(
        "${FILESDIR}"/${PN}-1.4.1-no-werror.patch
        "${FILESDIR}"/${PN}-2.1.4-fix-clang.patch
        "${FILESDIR}"/${P}-fix-clang.patch
+       "${FILESDIR}"/${P}-fix-build-without-X.patch
 )
 
 pkg_pretend() {

diff --git a/app-misc/ddcutil/files/ddcutil-2.2.0-fix-build-without-X.patch 
b/app-misc/ddcutil/files/ddcutil-2.2.0-fix-build-without-X.patch
new file mode 100644
index 000000000000..b8e8b2d75c06
--- /dev/null
+++ b/app-misc/ddcutil/files/ddcutil-2.2.0-fix-build-without-X.patch
@@ -0,0 +1,280 @@
+https://github.com/rockowitz/ddcutil/issues/504
+https://bugs.gentoo.org/950320
+
+From a35d1dc432d4dd419e4874b37c62d23f3ae70469 Mon Sep 17 00:00:00 2001
+From: "Sanford Rockowitz (/shared/home/rock/dot_gitconfig)"
+ <[email protected]>
+Date: Thu, 27 Feb 2025 09:28:14 -0500
+Subject: [PATCH] build with configure option --disable-x11
+
+eliminates watch-mode XEVENT
+
+addresses issue #504
+---
+ src/base/parms.h                 |  6 +++++-
+ src/cmdline/cmd_parser_goption.c | 12 ++++++++++++
+ src/dw/Makefile.am               | 10 ++++++++--
+ src/dw/dw_common.c               |  2 ++
+ src/dw/dw_main.c                 | 14 ++++++++++++++
+ src/dw/dw_poll.c                 |  4 ++++
+ src/dw/dw_services.c             |  4 ++++
+ 7 files changed, 49 insertions(+), 3 deletions(-)
+
+diff --git a/src/base/parms.h b/src/base/parms.h
+index 3a8fbdd5..fcfac321 100644
+--- a/src/base/parms.h
++++ b/src/base/parms.h
+@@ -3,7 +3,7 @@
+  *  System configuration and tuning
+  */
+ 
+-// Copyright (C) 2014-2024 Sanford Rockowitz <[email protected]>
++// Copyright (C) 2014-2025 Sanford Rockowitz <[email protected]>
+ // SPDX-License-Identifier: GPL-2.0-or-later
+ 
+ #ifndef PARMS_H_
+@@ -109,7 +109,11 @@
+ #define DEFAULT_DDCUTIL_SYSLOG_LEVEL DDCA_SYSLOG_WARNING
+ #define DEFAULT_LIBDDCUTIL_SYSLOG_LEVEL DDCA_SYSLOG_NOTICE
+ 
++#ifdef USE_X11
+ #define DEFAULT_WATCH_MODE Watch_Mode_Dynamic
++#else
++#define DEFAULT_WATCH_MODE Watch_Mode_Poll
++#endif
+ 
+ //
+ // Asynchronous Initialization
+diff --git a/src/cmdline/cmd_parser_goption.c 
b/src/cmdline/cmd_parser_goption.c
+index 27973d9b..b6ae37b7 100644
+--- a/src/cmdline/cmd_parser_goption.c
++++ b/src/cmdline/cmd_parser_goption.c
+@@ -508,8 +508,10 @@ static bool parse_watch_mode(
+ 
+       if (     is_abbrev(v2, "POLL", 3))
+          parsed_cmd->watch_mode = Watch_Mode_Poll;
++#ifdef USE_X11
+       else if (is_abbrev(v2, "XEVENT", 3))
+          parsed_cmd->watch_mode = Watch_Mode_Xevent;
++#endif
+    // else if (is_abbrev(v2, "UDEV", 3))
+    //    parsed_cmd->watch_mode = Watch_Mode_Udev;
+       else if (is_abbrev(v2, "DYNAMIC", 3))
+@@ -1026,9 +1028,15 @@ parse_command(
+    case Watch_Mode_Udev:     default_watch_mode_keyword = "UDEV";    break;
+    }
+    char watch_mode_expl[80];
++#ifdef USE_X11
+    g_snprintf(watch_mode_expl, 80, "DYNAMIC|XEVENT|POLL, default: %s", 
default_watch_mode_keyword);
++#else
++   g_snprintf(watch_mode_expl, 80, "DYNAMIC|POLL, default: %s", 
default_watch_mode_keyword);
++#endif
+    gboolean enable_watch_displays = true;
++#ifdef USE_X11
+    gint     xevent_watch_loop_millis_work = 
DEFAULT_XEVENT_WATCH_LOOP_MILLISEC;
++#endif
+    gint     poll_watch_loop_millis_work = DEFAULT_POLL_WATCH_LOOP_MILLISEC;
+ 
+    gboolean f1_flag         = false;
+@@ -1288,8 +1296,10 @@ parse_command(
+                       G_OPTION_ARG_NONE, &disable_api_flag, "Completely 
disable API", NULL },
+       {"watch-mode", '\0', G_OPTION_FLAG_HIDDEN,
+                            G_OPTION_ARG_STRING, &watch_mode_work, "How to 
watch for display changes",  watch_mode_expl},
++#ifdef USE_X11
+       {"xevent-watch-loop-millisec", '\0', G_OPTION_FLAG_HIDDEN,
+                            G_OPTION_ARG_INT, &xevent_watch_loop_millis_work, 
"Loop delay for mode XEVENT", "milliseconds"},
++#endif
+       {"poll-watch-loop-millisec", '\0', G_OPTION_FLAG_HIDDEN,
+                            G_OPTION_ARG_INT, &poll_watch_loop_millis_work, 
"Loop delay for mode POLL", "milliseconds"},
+ #ifdef ENABLE_USB
+@@ -2054,6 +2064,7 @@ parse_command(
+       }
+    }
+ 
++#ifdef USE_X11
+    if (xevent_watch_loop_millis_work <= 0) {
+       EMIT_PARSER_ERROR(errmsgs,
+             "--xevent-watch-loop-millisec not a positive number: %d", 
xevent_watch_loop_millis_work);
+@@ -2061,6 +2072,7 @@ parse_command(
+    }
+    else
+       parsed_cmd->xevent_watch_loop_millisec = (uint16_t) 
xevent_watch_loop_millis_work;
++#endif
+ 
+    if (poll_watch_loop_millis_work <= 0) {
+       EMIT_PARSER_ERROR(errmsgs,
+diff --git a/src/dw/Makefile.am b/src/dw/Makefile.am
+index 0327f1af..063beef4 100644
+--- a/src/dw/Makefile.am
++++ b/src/dw/Makefile.am
+@@ -27,8 +27,14 @@ libdw_la_SOURCES += \
+   dw_dref.c \
+   dw_udev.c \
+   dw_recheck.c \
+-  dw_services.c \
+-  dw_xevent.c
++  dw_services.c
++endif
++
++if ENABLE_UDEV_COND
++if USE_X11_COND
++libdw_la_SOURCES += \
++  dw_xevent.c 
++endif
+ endif
+ 
+ # Rename to "all=local" for development 
+diff --git a/src/dw/dw_common.c b/src/dw/dw_common.c
+index 62f87226..29c4ff75 100644
+--- a/src/dw/dw_common.c
++++ b/src/dw/dw_common.c
+@@ -59,7 +59,9 @@
+ 
+ #include "dw_status_events.h"
+ #include "dw_dref.h"
++#ifdef USE_X11
+ #include "dw_xevent.h"
++#endif
+ 
+ #include "dw_common.h"
+ 
+diff --git a/src/dw/dw_main.c b/src/dw/dw_main.c
+index 996d6f95..d3218c89 100644
+--- a/src/dw/dw_main.c
++++ b/src/dw/dw_main.c
+@@ -46,7 +46,9 @@
+ #include "dw_udev.h"
+ #include "dw_recheck.h"
+ #include "dw_poll.h"
++#ifdef USE_X11
+ #include "dw_xevent.h"
++#endif
+ 
+ #include "dw_main.h"
+ 
+@@ -79,8 +81,10 @@ resolve_watch_mode(DDC_Watch_Mode initial_mode,  
XEvent_Data ** xev_data_loc) {
+    DBGTRC_STARTING(debug, TRACE_GROUP, "initial_mode=%s xev_data_loc=%p", 
watch_mode_name(initial_mode), xev_data_loc);
+ 
+    DDC_Watch_Mode resolved_watch_mode = Watch_Mode_Poll;
++#ifdef USE_X11
+    XEvent_Data * xevdata = NULL;
+    *xev_data_loc = NULL;
++#endif
+ 
+ #ifndef ENABLE_UDEV
+    if (initial_mode == Watch_Mode_Udev)
+@@ -89,6 +93,7 @@ resolve_watch_mode(DDC_Watch_Mode initial_mode,  XEvent_Data 
** xev_data_loc) {
+ 
+    if (initial_mode == Watch_Mode_Dynamic) {
+       resolved_watch_mode = Watch_Mode_Poll;    // always works, may be slow
++#ifdef USE_X11
+       char * xdg_session_type = getenv("XDG_SESSION_TYPE");
+       DBGTRC_NOPREFIX(debug, DDCA_TRC_NONE, "XDG_SESSION_TYPE=|%s|", 
xdg_session_type);
+       if (xdg_session_type &&         // can xdg_session_type ever not be set
+@@ -111,6 +116,7 @@ resolve_watch_mode(DDC_Watch_Mode initial_mode,  
XEvent_Data ** xev_data_loc) {
+       // sysfs_fully_reliable = is_sysfs_reliable();
+       // if (!sysfs_fully_reliable)
+       //    dw_watch_mode = Watch_Mode_Poll;
++#endif
+    }
+    else {
+       resolved_watch_mode = initial_mode;
+@@ -124,6 +130,7 @@ resolve_watch_mode(DDC_Watch_Mode initial_mode,  
XEvent_Data ** xev_data_loc) {
+    }
+ #endif
+ 
++#ifdef USE_X11
+    if (resolved_watch_mode == Watch_Mode_Xevent) {
+       xevdata  = dw_init_xevent_screen_change_notification();
+       // *xev_data_loc  = ddc_init_xevent_screen_change_notification();
+@@ -132,15 +139,18 @@ resolve_watch_mode(DDC_Watch_Mode initial_mode,  
XEvent_Data ** xev_data_loc) {
+          MSG_W_SYSLOG(DDCA_SYSLOG_WARNING, "X11 RANDR api unavailable. 
Switching to Watch_Mode_Poll");
+       }
+    }
++#endif
+ 
+    // DBG( "xevdata=%p, watch_mode = %s", xevdata, 
dw_watch_mode_name(resolved_watch_mode));
+ 
++#ifdef USE_X11
+    *xev_data_loc = xevdata;
+    // ASSERT_IFF(resolved_watch_mode == Watch_Mode_Xevent, xevdata);
+    ASSERT_IFF(resolved_watch_mode == Watch_Mode_Xevent, *xev_data_loc);
+    if (*xev_data_loc && IS_DBGTRC(debug, DDCA_TRC_NONE)) {
+       dw_dbgrpt_xevent_data(*xev_data_loc,  0);
+    }
++#endif
+    DBGTRC_DONE(debug, TRACE_GROUP, "resolved_watch_mode: %s. *xev_data_loc: 
%p",
+          watch_mode_name(resolved_watch_mode),  *xev_data_loc);
+    return resolved_watch_mode;
+@@ -278,6 +288,7 @@ dw_stop_watch_displays(bool wait, 
DDCA_Display_Event_Class* enabled_classes_loc)
+    if (watch_thread) {
+       DBGTRC_NOPREFIX(debug, DDCA_TRC_NONE, "resolved_watch_mode = %s",
+                                             
watch_mode_name(global_wdd->watch_mode));
++#ifdef USE_X11
+       if (global_wdd->watch_mode == Watch_Mode_Xevent) {
+          if (terminate_using_x11_event) {   // for testing, does not 
currently work
+             dw_send_x11_termination_message(global_wdd->evdata);
+@@ -290,6 +301,9 @@ dw_stop_watch_displays(bool wait, 
DDCA_Display_Event_Class* enabled_classes_loc)
+       else {
+          terminate_watch_thread = true;  // signal watch thread to terminate
+       }
++#else
++      terminate_watch_thread = true;
++#endif
+ 
+       // DBGTRC_NOPREFIX(debug, TRACE_GROUP, "Waiting %d millisec for watch 
thread to terminate...", 4000);
+       // usleep(4000*1000);  // greater than the sleep in 
watch_displays_using_poll()
+diff --git a/src/dw/dw_poll.c b/src/dw/dw_poll.c
+index 677a6ce6..336b5c92 100644
+--- a/src/dw/dw_poll.c
++++ b/src/dw/dw_poll.c
+@@ -62,7 +62,9 @@
+ #include "dw_dref.h"
+ #include "dw_recheck.h"
+ #include "dw_status_events.h"
++#ifdef USE_X11
+ #include "dw_xevent.h"
++#endif
+ 
+ #include "dw_poll.h"
+ 
+@@ -276,6 +278,7 @@ gpointer dw_watch_display_connections(gpointer data) {
+          continue;
+       dw_terminate_if_invalid_thread_or_process(cur_pid, cur_tid);
+ 
++#ifdef USE_X11
+       if (wdd->watch_mode == Watch_Mode_Xevent) {
+          if (terminate_using_x11_event) {
+             bool event_found = dw_next_X11_event_of_interest(wdd->evdata);
+@@ -295,6 +298,7 @@ gpointer dw_watch_display_connections(gpointer data) {
+                continue;
+          }
+       }
++#endif
+ 
+       DBGTRC_NOPREFIX(debug, DDCA_TRC_NONE, "locking process_event_mutex");
+       g_mutex_lock(&process_event_mutex);
+diff --git a/src/dw/dw_services.c b/src/dw/dw_services.c
+index 75601879..93085e00 100644
+--- a/src/dw/dw_services.c
++++ b/src/dw/dw_services.c
+@@ -15,7 +15,9 @@
+ #include "dw/dw_recheck.h"
+ #include "dw/dw_status_events.h"
+ #include "dw/dw_udev.h"
++#ifdef USE_X11
+ #include "dw/dw_xevent.h"
++#endif
+ 
+ #include "dw_services.h"
+ 
+@@ -31,7 +33,9 @@ void init_dw_services() {
+    init_dw_poll();
+    init_dw_recheck();
+    init_dw_udev();
++#ifdef USE_X11
+    init_dw_xevent();
++#endif
+ 
+    DBGMSF(debug, "Done");
+ }

Reply via email to