// 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 #include #include #include #include // ------------------------------------------------------------------ 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 } // ------------------------------------------------------------------