Publi

Copiar en el portapapeles un texto desde la línea de comandos [C]

En ocasiones, cuando estamos haciendo shell scripts, surge la necesidad de copiar algo al portapapeles para que el usuario lo utilice, en principio, podemos utilizar xclip, aunque ese sería el portapapeles de X11, ese con el que se copia seleccionando con el ratón, y se pega con el botón del centro (o izquierdo+derecho si emulamos el botón central).
Pero para dar algo de usabilidad (Control+V), y no queremos obligar al usuario a configurar sus gestores de portapapeles, esos grandes desconocidos que suelen estar ahí y nunca hacemos caso…

Podemos hacer este pequeño programa en C, que utilizará Gtk para acceder al portapapeles, y escribir en él. Este programa esperará a que pegues el contenido antes de salir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <string.h>

int main (int argc, char **argv) {
  if (argc==2)
    {
      const char *message = argv[1];

      GtkClipboard *clipboard;
      /* initialize GTK */
      gtk_init (&argc, &argv);
      clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
      /* set the clipboard text */
      gtk_clipboard_set_text(clipboard, message, strlen(message));
      gtk_clipboard_set_can_store (clipboard, NULL, 0);

      while (gtk_events_pending())
    gtk_main_iteration();
      gtk_main_iteration ();
      gtk_main_iteration ();
      gtk_main_iteration ();
    }
  else
    {
      fprintf(stderr, "Debes especificar el parámetro a copiar en el portapapeles de GTK\n     clipman "texto"\n\n");
      fprintf(stderr, "Nota: Para que los cambios persistan es necesario utilizar un clipboard manager, como glipper, por ejemplo\n\n");
    }
    return 0;
}

Y lo compilamos:

g++ -o clipman clipman.c `pkg-config –cflags –libs gtk+2.0`

Debemos asegurarnos de tener a biblioteca gtk2.0 instalada. Compilará con gtk3.0 pero no realizará la espera antes de salir, GTK3.0 envía muchos más eventos, y sí que necesitaremos tener un gestor de portapapeles para que capture este contenido antes de que se cierre el programa.
Foto: Windell Oskay (Flickr) CC-by Septiembre/2013

También podría interesarte...

There are 2 comments left Ir a comentario

  1. djdava /
    Usando Mozilla Firefox Mozilla Firefox 17.0 en Linux Linux

    Hola, comentar simplemente que yo en la terminal copio y pego con la combinación de teclas Ctrl+Shift+C y Ctrl+Shift+V respectivamente, sin haber configurado nada.

    Enhorabuena por el blog.

    Saludos.

    1. admin / Post Author
      Usando Mozilla Firefox Mozilla Firefox 24.0 en Ubuntu Linux Ubuntu Linux

      Gracias. Es verdad que muchos programas para terminal permiten hacer la copia. Aunque en este ejemplo, sobre todo estaba pensando en scripts. Es decir, puedes perfectamente vincular una tecla rápida a un script, y que éste copie un texto en el portapapeles.

      Saludos

Leave a Reply