Независимый от операционной системы буфер обмена скопировать/вставить текст в C

Я работаю над проектом, это, как предполагается, работает и над Windows и над Linux (с неофициальным портом Mac также), который эмулирует системную консоль истинного цвета.

Моя проблема состоит в том, что недавно там появился запрос на поддержку текстового поля (да, основанный на консоли), и будет здорово добавить возможность копирования текста к буферу обмена и вставке от него. Есть ли способ достигнуть этого, которое будет:

  • будьте сделаны в C (не C++),
  • работа и в Windows и в Linux (макросы препроцессора опция, если нет никакого платформенно независимого кода),
  • потребовать, чтобы никакие дополнительные библиотеки не связались с?

Заранее спасибо за Вашу справку.

9
задан mingos 16 February 2010 в 02:17
поделиться

4 ответа

Если вы не используете кроссплатформенную библиотеку пользовательского интерфейса (например, wx или что-то в этом роде), то похоже, что вам просто нужно будет написать собственный код буфера обмена для каждой платформы, которую вы хотите поддерживать.

Помните, что на Macintosh вы копируете с помощью Command-C, а не Ctrl + C :)

5
ответ дан 4 December 2019 в 14:28
поделиться

Буфер обмена по сути является концепцией, определяемой операционной системой. Сам язык C не знает, что такое буфер обмена и как с ним работать. Вы должны либо взаимодействовать напрямую с ОС, либо использовать библиотеку переносимости, которая делает это от вашего имени. Нет никакого способа обойти это.

4
ответ дан 4 December 2019 в 14:28
поделиться

Лично я бы определил свою собственную функцию

getClipboardText();

, которая определена в двух разных файлах заголовков (linux_clipboard.h, windows_clipboard.h и т. Д.), А затем сделайте предварительный обработчик, чтобы загрузить соответствующий файл соответственно. Я действительно не кодирую на C / C ++, поэтому извините, если это не имело никакого смысла или было плохой практикой, но я бы сделал это именно так.

#if WIN32
#include windows_clipboard.h
#endif

Подобные вещи

Помните: Для Linux вам нужно иметь дело с разными оконными менеджерами (Gnome, KDE), у всех есть разные способы управления буфером обмена. Помните об этом при разработке своего приложения.

4
ответ дан 4 December 2019 в 14:28
поделиться

Вы можете связываться с буфером обмена, используя xclip . Вы можете использовать этот скрипт python здесь, чтобы выполнить эту работу, установив связь с 'dcop' и 'klipper' здесь . Это для KDE, я не знаю, как это будет сделано в GNOME ... Вы также можете сделать это независимо от GNOME / KDE, используя DBUS, хотя я также не могу сказать на 100% уверенно по этому поводу ...

Просто имейте в виду, что для действительно кроссплатформенной работы вы должны учитывать различные графические интерфейсы, например, в Linux, X - это интерфейс главного оконного менеджера, и либо GNOME / KDE находится поверх него .. Я не выделяю другие графические интерфейсы, такие как FluxBox, WindowMaker, и это лишь некоторые из них, и что будет много кода, зависящего от платформы, а также вместе с ним вы также будете иметь дело с буфером обмена Windows ... все в целом, большой интегрированный код ...

Вы не задумывались о том, чтобы взглянуть на необработанный программный API X для поддержки буфера обмена? Возможно, это могло бы быть лучше, как я мог бы себе представить, GNOME / KDE и т. Д. Используют API X для работы с буфером обмена ... если это подтвердится, тогда работа будет вырезана и не будет зависеть от основных интерфейсов GUI ... (Я надеюсь, что так и будет, поскольку это упростит жизнь вашему проекту!)

Возможно, используя переключатели времени компиляции для каждой платформы ... WIN, KDE, GNOME, MAC или используйте тот, который уже предварительно -defined ..

Надеюсь, это поможет, С уважением, Том.

1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: