This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gall/gutlclip.cpp
2005-10-25 06:11:09 +00:00

170 lines
4.0 KiB
C++

// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// Copyright (C) 1999 Alexander S. Aganichev
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// Misc. clipboards support.
// ------------------------------------------------------------------
#include <gstrall.h>
#include <gutlmisc.h>
#include <gutlclip.h>
#include <gmemdbg.h>
#include <gutlos.h>
// ------------------------------------------------------------------
int clipboard_available = -1;
char *fake_clipboard = NULL;
// ------------------------------------------------------------------
void fake_clipboard_destroy() {
if(fake_clipboard)
throw_free(fake_clipboard);
}
// ------------------------------------------------------------------
gclipbrd::gclipbrd() {
len = -1;
clipdata = NULL;
cliphdl = NULL;
#if defined(GUTLOS_FUNCS)
if(clipboard_available == -1)
clipboard_available = g_is_clip_available() ? 1 : 0;
#else
clipboard_available = 0;
#endif
if(not clipboard_available and not fake_clipboard) {
fake_clipboard = throw_strdup("");
atexit(fake_clipboard_destroy);
}
}
// ------------------------------------------------------------------
bool gclipbrd::openread() {
if(not clipboard_available) {
cliphdl = clipdata = fake_clipboard;
if(fake_clipboard != NULL) {
len = strlen(cliphdl);
return true;
}
else
return false;
}
#if defined(GUTLOS_FUNCS)
cliphdl = clipdata = g_get_clip_text();
if (clipdata != NULL) {
len = strlen(clipdata);
return true;
}
#endif
return false;
}
// ------------------------------------------------------------------
bool gclipbrd::writeclipbrd(const char* buf) {
if(not clipboard_available) {
if(fake_clipboard)
throw_free(fake_clipboard);
fake_clipboard = throw_strdup(buf);
return (fake_clipboard != NULL);
}
#if defined(GUTLOS_FUNCS)
return (g_put_clip_text(buf) == 0);
#else
return false;
#endif
}
// ------------------------------------------------------------------
char* gclipbrd::read(char* buffer, int maxlen) {
if(len>0) {
int i = MinV(len, maxlen-1);
char* p = strpbrk(clipdata, "\r\n");
if(p) {
if(p-clipdata < i) {
i = p - clipdata;
if((len > i) and strchr("\r\n", *(p+1)) and (*p != *(p+1)))
++i;
}
else
p = NULL;
}
else
p = NULL;
strxcpy(buffer, clipdata, i+1);
char* p2 = strpbrk(buffer, "\r\n");
if(p2) *p2 = 0;
if(p) {
strcat(buffer, "\n");
++i;
}
len -= MinV(len, i);
clipdata += i;
return buffer;
}
return NULL;
}
// ------------------------------------------------------------------
void gclipbrd::close() {
if(not clipboard_available)
return;
#if defined(GUTLOS_FUNCS)
if(len>=0) {
if (cliphdl != NULL)
throw_free(cliphdl);
len = -1;
cliphdl = clipdata = NULL;
}
#endif
}
// ------------------------------------------------------------------