Взаимодействие Linux приложения с окном другого приложения
Модератор: Модераторы
Взаимодействие Linux приложения с окном другого приложения
Собссно вопрос в сабже...
Хочу сделать простой фронтенд для rdesktop.
Запустить не проблема с TProcess, но у него очень нефункциональное окно. Хочу сделать своё окно и чтобы в нём было окошко rdesktop
Хочу сделать простой фронтенд для rdesktop.
Запустить не проблема с TProcess, но у него очень нефункциональное окно. Хочу сделать своё окно и чтобы в нём было окошко rdesktop
Последний раз редактировалось tema 09.08.2017 23:04:19, всего редактировалось 3 раза.
Можно все, тем более есть исходники.
https://github.com/rdesktop/rdesktop
Можно сделать librdesktop.so или librdesktop.a
вывести ключевые функции и воздействовать на них из lazarus-а.
https://github.com/rdesktop/rdesktop
Можно сделать librdesktop.so или librdesktop.a
вывести ключевые функции и воздействовать на них из lazarus-а.
Так смысл в том, чтобы не выводить ничего. Он и так прекрасно работает. Смысл в том, чтобы запустить этот rdesktop (потом ещё хочу какой-нибудь vnc клиент) и просто тупо управлять запущеным окном. Перетаскивать, разворачивать на весь экран и т.п., используя нарисованную мною панельку.
Но даже если выводить. Как отрисовать это окно на моей форме?
Но даже если выводить. Как отрисовать это окно на моей форме?
ненадо ничего выводить..
надо ликовать либлу, и ловить callback с обновлением картинки, ими перерисовывать свои панельки. одновременно отправлять мышь,клавиатуру..
но для этого нужно знать волшебные функции за это отвечающие.
есть
http://savannah.nongnu.org/projects/grdesktop
но при первом просмотре вроде он работает через TProcess
Добавлено спустя 16 минут 53 секунды:
Re: Встраивание окна другого приложение в своё приложение Linux
Нашел еще FreeRDP
https://github.com/FreeRDP/FreeRDP
хорошее описание API
http://pub.freerdp.com/api/index.html
даже показан клиент:
https://github.com/FreeRDP/FreeRDP/blob ... /freerdp.c
надо ликовать либлу, и ловить callback с обновлением картинки, ими перерисовывать свои панельки. одновременно отправлять мышь,клавиатуру..
но для этого нужно знать волшебные функции за это отвечающие.
есть
http://savannah.nongnu.org/projects/grdesktop
но при первом просмотре вроде он работает через TProcess
Добавлено спустя 16 минут 53 секунды:
Re: Встраивание окна другого приложение в своё приложение Linux
Нашел еще FreeRDP
https://github.com/FreeRDP/FreeRDP
хорошее описание API
http://pub.freerdp.com/api/index.html
даже показан клиент:
https://github.com/FreeRDP/FreeRDP/blob ... /freerdp.c
olegy123 писал(а):ненадо ничего выводить..
надо ликовать либлу, и ловить callback с обновлением картинки, ими перерисовывать свои панельки. одновременно отправлять мышь,клавиатуру..
но для этого нужно знать волшебные функции за это отвечающие.
Вово. А где их взять. Но мне не обязательно на своей панельке. Достаточно чтобы я мог просто передавать в это окошко какие-то свои приколы. Например таскать это окошко или размещать на экране имеено там где я укажу своей программой. Это нужно когда открыто два небольших окошка и чтобы их обоих таскать "склееными". Допустим панелька маленькая и я с неё управляю открытием/закрытием этих окошек; могу эту панельку таскать и окошки вслед за ней и т.п. По сути задачи отрисовывать у себя не стоит.
olegy123 писал(а):есть
http://savannah.nongnu.org/projects/grdesktop
но при первом просмотре вроде он работает через TProcess
Там волшебных функций нет. Я проштудировал этот код. Там именно как TProcess
olegy123 писал(а):Нашел еще FreeRDP
https://github.com/FreeRDP/FreeRDP
хорошее описание API
http://pub.freerdp.com/api/index.html
даже показан клиент:
https://github.com/FreeRDP/FreeRDP/blob ... /freerdp.c
Эта фигня глючит. https://forum.altlinux.org/index.php?to ... #msg313635
Из всего что я опробовал хорошо работает только rdesktop. grdesktop совершенно вырвиглазный фронтенд
Добавлено спустя 3 минуты 27 секунд:
Re: Взаимодействие своего приложения с окном другого приложения
Переформулировал задачу сабжа.
Добавлено спустя 2 минуты 10 секунд:
Re: Взаимодействие своего приложения с окном другого приложения
По сути выходит, что задача сводится к тому, чтобы отрисовать рамку вокруг окна rdesktop и "приклеить" это окно к перетаскиванию этой рамки, при этом скрыв заголовок окна rdesktop
Понятно, вы не занимались си линкованием в lazarus-е.
есть, задача сводится к тому чтобы преобразовать rdesktop не в программу, а в библиотеку с описанием .h - файла, далее функции переносятся в .pas файл и описывается линковка. Вся работа.
в итоге вы имеете librdesktop.so и линкующий его librdesktop.pas. с набором функций rdesktop.
Например я так работал с ffmpeg, чтобы не переводить все h файлы и не разбираться что там за структура в сотни строк, которая еще имеет десятки таких же структур, а они разбрасали описание на сотни h файлов. Вот чтобы не делать подвиг, не переводить все.. сделал просто создал свою обертку libMyFFmpeg.so внес туда всю работу с ffmpeg и вынес ту которая нужна мне в pascal-е.
Как итог я написал свой плеер не хуже чем vlc.
Вообще линух славится развитыми либлами и скудными пользовательскими интерфейсами большая часть из них вообще представляет bash-скрипты с управлением через консоль. В Windows программированием это считается ламерством, хаком. Зачем делать развитые визуальные контролы, когда легко можно забашит/забатить работу плеера.
Вообще может оказаться, что под люних умеют кодировать не более тысячи человек на весь мир, остальная масса прогеров - это башисты, питонщики.
это называется управление чужими окнами. в X11 там нет развитых коммуникаций между окнами и управления как в Windows путем сообщений, но есть DBAS и оконные менеджеры могут в нем работать, но тут я не копал.
Добавлено спустя 5 минут 42 секунды:
Re: Взаимодействие Linux приложения с окном другого приложения
Это делает оконный менеджер. Рисует рамку вокруг X11 окна, а вывод в чужое окно(gtk виджет) есть у vlc - но там оно прописано как опция.
tema писал(а):Там волшебных функций нет. Я проштудировал этот код. Там именно как TProcess
есть, задача сводится к тому чтобы преобразовать rdesktop не в программу, а в библиотеку с описанием .h - файла, далее функции переносятся в .pas файл и описывается линковка. Вся работа.
в итоге вы имеете librdesktop.so и линкующий его librdesktop.pas. с набором функций rdesktop.
Например я так работал с ffmpeg, чтобы не переводить все h файлы и не разбираться что там за структура в сотни строк, которая еще имеет десятки таких же структур, а они разбрасали описание на сотни h файлов. Вот чтобы не делать подвиг, не переводить все.. сделал просто создал свою обертку libMyFFmpeg.so внес туда всю работу с ffmpeg и вынес ту которая нужна мне в pascal-е.
Как итог я написал свой плеер не хуже чем vlc.
Вообще линух славится развитыми либлами и скудными пользовательскими интерфейсами большая часть из них вообще представляет bash-скрипты с управлением через консоль. В Windows программированием это считается ламерством, хаком. Зачем делать развитые визуальные контролы, когда легко можно забашит/забатить работу плеера.
Вообще может оказаться, что под люних умеют кодировать не более тысячи человек на весь мир, остальная масса прогеров - это башисты, питонщики.
tema писал(а): Допустим панелька маленькая и я с неё управляю открытием/закрытием этих окошек; могу эту панельку таскать и окошки вслед за ней и т.п.
это называется управление чужими окнами. в X11 там нет развитых коммуникаций между окнами и управления как в Windows путем сообщений, но есть DBAS и оконные менеджеры могут в нем работать, но тут я не копал.
Добавлено спустя 5 минут 42 секунды:
Re: Взаимодействие Linux приложения с окном другого приложения
tema писал(а):По сути выходит, что задача сводится к тому, чтобы отрисовать рамку вокруг окна rdesktop и "приклеить" это окно к перетаскиванию этой рамки, при этом скрыв заголовок окна rdesktop
Это делает оконный менеджер. Рисует рамку вокруг X11 окна, а вывод в чужое окно(gtk виджет) есть у vlc - но там оно прописано как опция.
Стандартно для управления приложением из другого приложения используется DBUS.
Посмотрите вначале, если такая возможность реализована в rdesktop.
Посмотрите вначале, если такая возможность реализована в rdesktop.
Я всё сделал минут через 20 после последнего своего сообщения. Так обрадовался, что забыл отписаться
У rdesktop в последней версии есть опция -X windowid. Проще простого
От программы требуется только указать этот самый windowid того окна, куда запихать rdesktop. Это я сделал так:
Сейчас уже копаю gtk-vnc как реализовать VNC, чтобы был полный набор.
От программы требуется только указать этот самый windowid того окна, куда запихать rdesktop. Это я сделал так:
Код: Выделить всё
uses gtk2proc, gtk2extra, ctypes, gtk2;
Function GetXHandle(AWinControl : TWinControl) : culong;
var
Widget: PGtkWidget;
begin
Result:=0;
if (AWinControl=nil) or (not AWinControl.HandleAllocated) then exit;
Widget:={%H-}PGtkWidget(AWinControl.Handle);
if Widget^.window = nil then exit;
Result := gdk_window_xwindow(Widget^.window);
end;
Сейчас уже копаю gtk-vnc как реализовать VNC, чтобы был полный набор.
Код: Выделить всё
$ man rdesktop
...
-X <windowid>
Embed rdesktop-window in another window. The windowid is expected to be decimal or hexadecimal (prefixed by 0x).
....О, уже не актуально!
