mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 16:55:40 +00:00
Bug 637111 - [OS/2] eliminate copy to clipboard at shutdown; r=wuno
This commit is contained in:
parent
dc5e43c133
commit
182c666e87
@ -44,13 +44,14 @@
|
||||
#include "nsPrimitiveHelpers.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "prmem.h"
|
||||
#include "nsIObserverService.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsOS2Uni.h"
|
||||
#include "nsClipboard.h"
|
||||
#include "mozilla/Services.h"
|
||||
|
||||
inline ULONG RegisterClipboardFormat(PCSZ pcszFormat)
|
||||
#define INCL_DOSERRORS
|
||||
#define INCL_WIN
|
||||
#include <os2.h>
|
||||
|
||||
inline PRUint32 RegisterClipboardFormat(PCSZ pcszFormat)
|
||||
{
|
||||
ATOM atom = WinFindAtom(WinQuerySystemAtomTable(), pcszFormat);
|
||||
if (!atom) {
|
||||
@ -72,20 +73,11 @@ nsClipboard::nsClipboard() : nsBaseClipboard()
|
||||
RegisterClipboardFormat(kURLMime);
|
||||
RegisterClipboardFormat(kNativeImageMime);
|
||||
RegisterClipboardFormat(kNativeHTMLMime);
|
||||
|
||||
// Register for a shutdown notification so that we can flush data
|
||||
// to the OS clipboard.
|
||||
nsCOMPtr<nsIObserverService> observerService =
|
||||
mozilla::services::GetObserverService();
|
||||
if (observerService)
|
||||
observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
|
||||
}
|
||||
|
||||
nsClipboard::~nsClipboard()
|
||||
{}
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED1(nsClipboard, nsBaseClipboard, nsIObserver)
|
||||
|
||||
nsresult nsClipboard::SetNativeClipboardData(PRInt32 aWhichClipboard)
|
||||
{
|
||||
if (aWhichClipboard != kGlobalClipboard)
|
||||
@ -110,7 +102,7 @@ nsresult nsClipboard::GetNativeClipboardData(nsITransferable *aTransferable, PRI
|
||||
// Get some data from the clipboard
|
||||
PRBool nsClipboard::GetClipboardData(const char *aFlavor)
|
||||
{
|
||||
ULONG ulFormatID = GetFormatID( aFlavor );
|
||||
PRUint32 ulFormatID = GetFormatID(aFlavor);
|
||||
|
||||
PRBool found = GetClipboardDataByID( ulFormatID, aFlavor );
|
||||
|
||||
@ -129,13 +121,13 @@ PRBool nsClipboard::GetClipboardData(const char *aFlavor)
|
||||
return found;
|
||||
}
|
||||
|
||||
PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
|
||||
PRBool nsClipboard::GetClipboardDataByID(PRUint32 aFormatID, const char *aFlavor)
|
||||
{
|
||||
PVOID pDataMem;
|
||||
PRUint32 NumOfBytes;
|
||||
PRBool TempBufAllocated = PR_FALSE;
|
||||
|
||||
PVOID pClipboardData = reinterpret_cast<PVOID>(WinQueryClipbrdData( 0, ulFormatID ));
|
||||
PVOID pClipboardData = reinterpret_cast<PVOID>(WinQueryClipbrdData(0, aFormatID));
|
||||
|
||||
if (!pClipboardData)
|
||||
return PR_FALSE;
|
||||
@ -144,7 +136,7 @@ PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
|
||||
{
|
||||
pDataMem = pClipboardData;
|
||||
|
||||
if (ulFormatID == CF_TEXT) // CF_TEXT is one byte character set
|
||||
if (aFormatID == CF_TEXT) // CF_TEXT is one byte character set
|
||||
{
|
||||
PRUint32 NumOfChars = strlen( static_cast<char*>(pDataMem) );
|
||||
NumOfBytes = NumOfChars;
|
||||
@ -178,7 +170,7 @@ PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
|
||||
}
|
||||
else // Assume rest of flavors are binary data
|
||||
{
|
||||
if (ulFormatID == CF_BITMAP)
|
||||
if (aFormatID == CF_BITMAP)
|
||||
{
|
||||
if (!strcmp( aFlavor, kJPEGImageMime ))
|
||||
{
|
||||
@ -250,7 +242,7 @@ void nsClipboard::SetClipboardData(const char *aFlavor)
|
||||
return;
|
||||
}
|
||||
|
||||
ULONG ulFormatID = GetFormatID( aFlavor );
|
||||
PRUint32 ulFormatID = GetFormatID(aFlavor);
|
||||
|
||||
if (strstr( aFlavor, "text/" )) // All text/.. flavors are null-terminated
|
||||
{
|
||||
@ -406,7 +398,7 @@ nsresult nsClipboard::DoClipboardAction(ClipboardAction aAction)
|
||||
}
|
||||
|
||||
// get the format ID for a given mimetype
|
||||
ULONG nsClipboard::GetFormatID(const char *aMimeStr)
|
||||
PRUint32 nsClipboard::GetFormatID(const char *aMimeStr)
|
||||
{
|
||||
if (strcmp(aMimeStr, kTextMime) == 0)
|
||||
return CF_TEXT;
|
||||
@ -414,46 +406,6 @@ ULONG nsClipboard::GetFormatID(const char *aMimeStr)
|
||||
return RegisterClipboardFormat(aMimeStr);
|
||||
}
|
||||
|
||||
// nsIObserver
|
||||
NS_IMETHODIMP
|
||||
nsClipboard::Observe(nsISupports *aSubject, const char *aTopic,
|
||||
const PRUnichar *aData)
|
||||
{
|
||||
// This will be called on shutdown.
|
||||
|
||||
// make sure we have a good transferable
|
||||
if (!mTransferable)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (WinOpenClipbrd(0/*hab*/)) {
|
||||
WinEmptyClipbrd(0/*hab*/);
|
||||
|
||||
// get flavor list that includes all flavors that can be written (including ones
|
||||
// obtained through conversion)
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
nsresult errCode = mTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavorList));
|
||||
if (NS_FAILED(errCode))
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// Walk through flavors and put data on to clipboard
|
||||
PRUint32 i;
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for (i = 0; i < cnt; i++) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt(i, getter_AddRefs(genericFlavor));
|
||||
nsCOMPtr<nsISupportsCString> currentFlavor(do_QueryInterface(genericFlavor));
|
||||
if (currentFlavor) {
|
||||
nsXPIDLCString flavorStr;
|
||||
currentFlavor->ToString(getter_Copies(flavorStr));
|
||||
SetClipboardData(flavorStr);
|
||||
}
|
||||
}
|
||||
WinCloseClipbrd(0/*hab*/);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsClipboard::HasDataMatchingFlavors(const char** aFlavorList,
|
||||
PRUint32 aLength,
|
||||
PRInt32 aWhichClipboard,
|
||||
@ -465,7 +417,7 @@ NS_IMETHODIMP nsClipboard::HasDataMatchingFlavors(const char** aFlavorList,
|
||||
|
||||
for (PRUint32 i = 0; i < aLength; ++i) {
|
||||
ULONG fmtInfo = 0;
|
||||
ULONG format = GetFormatID(aFlavorList[i]);
|
||||
PRUint32 format = GetFormatID(aFlavorList[i]);
|
||||
|
||||
if (WinQueryClipbrdFmtInfo(0/*hab*/, format, &fmtInfo)) {
|
||||
*_retval = PR_TRUE;
|
||||
|
@ -39,12 +39,6 @@
|
||||
#define _nsClipboard_h
|
||||
|
||||
#include "nsBaseClipboard.h"
|
||||
#include "nsIObserver.h"
|
||||
|
||||
#define INCL_DOSERRORS
|
||||
#define INCL_WIN
|
||||
#include <os2.h>
|
||||
|
||||
class nsITransferable;
|
||||
|
||||
/**
|
||||
@ -53,20 +47,13 @@ class nsITransferable;
|
||||
|
||||
struct FormatRecord;
|
||||
|
||||
class nsClipboard : public nsBaseClipboard,
|
||||
public nsIObserver
|
||||
class nsClipboard : public nsBaseClipboard
|
||||
{
|
||||
|
||||
public:
|
||||
nsClipboard();
|
||||
virtual ~nsClipboard();
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
// nsIObserver
|
||||
NS_DECL_NSIOBSERVER
|
||||
|
||||
// nsIClipboard
|
||||
NS_IMETHOD HasDataMatchingFlavors(const char** aFlavorList, PRUint32 aLength,
|
||||
PRInt32 aWhichClipboard, PRBool *_retval);
|
||||
@ -81,9 +68,9 @@ protected:
|
||||
Write
|
||||
};
|
||||
|
||||
ULONG GetFormatID(const char *aMimeStr);
|
||||
PRUint32 GetFormatID(const char *aMimeStr);
|
||||
PRBool GetClipboardData(const char *aFlavour);
|
||||
PRBool GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor);
|
||||
PRBool GetClipboardDataByID(PRUint32 aFormatID, const char *aFlavor);
|
||||
void SetClipboardData(const char *aFlavour);
|
||||
nsresult DoClipboardAction(ClipboardAction aAction);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user