Fixed the xid stuff and some cleanups.

Original commit message from CVS:
Fixed the xid stuff and some cleanups.
This commit is contained in:
Wim Taymans 2001-06-04 21:02:01 +00:00
parent db0325ee37
commit 98f65dadac

View file

@ -6,24 +6,16 @@
static int launch_argc; static int launch_argc;
static char **launch_argv; static char **launch_argv;
int xid = 0;
GtkWidget *window; GtkWidget *window;
GtkWidget *hbox;
GtkWidget *gtk_socket; GtkWidget *gtk_socket;
typedef void (*found_handler) (GstElement *element, gint xid, void *priv);
typedef void (*found_handler) (GstElement *element, GtkArg *arg, void *priv);
void void
arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv) arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv)
{ {
GList *children; GList *children;
GstElement *child;
GtkType type;
GtkArg *args;
guint32 *flags;
guint num_args,i;
gchar *ccargname; gchar *ccargname;
ccargname = g_strdup_printf("::%s",argname); ccargname = g_strdup_printf("::%s",argname);
@ -31,19 +23,28 @@ arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv)
children = gst_bin_get_list(bin); children = gst_bin_get_list(bin);
while (children) { while (children) {
GstElement *child;
child = GST_ELEMENT (children->data); child = GST_ELEMENT (children->data);
children = g_list_next (children); children = g_list_next (children);
// fprintf(stderr,"have child \"%s\"\n",gst_object_get_path_string(GST_OBJECT(child)));
if (GST_IS_BIN (child)) arg_search (GST_BIN (child), argname, handler, priv); if (GST_IS_BIN (child)) arg_search (GST_BIN (child), argname, handler, priv);
else { else {
GtkType type;
type = GTK_OBJECT_TYPE (child); type = GTK_OBJECT_TYPE (child);
while (type != GTK_TYPE_INVALID) { while (type != GTK_TYPE_INVALID) {
GtkArg *args;
guint32 *flags;
guint num_args,i;
args = gtk_object_query_args(type,&flags,&num_args); args = gtk_object_query_args(type,&flags,&num_args);
for (i=0;i<num_args;i++) { for (i=0;i<num_args;i++) {
//fprintf(stderr,"arg is \"%s\"\n",args[i].name); if (strstr(args[i].name,ccargname)) {
if (strstr(args[i].name,ccargname)) (handler)(child, gst_util_get_int_arg (GTK_OBJECT (child), argname) ,priv);
(handler)(child,&args[i],priv); }
} }
type = gtk_type_parent(type); type = gtk_type_parent(type);
} }
@ -53,28 +54,28 @@ arg_search (GstBin *bin, gchar *argname, found_handler handler, void *priv)
g_free(ccargname); g_free(ccargname);
} }
void handle_have_size(GstElement *element,int width,int height) { void
fprintf(stderr,"have size from xvideosink: %dx%d\n",width,height); handle_have_size (GstElement *element,int width,int height)
{
gtk_widget_set_usize(gtk_socket,width,height); gtk_widget_set_usize(gtk_socket,width,height);
gtk_widget_show_all(window);
} }
void xid_handler(GstElement *element, GtkArg *arg, void *priv) { void
fprintf(stderr,"have xid\n"); xid_handler (GstElement *element, gint xid, void *priv)
{
xid = GTK_VALUE_INT(*arg);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
hbox = gtk_hbox_new(TRUE,10);
gtk_socket = gtk_socket_new (); gtk_socket = gtk_socket_new ();
gtk_widget_set_usize(gtk_socket,720,480);
gtk_widget_show(gtk_socket); gtk_widget_show(gtk_socket);
gtk_container_add(GTK_CONTAINER(window),hbox);
gtk_box_pack_end(GTK_BOX(hbox),gtk_socket,TRUE,TRUE,0); gtk_container_add(GTK_CONTAINER(window),gtk_socket);
gtk_widget_realize(gtk_socket); gtk_widget_realize(gtk_socket);
gtk_socket_steal (GTK_SOCKET (gtk_socket), xid); gtk_socket_steal (GTK_SOCKET (gtk_socket), xid);
gtk_object_set(GTK_OBJECT(window),"allow_grow",TRUE,NULL); gtk_object_set(GTK_OBJECT(window),"allow_grow",TRUE,NULL);
gtk_object_set(GTK_OBJECT(window),"allow_shrink",TRUE,NULL); gtk_object_set(GTK_OBJECT(window),"allow_shrink",TRUE,NULL);
gtk_widget_show_all(window);
gtk_signal_connect (GTK_OBJECT (element), "have_size", gtk_signal_connect (GTK_OBJECT (element), "have_size",
GTK_SIGNAL_FUNC (handle_have_size), element); GTK_SIGNAL_FUNC (handle_have_size), element);
@ -134,13 +135,8 @@ main(int argc, char *argv[])
fprintf(stderr,"RUNNING pipeline\n"); fprintf(stderr,"RUNNING pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PLAYING); gst_element_set_state (pipeline, GST_STATE_PLAYING);
// if (have_window) {
gtk_idle_add(idle_func,pipeline); gtk_idle_add(idle_func,pipeline);
fprintf(stderr,"going into gtk_main()\n");
gtk_main(); gtk_main();
// } else {
// while (gst_bin_iterate (GST_BIN (pipeline)));
// }
gst_element_set_state (pipeline, GST_STATE_NULL); gst_element_set_state (pipeline, GST_STATE_NULL);