2010-02-16 38 views
9

Estoy trabajando en un proyecto que se supone que funciona tanto en Windows como en Linux (también con un puerto Mac no oficial) que emula una consola de sistema de color real.Portapapeles independiente del sistema operativo copiar/pegar texto en C

Mi problema es que hace poco apareció una solicitud de apoyo campo de texto (sí, basada en consola) y que estaría bien añadir la posibilidad de copiar el texto al portapapeles y pegar de él. ¿Hay una manera de lograr esto que será:

  • que hacerse en C (no C++),
  • trabajo tanto en Windows como en Linux (macros del preprocesador son una opción si no hay código independiente de la plataforma),
  • no requieren bibliotecas adicionales para vincular?

Gracias de antemano por su ayuda.

Respuesta

5

Si usted no está utilizando una biblioteca de interfaz de usuario de la plataforma cruzada (como wx o algo así), entonces suena como sólo vamos a tener que escribir código portapapeles nativo para cada plataforma que desea apoyar.

Recuerde, en los Macintosh, se copia con el Comando-C, no Ctrl + C :)

+0

Heh, gracias por el consejo sobre Macs :). Nunca he usado uno (bueno, una vez, pero solo para la edición de videos). Espero que el mantenedor del puerto Mac pueda evitar esto: D. Ah, y en Linux, copie simplemente resaltando el texto: D. – mingos

+0

@mingos Tenga en cuenta que Linux puede tener varios portapapeles. Existe el portapapeles "resaltar texto" proporcionado por el servidor X, y luego el entorno de escritorio (KDE, Gnome, etc.) puede proporcionar su propio portapapeles Ctrl + C, que puede o no compartir contenidos con el portapapeles X. –

+0

Creo que confiar en el portapapeles X es la mejor manera de hacerlo en mi caso, ya que * debería * requerir una implementación única para KDE, Gnome, XFCE y todo eso ... al menos eso creo ... – mingos

4

El portapapeles es inherentemente un sistema operativo definido concepto. El lenguaje C en sí no tiene conocimiento de lo que es un portapapeles o cómo operarlo. Usted debe interactuar directamente con el sistema operativo o utilizar una biblioteca de portabilidad que hace esto en su nombre. No hay forma de evitar esto.

+0

Bueno, yo parece que se encontró con un código C que se supone que hace que el portapapeles funcione en Windows: http://www.daniweb.com/code/snippet217173.html --- no necesita bibliotecas adicionales y con un preprocesador #ifdef, I debería ser capaz de convertirlo en una parte específica del código de Windows. No sé si este fragmento funcionará en absoluto (espero que sí), todavía estoy buscando algo similar para Linux ... – mingos

4

Personalmente me gustaría definir mi su propia función

getClipboardText(); 

que se define en dos archivos diferentes de cabecera (linux_clipboard.h, windows_clipboard.h, etc) y luego hacer pre-proccessor cosas para cargar el apropiado en consecuencia. Realmente no codifico en C/C++, entonces lo siento si eso no tiene sentido o es una mala práctica, pero así es como voy a hacer esto.

#if WIN32 
#include windows_clipboard.h 
#endif 

Ese tipo de cosas

Recuerde: Para Linux existen para hacer frente a diferentes gestores de ventanas (Gnome, KDE), todas con diferentes formas de gestionar el portapapeles. Tenga esto en cuenta al diseñar su aplicación.

+0

Esto es precisamente en lo que estaba pensando. Solo quiero saber si hay una manera de abordar esto en C, y sin dependencias. No quiero vincular a una biblioteca adicional solo para el soporte del portapapeles. Creo que es factible en Windows, después de #incluyendo windows.h, pero todavía estoy tratando de descubrir cómo hacerlo en Linux ... De todos modos, gracias por su respuesta. – mingos

1

Puede comunicarse con el portapapeles utilizando xclip. Puede utilizar este script de python aquí para hacer este trabajo comunicándose con 'dcop' y 'klipper' here. Eso es para KDE, no sé cómo se haría bajo GNOME ... También puedes hacerlo independientemente de GNOME/KDE usando DBUS, aunque tampoco puedo decir con seguridad al 100% sobre eso tampoco ...

Tenga en cuenta que para un trabajo verdaderamente multiplataforma, debe tener en cuenta las diferentes GUI, como en Linux, X es la interfaz principal del administrador de ventanas y GNOME/KDE se encuentra encima de ella. .No estoy seleccionando otras GUI como FluxBox, WindowMaker por nombrar solo algunas, y que habrá una gran cantidad de código dependiente de la plataforma, y ​​también en conjunto, también tratará con el portapapeles de Windows ... en definitiva , un gran código integrado ...

¿No ha considerado mirar la API de programación X sin procesar para el soporte del portapapeles?Tal vez eso podría ser mejor como me imagino, GNOME/KDE, etc. están utilizando la API de X para hacer el trabajo del portapapeles ... si eso se confirma, entonces el trabajo se cortaría y sería independiente de las principales interfaces GUI ... (Espero que ese sea el caso, ya que haría la vida más fácil para su proyecto!)

Quizás usando interruptores en tiempo de compilación, para cada plataforma ... WIN, KDE, GNOME, MAC o use el que ya está predefinida ..

Espero que esto ayude, saludos cordiales, Tom .

+0

Oye, xclip parece interesante, voy a ver cómo lo hicieron allí. ¡Gracias por la sugerencia! – mingos

Cuestiones relacionadas