LINUX.ORG.RU

Работа с буфером обмена на чистом Си в линуксе (баг в SDL2?)

 , , ,


0

2

Нужны функции на чистом Си для чтения и записи текста в буфер обмена.

Поиск находит только виндовские функции или не на Си. С линуксовыми сишными функциями - полная беда. Кроссплатформенные (хотя бы линукс/винда) библиотеки для работы с буфером обмена существуют?

П. С.:

SDL_SetClipboardText и SDL_GetClipboardText у меня на линуксе почему-то не работают. Это баг в SDL2?

Debian 10, XFCE.



Последнее исправление: metaprog (всего исправлений: 2)

Посмотри как это сделано в wl-clipboard (wayland) или xclip (иксы).

Im_not_a_robot ★★★★★
()
Ответ на: комментарий от Harald

Что такое «чистый С»?

Весь Си чист, нечестивыми могут быть только другие ЯП, созданные из лени и других пороков.

goingUp ★★★★★
()
Ответ на: комментарий от metaprog

И без паскаля так понимаю, не предлагать Clipboard.AsText := 'Text'; А чего ты собрался кроссплатформенные найти если оно в User32.dll сидит или иксах и еще какой-то кроме иксов.

ilovewindows ★★★★★
()
Ответ на: комментарий от metaprog

В вяленде оно работает по-другому?

неожиданно, да?

anonymous
()
Ответ на: комментарий от metaprog

На линуксе у меня X11. В вяленде оно работает по-другому?

что-то не слышал про массовый забан в гугле..

X11+clipboard

MKuznetsov ★★★★★
()

Кроссплатформенные (хотя бы линукс/винда) библиотеки для работы с буфером обмена существуют?

Я SDL использовал

COKPOWEHEU
()

папа чётко знает, что такое буфера. (с)

olelookoe ★★★
()

Используй АПИ всех тулкитов. Единого нет.

anonymous
()
Ответ на: комментарий от metaprog

в самом X11 нет буфера обмена, есть механизм передачи event SELECT_NOTIFY/SELECT_REQUEST и передача данных через property окна.
Т.е. одно приложение делает owner на любое имя буфера, другие же пытаются их получить.
Имен может быть сколько угодно, но заюзано там два PRIMARY и CLIPBOARD.
Первый через выделение мыши второй через ctrl+c,ctrl+v. Имена функций как бы намекают…

Все примеры которые якобы на c++ они все базируются либо на XLib либо на XCB и то и другое чистый Си, хватит ныть, пиши код

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)

Если под «чистым С» имеется ввиду минимальная зависимоть от тулкитов и библиотек и вы общаетесь с X-сервером через libx11, то буфера обмена как такового нет. Приложения могут запрашивать друг у друга какой участок текста сейчас выделен и просить переслать его содержимое.

Делается с помощью обработки сообщений SelectionClear, SelectionRequest, SelectionNotify.

anonymous
()
Ответ на: комментарий от pinus_nigra

Но ведь !(K&R) == K|R

Нет. Де Морган утверждает, что

!(K & R) = !K | !R

akk ★★★★★
()
Ответ на: комментарий от metaprog

SDL_SetClipboardText и SDL_GetClipboardText у меня на линуксе почему-то не работают. Debian 10, XFCE.

Debian 10, XFCE, все работает

#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_clipboard.h>

int main(){
  SDL_Init(SDL_INIT_VIDEO);
  char *temp = SDL_GetClipboardText();
  printf("%s\n", temp);
  SDL_Quit();
}
$ gcc main.c -lSDL2
$ ./a.out 
SDL_Quit
COKPOWEHEU
()
Ответ на: комментарий от Harald

Без говнокультей и говнотыка!

anonymous
()
Ответ на: комментарий от saahriktu

зачем женщина когда есть рука, ага

anonymous
()
Ответ на: комментарий от metaprog

В вяленде оно работает по-другому?

Да. Но если использовать какой-либо тулкит, то разницы не будет.

ls-h ★★★★★
()

УМВР

...
            if(keyboard_get_keystate("x"))
            {
                SDL_SetClipboardText("hello");
                debug("%s",SDL_GetClipboardText());
            }
...
...
$hello
$hello
$...
$libsdl2-2.0-0/testing,now 2.0.14+dfsg2-3 amd64 [установлен, автоматически]
  Simple DirectMedia Layer

anonymous
()

Что значит не работают. Что говрит SDL_GetError? Как проверял? Вне эвент лупа?

anonymous
()
Ответ на: комментарий от anonymous

УМВР

Да он SDL_Init с флагами наверняка сделать забыл.

Что значит не работают. Что говрит SDL_GetError? Как проверял? Вне эвент лупа?

А ему есть разница внутри цикла или вне? У меня и так и так работает.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

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

anonymous
()
Ответ на: комментарий от anonymous

Я там выше код приводил вообще без циклов (и без освобождения памяти, кстати - косяк) - читает буфер обмена, печатает его и завершается. А уж что там ТСу надо - кто ж Метапрога разберет.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Да, дело было в SDL_Init. Однако теперь есть проблема поинтееснее: работает SDL_GetClipboardText только в потоке, в котором был вызван SDL_Init. Есть ли хаки на этот счет?

metaprog
() автор топика
Ответ на: комментарий от anonymous

А если надо, например, обращаться к буферу обмена в разных потоках? Да, я уже смастерил костыль с обращением к потоку отрисовки графики, но это ж ведь именно костыль.

metaprog
() автор топика
Ответ на: комментарий от anonymous

Не, анон, вряд ли получится. SDL2 ориентируется на один единственный тред, и я сомневаюсь что два инита в разных тредах вообще не сломают все нахрен.

anonymous
()
Ответ на: комментарий от metaprog

Ты все правильно делаешь.

Вообще традиционно запускают обработчики в потоке графическом, и только при тяжелых операциях создают отдельный поток. Если надо из отдельного потока передать что то в графический то передают управление графическому и что то выполняют уже через него.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

А как быть с сетью? SDL_net тоже глючит (на винде), если в его потоке не сделать SDLNet_Init. И потоков, требующих работы сетью, несколько.

Что делать? Я уже подумываю использовать более простые функции работы с сетью, вопрос лишь в их кроссплатформенности (надо и на винду, и на линукс).

metaprog
() автор топика
Ответ на: комментарий от metaprog

Словом, можно и нужно ли делать SDLNet_Init сразу в разных потоках и не будет ли из-за этого проблем?

metaprog
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.