⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_gtk_widget.c

📁 Swfdec is a decoder/renderer for Macromedia Flash animations. The decoding and rendering engine is
💻 C
📖 第 1 页 / 共 2 页
字号:
  GdkCursor *cursor;  if (window == NULL)    return;  if (priv->interactive)    g_object_get (priv->player, "mouse-cursor", &swfcursor, NULL);  else    swfcursor = SWFDEC_MOUSE_CURSOR_NORMAL;  switch (swfcursor) {    case SWFDEC_MOUSE_CURSOR_NONE:      {	GdkBitmap *bitmap;	GdkColor color = { 0, 0, 0, 0 };	char data = 0;	bitmap = gdk_bitmap_create_from_data (window, &data, 1, 1);	if (bitmap == NULL)	  return;	cursor = gdk_cursor_new_from_pixmap (bitmap, bitmap, &color, &color, 0, 0);	gdk_window_set_cursor (window, cursor);	gdk_cursor_unref (cursor);	g_object_unref (bitmap);	break;      }    case SWFDEC_MOUSE_CURSOR_TEXT:      cursor = gdk_cursor_new_for_display (display, GDK_XTERM);      gdk_window_set_cursor (window, cursor);      gdk_cursor_unref (cursor);      break;    case SWFDEC_MOUSE_CURSOR_CLICK:      cursor = gdk_cursor_new_for_display (display, GDK_HAND2);      gdk_window_set_cursor (window, cursor);      gdk_cursor_unref (cursor);      break;    case SWFDEC_MOUSE_CURSOR_NORMAL:      cursor = gdk_cursor_new_for_display (display, GDK_LEFT_PTR);      gdk_window_set_cursor (window, cursor);      gdk_cursor_unref (cursor);      break;    default:      g_warning ("invalid cursor %d", (int) swfcursor);      gdk_window_set_cursor (window, NULL);      break;  }}static voidswfdec_gtk_widget_realize (GtkWidget *widget){  GdkWindowAttr attributes;  gint attributes_mask;  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.event_mask = gtk_widget_get_events (widget);  attributes.event_mask |= GDK_EXPOSURE_MASK | 			   GDK_BUTTON_PRESS_MASK |			   GDK_BUTTON_RELEASE_MASK |			   GDK_LEAVE_NOTIFY_MASK | 			   GDK_POINTER_MOTION_MASK | 			   GDK_POINTER_MOTION_HINT_MASK |			   GDK_KEY_PRESS_MASK |			   GDK_KEY_RELEASE_MASK;  attributes_mask = GDK_WA_X | GDK_WA_Y;  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),      &attributes, attributes_mask);  gdk_window_set_user_data (widget->window, widget);  widget->style = gtk_style_attach (widget->style, widget->window);  if (SWFDEC_GTK_WIDGET (widget)->priv->player) {    swfdec_gtk_widget_update_cursor (SWFDEC_GTK_WIDGET (widget));  }}static voidswfdec_gtk_widget_class_init (SwfdecGtkWidgetClass * g_class){  GObjectClass *object_class = G_OBJECT_CLASS (g_class);  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (g_class);  object_class->dispose = swfdec_gtk_widget_dispose;  object_class->get_property = swfdec_gtk_widget_get_property;  object_class->set_property = swfdec_gtk_widget_set_property;  g_object_class_install_property (object_class, PROP_PLAYER,      g_param_spec_object ("player", "player", "player that is displayed",	  SWFDEC_TYPE_PLAYER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));  g_object_class_install_property (object_class, PROP_INTERACTIVE,      g_param_spec_boolean ("interactive", "interactive", "if mouse events are processed",	  TRUE, G_PARAM_READWRITE));  g_object_class_install_property (object_class, PROP_RENDERER_SET,      g_param_spec_boolean ("renderer-set", "renderer set", "if an intermediate renderer should be used",	  TRUE, G_PARAM_READWRITE));  /* FIXME: get an enum for cairo_surface_type_t */  g_object_class_install_property (object_class, PROP_RENDERER,      g_param_spec_uint ("renderer", "renderer", "cairo_surface_type_t of intermediate renderer to use",	  0, G_MAXUINT, CAIRO_SURFACE_TYPE_IMAGE, G_PARAM_READWRITE));  widget_class->realize = swfdec_gtk_widget_realize;  widget_class->size_request = swfdec_gtk_widget_size_request;  widget_class->size_allocate = swfdec_gtk_widget_size_allocate;  widget_class->expose_event = swfdec_gtk_widget_expose;  widget_class->button_press_event = swfdec_gtk_widget_button_press;  widget_class->button_release_event = swfdec_gtk_widget_button_release;  widget_class->motion_notify_event = swfdec_gtk_widget_motion_notify;  widget_class->leave_notify_event = swfdec_gtk_widget_leave_notify;  widget_class->key_press_event = swfdec_gtk_widget_key_press;  widget_class->key_release_event = swfdec_gtk_widget_key_release;  g_type_class_add_private (object_class, sizeof (SwfdecGtkWidgetPrivate));}static voidswfdec_gtk_widget_init (SwfdecGtkWidget * widget){  SwfdecGtkWidgetPrivate *priv;    priv = widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget, SWFDEC_TYPE_GTK_WIDGET, SwfdecGtkWidgetPrivate);  priv->interactive = TRUE;  priv->renderer = CAIRO_SURFACE_TYPE_IMAGE;  GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);}static voidswfdec_gtk_widget_invalidate_cb (SwfdecPlayer *player, double x, double y,     double width, double height, SwfdecGtkWidget *widget){  GdkRectangle rect;  if (!GTK_WIDGET_REALIZED (widget))    return;  rect.x = floor (x);  rect.y = floor (y);  rect.width = ceil (x + width) - rect.x;  rect.height = ceil (y + height) - rect.y;  gdk_window_invalidate_rect (GTK_WIDGET (widget)->window, &rect, FALSE);}static voidswfdec_gtk_widget_notify_cb (SwfdecPlayer *player, GParamSpec *pspec, SwfdecGtkWidget *widget){  if (g_str_equal (pspec->name, "mouse-cursor")) {    swfdec_gtk_widget_update_cursor (widget);  } else if (g_str_equal (pspec->name, "initialized")) {    gtk_widget_queue_resize (GTK_WIDGET (widget));  }}/*** PUBLIC API ***//** * swfdec_gtk_widget_set_player: * @widget: a #SwfdecGtkWidget * @player: the #SwfdecPlayer to display or %NULL for none * * Sets the new player to display in @widget. **/voidswfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player){  SwfdecGtkWidgetPrivate *priv = widget->priv;  g_return_if_fail (SWFDEC_IS_GTK_WIDGET (widget));  g_return_if_fail (player == NULL || SWFDEC_IS_PLAYER (player));    if (priv->player) {    g_signal_handlers_disconnect_by_func (priv->player, swfdec_gtk_widget_invalidate_cb, widget);    g_signal_handlers_disconnect_by_func (priv->player, swfdec_gtk_widget_notify_cb, widget);    g_object_unref (priv->player);  }  priv->player = player;  if (player) {    g_signal_connect (player, "invalidate", G_CALLBACK (swfdec_gtk_widget_invalidate_cb), widget);    g_signal_connect (player, "notify", G_CALLBACK (swfdec_gtk_widget_notify_cb), widget);    g_object_ref (player);    swfdec_gtk_widget_update_cursor (widget);  } else {    if (GTK_WIDGET (widget)->window)      gdk_window_set_cursor (GTK_WIDGET (widget)->window, NULL);   }  gtk_widget_queue_resize (GTK_WIDGET (widget));  g_object_notify (G_OBJECT (widget), "player");}/** * swfdec_gtk_widget_get_player: * @widget: a #SwfdecGtkWidget * * Gets the player that is currently played back in this @widget. * * Returns: the #SwfdecPlayer or %NULL if none **/SwfdecPlayer *swfdec_gtk_widget_get_player (SwfdecGtkWidget *widget){  g_return_val_if_fail (SWFDEC_IS_GTK_WIDGET (widget), NULL);  return widget->priv->player;}/** * swfdec_gtk_widget_new: * @player: a #SwfdecPlayer or %NULL * * Creates a new #SwfdecGtkWidget to display @player. * * Returns: the new widget that displays @player **/GtkWidget *swfdec_gtk_widget_new (SwfdecPlayer *player){  SwfdecGtkWidget *widget;    g_return_val_if_fail (player == NULL || SWFDEC_IS_PLAYER (player), NULL);  widget = g_object_new (SWFDEC_TYPE_GTK_WIDGET, "player", player, NULL);  return GTK_WIDGET (widget);}/** * swfdec_gtk_widget_set_interactive: * @widget: a #SwfdecGtkWidget * @interactive: %TRUE to make the widget interactive * * Sets the widget to be interactive or not. An interactive widget processes  * mouse and keyboard events, while a non-interactive widget does not care about * user input. Widgets are interactive by default. **/voidswfdec_gtk_widget_set_interactive (SwfdecGtkWidget *widget, gboolean interactive){  g_return_if_fail (SWFDEC_IS_GTK_WIDGET (widget));  widget->priv->interactive = interactive;  swfdec_gtk_widget_update_cursor (widget);  g_object_notify (G_OBJECT (widget), "interactive");}/** * swfdec_gtk_widget_get_interactive: * @widget: a #SwfdecGtkWidget * * Queries if the @widget is currently interactive. See  * swfdec_gtk_widget_set_interactive() for details. * * Returns: %TRUE if the widget is interactive, %FALSE otherwise. **/gbooleanswfdec_gtk_widget_get_interactive (SwfdecGtkWidget *widget){  g_return_val_if_fail (SWFDEC_IS_GTK_WIDGET (widget), FALSE);  return widget->priv->interactive;}/** * swfdec_gtk_widget_set_renderer: * @widget: a #SwfdecGtkWidget * @renderer: a #cairo_surface_type_t for the intermediate renderer * * Tells @widget to use an intermediate surface for rendering. This is * useful for debugging or performance measurements inside swfdec and is  * probably not interesting for anyone else. **/voidswfdec_gtk_widget_set_renderer (SwfdecGtkWidget *widget, cairo_surface_type_t renderer){  g_return_if_fail (SWFDEC_IS_GTK_WIDGET (widget));  widget->priv->renderer = renderer;  if (widget->priv->renderer_set == FALSE) {    widget->priv->renderer_set = TRUE;    g_object_notify (G_OBJECT (widget), "renderer-set");  }  g_object_notify (G_OBJECT (widget), "renderer");}/** * swfdec_gtk_widget_unset_renderer: * @widget: a #SwfdecGtkWidget * * Unsets the use of an intermediate rendering surface. See  * swfdec_gtk_widget_set_renderer() for details. **/voidswfdec_gtk_widget_unset_renderer (SwfdecGtkWidget *widget){  g_return_if_fail (SWFDEC_IS_GTK_WIDGET (widget));  if (widget->priv->renderer_set == FALSE)    return;  widget->priv->renderer_set = FALSE;  g_object_notify (G_OBJECT (widget), "renderer-set");}/** * swfdec_gtk_widget_get_renderer: * @widget: a #SwfdecGtkWidget * * Gets the intermediate renderer that is or would be in use by @widget. Use * swfdec_gtk_widget_uses_renderer() to check if an intermediate renderer is in * use. See swfdec_gtk_widget_set_renderer() for details. * * Returns: the type of the intermediate renderer **/cairo_surface_type_tswfdec_gtk_widget_get_renderer (SwfdecGtkWidget *widget){  g_return_val_if_fail (SWFDEC_IS_GTK_WIDGET (widget), CAIRO_SURFACE_TYPE_IMAGE);  return widget->priv->renderer;}/** * swfdec_gtk_widget_uses_renderer: * @widget: a #SwfdecGtkWidget * * Queries if an intermediate renderer set via swfdec_gtk_widget_set_renderer() * is currently in use. * * Returns: %TRUE if an intermediate renderer is used. **/gbooleanswfdec_gtk_widget_uses_renderer (SwfdecGtkWidget *widget){  g_return_val_if_fail (SWFDEC_IS_GTK_WIDGET (widget), FALSE);  return widget->priv->renderer_set;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -