Support for Pasting from macOS PasteBoard
This commit is contained in:
parent
40dd718dd1
commit
8c03202df6
@ -279,8 +279,9 @@ endif
|
|||||||
# Use gcc for compiling. Use ncc to build a callgraph and analyze the code.
|
# Use gcc for compiling. Use ncc to build a callgraph and analyze the code.
|
||||||
#CC = nccgen -ncgcc -ncld -ncfabs
|
#CC = nccgen -ncgcc -ncld -ncfabs
|
||||||
OBJDIR = ../obj/macosx
|
OBJDIR = ../obj/macosx
|
||||||
|
PLATFORMOBJ = pasteboard.o
|
||||||
ifeq ($(API),sdl)
|
ifeq ($(API),sdl)
|
||||||
PLATFORMOBJ = SDLMain.o
|
PLATFORMOBJ += SDLMain.o
|
||||||
endif
|
endif
|
||||||
FCLOPT =
|
FCLOPT =
|
||||||
MACAPPEXE = Grafx2.app/Contents/MacOS/Grafx2
|
MACAPPEXE = Grafx2.app/Contents/MacOS/Grafx2
|
||||||
@ -860,7 +861,7 @@ release : $(BIN)
|
|||||||
# .tgz archive with source only files
|
# .tgz archive with source only files
|
||||||
SRCARCH = ../src-$(VERSIONTAG).tgz
|
SRCARCH = ../src-$(VERSIONTAG).tgz
|
||||||
|
|
||||||
$(SRCARCH): $(wildcard *.c) $(wildcard *.cpp) $(wildcard *.h) Makefile Makefile.dep gfx2.ico Grafx2_Prefix.pch SDLMain.m gfx2.rc
|
$(SRCARCH): $(wildcard *.c) $(wildcard *.cpp) $(wildcard *.h) Makefile Makefile.dep gfx2.ico Grafx2_Prefix.pch $(wildcard *.m) gfx2.rc
|
||||||
cd .. && $(TAR) czf $(SRCARCH:../%=%) $(addprefix src/,$^)
|
cd .. && $(TAR) czf $(SRCARCH:../%=%) $(addprefix src/,$^)
|
||||||
|
|
||||||
ifeq ($(PLATFORM),Darwin)
|
ifeq ($(PLATFORM),Darwin)
|
||||||
@ -887,7 +888,7 @@ ifeq ($(PLATFORM),Darwin)
|
|||||||
endif
|
endif
|
||||||
$(TAR) czf "../grafx2-$(VERSIONTAG)-src.tgz" $(TARTRANSFORM) \
|
$(TAR) czf "../grafx2-$(VERSIONTAG)-src.tgz" $(TARTRANSFORM) \
|
||||||
../src/*.c ../src/*.cpp ../src/*.h ../src/Makefile ../src/Makefile.dep \
|
../src/*.c ../src/*.cpp ../src/*.h ../src/Makefile ../src/Makefile.dep \
|
||||||
../src/Grafx2_Prefix.pch ../src/SDLMain.m ../src/gfx2.rc ../src/gfx2.ico \
|
../src/Grafx2_Prefix.pch ../src/*.m ../src/gfx2.rc ../src/gfx2.ico \
|
||||||
../src/Grafx2.icns ../src/English.lproj/* ../src/Info.plist \
|
../src/Grafx2.icns ../src/English.lproj/* ../src/Info.plist \
|
||||||
../share/grafx2/gfx2def.ini $(SCRIPT_FILES) $(SKIN_FILES) \
|
../share/grafx2/gfx2def.ini $(SCRIPT_FILES) $(SKIN_FILES) \
|
||||||
../share/grafx2/gfx2.gif ../share/grafx2/gfx2.png ../share/icons/grafx2.svg \
|
../share/grafx2/gfx2.gif ../share/grafx2/gfx2.png ../share/icons/grafx2.svg \
|
||||||
|
|||||||
@ -167,6 +167,7 @@ void Save_HGR(T_IO_Context *);
|
|||||||
void Test_TIFF(T_IO_Context *, FILE *);
|
void Test_TIFF(T_IO_Context *, FILE *);
|
||||||
void Load_TIFF(T_IO_Context *);
|
void Load_TIFF(T_IO_Context *);
|
||||||
void Save_TIFF(T_IO_Context *);
|
void Save_TIFF(T_IO_Context *);
|
||||||
|
void Load_TIFF_from_memory(T_IO_Context *, const void *, unsigned long);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|||||||
@ -1733,11 +1733,13 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
|
|||||||
Display_bookmark(bookmark_dropdown[temp],temp);
|
Display_bookmark(bookmark_dropdown[temp],temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WIN32) || defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
|
#if defined(WIN32) || defined(__macosx__) || defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
|
||||||
if (load)
|
if (load)
|
||||||
Window_set_normal_button(62,180,115,14,"From Clipboard",0,1,SHORTCUT_PASTE); // 14
|
Window_set_normal_button(62,180,115,14,"From Clipboard",0,1,SHORTCUT_PASTE); // 14
|
||||||
|
#if !defined(__macosx__)
|
||||||
else
|
else
|
||||||
Window_set_normal_button(62,180,115,14,"To Clipboard",0,1,SHORTCUT_COPY); // 14
|
Window_set_normal_button(62,180,115,14,"To Clipboard",0,1,SHORTCUT_COPY); // 14
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Change_directory(context->File_directory);
|
Change_directory(context->File_directory);
|
||||||
|
|||||||
@ -86,6 +86,11 @@ extern Window X11_window;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__macosx__)
|
||||||
|
const void * get_tiff_paste_board(unsigned long * size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(USE_SDL) || defined(USE_SDL2)
|
#if defined(USE_SDL) || defined(USE_SDL2)
|
||||||
// -- SDL_Image -------------------------------------------------------------
|
// -- SDL_Image -------------------------------------------------------------
|
||||||
// (TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, IFF, PNG, ICO)
|
// (TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, IFF, PNG, ICO)
|
||||||
@ -1438,6 +1443,14 @@ static void Load_ClipBoard_Image(T_IO_Context * context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CloseClipboard();
|
CloseClipboard();
|
||||||
|
#elif defined(__macosx__)
|
||||||
|
unsigned long size;
|
||||||
|
const void * tiff = get_tiff_paste_board(&size);
|
||||||
|
|
||||||
|
GFX2_Log(GFX2_DEBUG, "TIFF pasteboard : %p (%lu bytes)\n", tiff, size);
|
||||||
|
if (tiff != NULL)
|
||||||
|
Load_TIFF_from_memory(context, tiff, size);
|
||||||
|
|
||||||
#elif defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
|
#elif defined(USE_X11) || (defined(SDL_VIDEO_DRIVER_X11) && !defined(NO_X11))
|
||||||
int i;
|
int i;
|
||||||
Atom selection;
|
Atom selection;
|
||||||
|
|||||||
37
src/pasteboard.m
Normal file
37
src/pasteboard.m
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* vim:expandtab:ts=2 sw=2:
|
||||||
|
*/
|
||||||
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2018 Thomas Bernard
|
||||||
|
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||||
|
|
||||||
|
Grafx2 is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
Grafx2 is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
///@file pasteboard.m
|
||||||
|
/// Support for Mac OS X PasteBoard
|
||||||
|
///
|
||||||
|
|
||||||
|
#import <AppKit/AppKit.h>
|
||||||
|
|
||||||
|
const void * get_tiff_paste_board(unsigned long * size)
|
||||||
|
{
|
||||||
|
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
|
||||||
|
NSLog(@"types in pasteboard : %@", [pasteboard types]);
|
||||||
|
NSData *data = [pasteboard dataForType:NSTIFFPboardType];
|
||||||
|
if (data == nil)
|
||||||
|
return NULL;
|
||||||
|
*size = [data length];
|
||||||
|
return [data bytes];
|
||||||
|
}
|
||||||
@ -383,6 +383,99 @@ void Load_TIFF_Sub(T_IO_Context * context, TIFF * tif, unsigned long file_size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct memory_buffer
|
||||||
|
{
|
||||||
|
char * buffer;
|
||||||
|
unsigned long offset;
|
||||||
|
unsigned long size;
|
||||||
|
};
|
||||||
|
|
||||||
|
tmsize_t lTIFF_read(thandle_t p, void * data, tmsize_t size)
|
||||||
|
{
|
||||||
|
struct memory_buffer * mbuffer = (struct memory_buffer *)p;
|
||||||
|
GFX2_Log(GFX2_DEBUG, "lTIFF_read(%p, %p, %u)\n", p, data, size);
|
||||||
|
memcpy(data, mbuffer->buffer + mbuffer->offset, size);
|
||||||
|
mbuffer->offset += size;
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmsize_t lTIFF_write(thandle_t p, void * data, tmsize_t size)
|
||||||
|
{
|
||||||
|
struct memory_buffer * mbuffer = (struct memory_buffer *)p;
|
||||||
|
GFX2_Log(GFX2_DEBUG, "lTIFF_write(%p, %p, %u)\n", p, data, size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
toff_t lTIFF_seek(thandle_t p, toff_t offset, whence)
|
||||||
|
{
|
||||||
|
struct memory_buffer * mbuffer = (struct memory_buffer *)p;
|
||||||
|
GFX2_Log(GFX2_DEBUG, "lTIFF_seek(%p, %u, %d)\n", p, offset, whence);
|
||||||
|
switch (whence)
|
||||||
|
{
|
||||||
|
case SEEK_SET:
|
||||||
|
mbuffer->offset = offset;
|
||||||
|
break;
|
||||||
|
case SEEK_CUR:
|
||||||
|
mbuffer->offset += offset;
|
||||||
|
break;
|
||||||
|
case SEEK_END:
|
||||||
|
mbuffer->offset = mbuffer->size - offset;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return mbuffer->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
toff_t lTIFF_size(thandle_t p)
|
||||||
|
{
|
||||||
|
struct memory_buffer * mbuffer = (struct memory_buffer *)p;
|
||||||
|
return mbuffer->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lTIFF_close(thandle_t p)
|
||||||
|
{
|
||||||
|
(void)p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lTIFF_map(thandle_t p, void ** base, toff_t * size)
|
||||||
|
{
|
||||||
|
struct memory_buffer * mbuffer = (struct memory_buffer *)p;
|
||||||
|
GFX2_Log(GFX2_DEBUG, "lTIFF_map(%p, %p, %p)\n", p, base, size);
|
||||||
|
*base = mbuffer->buffer;
|
||||||
|
*size = mbuffer->size;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lTIFF_unmap(thandle_t p, void *base, toff_t size)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_DEBUG, "lTIFF_unmap(%p, %p, %u)\n", p, base, size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load TIFF from memory
|
||||||
|
void Load_TIFF_from_memory(T_IO_Context * context, const void * buffer, unsigned long size)
|
||||||
|
{
|
||||||
|
TIFF * tif;
|
||||||
|
struct memory_buffer memory_buffer;
|
||||||
|
|
||||||
|
memory_buffer.buffer = (char *)buffer;
|
||||||
|
memory_buffer.offset = 0;
|
||||||
|
memory_buffer.size = size;
|
||||||
|
|
||||||
|
TIFF_Init();
|
||||||
|
tif = TIFFClientOpen("memory.tiff", "r", &memory_buffer,
|
||||||
|
lTIFF_read, lTIFF_write, lTIFF_seek, lTIFF_close,
|
||||||
|
lTIFF_size, lTIFF_map, lTIFF_unmap);
|
||||||
|
if (tif != NULL)
|
||||||
|
{
|
||||||
|
Load_TIFF_Sub(context, tif, size);
|
||||||
|
TIFFClose(tif);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Load TIFF from file
|
/// Load TIFF from file
|
||||||
void Load_TIFF(T_IO_Context * context)
|
void Load_TIFF(T_IO_Context * context)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user