2010-02-16 6 views
9

Ich arbeite an einem Projekt, das sowohl unter Windows als auch unter Linux (mit einem inoffiziellen Mac-Port) arbeiten soll, die eine echte Farbsystemkonsole emuliert.OS unabhängige Zwischenablage Kopieren/Einfügen von Text in C

Mein Problem ist, dass vor kurzem eine Anfrage für Textfield-Unterstützung (ja, Konsole-basierte) erschien und es wäre cool, die Möglichkeit zum Kopieren von Text in die Zwischenablage und Einfügen von ihm hinzuzufügen. Gibt es eine Möglichkeit, dies zu erreichen, das wird:

  • in C (nicht C++) erfolgen,
  • Arbeit in Windows und in Linux (Präprozessormakros sind eine Option, wenn es kein plattformunabhängigen Code ist),
  • erfordern keine zusätzlichen Bibliotheken zu verknüpfen?

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

5

Wenn Sie keine plattformübergreifende UI-Bibliothek verwenden (wie Wx oder etwas), dann klingt es so, als müssten Sie nur nativen Clipboard-Code für jede Plattform schreiben, die Sie unterstützen möchten.

Denken Sie daran, auf Macintosh-Computern, Sie kopieren mit Befehl-C, nicht Strg + C :)

+0

Heh, danke für den Tipp über Macs :). Ich habe nie wirklich eine verwendet (gut, einmal, aber nur für die Videobearbeitung). Ich hoffe, dass der Betreuer des Mac-Ports in der Lage ist, dies zu umgehen: D. Oh, und in Linux, kopieren Sie einfach, indem Sie den Text markieren: D. – mingos

+0

@mingos Denken Sie daran, dass Linux mehrere Zwischenablagen haben könnte. Es gibt die "Hervorhebungstext" -Klammer, die vom X-Server bereitgestellt wird, und dann kann die Desktopumgebung (KDE, Gnome, usw.) eine eigene Ctrl + C-Zwischenablage bereitstellen, die Inhalte mit der X-Zwischenablage teilen kann oder nicht. –

+0

Ich glaube, sich auf die X-Zwischenablage zu verlassen, ist der beste Weg, in meinem Fall zu gehen, da es eine einzige Implementierung für KDE, Gnome, XFCE und was nicht brauchen sollte ... zumindest denke ich ... – mingos

4

Die Zwischenablage ist von Natur aus ein Betriebssystem-Konzept definiert. Die C-Sprache selbst hat keine Kenntnis davon, was eine Zwischenablage ist oder wie sie darauf funktioniert. Sie müssen entweder Schnittstelle direkt mit dem Betriebssystem, oder verwenden Sie eine Portabilität Bibliothek, die dies in Ihrem Namen tut. Es gibt keinen Weg darum.

+0

Nun, ich scheinen über einen C-Code gestolpert zu sein, der die Zwischenablage in Windows funktionieren lassen sollte: http://www.daniweb.com/code/snippet217173.html --- es benötigt keine zusätzlichen Bibliotheken und mit einem Präprozessor #ifdef, I sollte in der Lage sein, es zu einem Windows-spezifischen Teil des Codes zu machen. Ich weiß nicht, ob dieser Schnipsel überhaupt funktioniert (hoffe ich), ich suche immer noch nach etwas ähnlichem für Linux ... – mingos

4

Persönlich würde ich meine eigenen Funktions definieren

getClipboardText(); 

die in zwei verschiedenen Header-Dateien definiert (linux_clipboard.h, windows_clipboard.h, usw.) und dann tun Sachen vorge proccessor die entsprechenden laden entsprechend. Ich programmiere nicht wirklich in C/C++, also tut es mir leid, wenn das keinen Sinn ergibt oder schlechte Praxis ist, aber so würde ich das machen.

#if WIN32 
#include windows_clipboard.h 
#endif 

Dergleichen

Denken Sie daran: Für Linux müssen Sie mit verschiedenen Fenstermanager (Gnome, KDE), alle mit verschiedenen Möglichkeiten für die Verwaltung der Zwischenablage beschäftigen. Berücksichtigen Sie dies beim Entwerfen Ihrer App.

+0

Genau darüber habe ich nachgedacht. Ich möchte nur wissen, ob es eine Möglichkeit gibt, dies in C zu lösen und ohne Abhängigkeiten. Ich möchte keine Verknüpfung zu einer zusätzlichen Bibliothek herstellen, nur um die Zwischenablage zu unterstützen. Ich denke, es ist in Windows machbar, nachdem ich Windows.h eingeschlossen habe, aber ich versuche immer noch herauszufinden, wie man das in Linux macht ... Wie auch immer, danke für deine Antwort. – mingos

1

Möglicherweise können Sie mit der Zwischenablage kommunizieren, indem Sie xclip verwenden. Sie können dieses Python-Skript hier verwenden, um diese Aufgabe über die Kommunikation mit 'dcop' und 'klipper' here zu erledigen. Das ist für KDE, ich weiß nicht, wie es unter GNOME gemacht werden würde ... Vielleicht können Sie das auch unabhängig von GNOME/KDE mit DBUS machen, obwohl ich das auch nicht 100% sicher sagen kann ...

Seien Sie sich bewusst, dass Sie für einen wirklich plattformübergreifenden Job die verschiedenen GUI's berücksichtigen müssen, wie unter Linux, X ist die Hauptfenstermanagerschnittstelle und entweder GNOME/KDE sitzt oben drauf. .Ich wähle keine anderen GUI's wie FluxBox, WindowMaker, um nur einige zu nennen, und dass es eine Menge plattformabhängigen Code geben wird, und auch in Verbindung werden Sie sich mit der Windows-Zwischenablage beschäftigen. Alles in allem , ein großer integrierter Code ...

Haben Sie nicht erwogen, die rohe X-Programmier-API für die Zwischenablage zu betrachten?Vielleicht könnte das besser sein, wie ich es mir vorstelle, GNOME/KDE usw. verwenden die X-API, um die Zwischenablage zu machen ... wenn das bestätigt wird, dann wäre die Arbeit abgeschnitten und unabhängig von den wichtigsten GUI-Schnittstellen ... (Ich hoffe, dass dies der Fall wäre, da es das Leben für Ihr Projekt einfacher macht!)

Vielleicht Compile-Time-Switches, für jede Plattform ... WIN, KDE, GNOME, MAC oder verwenden Sie die, die bereits ist vordefinierte ..

Hoffe, dass dies hilft, Mit freundlichen Grüßen, Tom.

+0

Hey, xclip scheint interessant, ich werde sehen, wie sie es dort gemacht haben. Danke für den Vorschlag! – mingos