Comments 60
Для повышения скорости предусмотрены функции BeginPacket(), EndPacket(), которые позволяют отправлять группу сообщений — для создания окна, например, со всеми его виджетами и их свойствами, как один пакет. Кроме того, некоторые обработчики событий можно передать серверу — я об этом писал.
Реализация подобной таблицы (browse) в HwGUI достаточно гибка, модели поведения можно создавать самые разные. По умолчанию два варианта — переданный массив данных или dbf файл, локальный или через соответствующую СУБД, Ads или LetoDB. Но подставив другие обработчики событий, можно реализовать и что-то еще для своих нужд. Эти другие предопределенные варианты можно будет задать в GuiServer, а из программы выбирать нужный.
А что с Drag'n'Drop?
В линуксе это получаются иксы над иксами внутри иксов?
… к которому подключаются еще клиенты.
один клиент, я об этом писал. Ну и, потом, мой GuiServer — это не иксы, так что выражение «иксы над иксами» здесь некорректно.
Если описать концепцию X-сервера в такой же "вкрации", как и ваша, разница будет нулевая.
Да, ну и чтобы два раза не вставать: если уж у вас "один сервер — один клиент", то чем объясняется выбор tcp/ip стека?
Тогда я запутался окончательно. Можете привести терминологию в статье к общему знаменателю, потому что не понятно какова роль GuiServer, клиента, кто такая "основная программа работает на Linux сервере". Где кто что отрисовывает?
Диаграммку набросайте, пожалуйста. Пока, как я это понял, всё выглядит как wxWidgets, но с клиент-серверной архитектурой.
Во фразе «основная программа работает на Linux сервере» имеется ввиду сервер вашей локальной сети.
Даже в этом вашем комментарии два "сервера". Вот что я понял. Старый добрый подход: молотилка данных отдельно, морда — отдельно. Это очень старый подход, вот примеры: mpd и множество его фронтэндов, из последнего — neovim и его tui и gui. Только у вас это с ног на голову. Правильно я понимаю?
молотилка данных отдельно, морда — отдельно
Примерно так. Только вот насчет «с ног на голову» я не соглашусь.
Ну, возможно, и не с ног на голову. В конце концов платформа с вашим подходом тоже уже существует.
Я его даже не видел, пользуюсь старым добрым vim.
Там как-то вот так:
Embeddable
GUIs and other applications can nvim --embed to discover the msgpack API dynamically.
И пачка проектов про это:
https://github.com/neovim/neovim/wiki/Related-projects#gui
TUI — нет. Остальные UI — да. И, кстати, может общаться и через сокеты, и через обычные pipe. Только в случае с Neovim ожидается, что GUI запустит neovim (или, теоретически, присоединится к уже запущенному), а не наоборот.
Этот сервер после запуска будет молча слушать определенный порт, и, получив соединение от моей программы на Golang, будет в ответ на ее запросы создавать окошки, виджеты, производить с ними манипуляции и осуществлять обратную связь при появлении каких-то событий от виджетов — словом, реализовывать для нее GUI.
А почему бы не написать такой сервер на tcl/tk?
По-настоящему нативным для Linux решением было бы детектить текущее окружение\установленные библиотеки и на основе этого включать тот фреймворк, который для данной системы нативный.
Не могу себе представить такое. Мартышкин труд какой-то.
Gtk2 или Gtk3, Qt4 или Qt5? Даже в рамках двух фреймворков уже 4 варианта.
Судя по вот таким штукам в Makefile fbreader, он это "детектил" на этапе сборки:
ifeq "$(UI_TYPE)" "qt"
QTSUBDIRS = src/qt/time src/qt/dialogs src/qt/view src/qt/image src/qt/util src/qt/filesystem src/qt/library src/unix/message src/qt/application-$(TARGET_ARCH)
endif
ifeq "$(UI_TYPE)" "qt4"
QTSUBDIRS = src/qt4/time src/qt4/dialogs src/qt4/view src/qt4/image src/qt4/util src/qt4/filesystem src/qt4/library src/unix/message src/qt4/application
endif
ifeq "$(UI_TYPE)" "gtk"
GTKSUBDIRS = src/gtk/time src/gtk/dialogs src/gtk/optionView src/gtk/image src/gtk/util src/gtk/filesystem src/gtk/library src/gtk/view src/unix/message src/gtk/application-$(TARGET_ARCH) src/gtk/pixbuf
endif
В Gnome он выглядит, кстати, вполне нормально. В KDE — не пробовал.
Но работать с ним я бы не стал, потому что использовать gtk под Windows, на мой взгляд, не лучший вариант. И выглядит несколько непривычно, и то, что надо устанавливать сам gtk везде со своей программой — сильно не нравится.
Что касается количества соединений — можно, конечно, было бы и одним обойтись, но тогда логика взаимодействия процессов усложнилась бы. Ведь событие от GUI, которое посылает сообщение основной программе, может произойти в любой момент, в том числе во время передачи сообщения от программы к GUI или когда программа ждет ответа на свое сообщение. Разрулить все это можно, но зачем лишняя головная боль…
Для Go, кстати есть и GTK биндинги. Вот тут рассматривали как минимум один из них.
Для локального приложения tcp/ip выглядит странно, более логично было бы AF_UNIX (linux/osx) и NamedPipe (win). Но я хоть убей всё ещё не понимаю, зачем может понадобиться связка GuiServer и GuiClient на разных хостах. Как это, вообще будет выглядеть, если GuiServer на win-хосте, а клиент на osx, к примеру?
Ах, ну и Клиппер, о боже, Клиппер! :)
Для Go, кстати есть и GTK биндинги.
Знаю, но я не использую gtk под Windows. Кроме того, это именно биндинги, т.е., набор функций, практически повторяющий gtk с его местами непростой структурой. В HwGUI же — обертка, которая изолирует программиста от всех деталей gtk и делает его работу проще.
Для локального приложения tcp/ip выглядит странно
Согласен. Вполне возможно, что в дальнейшем могут быть добавлены альтернативные варианты организации обмена. Реально там всего несколько небольших функций, которые за это отвечают. Через процедуру Init можно будет передавать GuiServer'у информацию, какой вариант использовать.
зачем может понадобиться связка GuiServer и GuiClient на разных хостах.Преимущественно в тех случаях, когда на компьютере, где работает программа, нет GUI оболочки или даже монитора — я же перечислил возможные варианты.
даже самой маленькой.
Тогда Go с его статической линковкой вам не подойдет.
1)То, как выглядит gtk под Windows, оставляет желать лучшего.
2)Биндинги повторяют модель библиотеки, gtk или qt. Моя обертка над gtk и winapi скрывает низкоуровневые детали реализации, с ней работать проще. Впрочем, может, это потому, что я к ней привык).
И ещё момент — очень часто сталкиваюсь с тем, что админы выключают на локальных компах виндовз службу DNS адресов. Видимо на то есть причины. В этом случае сервер ваш работать не будет, не так ли? по этому логичнее было бы например для windows использовать именованные пайпы, shared memory либо сообщения WM_COPYDATA. Или любой другой рекомендованный способ межпроцессной коммуникации, не зависящий от запущенных служб
Есть еще группа контролов, которые есть в HwGUI и, следавательно, будут доступны и через GuiServer, когда я напишу для этого код. В принципе, они все доступны и сейчас, если использовать xml формы.
По второму вопросу: отсутствие службы DNS никак не может повлиять на вызов локального сервера по адресу 127.0.0.1. Но об альтернативных механизмах связи я все равно буду думать — полезно иметь несколько вариантов.
GUI-фреймворки — на поток