[Swfdec-commits] 7 commits - mozilla-sucks/npapi.h src/plugin.c src/plugin.h src/plugin_x11.c src/plugin_x11.h src/swfmoz_player.c src/swfmoz_player.h

Benjamin Otte company at kemper.freedesktop.org
Tue Apr 22 14:50:54 PDT 2008


 mozilla-sucks/npapi.h |    4 +
 src/plugin.c          |   87 ++++++++++++++++++++-----------
 src/plugin.h          |    4 +
 src/plugin_x11.c      |  139 +++++++++++++++++++++++++++++++++-----------------
 src/plugin_x11.h      |    3 -
 src/swfmoz_player.c   |  122 +++++++++++++++++++++++--------------------
 src/swfmoz_player.h   |    5 +
 7 files changed, 228 insertions(+), 136 deletions(-)

New commits:
commit 7633dbf9aba4e8b71fef4a44b5dc64344756d08b
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 23:50:19 2008 +0200

    silence argument parser
    
    There's no need to print all arguments we don't parse.

diff --git a/src/plugin.c b/src/plugin.c
index f83d898..a935dfd 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -253,12 +253,6 @@ plugin_new (NPMIMEType mime_type, NPP instance,
     if (g_ascii_strcasecmp (argn[i], "flashvars") == 0) {
       if (argv[i])
 	swfdec_player_set_variables (player, argv[i]);
-    } else if (g_ascii_strcasecmp (argn[i], "bgcolor") == 0) {
-    } else if (g_ascii_strcasecmp (argn[i], "src") == 0) {
-    } else if (g_ascii_strcasecmp (argn[i], "type") == 0) {
-    } else if (g_ascii_strcasecmp (argn[i], "width") == 0) {
-    } else if (g_ascii_strcasecmp (argn[i], "height") == 0) {
-    } else if (g_ascii_strcasecmp (argn[i], "wmode") == 0) {
     } else if (g_ascii_strcasecmp (argn[i], "scale") == 0) {
       SwfdecScaleMode scale;
       if (g_ascii_strcasecmp (argv[i], "noborder") == 0) {
@@ -295,9 +289,6 @@ plugin_new (NPMIMEType mime_type, NPP instance,
 	}
       }
       swfdec_player_set_alignment (player, align);
-    } else {
-      g_printerr ("Unsupported movie property %s with value \"%s\"\n", 
-	  argn[i], argv[i] ? argv[i] : "(null)");
     }
   }
 
commit 8ad6a87520fdef293df541f66608ddeaeb3f67f0
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 23:44:08 2008 +0200

    implement windowless mode (bug 12149)
    
    To test: http://www.communitymx.com/content/source/E5141/wmodeopaque.htm
    Some caveats:
    - Mozilla seems to not properly repaint the leftmost column of pixels. This
      causes flicker.
    - Changing the mouse cursor does not work.
    Other than that it seems to work properly.
    
    Note that to stay compatible with Adobe's plugin we only honour windowless mode
    if the plugin requests this.

diff --git a/src/plugin.c b/src/plugin.c
index acd7e39..f83d898 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -34,6 +34,10 @@
 #include "plugin.h"
 #include "plugin_x11.h"
 
+/* This is here so we can quickly disable windowless support. For now it's 
+ * missing some features (cursor support) and redraws seem to be buggy */
+#define ENABLE_WINDOWLESS
+
 NPNetscapeFuncs mozilla_funcs;
 
 
@@ -93,6 +97,12 @@ plugin_pop_allow_popups (NPP instance)
   return CallNPN_PopPopupsEnabledStateProc (mozilla_funcs.poppopupsenabledstate, instance);
 }
 
+gboolean
+plugin_get_value (NPP instance, NPNVariable var, gpointer data)
+{
+  return CallNPN_GetValueProc(mozilla_funcs.getvalue, instance, var, data) == NPERR_NO_ERROR;
+}
+
 /*** plugin implementation ***/
 
 char *
@@ -169,6 +179,28 @@ swfdec_mozilla_make_sure_this_thing_stays_in_memory (void)
   return TRUE;
 }
 
+#ifdef ENABLE_WINDOWLESS
+/* returns true if this instance can run windowless */
+static gboolean
+plugin_try_windowless (NPP instance)
+{
+  PRBool b = PR_FALSE;
+
+  /* Check if the plugin can do windowless.
+   * See http://bugzilla.mozilla.org/show_bug.cgi?id=386537 */
+  if (CallNPN_GetValueProc(mozilla_funcs.getvalue, instance,
+	NPNVSupportsWindowless, (void *) &b) || b != PR_TRUE)
+    return FALSE;
+
+  /* Try making us windowless */
+  if (CallNPN_SetValueProc (mozilla_funcs.setvalue, instance,
+  	NPPVpluginWindowBool, (void *) PR_FALSE))
+    return FALSE;
+
+  return TRUE;
+}
+#endif
+
 static NPError
 plugin_new (NPMIMEType mime_type, NPP instance,
     uint16_t mode, int16_t argc, char *argn[], char *argv[],
@@ -176,6 +208,7 @@ plugin_new (NPMIMEType mime_type, NPP instance,
 {
   SwfdecPlayer *player;
   int i;
+  gboolean windowless = FALSE, opaque = FALSE;
 
   if (instance == NULL)
     return NPERR_INVALID_INSTANCE_ERROR;
@@ -186,23 +219,31 @@ plugin_new (NPMIMEType mime_type, NPP instance,
 		"Please use the --with-plugin-dir configure option to install it into a different place.\n");
     return NPERR_INVALID_INSTANCE_ERROR;
   }
-#if 0
-  /* see https://bugzilla.mozilla.org/show_bug.cgi?id=137189 for why this doesn't work
-   * probably needs user agent sniffing to make this work correctly (iff gecko 
-   * implements it
-   */
-  if (CallNPN_SetValueProc (mozilla_funcs.setvalue, instance,
-  	NPPVpluginWindowBool, (void *) PR_FALSE))
-    return NPERR_INCOMPATIBLE_VERSION_ERROR;
-  if (CallNPN_SetValueProc (mozilla_funcs.setvalue, instance,
-	NPPVpluginTransparentBool, (void *) PR_TRUE))
-    return NPERR_INCOMPATIBLE_VERSION_ERROR;
-#endif
 
   /* Init functioncalling (even g_type_init) gets postponed until we know we
    * won't be unloaded, i.e. NPPVpluginKeepLibraryInMemory was successful */
   swfdec_init ();
-  instance->pdata = player = swfmoz_player_new (instance, FALSE);
+
+#ifdef ENABLE_WINDOWLESS
+  /* parse pre-creation properties */
+  for (i = 0; i < argc; i++) {
+    if (g_ascii_strcasecmp (argn[i], "wmode") == 0) {
+      if (g_ascii_strcasecmp (argv[i], "transparent") == 0) {
+	windowless = plugin_try_windowless (instance);
+	opaque = FALSE;
+      } else if (g_ascii_strcasecmp (argv[i], "opaque") == 0) {
+	windowless = plugin_try_windowless (instance);
+	if (windowless) {
+	  CallNPN_SetValueProc (mozilla_funcs.setvalue, instance,
+	    NPPVpluginTransparentBool, (void *) PR_FALSE);
+	  opaque = TRUE;
+	}
+      }
+    }
+  }
+#endif
+
+  instance->pdata = player = swfmoz_player_new (instance, windowless, opaque);
 
   /* set the properties we support */
   /* FIXME: figure out how variables override each other */
@@ -217,6 +258,7 @@ plugin_new (NPMIMEType mime_type, NPP instance,
     } else if (g_ascii_strcasecmp (argn[i], "type") == 0) {
     } else if (g_ascii_strcasecmp (argn[i], "width") == 0) {
     } else if (g_ascii_strcasecmp (argn[i], "height") == 0) {
+    } else if (g_ascii_strcasecmp (argn[i], "wmode") == 0) {
     } else if (g_ascii_strcasecmp (argn[i], "scale") == 0) {
       SwfdecScaleMode scale;
       if (g_ascii_strcasecmp (argv[i], "noborder") == 0) {
@@ -370,8 +412,9 @@ plugin_handle_event (NPP instance, void *eventp)
   if (instance == NULL || !SWFMOZ_IS_PLAYER (instance->pdata))
     return FALSE;
 
-  /* FIXME: implement */
-  return FALSE;
+  plugin_x11_handle_event (instance->pdata, eventp);
+
+  return TRUE;
 }
 
 static void
diff --git a/src/plugin.h b/src/plugin.h
index 69b44a3..963cc3b 100644
--- a/src/plugin.h
+++ b/src/plugin.h
@@ -26,6 +26,10 @@
 G_BEGIN_DECLS
 
 
+gboolean	plugin_get_value		(NPP		instance,
+						 NPNVariable	var,
+						 gpointer	data);
+
 void		plugin_get_url			(NPP		instance,
 						 const char *	url,
 						 const char *	target);
diff --git a/src/plugin_x11.c b/src/plugin_x11.c
index e328dcc..4db8320 100644
--- a/src/plugin_x11.c
+++ b/src/plugin_x11.c
@@ -21,49 +21,67 @@
 #include "config.h"
 #endif
 
+#include "plugin.h"
 #include "plugin_x11.h"
 #include "swfmoz_player.h"
 #include <gdk/gdkkeysyms.h>
+#include <gdk/gdkx.h>
+#include <cairo-xlib.h>
 
 /*** Plugin code ***/
 
-static GdkFilterReturn
-plugin_x11_handle_event (GdkXEvent *gdkxevent, GdkEvent *unused, gpointer playerp)
+void
+plugin_x11_handle_event (SwfmozPlayer *mozplay, XEvent *event)
 {
-  SwfdecPlayer *player = playerp;
-  SwfmozPlayer *mozplay = playerp;
-  XEvent *event = gdkxevent;
+  SwfdecPlayer *player = SWFDEC_PLAYER (mozplay);
 
   switch (event->type) {
     case VisibilityNotify:
-      {
+      if (!mozplay->windowless) {
 	GdkRectangle rect = { 0, 0, mozplay->target_rect.width, mozplay->target_rect.height };
 	GdkRegion *region;
 	region = gdk_region_rectangle (&rect);
-	swfmoz_player_render (mozplay, region);
+	swfmoz_player_render (mozplay, NULL, region);
 	gdk_region_destroy (region);
-	break;
       }
+      break;
+    case GraphicsExpose:
+      if (mozplay->windowless && mozplay->target) {
+	XGraphicsExposeEvent *expose = (XGraphicsExposeEvent *) event;
+	GdkRectangle rect = { expose->x, expose->y, expose->width, expose->height };
+	GdkRegion *region = gdk_region_rectangle (&rect);
+	cairo_surface_t *surface = cairo_xlib_surface_create (expose->display, 
+	    expose->drawable, GDK_VISUAL_XVISUAL (gdk_drawable_get_visual (mozplay->target)),
+	    expose->x + expose->width, expose->y + expose->height);
+	cairo_t *cr = cairo_create (surface);
+	swfmoz_player_render (mozplay, cr, region);
+	cairo_destroy (cr);
+	cairo_surface_destroy (surface);
+	gdk_region_destroy (region);
+      }
+      break;
     case Expose:
-      {
+      if (!mozplay->windowless) {
 	XExposeEvent *expose = (XExposeEvent *) event;
 	GdkRectangle rect = { expose->x, expose->y, expose->width, expose->height };
 	GdkRegion *region;
 	region = gdk_region_rectangle (&rect);
-	swfmoz_player_render (mozplay, region);
+	swfmoz_player_render (mozplay, NULL, region);
 	gdk_region_destroy (region);
-	break;
       }
+      break;
     case ButtonPress:
       {
 	XButtonEvent *button = (XButtonEvent *) event;
-	swfmoz_player_mouse_press (mozplay, button->x, button->y, button->button);
+	swfmoz_player_mouse_press (mozplay, button->x - mozplay->target_rect.x, 
+	    button->y - mozplay->target_rect.y, button->button);
 	break;
       }
     case ButtonRelease:
       {
 	XButtonEvent *button = (XButtonEvent *) event;
-	swfmoz_player_mouse_release (mozplay, button->x, button->y, button->button);
+	swfmoz_player_mouse_release (mozplay, button->x - mozplay->target_rect.x, 
+	    button->y - mozplay->target_rect.y, button->button);
 	break;
       }
     case EnterNotify:
@@ -72,10 +90,16 @@ plugin_x11_handle_event (GdkXEvent *gdkxevent, GdkEvent *unused, gpointer player
       break;
     case MotionNotify:
       {
-	int winx, winy;
+	if (mozplay->windowless) {
+	  XMotionEvent *motion = (XMotionEvent *) event;
+	  swfmoz_player_mouse_move (mozplay, motion->x - mozplay->target_rect.x,
+	      motion->y - mozplay->target_rect.y);
+	} else {
+	  int winx, winy;
 
-	gdk_window_get_pointer (mozplay->target, &winx, &winy, NULL);
-	swfmoz_player_mouse_move (mozplay, winx, winy);
+	  gdk_window_get_pointer (mozplay->target, &winx, &winy, NULL);
+	  swfmoz_player_mouse_move (mozplay, winx, winy);
+	}
 	break;
       }
     case KeyPress:
@@ -104,13 +128,20 @@ plugin_x11_handle_event (GdkXEvent *gdkxevent, GdkEvent *unused, gpointer player
       {
 	XConfigureEvent *conf = (XConfigureEvent *) event;
 
-	swfmoz_player_set_target (mozplay, mozplay->target, 0, 0, conf->width, conf->height);
+	if (!mozplay->windowless)
+	  swfmoz_player_set_target (mozplay, mozplay->target, 0, 0, conf->width, conf->height);
 	break;
       }
     default:
       g_printerr ("unhandled event %d\n", event->type);
       break;
   }
+}
+
+static GdkFilterReturn
+plugin_x11_filter_event (GdkXEvent *gdkxevent, GdkEvent *unused, gpointer playerp)
+{
+  plugin_x11_handle_event (playerp, gdkxevent);
   return GDK_FILTER_REMOVE;
 }
 
@@ -118,37 +149,51 @@ void
 plugin_x11_setup_windowed (SwfmozPlayer *player, Window xwindow, 
     int x, int y, int width, int height)
 {
-  if (player->target == NULL) {
-    GdkWindowAttr attr;
-    GdkWindow *parent, *window;
-    GdkColor color;
-
-    parent = gdk_window_foreign_new (xwindow);
-    if (parent == NULL) {
-      g_printerr ("invalid window given for setup (id %lu)\n", xwindow);
-      return;
+  if (player->windowless) {
+    if (player->target == NULL) {
+      GdkWindow *window;
+      if (!plugin_get_value (player->instance, NPNVnetscapeWindow, &xwindow) ||
+	  (window = gdk_window_foreign_new (xwindow)) == NULL) {
+	g_printerr ("cannot set window given for setup (id %lu)\n", xwindow);
+	return;
+      }
+      swfmoz_player_set_target (player, window, x, y, width, height);
+    } else {
+      swfmoz_player_set_target (player, player->target, x, y, width, height);
     }
-    
-    attr.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | 
-      GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
-      GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | 
-      GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_KEY_PRESS_MASK |
-      GDK_KEY_RELEASE_MASK;
-    attr.x = 0;
-    attr.y = 0;
-    attr.width = width;
-    attr.height = height;
-    attr.window_type = GDK_WINDOW_CHILD;
-    attr.wclass = GDK_INPUT_OUTPUT;
-    window = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
-    color.red = color.green = color.blue = 65535;
-    gdk_rgb_find_color (gdk_window_get_colormap (window), &color);
-    gdk_window_set_background (window, &color);
-    gdk_window_add_filter (window, plugin_x11_handle_event, player);
-    gdk_window_show (window);
-    swfmoz_player_set_target (player, window, 0, 0, width, height);
   } else {
-    gdk_window_move_resize (player->target, 0, 0, width, height);
+    if (player->target == NULL) {
+      GdkWindowAttr attr;
+      GdkWindow *parent, *window;
+      GdkColor color;
+
+      parent = gdk_window_foreign_new (xwindow);
+      if (parent == NULL) {
+	g_printerr ("invalid window given for setup (id %lu)\n", xwindow);
+	return;
+      }
+      
+      attr.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK | 
+	GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
+	GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | 
+	GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_KEY_PRESS_MASK |
+	GDK_KEY_RELEASE_MASK;
+      attr.x = 0;
+      attr.y = 0;
+      attr.width = width;
+      attr.height = height;
+      attr.window_type = GDK_WINDOW_CHILD;
+      attr.wclass = GDK_INPUT_OUTPUT;
+      window = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
+      color.red = color.green = color.blue = 65535;
+      gdk_rgb_find_color (gdk_window_get_colormap (window), &color);
+      gdk_window_set_background (window, &color);
+      gdk_window_add_filter (window, plugin_x11_filter_event, player);
+      gdk_window_show (window);
+      swfmoz_player_set_target (player, window, 0, 0, width, height);
+    } else {
+      gdk_window_move_resize (player->target, 0, 0, width, height);
+    }
   }
 }
 
@@ -156,7 +201,7 @@ void
 plugin_x11_teardown (SwfmozPlayer *player)
 {
   if (player->target) {
-    gdk_window_remove_filter (player->target, plugin_x11_handle_event, player);
+    gdk_window_remove_filter (player->target, plugin_x11_filter_event, player);
   }
   swfmoz_player_set_target (player, NULL, 0, 0, 0, 0);
 }
diff --git a/src/plugin_x11.h b/src/plugin_x11.h
index 82cfa73..b07c677 100644
--- a/src/plugin_x11.h
+++ b/src/plugin_x11.h
@@ -34,7 +34,8 @@ void	plugin_x11_setup_windowed	(SwfmozPlayer *	      player,
 					 int		      width,
 					 int		      height);
 void	plugin_x11_teardown		(SwfmozPlayer *	      player);
-
+void	plugin_x11_handle_event		(SwfmozPlayer *	      player,
+					 XEvent *	      event);
 
 G_END_DECLS
 #endif
diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index 80c5d06..ee81c7a 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -153,16 +153,31 @@ swfmoz_player_idle_redraw (gpointer playerp)
   GdkRegion *region;
 
   region = player->repaint;
-  if (region) {
-    player->repaint = NULL;
-    g_source_destroy (player->repaint_source);
-    g_source_unref (player->repaint_source);
-    player->repaint_source = NULL;
-    swfmoz_player_render (player, region);
-    gdk_region_destroy (region);
+  player->repaint = NULL;
+  g_source_unref (player->repaint_source);
+  player->repaint_source = NULL;
+  if (player->windowless) {
+    NPRect rect;
+    GdkRectangle *rectangles;
+    int i, n_rectangles;
+
+    g_assert (player->repaint == NULL);
+    
+    gdk_region_get_rectangles (region, &rectangles, &n_rectangles);
+
+    for (i = 0; i < n_rectangles; i++) {
+      rect.left = rectangles[i].x;
+      rect.top = rectangles[i].y;
+      rect.right = rectangles[i].x + rectangles[i].width;
+      rect.bottom = rectangles[i].y + rectangles[i].height;
+      plugin_invalidate_rect (player->instance, &rect);
+    }
+  } else {
+    swfmoz_player_render (player, NULL, region);
   }
+  gdk_region_destroy (region);
 
-  return TRUE;
+  return FALSE;
 }
 
 static void
@@ -181,34 +196,15 @@ swfmoz_player_redraw (SwfmozPlayer *player, const SwfdecRectangle *extents,
     gdk_region_union_with_rect (region, (GdkRectangle *) &rects[i]);
   }
 
-  if (player->windowless) {
-    NPRect rect;
-    GdkRectangle *rectangles;
-    int n_rectangles;
-
-    g_assert (player->repaint == NULL);
-    
-    gdk_region_get_rectangles (region, &rectangles, &n_rectangles);
-
-    for (i = 0; i < (guint) n_rectangles; i++) {
-      rect.left = rectangles[i].x;
-      rect.top = rectangles[i].y;
-      rect.right = rectangles[i].x + rectangles[i].width;
-      rect.bottom = rectangles[i].y + rectangles[i].height;
-      plugin_invalidate_rect (player->instance, &rect);
-    }
-    gdk_region_destroy (region);
+  if (player->repaint_source) {
+    g_assert (player->repaint);
   } else {
-    if (player->repaint_source) {
-      g_assert (player->repaint);
-    } else {
-      GSource *source = g_idle_source_new ();
-      player->repaint_source = source;
-      g_source_set_priority (source, SWFDEC_GTK_PRIORITY_REDRAW);
-      g_source_set_callback (source, swfmoz_player_idle_redraw, player, NULL);
-      g_source_attach (source, player->context);
-      player->repaint = region;
-    }
+    GSource *source = g_idle_source_new ();
+    player->repaint_source = source;
+    g_source_set_priority (source, SWFDEC_GTK_PRIORITY_REDRAW);
+    g_source_set_callback (source, swfmoz_player_idle_redraw, player, NULL);
+    g_source_attach (source, player->context);
+    player->repaint = region;
   }
 }
 
@@ -244,7 +240,8 @@ swfmoz_player_update_cursor (SwfmozPlayer *player)
   SwfdecMouseCursor swfcursor;
   GdkCursor *cursor;
 
-  if (window == NULL)
+  /* FIXME: make this work for windowless mode */
+  if (window == NULL || player->windowless)
     return;
   display = gdk_drawable_get_display (window);
 
@@ -396,7 +393,7 @@ swfmoz_player_init (SwfmozPlayer *player)
 }
 
 SwfdecPlayer *
-swfmoz_player_new (NPP instance, gboolean windowless)
+swfmoz_player_new (NPP instance, gboolean windowless, gboolean opaque)
 {
   SwfmozPlayer *ret;
   SwfdecSystem *system;
@@ -409,6 +406,7 @@ swfmoz_player_new (NPP instance, gboolean windowless)
       NULL);
   ret->instance = instance;
   ret->windowless = windowless;
+  ret->opaque = opaque;
   ret->config = swfmoz_config_new ();
 
   return SWFDEC_PLAYER (ret);
@@ -539,7 +537,7 @@ swfmoz_player_set_target (SwfmozPlayer *player, GdkWindow *target,
   player->target_rect.y = y;
   player->target_rect.width = width;
   player->target_rect.height = height;
-  swfdec_player_set_size (SWFDEC_PLAYER (player), width - x, height - y);
+  swfdec_player_set_size (SWFDEC_PLAYER (player), width, height);
   if (target) {
     g_object_ref (target);
     swfdec_gtk_player_set_missing_plugins_window (SWFDEC_GTK_PLAYER (player), 
@@ -619,32 +617,44 @@ swfdec_gtk_player_draw_pause (cairo_t *cr)
 }
 
 void
-swfmoz_player_render (SwfmozPlayer *player, GdkRegion *region)
+swfmoz_player_render (SwfmozPlayer *player, cairo_t *cr, GdkRegion *region)
 {
   GdkRectangle rect;
-  cairo_t *cr;
+  gboolean has_cr = cr != NULL;
 
   g_return_if_fail (SWFMOZ_IS_PLAYER (player));
   g_return_if_fail (!gdk_region_empty (region));
 
   /* first, remove the repainted stuff from the stuff that needs a redraw */
   if (player->repaint) {
-
     g_assert (player->repaint_source);
-    gdk_region_union (player->repaint, region);
-
-    region = player->repaint;
+    gdk_region_subtract (player->repaint, region);
+    if (gdk_region_empty (player->repaint)) {
+      g_source_destroy (player->repaint_source);
+      g_source_unref (player->repaint_source);
+      player->repaint_source = NULL;
+      gdk_region_destroy (player->repaint);
+      player->repaint = NULL;
+    }
   }
 
   /* second, check if we have anything to draw */
   if (player->target == NULL)
     return;
 
-  /* paint it */
-  gdk_window_begin_paint_region (player->target, region);
-  cr = gdk_cairo_create (player->target);
+  if (!has_cr) {
+    gdk_window_begin_paint_region (player->target, region);
+    cr = gdk_cairo_create (player->target);
+  } else {
+    cairo_save (cr);
+  }
   gdk_cairo_region (cr, region);
   cairo_clip (cr);
+  /* paint it */
+  if (player->opaque) {
+    cairo_set_source_rgb (cr, 1, 1, 1);
+    cairo_paint (cr);
+  }
   cairo_translate (cr, player->target_rect.x, player->target_rect.y);
   gdk_region_get_clipbox (region, &rect);
   swfdec_player_render (SWFDEC_PLAYER (player), cr, rect.x - player->target_rect.x,
@@ -662,15 +672,11 @@ swfmoz_player_render (SwfmozPlayer *player, GdkRegion *region)
     cairo_scale (cr, len / 32.0, len / 32.0);
     swfdec_gtk_player_draw_pause (cr);
   }
-  cairo_destroy (cr);
-  gdk_window_end_paint (player->target);
-
-  if (region == player->repaint) {
-    g_source_destroy (player->repaint_source);
-    g_source_unref (player->repaint_source);
-    player->repaint_source = NULL;
-    gdk_region_destroy (player->repaint);
-    player->repaint = NULL;
+  if (!has_cr) {
+    cairo_destroy (cr);
+    gdk_window_end_paint (player->target);
+  } else {
+    cairo_restore (cr);
   }
 }
 
diff --git a/src/swfmoz_player.h b/src/swfmoz_player.h
index 6a8cf75..f65a87e 100644
--- a/src/swfmoz_player.h
+++ b/src/swfmoz_player.h
@@ -56,6 +56,7 @@ struct _SwfmozPlayer {
 
   NPStream *		initial;		/* loader that spawned this player or NULL if none yet */
   gboolean		windowless;		/* TRUE if player communicates with the windowing system via the browser */
+  gboolean		opaque;			/* TRUE if the player should not allow translucency */
   GdkWindow *		target;			/* what we draw to */
   GdkRectangle		target_rect;		/* area in target that this plugin occupies */
 
@@ -77,7 +78,8 @@ struct _SwfmozPlayerClass {
 GType		swfmoz_player_get_type   	(void);
 
 SwfdecPlayer *	swfmoz_player_new	  	(NPP			instance,
-						 gboolean		windowless);
+						 gboolean		windowless,
+						 gboolean		opaque);
 void		swfmoz_player_remove		(SwfmozPlayer *		player);
 
 gboolean	swfmoz_player_set_initial_stream (SwfmozPlayer *	player,
@@ -91,6 +93,7 @@ void		swfmoz_player_set_target	(SwfmozPlayer *		player,
 						 int			width,
 						 int			height);
 void		swfmoz_player_render		(SwfmozPlayer *		player,
+						 cairo_t *		cr,
 						 GdkRegion *		region);
 gboolean	swfmoz_player_mouse_press	(SwfmozPlayer *		player,
 						 int			x,
commit ae9b908f493499e6fa9f41dc45fdc506997013cf
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 22:58:56 2008 +0200

    use the right check for determining if a player was already initialized

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index 3124076..80c5d06 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -651,11 +651,10 @@ swfmoz_player_render (SwfmozPlayer *player, GdkRegion *region)
       rect.y - player->target_rect.y, rect.width, rect.height);
   /* paint optional pause sign */
   if (!swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (player)) &&
-      player->initial != NULL) {
+      swfdec_player_get_url (SWFDEC_PLAYER (player)) != NULL) {
     int w = player->target_rect.width;
     int h = player->target_rect.height;
     int len = MIN (w, h) * 4 / 5;
-    g_print ("PAINTING PAUSE\n");
     cairo_rectangle (cr, 0, 0, w, h);
     cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.4);
     cairo_fill (cr);
commit bd92be696f65499a8cf54c318ada4c765bfda7d0
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 22:48:39 2008 +0200

    invalidate in any case as we want to properly draw the pause sign

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index bd2031b..3124076 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -503,6 +503,7 @@ swfmoz_player_set_initial_stream (SwfmozPlayer *player, NPStream *stream)
     swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (player), TRUE);
   }
   swfdec_url_free (url);
+  swfmoz_player_invalidate (player);
 
   return TRUE;
 }
commit 1f6844a261d1bd45077dbfe05c5c0c86ee600e72
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 16:55:54 2008 +0200

    we don't need no XEmbed

diff --git a/src/plugin.c b/src/plugin.c
index 6b0b351..acd7e39 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -120,7 +120,7 @@ NP_GetValue (void* reserved, NPPVariable var, void* out)
       *val = (char *) "Shockwave Flash 9.0 r100";
       break;
     case NPPVpluginNeedsXEmbed:
-      *((PRBool*) val) = PR_TRUE;
+      *((PRBool*) val) = PR_FALSE;
       break;
     case NPPVpluginWindowBool:
     case NPPVpluginTransparentBool:
@@ -390,7 +390,6 @@ plugin_url_notify (NPP instance, const char* url, NPReason reason, void* notifyD
 NPError
 NP_Initialize (NPNetscapeFuncs * moz_funcs, NPPluginFuncs * plugin_funcs)
 {
-  PRBool b = PR_FALSE;
   NPNToolkitType toolkit = 0;
 
   if (moz_funcs == NULL || plugin_funcs == NULL)
@@ -409,10 +408,6 @@ NP_Initialize (NPNetscapeFuncs * moz_funcs, NPPluginFuncs * plugin_funcs)
   if (CallNPN_GetValueProc(mozilla_funcs.getvalue, NULL,
 	NPNVToolkit, (void *) &toolkit) || toolkit != NPNVGtk2)
     return NPERR_INCOMPATIBLE_VERSION_ERROR;
-  /* we want XEmbed embedding */
-  if (CallNPN_GetValueProc(mozilla_funcs.getvalue, NULL,
-	NPNVSupportsXEmbedBool, (void *) &b) || !b)
-    return NPERR_INCOMPATIBLE_VERSION_ERROR;
 
   memset (plugin_funcs, 0, sizeof (NPPluginFuncs));
   plugin_funcs->size = sizeof (NPPluginFuncs);
commit 66c5b837a9d62a9352e1424aec51958478cf9b0e
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 16:55:33 2008 +0200

    update for windowsless plugins

diff --git a/mozilla-sucks/npapi.h b/mozilla-sucks/npapi.h
index 6092112..02b019b 100644
--- a/mozilla-sucks/npapi.h
+++ b/mozilla-sucks/npapi.h
@@ -426,7 +426,9 @@ typedef enum {
   NPNVWindowNPObject = 15,
 
   /* Get the NPObject wrapper for the plugins DOM element. */
-  NPNVPluginElementNPObject = 16
+  NPNVPluginElementNPObject = 16,
+
+  NPNVSupportsWindowless = 17
 } NPNVariable;
 
 /*
commit 2454a05f13f54494c880bd0a8598c3697da9bcb5
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Apr 22 16:39:41 2008 +0200

    only draw a pause sign if the player is initialized
    
    Stupid mozilla paints before setting the URL so we get a flickering pause sign.

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index 1f7c15b..bd2031b 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -649,10 +649,12 @@ swfmoz_player_render (SwfmozPlayer *player, GdkRegion *region)
   swfdec_player_render (SWFDEC_PLAYER (player), cr, rect.x - player->target_rect.x,
       rect.y - player->target_rect.y, rect.width, rect.height);
   /* paint optional pause sign */
-  if (!swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (player))) {
+  if (!swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (player)) &&
+      player->initial != NULL) {
     int w = player->target_rect.width;
     int h = player->target_rect.height;
     int len = MIN (w, h) * 4 / 5;
+    g_print ("PAINTING PAUSE\n");
     cairo_rectangle (cr, 0, 0, w, h);
     cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.4);
     cairo_fill (cr);


More information about the Swfdec-commits mailing list