From 84cc52bd4fd197ec4aad845d9b09bcd5b74453d5 Mon Sep 17 00:00:00 2001 From: Tommi Komulainen Date: Tue, 25 Aug 2009 16:04:59 +0000 Subject: browser-plugin: add clipboard copy support Only supporting copy, evince doesn't support editing (at least the API is lacking cut and paste) Using property access workaround. Example: if (plugin.canCopy) { plugin.canCopy = 42; (workaround) copy selection to clipboard } --- diff --git a/browser-plugin/plugin.cpp b/browser-plugin/plugin.cpp index 7d79100..88893c8 100644 --- a/browser-plugin/plugin.cpp +++ b/browser-plugin/plugin.cpp @@ -27,7 +27,8 @@ Plugin::Plugin (NPP instance) : mInstance (instance), mScriptableObject (0), mWindow (0), mLoadJob (0), - mTitle (0) + mTitle (0), + mHasSelection (false) { mScrolledWindow = gtk_scrolled_window_new (NULL, NULL); @@ -36,6 +37,10 @@ Plugin::Plugin (NPP instance) : mInstance (instance), "notify::sizing-mode", G_CALLBACK (Plugin::SizingModeCallback), reinterpret_cast(this)); + g_signal_connect (G_OBJECT (mView), + "notify::has-selection", + G_CALLBACK (Plugin::HasSelectionCallback), + reinterpret_cast(this)); g_signal_connect (G_OBJECT (mView), "external-link", @@ -103,6 +108,12 @@ Plugin::FindPrevious (const char *text) } void +Plugin::CopyClipboard () +{ + ev_view_copy (EV_VIEW (mView)); +} + +void Plugin::SetWindow (GdkNativeWindow window) { if (mWindow != 0) { @@ -226,6 +237,19 @@ Plugin::SizingModeCallback (EvView *view, GParamSpec *pspec, gpointer data) } void +Plugin::HasSelectionCallback (EvView *view, GParamSpec *pspec, gpointer data) +{ + Plugin *plugin = reinterpret_cast (data); + + gboolean has_selection = ev_view_get_has_selection (view); + + if (has_selection != plugin->mHasSelection) { + plugin->mHasSelection = has_selection; + plugin->CallBrowser ("onClipboardChanged"); + } +} + +void Plugin::ExternalLinkCallback (EvView *view, EvLinkAction *action, gpointer data) { Plugin *plugin = reinterpret_cast (data); diff --git a/browser-plugin/plugin.h b/browser-plugin/plugin.h index 7ea940e..7da0aa3 100644 --- a/browser-plugin/plugin.h +++ b/browser-plugin/plugin.h @@ -39,6 +39,7 @@ class Plugin { void SetZoom (double); void FindNext (const char *text); void FindPrevious (const char *text); + void CopyClipboard (); void ShowLoadingError (); NPObject *GetScriptableNPObject (); @@ -51,6 +52,9 @@ class Plugin { static void SizingModeCallback (EvView *view, GParamSpec *pspec, gpointer data); + static void HasSelectionCallback (EvView *view, + GParamSpec *pspec, + gpointer data); static void ExternalLinkCallback (EvView *view, EvLinkAction *action, gpointer data); @@ -66,6 +70,7 @@ class Plugin { public: char *mTitle; + bool mHasSelection; }; void* NPN_MemDup (const void *aMem, uint32 aLen); diff --git a/browser-plugin/scriptable.cpp b/browser-plugin/scriptable.cpp index e8fbcb2..81caeb0 100644 --- a/browser-plugin/scriptable.cpp +++ b/browser-plugin/scriptable.cpp @@ -198,6 +198,7 @@ ScriptablePluginObject::ScriptablePluginObject (NPP npp) : { mTitleID = NPN_GetStringIdentifier ("title"); mZoomID = NPN_GetStringIdentifier ("zoom"); + mCanCopyID = NPN_GetStringIdentifier ("canCopy"); mMagicWrapperID = NPN_GetStringIdentifier ("magicWrapper"); mZoomInID = NPN_GetStringIdentifier ("zoomIn"); @@ -231,6 +232,7 @@ ScriptablePluginObject::HasProperty (NPIdentifier name) NPIdentifier properties[] = { mTitleID, mZoomID, + mCanCopyID, mMagicWrapperID }; @@ -261,6 +263,9 @@ ScriptablePluginObject::GetProperty (NPIdentifier name, NPVariant *result) } else if (name == mZoomID) { DOUBLE_TO_NPVARIANT (plugin->GetZoom(), *result); return true; + } else if (name == mCanCopyID) { + BOOLEAN_TO_NPVARIANT (plugin->mHasSelection, *result); + return true; } return false; @@ -310,6 +315,16 @@ ScriptablePluginObject::SetProperty (NPIdentifier name, const NPVariant *value) plugin->SetZoom (zoom); return true; + } else if (name == mCanCopyID) { + // FIXME fix method calls (using write access to a property as + // an awful workaround) + if (!plugin->mHasSelection) { + NPN_SetException (this, "Nothing to copy"); + return false; + } + + plugin->CopyClipboard (); + return true; } return false; diff --git a/browser-plugin/scriptable.h b/browser-plugin/scriptable.h index cc6ac1c..763ead2 100644 --- a/browser-plugin/scriptable.h +++ b/browser-plugin/scriptable.h @@ -94,6 +94,7 @@ class ScriptablePluginObject : public ScriptablePluginObjectBase private: NPIdentifier mTitleID; NPIdentifier mZoomID; + NPIdentifier mCanCopyID; NPIdentifier mMagicWrapperID; NPIdentifier mZoomInID; -- cgit v0.9.1