Follow-Up: Size Requesition of User Defined Widget



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 (),
       &gtkmplayer_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.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]