1*4882a593SmuzhiyunFrom b5eed6c97c71e1be0defd8827422dedfa06a1edc Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Fri, 28 Apr 2023 17:09:54 +0800
4*4882a593SmuzhiyunSubject: [PATCH 15/16] xvimagesink: Allow disabling decorations
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunTested on RK3588 EVB with:
7*4882a593Smuzhiyungst-launch-1.0 videotestsrc ! xvimagesink decorations=0
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun sys/xvimage/xvcontext.c   |  5 +++--
12*4882a593Smuzhiyun sys/xvimage/xvcontext.h   |  3 ++-
13*4882a593Smuzhiyun sys/xvimage/xvimagesink.c | 17 ++++++++++++++++-
14*4882a593Smuzhiyun sys/xvimage/xvimagesink.h |  2 ++
15*4882a593Smuzhiyun 4 files changed, 23 insertions(+), 4 deletions(-)
16*4882a593Smuzhiyun
17*4882a593Smuzhiyundiff --git a/sys/xvimage/xvcontext.c b/sys/xvimage/xvcontext.c
18*4882a593Smuzhiyunindex 975c3a9..97962d9 100644
19*4882a593Smuzhiyun--- a/sys/xvimage/xvcontext.c
20*4882a593Smuzhiyun+++ b/sys/xvimage/xvcontext.c
21*4882a593Smuzhiyun@@ -1048,7 +1048,8 @@ gst_xv_touchdevice_free (GstXvTouchDevice * device)
22*4882a593Smuzhiyun #endif
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun GstXWindow *
25*4882a593Smuzhiyun-gst_xvcontext_create_xwindow (GstXvContext * context, gint width, gint height)
26*4882a593Smuzhiyun+gst_xvcontext_create_xwindow (GstXvContext * context, gint width, gint height,
27*4882a593Smuzhiyun+    gboolean decorations)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun   GstXWindow *window;
30*4882a593Smuzhiyun   Atom wm_delete;
31*4882a593Smuzhiyun@@ -1098,7 +1099,7 @@ gst_xvcontext_create_xwindow (GstXvContext * context, gint width, gint height)
32*4882a593Smuzhiyun     hints = g_malloc0 (sizeof (MotifWmHints));
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun     hints->flags |= MWM_HINTS_DECORATIONS;
35*4882a593Smuzhiyun-    hints->decorations = 1 << 0;
36*4882a593Smuzhiyun+    hints->decorations = decorations ? 1 << 0 : 0;
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun     XChangeProperty (context->disp, window->win,
39*4882a593Smuzhiyun         hints_atom, hints_atom, 32, PropModeReplace,
40*4882a593Smuzhiyundiff --git a/sys/xvimage/xvcontext.h b/sys/xvimage/xvcontext.h
41*4882a593Smuzhiyunindex e515fcc..1fb7614 100644
42*4882a593Smuzhiyun--- a/sys/xvimage/xvcontext.h
43*4882a593Smuzhiyun+++ b/sys/xvimage/xvcontext.h
44*4882a593Smuzhiyun@@ -287,7 +287,8 @@ struct _GstXvTouchDevice {
45*4882a593Smuzhiyun G_END_DECLS
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun GstXWindow *   gst_xvcontext_create_xwindow     (GstXvContext * context,
48*4882a593Smuzhiyun-                                                 gint width, gint height);
49*4882a593Smuzhiyun+                                                 gint width, gint height,
50*4882a593Smuzhiyun+                                                 gboolean decorations);
51*4882a593Smuzhiyun GstXWindow *   gst_xvcontext_create_xwindow_from_xid (GstXvContext * context, XID xid);
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun void           gst_xwindow_destroy              (GstXWindow * window);
54*4882a593Smuzhiyundiff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c
55*4882a593Smuzhiyunindex fea70a5..a0fa468 100644
56*4882a593Smuzhiyun--- a/sys/xvimage/xvimagesink.c
57*4882a593Smuzhiyun+++ b/sys/xvimage/xvimagesink.c
58*4882a593Smuzhiyun@@ -200,6 +200,7 @@ enum
59*4882a593Smuzhiyun   PROP_DRAW_BORDERS,
60*4882a593Smuzhiyun   PROP_WINDOW_WIDTH,
61*4882a593Smuzhiyun   PROP_WINDOW_HEIGHT,
62*4882a593Smuzhiyun+  PROP_DECORATIONS,
63*4882a593Smuzhiyun   PROP_LAST
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun@@ -557,7 +558,8 @@ gst_xv_image_sink_xwindow_new (GstXvImageSink * xvimagesink,
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun   context = xvimagesink->context;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun-  xwindow = gst_xvcontext_create_xwindow (context, width, height);
71*4882a593Smuzhiyun+  xwindow = gst_xvcontext_create_xwindow (context, width, height,
72*4882a593Smuzhiyun+      xvimagesink->decorations);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun   /* set application name as a title */
75*4882a593Smuzhiyun   gst_xv_image_sink_xwindow_set_title (xvimagesink, xwindow, NULL);
76*4882a593Smuzhiyun@@ -2057,6 +2059,9 @@ gst_xv_image_sink_set_property (GObject * object, guint prop_id,
77*4882a593Smuzhiyun     case PROP_DRAW_BORDERS:
78*4882a593Smuzhiyun       xvimagesink->draw_borders = g_value_get_boolean (value);
79*4882a593Smuzhiyun       break;
80*4882a593Smuzhiyun+    case PROP_DECORATIONS:
81*4882a593Smuzhiyun+      xvimagesink->decorations = g_value_get_boolean (value);
82*4882a593Smuzhiyun+      break;
83*4882a593Smuzhiyun     default:
84*4882a593Smuzhiyun       if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value))
85*4882a593Smuzhiyun         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
86*4882a593Smuzhiyun@@ -2147,6 +2152,9 @@ gst_xv_image_sink_get_property (GObject * object, guint prop_id,
87*4882a593Smuzhiyun       else
88*4882a593Smuzhiyun         g_value_set_uint64 (value, 0);
89*4882a593Smuzhiyun       break;
90*4882a593Smuzhiyun+    case PROP_DECORATIONS:
91*4882a593Smuzhiyun+      g_value_set_boolean (value, xvimagesink->decorations);
92*4882a593Smuzhiyun+      break;
93*4882a593Smuzhiyun     default:
94*4882a593Smuzhiyun       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
95*4882a593Smuzhiyun       break;
96*4882a593Smuzhiyun@@ -2310,6 +2318,8 @@ gst_xv_image_sink_init (GstXvImageSink * xvimagesink)
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun   /* HACK: Use a non-zero initial ID to detect overlay mode */
99*4882a593Smuzhiyun   xvimagesink->xwindow_id = -1;
100*4882a593Smuzhiyun+
101*4882a593Smuzhiyun+  xvimagesink->decorations = TRUE;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun static void
105*4882a593Smuzhiyun@@ -2446,6 +2456,11 @@ gst_xv_image_sink_class_init (GstXvImageSinkClass * klass)
106*4882a593Smuzhiyun           "Height of the window", 0, G_MAXUINT64, 0,
107*4882a593Smuzhiyun           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun+  g_object_class_install_property (gobject_class, PROP_DECORATIONS,
110*4882a593Smuzhiyun+      g_param_spec_boolean ("decorations", "decorations",
111*4882a593Smuzhiyun+          "Allow window decorations", TRUE,
112*4882a593Smuzhiyun+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
113*4882a593Smuzhiyun+
114*4882a593Smuzhiyun   gobject_class->finalize = gst_xv_image_sink_finalize;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun   gst_element_class_set_static_metadata (gstelement_class,
117*4882a593Smuzhiyundiff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h
118*4882a593Smuzhiyunindex c84eeea..2e7182c 100644
119*4882a593Smuzhiyun--- a/sys/xvimage/xvimagesink.h
120*4882a593Smuzhiyun+++ b/sys/xvimage/xvimagesink.h
121*4882a593Smuzhiyun@@ -136,6 +136,8 @@ struct _GstXvImageSink
122*4882a593Smuzhiyun   GstVideoRectangle render_rect;
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun   guintptr xwindow_id;
125*4882a593Smuzhiyun+
126*4882a593Smuzhiyun+  gboolean decorations;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun struct _GstXvImageSinkClass
130*4882a593Smuzhiyun--
131*4882a593Smuzhiyun2.20.1
132*4882a593Smuzhiyun
133