{
GstGLWindow *window = GST_GL_WINDOW (object);
GstGLWindowPrivate *priv = window->priv;
+ XEvent event;
+
+ g_debug ("gl window finalizing\n");
XUnmapWindow (priv->device, priv->internal_win_id);
XDestroyWindow (priv->device, priv->internal_win_id);
- XCloseDisplay (priv->device);
+ XFlush (priv->device);
+ while (XCheckTypedEvent (priv->device, ClientMessage, &event))
+ {
+ g_debug ("discared custom x event\n");
+ g_cond_signal (priv->cond_send_message);
+ }
+
+ XFlush (priv->device);
+ while(XPending (priv->device))
+ {
+ g_debug ("one more last pending x msg\n");
+ XNextEvent (priv->device, &event);
+ }
+ XSetCloseDownMode (priv->device, DestroyAll);
- g_cond_signal (priv->cond_send_message);
+ XCloseDisplay (priv->device);
+
+ g_debug ("display closed\n");
if (priv->cond_send_message)
g_cond_free (priv->cond_send_message);
g_mutex_free (priv->mutex);
G_OBJECT_CLASS (gst_gl_window_parent_class)->finalize (object);
+
+ g_debug ("lock deleted\n");
}
static void
None
};
+ Bool ret = FALSE;
+
XSetWindowAttributes win_attr;
XTextProperty text_property;
XSizeHints size_hints;
unsigned long mask;
const gchar *title = "OpenGL renderer";
- Bool ret = FALSE;
-
static gint x = 0;
static gint y = 0;
x += 20;
y += 20;
+ priv->mutex = g_mutex_new ();
+ priv->cond_send_message = g_cond_new ();
+ priv->is_closed = FALSE;
+
priv->device = XOpenDisplay (priv->display_name);
+
+ g_debug ("gl device id: %ld\n", (gulong) priv->device);
+
priv->screen = DefaultScreen (priv->device);
priv->root = RootWindow (priv->device, priv->screen);
priv->visual_info = glXChooseVisual (priv->device, priv->screen, attrib);
win_attr.event_mask =
- StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
- ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask |
- VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
- PointerMotionMask | ButtonMotionMask;
+ StructureNotifyMask | SubstructureNotifyMask | ExposureMask | VisibilityChangeMask;
win_attr.background_pixmap = None;
win_attr.background_pixel = 0;
if (!ret)
g_debug ("failed to make opengl context current\n");
- priv->mutex = g_mutex_new ();
- priv->cond_send_message = g_cond_new ();
- priv->is_closed = FALSE;
-
- XResizeWindow (priv->device, priv->internal_win_id, width, height);
-
return window;
}
event.xexpose.width = attr.width;
event.xexpose.height = attr.height;
event.xexpose.count = 0;
- XSendEvent (priv->device, priv->internal_win_id, FALSE, NoEventMask, &event);
+ XSendEvent (priv->device, priv->internal_win_id, FALSE, ExposureMask, &event);
}
void
if (event.xclient.message_type == priv->atom_custom)
{
- if (priv->is_closed && priv->close_cb)
- {
- priv->close_cb (priv->close_data);
- g_debug ("is closed\n");
- }
- else
+ if (!priv->is_closed)
{
GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
gpointer custom_data = (gpointer) event.xclient.data.l[1];
g_cond_signal (priv->cond_send_message);
}
+
else if ( (Atom) event.xclient.data.l[0] == priv->atom_delete_window)
{
+ XEvent event;
+
g_debug ("Close\n");
+
+ g_mutex_lock (priv->mutex);
+
priv->is_closed = TRUE;
+ if (priv->close_cb)
+ priv->close_cb (priv->close_data);
running = FALSE;
+
+ XFlush (priv->device);
+ while (XCheckTypedEvent (priv->device, ClientMessage, &event))
+ {
+ g_debug ("discared custom x event\n");
+ g_cond_signal (priv->cond_send_message);
+ }
+
+ g_mutex_unlock (priv->mutex);
}
break;
}
if (priv->draw_cb)
{
priv->draw_cb (priv->draw_data);
+ //glFlush();
glXSwapBuffers (priv->device, priv->internal_win_id);
}
break;
case VisibilityNotify:
{
+ g_debug ("VisibilityNotify\n");
+
switch (event.xvisibility.state)
{
case VisibilityUnobscured:
if (window)
{
GstGLWindowPrivate *priv = window->priv;
- XEvent event;
-
- event.xclient.type = ClientMessage;
- event.xclient.send_event = TRUE;
- event.xclient.display = priv->device;
- event.xclient.window = priv->internal_win_id;
- event.xclient.message_type = 0;
- event.xclient.format = 32;
- event.xclient.data.l[0] = priv->atom_delete_window;
-
- XSendEvent (priv->device, priv->internal_win_id, FALSE, NoEventMask, &event);
- XFlush (priv->device);
+
+ g_mutex_lock (priv->mutex);
+
+ if (!priv->is_closed)
+ {
+
+ XEvent event;
+
+ event.xclient.type = ClientMessage;
+ event.xclient.send_event = TRUE;
+ event.xclient.display = priv->device;
+ event.xclient.window = priv->internal_win_id;
+ event.xclient.message_type = 0;
+ event.xclient.format = 32;
+ event.xclient.data.l[0] = priv->atom_delete_window;
+
+ XSendEvent (priv->device, priv->internal_win_id, FALSE, NoEventMask, &event);
+ XFlush (priv->device);
+
+ }
+
+ g_mutex_unlock (priv->mutex);
}
}
GstGLWindowPrivate *priv = window->priv;
+ g_mutex_lock (priv->mutex);
+
if (!priv->is_closed)
{
XEvent event;
- g_mutex_lock (priv->mutex);
-
event.xclient.type = ClientMessage;
event.xclient.send_event = TRUE;
event.xclient.display = priv->device;
XFlush (priv->device);
g_cond_wait (priv->cond_send_message, priv->mutex);
-
- g_mutex_unlock (priv->mutex);
}
+
+ g_mutex_unlock (priv->mutex);
}
}