All pastes #241851 Raw Edit

Mine

public text v1 · immutable
·published 2006-11-06 18:14 UTC
rendered paste body
set_invisible_cursor(GdkWindow* pubRefGdkWin) /* adapted from totem */
{
	GdkBitmap *empty_bitmap;
	GdkCursor *cursor;
	GdkColor useless;
	char invisible_cursor_bits[] = { 0x0 }; 

	useless.red = useless.green = useless.blue = 0;
	useless.pixel = 0;

	empty_bitmap = gdk_bitmap_create_from_data(pubRefGdkWin,
			invisible_cursor_bits,
			1, 1);

	/* When there's no window, there's no bitmap */
	if (empty_bitmap == NULL)
		return;

	cursor = gdk_cursor_new_from_pixmap(empty_bitmap,
			empty_bitmap,
			&useless,
			&useless, 0, 0);

	gdk_window_set_cursor(pubRefGdkWin, cursor);

	gdk_cursor_unref(cursor);

	g_object_unref(empty_bitmap);
}

static gint 
handle_video_cursor(GtkWidget *widget, GdkEventMotion *event) 
{
  gdk_window_set_cursor(event->window, NULL); //this never happens
  return true;
}

...
  GdkWindowAttr attributes;
  mGtkWidget = gtk_drawing_area_new();
  attributes.window_type = GDK_WINDOW_CHILD;
  attributes.x = 0;
  attributes.y = 0;
  attributes.width = 0;
  attributes.height = 0;
  attributes.wclass = GDK_INPUT_OUTPUT;
  attributes.event_mask = GDK_ALL_EVENTS_MASK;

  gtk_drawing_area_size(GTK_DRAWING_AREA(mGtkWidget),0,0);
  mGdkWin = gdk_window_new(win, &attributes, GDK_WA_X | GDK_WA_Y); //win is a toplevel window created by the xul application
  gtk_widget_set_parent_window(mGtkWidget, mGdkWin);
  gtk_signal_connect(GTK_OBJECT(mGtkWidget), "motion_notify_event", (GtkSignalFunc)handle_video_cursor, NULL);
  gtk_widget_set_events(mGtkWidget, GDK_ALL_EVENTS_MASK);
  gdk_window_show(mGdkWin);
  gtk_widget_show(mGtkWidget);
  set_invisible_cursor(mGdkWin);
...

NS_IMETHODIMP
sbGStreamerSimple::Resize() //resize video window and gtkwidget
{
  PRInt32 x, y, width, height;
  nsCOMPtr<nsIBoxObject> boxObject;
  mVideoOutputElement->GetBoxObject(getter_AddRefs(boxObject));
  boxObject->GetX(&x);
  boxObject->GetY(&y);
  boxObject->GetWidth(&width);
  boxObject->GetHeight(&height);

  PRInt32 newX, newY, newWidth, newHeight;

  // If we have not received a video size yet, size the video window to the
  // size of the video output element
  if(mVideoWidth == 0 && mVideoHeight == 0) {
    gdk_window_move_resize(mGdkWin, x, y, width, height);
    gtk_widget_hide(mGtkWidget);
    gtk_widget_set_size_request(mGtkWidget,(gint)width,(gint)height);
    gtk_widget_show(mGtkWidget);
  }
  else {
    if(mVideoWidth > 0 && mVideoHeight > 0) {

      float ratioWidth  = (float) width  / (float) mVideoWidth;
      float ratioHeight = (float) height / (float) mVideoHeight;
      if(ratioWidth < ratioHeight) {
        newWidth  = PRInt32(mVideoWidth  * ratioWidth);
        newHeight = PRInt32(mVideoHeight * ratioWidth);
        newX = x;
        newY = ((height - newHeight) / 2) + y;
      }
      else {
        newWidth  = PRInt32(mVideoWidth  * ratioHeight);
        newHeight = PRInt32(mVideoHeight * ratioHeight);
        newX = ((width - newWidth) / 2) + x;
        newY = y;
      }

      gdk_window_move_resize(mGdkWin, newX, newY, newWidth, newHeight);
      gtk_widget_hide(mGtkWidget);
      gtk_widget_set_size_request(mGtkWidget,(gint)newWidth,(gint)newHeight);
      gtk_widget_show(mGtkWidget);
    }
  }

  return NS_OK;
}