📄 swfdec_gtk_widget.c
字号:
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 + -