mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 16:26:39 +00:00
[272/906] add a visible member to deal better with the first expose events
This commit is contained in:
parent
f878b84f90
commit
8840d306c4
1 changed files with 19 additions and 27 deletions
|
@ -40,6 +40,7 @@ struct _GstGLWindowPrivate
|
|||
GMutex *x_lock;
|
||||
GCond *cond_send_message;
|
||||
gboolean running;
|
||||
gboolean visible;
|
||||
|
||||
gchar *display_name;
|
||||
Display *device;
|
||||
|
@ -228,7 +229,6 @@ gst_gl_window_new (gint width, gint height)
|
|||
|
||||
XSetWindowAttributes win_attr;
|
||||
XTextProperty text_property;
|
||||
XSizeHints size_hints;
|
||||
XWMHints wm_hints;
|
||||
unsigned long mask;
|
||||
const gchar *title = "OpenGL renderer";
|
||||
|
@ -240,12 +240,10 @@ gst_gl_window_new (gint width, gint height)
|
|||
priv->x_lock = g_mutex_new ();
|
||||
priv->cond_send_message = g_cond_new ();
|
||||
priv->running = TRUE;
|
||||
priv->visible = FALSE;
|
||||
|
||||
g_mutex_lock (priv->x_lock);
|
||||
|
||||
x += 20;
|
||||
y += 20;
|
||||
|
||||
priv->device = XOpenDisplay (priv->display_name);
|
||||
|
||||
g_debug ("gl device id: %ld\n", (gulong) priv->device);
|
||||
|
@ -258,6 +256,7 @@ gst_gl_window_new (gint width, gint height)
|
|||
priv->black = XBlackPixel (priv->device, priv->screen_num);
|
||||
priv->depth = DefaultDepthOfScreen (priv->screen);
|
||||
|
||||
g_debug ("gl root id: %lld\n", (guint64) priv->root);
|
||||
|
||||
priv->device_width = DisplayWidth (priv->device, priv->screen_num);
|
||||
priv->device_height = DisplayHeight (priv->device, priv->screen_num);
|
||||
|
@ -280,6 +279,9 @@ gst_gl_window_new (gint width, gint height)
|
|||
width, height, 0, priv->visual_info->depth, InputOutput,
|
||||
priv->visual_info->visual, mask, &win_attr);
|
||||
|
||||
x += 20;
|
||||
y += 20;
|
||||
|
||||
XSync (priv->device, FALSE);
|
||||
|
||||
XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None);
|
||||
|
@ -303,12 +305,6 @@ gst_gl_window_new (gint width, gint height)
|
|||
if (!glXIsDirect(priv->device, priv->gl_context))
|
||||
g_debug ("direct rendering failed\n");
|
||||
|
||||
size_hints.flags = USPosition | USSize;
|
||||
size_hints.x = x; //FIXME: not working
|
||||
size_hints.y = y; //FIXME: not working
|
||||
size_hints.width = width;
|
||||
size_hints.height= height;
|
||||
|
||||
wm_hints.flags = StateHint;
|
||||
wm_hints.initial_state = NormalState;
|
||||
wm_hints.input = False;
|
||||
|
@ -316,7 +312,7 @@ gst_gl_window_new (gint width, gint height)
|
|||
XStringListToTextProperty ((char**)&title, 1, &text_property);
|
||||
|
||||
XSetWMProperties (priv->device, priv->internal_win_id, &text_property, &text_property, 0, 0,
|
||||
&size_hints, &wm_hints, NULL);
|
||||
NULL, &wm_hints, NULL);
|
||||
|
||||
XFree (text_property.value);
|
||||
|
||||
|
@ -416,21 +412,8 @@ gst_gl_window_visible (GstGLWindow *window, gboolean visible)
|
|||
|
||||
g_mutex_lock (priv->x_lock);
|
||||
|
||||
if (priv->running)
|
||||
{
|
||||
Display *disp = XOpenDisplay (priv->display_name);
|
||||
|
||||
g_debug ("set visible %lld\n", (guint64) priv->internal_win_id);
|
||||
|
||||
if (visible)
|
||||
XMapWindow (disp, priv->internal_win_id);
|
||||
else
|
||||
XUnmapWindow (disp, priv->internal_win_id);
|
||||
|
||||
XSync(disp, FALSE);
|
||||
|
||||
XCloseDisplay (disp);
|
||||
}
|
||||
if (priv->visible != visible)
|
||||
priv->visible = visible;
|
||||
|
||||
g_mutex_unlock (priv->x_lock);
|
||||
}
|
||||
|
@ -455,6 +438,12 @@ gst_gl_window_draw (GstGLWindow *window)
|
|||
|
||||
disp = XOpenDisplay (priv->display_name);
|
||||
|
||||
if (priv->visible)
|
||||
{
|
||||
XMapWindow (disp, priv->internal_win_id);
|
||||
priv->visible = FALSE;
|
||||
}
|
||||
|
||||
XGetWindowAttributes (disp, priv->internal_win_id, &attr);
|
||||
|
||||
event.xexpose.type = Expose;
|
||||
|
@ -538,7 +527,7 @@ gst_gl_window_run_loop (GstGLWindow *window)
|
|||
{
|
||||
XEvent event;
|
||||
|
||||
g_debug ("Close\n");
|
||||
g_debug ("Close %lld\n", (guint64) priv->internal_win_id);
|
||||
|
||||
priv->running = FALSE;
|
||||
|
||||
|
@ -582,6 +571,7 @@ gst_gl_window_run_loop (GstGLWindow *window)
|
|||
if (priv->draw_cb)
|
||||
{
|
||||
priv->draw_cb (priv->draw_data);
|
||||
glFlush();
|
||||
glXSwapBuffers (priv->device, priv->internal_win_id);
|
||||
}
|
||||
break;
|
||||
|
@ -671,6 +661,8 @@ gst_gl_window_send_message (GstGLWindow *window, GstGLWindowCB callback, gpointe
|
|||
|
||||
g_mutex_lock (priv->x_lock);
|
||||
|
||||
g_debug ("AA CUSTOM IN: %lld\n", (guint64)priv->internal_win_id);
|
||||
|
||||
if (priv->running)
|
||||
{
|
||||
Display *disp;
|
||||
|
|
Loading…
Reference in a new issue