From 25b437a9b408cbd306633c31d8cebe53d672acc7 Mon Sep 17 00:00:00 2001 From: fduncanh Date: Fri, 27 Aug 2021 07:57:52 -0400 Subject: [PATCH] reworked the last fix to remove static variables. --- renderers/video_renderer_gstreamer.c | 23 +++++++------ renderers/x_display_fix.h | 48 +++++++++++++--------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 9d65f88..3c8573a 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -30,6 +30,9 @@ struct video_renderer_s { logger_t *logger; GstElement *appsrc, *pipeline, *sink; GstBus *bus; +#ifdef X_DISPLAY_FIX + window_t *X11; +#endif }; static gboolean check_plugins (void) @@ -115,10 +118,6 @@ video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, video_renderer_t *renderer; GError *error = NULL; -#ifdef X_DISPLAY_FIX - get_x_display_root(); -#endif - /* this call to g_set_application_name makes server_name appear in the display window title bar, */ /* (instead of the program name uxplay taken from (argv[0]). It is only set one time. */ @@ -148,7 +147,11 @@ video_renderer_t *video_renderer_init(logger_t *logger, const char *server_name, renderer->appsrc = gst_bin_get_by_name (GST_BIN (renderer->pipeline), "video_source"); renderer->sink = gst_bin_get_by_name (GST_BIN (renderer->pipeline), "video_sink"); - +#ifdef X_DISPLAY_FIX + renderer->X11 = calloc(1, sizeof(window_t)); + assert(renderer->X11); + get_x_display(renderer->X11, server_name); +#endif return renderer; } @@ -170,7 +173,9 @@ void video_renderer_render_buffer(video_renderer_t *renderer, raop_ntp_t *ntp, u gst_app_src_push_buffer (GST_APP_SRC(renderer->appsrc), buffer); #ifdef X_DISPLAY_FIX - fix_x_window_name(); + if(!renderer->X11->window) { + fix_x_window_name(renderer->X11); + } #endif } @@ -217,11 +222,11 @@ void video_renderer_destroy(video_renderer_t *renderer) { gst_object_unref(renderer->bus); gst_element_set_state (renderer->pipeline, GST_STATE_NULL); gst_object_unref (renderer->pipeline); +#ifdef X_DISPLAY_FIX + free(renderer->X11); +#endif if (renderer) { free(renderer); -#ifdef X_DISPLAY_FIX - my_window = (Window) NULL; -#endif } } diff --git a/renderers/x_display_fix.h b/renderers/x_display_fix.h index d29276c..9e4df0d 100644 --- a/renderers/x_display_fix.h +++ b/renderers/x_display_fix.h @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* code from David Ventura https://github.com/DavidVentura/UxPlay */ +/* based on code from David Ventura https://github.com/DavidVentura/UxPlay */ #ifndef X_DISPLAY_FIX_H #define X_DISPLAY_FIX_H @@ -30,55 +30,53 @@ extern "C" { #include #include -static Display* display; -static Window root, my_window; +struct window_s { + Display * display; + Window window, root; + const char * name; +} typedef window_t; -void get_x_display_root() { - display = XOpenDisplay(NULL); - root = XDefaultRootWindow(display); +void get_x_display(window_t * X11, const char * window_name) { + X11->display = XOpenDisplay(NULL); + X11->root = XDefaultRootWindow(X11->display); + X11->window = (Window) NULL; + X11->name = window_name; } - -Window enum_windows(Display* display, Window window, int depth) { - int i; +Window enum_windows(const char * str, Display* display, Window window, int depth) { + int i; XTextProperty text; XGetWMName(display, window, &text); char* name; XFetchName(display, window, &name); - - if (name != 0 && strcmp((const char*) g_get_application_name(), name) == 0) { + if (name != 0 && strcmp(str, name) == 0) { return window; } - Window _root, parent; Window* children; unsigned int n; XQueryTree(display, window, &_root, &parent, &children, &n); if (children != NULL) { for (i = 0; i < n; i++) { - Window w = enum_windows(display, children[i], depth + 1); + Window w = enum_windows(str, display, children[i], depth + 1); if (w) return w; } XFree(children); } - return (Window) NULL; } -void fix_x_window_name() { - if (!my_window) { - my_window = enum_windows(display, root, 0); - if (my_window) { - const char* str = g_get_application_name(); - Atom _NET_WM_NAME = XInternAtom(display, "_NET_WM_NAME", 0); - Atom UTF8_STRING = XInternAtom(display, "UTF8_STRING",0); - XChangeProperty(display, my_window, _NET_WM_NAME, UTF8_STRING, 8, 0, (const unsigned char *) str, strlen(str)); - XSync(display, False); - } +void fix_x_window_name(window_t * X11) { + X11->window = enum_windows(X11->name, X11->display, X11->root, 0); + if (X11->window) { + Atom _NET_WM_NAME = XInternAtom(X11->display, "_NET_WM_NAME", 0); + Atom UTF8_STRING = XInternAtom(X11->display, "UTF8_STRING", 0); + XChangeProperty(X11->display, X11->window, _NET_WM_NAME, UTF8_STRING, 8, 0, + (const unsigned char *) X11->name, strlen(X11->name)); + XSync(X11->display, False); } } - #ifdef __cplusplus } #endif