pbcopy on Linux (using GTK+)

というわけで、書いてみた。
pbcopy.c

#include <gtk/gtk.h>
#include <gio/gio.h>
#include <gio/gunixinputstream.h>

int main(int argc, char *argv[])
{
  gtk_init(&argc, &argv);
  
  GInputStream *in = g_unix_input_stream_new(0, FALSE);
  gchar buf[1024];
  gssize read_bytes;
  GError *error;
  GString *str = g_string_new("");
  while ((read_bytes = g_input_stream_read(in, buf, sizeof(buf), NULL, &error)) > 0) {
    if (read_bytes == -1) {
      g_printerr("g_input_stream_read: %s\n", error->message);
      g_clear_error(&error);
    }
    else {
      buf[read_bytes] = '\0';
      g_string_append(str, buf);
    }
  }

  GtkClipboard *pb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
  gtk_clipboard_set_text(pb, str->str, str->len);
  gtk_clipboard_store(pb);

  g_string_free(str, TRUE);

  return 0;
}

こんなかんじ。
GTK+ とか GLib とかほとんど使ったことないので、リファレンスを見つついつものパッチワーク。
動くからいっか。


参考
http://library.gnome.org/devel/gtk/stable/gtk-Clipboards.html
GUnixInputStream: GIO Reference Manual
GInputStream: GIO Reference Manual