Hello again, i have to apologize: the thing about the wrong window size was a very nasty memory allocation thing: a corrected malloc and the requisition data weren´t be overwritten... *sigh* But another question still remains: The gtkmplayer widget allocation data gets the right dimensions of the newly allocated space, but the mplayer window holds its dimension (QVGA) centered in the middle of the allocated space. The mplayer doesn´t get information on it´s size (by command line parameters), so i can only think of the overriden functions ( allocate(), realize()...) to be the problem. I hope somebody can tell if there is a fundamental error in my resize-functions or if the problem is more complicated For more info here is the relevant code of my widget files: /*--------------------BEGIN--------------gtkmplayer.h--------------*/ #include <gtk/gtk.h> #define GTKMPLAYER(obj) GTK_CHECK_CAST(obj, \ gtkmplayer_get_type (), GtkMplayer) #define GTKMPLAYER_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, \ gtkmplayer_get_type (), GtkMplayerClass) #define GTK_IS_MPLAYER(obj) GTK_CHECK_TYPE(obj, gtkmplayer_get_type ()) typedef struct _GtkMplayer GtkMplayer; typedef struct _GtkMplayerClass GtkMplayerClass; struct _GtkMplayer { // parent GtkWidget parent; // widget data gboolean process_running; gboolean init_success; pid_t child_pid; guint32 window_xid; // video configuration data const gchar *stream; gint xres; gint yres; gint framerate; const gchar *ip_addr; gboolean mirror; gint rotation; // mplayer configuration data gboolean slave; const gchar *vo; gboolean nolirc; gint msglevel; }; struct _GtkMplayerClass { GtkWidgetClass parent_class; }; guint gtkmplayer_get_type (void); GtkWidget* gtkmplayer_new (void); void gtkmplayer_construct (GtkMplayer *gtkmplayer); void gtkmplayer_kill (GtkMplayer *gtkmplayer); /*--------------------END--------------gtkmplayer.h--------------*/ /*--------------------BEGIN--------------gtkmplayer.c--------------*/ #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <gdk/gdkx.h> #include <gtk/gtk.h> #include "gtkmplayer.h" #include "rufvm.h" #include "callback.h" #define NUMOFPARAMS 20 #define DEF_STREAM "MPEG4" //#define DEF_STREAM "MJPEG" #define DEF_FPS 15 #define DEF_XRES 320 #define DEF_YRES 240 static GtkObjectClass *parent_class = NULL; static void gtkmplayer_class_init (GtkMplayerClass *klass); static void gtkmplayer_init (GtkMplayer *gtkmplayer); static void gtkmplayer_destroy (GtkObject *object); static void gtkmplayer_size_request (GtkWidget *widget, GtkRequisition *req); static void gtkmplayer_realize (GtkWidget *widget); static void gtkmplayer_allocate (GtkWidget *widget, GtkAllocation *allocation); int gtkmplayer_setup_params (GtkMplayer* gtkmplayer, struct_camera *camera); int gtkmplayer_start_process (GtkMplayer *gtkmplayer); int gtkmplayer_create_argv (GtkMplayer *gtkmplayer, gchar *argv[]); guint gtkmplayer_get_type (void) { static guint gtkmplayer_type = 0; if (!gtkmplayer_type) { GtkTypeInfo gtkmplayer_info = { "GtkMplayer", sizeof (GtkMplayer), sizeof (GtkMplayerClass), (GtkClassInitFunc) gtkmplayer_class_init, (GtkObjectInitFunc) gtkmplayer_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; gtkmplayer_type = gtk_type_unique (gtk_widget_get_type (), >kmplayer_info); } return gtkmplayer_type; } static void gtkmplayer_class_init (GtkMplayerClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) klass; widget_class = (GtkWidgetClass*) klass; object_class->destroy = gtkmplayer_destroy; parent_class = gtk_type_class (gtk_widget_get_type ()); /*Override the default methods */ widget_class->realize = gtkmplayer_realize; widget_class->size_request = gtkmplayer_size_request; widget_class->expose_event = expose_event_gtkmplayer; // widget_class->size_allocate = gtkmplayer_allocate; } static void gtkmplayer_init (GtkMplayer *gtkmplayer) { gtkmplayer->process_running = FALSE; gtkmplayer->init_success = FALSE; gtkmplayer->child_pid = 0; gtkmplayer->window_xid = 0; // video configuration data gtkmplayer->stream = DEF_STREAM; gtkmplayer->xres = DEF_XRES; gtkmplayer->yres = DEF_YRES; gtkmplayer->framerate = DEF_FPS; gtkmplayer->ip_addr = "192.168.1.8"; gtkmplayer->mirror = 0; gtkmplayer->rotation = 0; // mplayer configuration data gtkmplayer->slave = TRUE; gtkmplayer->vo = "x11"; gtkmplayer->nolirc = TRUE; gtkmplayer->msglevel = 1; } static void gtkmplayer_destroy (GtkObject *object) { parent_class->destroy(object); } GtkWidget* gtkmplayer_new(void) { GtkWidget *gtkmplayer; gtkmplayer = gtk_type_new ( gtkmplayer_get_type()); return gtkmplayer; } void gtkmplayer_construct (GtkMplayer *gtkmplayer) { // DUMMY DEFINITION -> has to be filled with data!!!!!!!!!!!!!!!!!!!!!!! struct_camera *camera; camera = malloc (sizeof (struct_camera)); camera->ip_string = "192.168.1.8"; camera->camera_type = "Inner"; camera->camera_orientation = "v"; camera->camera_side = "R"; //_______________________________________________________________________ if (!gtkmplayer->process_running) { // wenns schon navi gibt dann selected holen und in gtkmplayer schreiben // cameral-lookup/wagon-lookup??? who knows ;-) if (gtkmplayer_setup_params(gtkmplayer,camera) == EXIT_SUCCESS) { gtkmplayer->init_success = TRUE; if (gtkmplayer_start_process(gtkmplayer) == EXIT_SUCCESS) gtkmplayer->process_running = TRUE; } } } void gtkmplayer_kill (GtkMplayer *gtkmplayer) { gint status = 0; if ((gtkmplayer->child_pid > 0) && gtkmplayer->process_running) { kill (gtkmplayer->child_pid, SIGTERM); waitpid (gtkmplayer->child_pid, &status, 0); gtkmplayer->child_pid = -1; gtkmplayer->process_running = FALSE; } } static void gtkmplayer_size_request (GtkWidget *widget, GtkRequisition *req) { req->width = DEF_XRES; // Default value req->height = DEF_YRES; // Default value } static void gtkmplayer_realize (GtkWidget *widget) { GtkMplayer *gtkmplayer; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MPLAYER (widget)); gtkmplayer = GTKMPLAYER (widget); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask); gdk_window_set_user_data (widget->window, gtkmplayer); widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); } static void gtkmplayer_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkMplayer *gtkmplayer; gtkmplayer = GTKMPLAYER (widget); g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MPLAYER (widget)); g_return_if_fail (allocation != NULL); widget->allocation = *allocation; if ( GTK_WIDGET_REALIZED (widget)) gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); gtkmplayer->xres = allocation->width; gtkmplayer->yres = allocation->height; } int gtkmplayer_setup_params (GtkMplayer* gtkmplayer, struct_camera *camera) { // mplayer parameter setup } int gtkmplayer_start_process(GtkMplayer *gtkmplayer) { gchar *argv[NUMOFPARAMS]; if (gtkmplayer_create_argv(gtkmplayer, &argv[0]) == EXIT_FAILURE) return EXIT_FAILURE; switch (gtkmplayer->child_pid = fork ()) { case -1: return EXIT_FAILURE; case 0: execv ("/usr/local/bin/mplayer", argv); exit (EXIT_FAILURE); break; default: if (waitpid (gtkmplayer->child_pid, NULL, WNOHANG) != 0) return EXIT_FAILURE; } return EXIT_SUCCESS; } int gtkmplayer_create_argv (GtkMplayer *gtkmplayer, gchar *argv[]) { // creation of the argument list }
/*--------------------END--------------gtkmplayer.c--------------*/ Hope it isn´t to much, but i hope trained eye will see something ;-) Best regards Markus ----- Gersys GmbH, Hans-Urmiller-Ring 46c, D-82515 Wolfratshausen, Germany Geschaeftsfuehrer: Erwin Sterzer, HRB 137 872 Muenchen, Fon: +49(0)8171 9986-6 Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet. This e-mail may contain confidential and/or privileged information. If you are not the intended recipient or have received this e-mail in error please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden. _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list