mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 11:35:08 -04:00
Copy/Paste should work on OSX now. (Thanks AndrewPH)
This commit is contained in:
parent
5e9f401449
commit
e5b77528ff
@ -222,23 +222,37 @@ namespace ClassicalSharp.Gui {
|
|||||||
|
|
||||||
bool OtherKey( Key key ) {
|
bool OtherKey( Key key ) {
|
||||||
if( key == Key.V && chatInputText.Length < TotalChars ) {
|
if( key == Key.V && chatInputText.Length < TotalChars ) {
|
||||||
string text = game.window.ClipboardText;
|
string text = null;
|
||||||
|
try {
|
||||||
|
text = game.window.ClipboardText;
|
||||||
|
} catch( Exception ex ) {
|
||||||
|
ErrorHandler.LogError( "Paste from clipboard", ex );
|
||||||
|
const string warning = "&cError while trying to paste from clipboard.";
|
||||||
|
game.Chat.Add( warning, MessageType.ClientStatus4 );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if( String.IsNullOrEmpty( text ) ) return true;
|
if( String.IsNullOrEmpty( text ) ) return true;
|
||||||
game.Chat.Add( null, MessageType.ClientStatus4 );
|
game.Chat.Add( null, MessageType.ClientStatus4 );
|
||||||
|
|
||||||
for( int i = 0; i < text.Length; i++ ) {
|
for( int i = 0; i < text.Length; i++ ) {
|
||||||
if( !IsValidInputChar( text[i] ) ) {
|
if( IsValidInputChar( text[i] ) ) continue;
|
||||||
const string warning = "&eClipboard contained some characters that can't be sent.";
|
const string warning = "&eClipboard contained some characters that can't be sent.";
|
||||||
game.Chat.Add( warning, MessageType.ClientStatus4 );
|
game.Chat.Add( warning, MessageType.ClientStatus4 );
|
||||||
text = RemoveInvalidChars( text );
|
text = RemoveInvalidChars( text );
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
AppendText( text );
|
AppendText( text );
|
||||||
return true;
|
return true;
|
||||||
} else if( key == Key.C ) {
|
} else if( key == Key.C ) {
|
||||||
if( !chatInputText.Empty )
|
if( chatInputText.Empty ) return true;
|
||||||
|
try {
|
||||||
game.window.ClipboardText = chatInputText.ToString();
|
game.window.ClipboardText = chatInputText.ToString();
|
||||||
|
} catch( Exception ex ) {
|
||||||
|
ErrorHandler.LogError( "Copy to clipboard", ex );
|
||||||
|
const string warning = "&cError while trying to copy to clipboard.";
|
||||||
|
game.Chat.Add( warning, MessageType.ClientStatus4 );
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -82,8 +82,18 @@ namespace ClassicalSharp {
|
|||||||
|
|
||||||
// TODO: retry when clipboard returns null.
|
// TODO: retry when clipboard returns null.
|
||||||
public string ClipboardText {
|
public string ClipboardText {
|
||||||
get { return Clipboard.GetText(); }
|
get {
|
||||||
set { Clipboard.SetText( value ); }
|
if ( OpenTK.Configuration.RunningOnMacOS )
|
||||||
|
return GetClipboardText();
|
||||||
|
else
|
||||||
|
return Clipboard.GetText();
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if ( OpenTK.Configuration.RunningOnMacOS )
|
||||||
|
SetClipboardText( value );
|
||||||
|
else
|
||||||
|
Clipboard.SetText( value );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -779,6 +779,29 @@ namespace OpenTK.Platform.MacOS.Carbon
|
|||||||
public extern static OSStatus QDBeginCGContext( IntPtr port, ref IntPtr context );
|
public extern static OSStatus QDBeginCGContext( IntPtr port, ref IntPtr context );
|
||||||
[DllImport(carbon)]
|
[DllImport(carbon)]
|
||||||
public extern static OSStatus QDEndCGContext( IntPtr port, ref IntPtr context );
|
public extern static OSStatus QDEndCGContext( IntPtr port, ref IntPtr context );
|
||||||
|
#endregion
|
||||||
|
#region --- Clipboard ---
|
||||||
|
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern IntPtr CFDataCreate(IntPtr allocator, IntPtr buf, Int32 length);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern IntPtr CFDataGetBytePtr(IntPtr data);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern int PasteboardSynchronize(IntPtr pbref);
|
||||||
|
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardClear(IntPtr pbref);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardCreate(IntPtr str, out IntPtr pbref);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardCopyItemFlavorData(IntPtr pbref, UInt32 itemid, IntPtr key, out IntPtr data);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardGetItemCount(IntPtr pbref, out UInt32 count);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardGetItemIdentifier(IntPtr pbref, UInt32 itemindex, out UInt32 itemid);
|
||||||
|
[DllImport (carbon)]
|
||||||
|
public static extern OSStatus PasteboardPutItemFlavor(IntPtr pbref, UInt32 itemid, IntPtr key, IntPtr data, UInt32 flags);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
[DllImport(carbon)]
|
[DllImport(carbon)]
|
||||||
|
@ -29,6 +29,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using OpenTK.Platform.MacOS.Carbon;
|
using OpenTK.Platform.MacOS.Carbon;
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
@ -556,9 +557,63 @@ namespace OpenTK.Platform.MacOS
|
|||||||
|
|
||||||
#region INativeWindow Members
|
#region INativeWindow Members
|
||||||
|
|
||||||
public string GetClipboardText() { return ""; }
|
IntPtr pbStr, utf16, utf8;
|
||||||
|
public string GetClipboardText() {
|
||||||
|
IntPtr pbRef = GetPasteboard();
|
||||||
|
API.PasteboardSynchronize( pbRef );
|
||||||
|
|
||||||
public void SetClipboardText( string value ) { }
|
uint itemCount;
|
||||||
|
OSStatus err = API.PasteboardGetItemCount( pbRef, out itemCount );
|
||||||
|
if( err != OSStatus.NoError )
|
||||||
|
throw new MacOSException( err, "Getting item count from Pasteboard." );
|
||||||
|
if( itemCount < 1 ) return "";
|
||||||
|
|
||||||
|
uint itemID;
|
||||||
|
err = API.PasteboardGetItemIdentifier( pbRef, 1, out itemID );
|
||||||
|
if( err != OSStatus.NoError )
|
||||||
|
throw new MacOSException( err, "Getting item identifier from Pasteboard." );
|
||||||
|
|
||||||
|
IntPtr outData;
|
||||||
|
if ( (err = API.PasteboardCopyItemFlavorData( pbRef, itemID, utf16, out outData )) == OSStatus.NoError ) {
|
||||||
|
IntPtr ptr = API.CFDataGetBytePtr( outData );
|
||||||
|
if( ptr == IntPtr.Zero )
|
||||||
|
throw new InvalidOperationException( "CFDataGetBytePtr() returned null pointer." );
|
||||||
|
return Marshal.PtrToStringUni( ptr );
|
||||||
|
}
|
||||||
|
// TODO: UTF 8
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetClipboardText( string value ) {
|
||||||
|
IntPtr pbRef = GetPasteboard();
|
||||||
|
OSStatus err = API.PasteboardClear( pbRef );
|
||||||
|
if( err != OSStatus.NoError )
|
||||||
|
throw new MacOSException( err, "Cleaing Pasteboard." );
|
||||||
|
API.PasteboardSynchronize( pbRef );
|
||||||
|
|
||||||
|
IntPtr ptr = Marshal.StringToHGlobalUni( value );
|
||||||
|
IntPtr cfData = API.CFDataCreate( IntPtr.Zero, ptr, (value.Length + 1) * 2 );
|
||||||
|
if( cfData == IntPtr.Zero )
|
||||||
|
throw new InvalidOperationException( "CFDataCreate() returned null pointer." );
|
||||||
|
|
||||||
|
API.PasteboardPutItemFlavor( pbRef, 1, utf16, cfData, 0 );
|
||||||
|
Marshal.FreeHGlobal( ptr );
|
||||||
|
}
|
||||||
|
|
||||||
|
IntPtr GetPasteboard() {
|
||||||
|
if( pbStr == IntPtr.Zero ) {
|
||||||
|
pbStr = CF.CFSTR( "com.apple.pasteboard.clipboard" );
|
||||||
|
utf16 = CF.CFSTR( "public.utf16-plain-text" );
|
||||||
|
utf8 = CF.CFSTR( "public.utf8-plain-text" );
|
||||||
|
}
|
||||||
|
|
||||||
|
IntPtr pbRef;
|
||||||
|
OSStatus err = API.PasteboardCreate( pbStr, out pbRef );
|
||||||
|
if( err != OSStatus.NoError )
|
||||||
|
throw new MacOSException( err, "Creating Pasteboard reference." );
|
||||||
|
API.PasteboardSynchronize( pbRef );
|
||||||
|
return pbRef;
|
||||||
|
}
|
||||||
|
|
||||||
public void ProcessEvents()
|
public void ProcessEvents()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user