Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > Общие вопросы программирования
Перезагрузить страницу Принципы оконного интерфейса
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Alexiski Alexiski на форуме
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 05.10.2007, 14:47

Собственно, вопрос был задан в другой ветке:
Цитата:
Вопрос 2: Как выглядит программный интерфейс с окном в Linux? Привязано ли это вообще к ядру, или реализовано по-своему в каждой оболочке типа KDE? Если можно, в двух словах, или хоть какие ссылки. Просто обрисовать горизонты, чтобы знать, откуда начать искать, а то я даже не знаю как вопрос правильно поставить, какими терминами оперировать. Если есть информация по другим операционным системам - тоже буду благодарен. А уж обзорная статья - просто прелесть.
Сдается мне, что этот вопрос затерялся в бурных обсуждениях основного вопроса того топика. Решил выделить его в отдельную тему.
Ответить с цитированием
  (#2 (permalink)) Старый
Narwal Narwal вне форума
Member
 
Сообщений: 1,039
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.10.2003
По умолчанию 05.10.2007, 15:15

http://ru.wikipedia.org/wiki/Linux_kernel
http://ru.wikipedia.org/wiki/X_Window_System
http://ru.wikipedia.org/wiki/KDE
Ответить с цитированием
  (#3 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 07.10.2007, 03:04

Там только рассказы, исходников я не увидел.

Я успел тоже топик создать, может, решим, где лучше вести обсуждение, здесь или там?


Хочу изложить свое IMHO насчет "Принципов построения X-Window" (по второй ссылке).
Цитата:
Добавляй новую функциональность только в том случае, если без неё нельзя завершить какое-то реальное приложение.
Решить, чем система не является, столь же важно, сколь решить, чем она является. Не пытайся удовлетворить все мыслимые потребности; вместо этого сделай систему расширяемой, чтобы новые потребности могли быть удовлетворены совместимым образом.
Блин, где был Бил Гейтс, когда они до этого додумались? Вот все бы так!

Цитата:
Если проблема не понята до конца, возможно, лучше не решать её вовсе.
Лодыри

Цитата:
Если ты можешь добиться 90 процентов нужного эффекта, затратив всего 10 процентов сил, используй более простое решение.
Тьфу на вас еще раз . Далеко так не уедешь.
Ответить с цитированием
  (#4 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 07.10.2007, 09:01

1. Что-то относящееся к грфике есть в современных ядрах Linux, но подробностей я не знаю (поищите по ключевым словам framebuffer и DRI).

2. В Unix графический интерфейс традиционно реализуется с помощью X Window System (X11). Работой с устройствами ввода-вывода занимается отдельное приложение - X server. "Пользовательское" приложение - X client - общается с сервером по стандартному X протоколу (протокол расширяемый), вообще говоря, через сеть. Клиент посылает серверу команды на создание/показ окна, отрисовку линий и т.п. Сервер посылает клиенту информацию о нажатых кнопках, изменениях состояний окон и т.д.

3. Для того, чтобы скрыть детали сетевого взаимодействия, существуют такие библиотеки, как Xlib (для языка C) и CLX (для Common Lisp). Например, чтобы нарисовать заполненный прямоугольник нужно вызвать функцию XFillRectangle (display, window, gc, x, y, width, height). Также библиотеки предоставляют функции для выборочного извлечения из очереди сообщений, поступивших от сервера.
Пример "hello world" на Xlib: http://en.literateprograms.org/Hello_World_(C,_Xlib).

4. Библиотеки виджетов позволяют собирать интерфейс из "кирпичиков". Они предоставляют набор классов для таких объектов, как кнопки, полосы прокрутки, меню и т.д., и дают возможность задать реакцию на действия с отдельными объектами.
4.1. X Toolkit -> (X Athena Widget Set | Motif). Пример: http://wwweic.eri.u-tokyo.ac.jp/computer/m...ml#EX-1013-02-3.
4.2. Tk. Пример (на языке Tcl): http://omega.di.unipi.it/web/IUM/Waterloo/node225.html.
4.3. GTK -> GNOME. Пример: http://bo.majewski.name/bluear/gnu/GTK/plain/index.htm.
4.4. Qt -> KDE. Пример: http://doc.trolltech.com/3.0/t2.html.
Ответить с цитированием
  (#5 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Wink 07.10.2007, 10:27

Alexey Dejneka, огромное вам спасибо!!!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Matematic Matematic вне форума
Member
 
Аватар для Matematic
 
Сообщений: 388
Сказал(а) спасибо: 31
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 15.01.2007
По умолчанию 09.11.2007, 07:01

А можно и я задам один вопрос?
Насколько я знаю, для Linux существует 3 наиболее распространенных графических оболочки: X Window, KDE и GNOME. Не уверен на все 100%, но по-моему KDE и GNOME хорошо совместимы между собой в том смысле, что программа, написанная под одну оболочку, скорее всего будет работать и под другой. В этом плане лишь X Window не является совместимой оболочкой: насколько я знаю, программы, написанные для нее, будут работать и в KDE и в GNOME, а вот обратное не верно. Т.е. X Window - базовая, простейшая графическая среда. Если я неправильно трактую эти вопросы, напишите, исправьте.

Ну а вопрос мой таков.
В системе Windows принята довольно гадкая, на мой взгляд, методика написания графических программ. Для написания оконного приложения пишется две различные функции-программы: оконная функция WinProc и собственно основная функция WinMain. Задача последней - установка начальных значений (инициализация программы), выполнение начальных действий после загрузки программы и вызов (запуск) WinProc, которая остается резидентной на все время выполнения программы. WinProc, если я не ошибаюсь, рисует окно (путем вызова специальной функции WinApi), задает его параметры, создает меню, рисует в нем начальную картинку, а далее останавливается и переходит в режим ожидания запросов. Каждое действие, произведенное на консоли (нажатие клавиши на клавиатуре, движение мыши и т. п.), заставляет операционную систему совершить запрос к оконной функции (WinProc), которая, в зависимости от полученного запроса (содержащего в закодированном виде информацию о дейстиях пользователя), вычисляет необходимое ответное действие (наиболее традиционный способ тут - создание большого блока switch) и запускает (вызывает) необходимую для обработки данной ситуации функцию, внешнюю по отношению к WinProc.
Таким образом, если я правильно понял идею, единой целостной программы как таковой и нет. Есть система разрозненных фрагментов: функция Winmain, вопреки своему названию лишь выполняющая начальный запуск программы и передающая управление WinProc, оконная интерфейсная функция, принимающая и обрабатывающая все запросы с консоли, и группа разрозненных (хотя, конечно, и как-то связанных между собой) функций, возможно, членов классов. Последние и представляют собой реальные алгоритмы нашей "программы", которые по сути дела и будут выполняться на протяжении всей работы программы, вызываясь, как правило, из оконной функции и заменяя собой "тело" программы.
Ситуация тут прямо противоположная классическому программированию. Действительно, в традиционном программировании внешним телом программы является алгоритм, а весь ввод-вывод находится внутри него, вызываясь из алгоритма. Здесь же, наоборот, внешним является ввод-вывод, интерфейс, а алгоритм находится внутри него, вызываясь из него в виде различных функций. Такой подход удобен для написания всяких редакторов, оболочек, клиентских программ и прочей хрени, но, как мне кажется, он малопродуктивен при написании чего-то более серьезного и содержательного. Действительно, там, где первичен алгоритм, идея, сама программа, он ее дробит на части, заставляет занять ее неподобающее место в коде, вынуждает автора программы концентрироваться на внешней стороне, на картинках, украшательствах, ибо они теперь - основной алгоритм, вместо того, чтобы углубиться в создание основного алгоритма. Сама система сделана шиворот-навыворот.
Если я неправильно или неграмотно изложил принцип работы приложений в ОС Windows, поправьте меня, а заодно выскажите свое мнение о том, что я написал.

Ну так вот, мне интересно узнать, графические программы под Linux (предназначенные для работы в GNOME и KDE) пишутся и работают по такому же принципу или же все-таки разработчики Linux придумали что-то более удобное, менее извращенное и более близкое к классическим принципам программирования?
Ответить с цитированием
  (#7 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,474
Сказал(а) спасибо: 22
Поблагодарили 944 раз(а) в 928 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 09.11.2007, 08:09

бред imho, вас никто не заставляет концентрироваться на украшательствах, ввод-вывод вызываемый только из алгоритма был в консольных программах. здесь же идея в том, чтобы программа могла работать не задерживаясь на вводе данных, т.е. обрабатывать их при их наличии, а не тупо ждать нажатия enter.
ну а то, что вы понимате под традиционным программированием, imho устарело ещё тогда, когда появились резидентные программы и многозадачные ос...
Ответить с цитированием
  (#8 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Lightbulb 09.11.2007, 09:28

А вот я согласен с позицией Matematic'а, мне тоже не нравится, что программа встроена в интерфейс, а не наоборот. С такой структурой связано очень много трудностей. Например, надо сделать плагиновую структуру для кроссплатформенной программы. Плагин должен иметь оконный интерфейс. И что, куда его пихать? Ведь здесь явно программа охватывает интерфейс, а не наоборот.

Про Linux я еще ничего не знаю, но почти уверен, что все будет также.
Ответить с цитированием
  (#9 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 09.11.2007, 09:47

Цитата:
Насколько я знаю, для Linux существует 3 наиболее распространенных графических оболочки: X Window, KDE и GNOME.
Есть приложение - X-сервер, отображающее графику на экране. Есть стандарт, как обращаться к X-серверу - X-протокол (надо номер рисуемой фигуры и ее параметры упаковать в структуру и послать через сокет). Есть библиотека Xlib, содержащая функции обращения к X-серверу (например, XFillRectangle (display, window, gc, x, y, width, height)). В принципе, используя только эту библиотеку, можно написать любое графическое приложение. Но это - огромная кропотливая ручная работа. Каждую кнопку, каждое поле ввода нужно нарисовать; при нажатии кнопки мыши - найти, какие прямоугольники ("кнопки") нужно перерисовать и т.д. Одно такой приложение с оператором switch на десяти тысячах строках я видел... Такие надстройки над Xlib, как GNOME и KDE, упрощают именно эту работу.

Цитата:
Не уверен на все 100%, но по-моему KDE и GNOME хорошо совместимы между собой в том смысле, что программа, написанная под одну оболочку, скорее всего будет работать и под другой. В этом плане лишь X Window не является совместимой оболочкой: насколько я знаю, программы, написанные для нее, будут работать и в KDE и в GNOME, а вот обратное не верно.
KDE и GNOME - это надстройки над X Window System, включающие в себя:
1. Библиотеки. Динамически скомпанованные программы будут работать только в том случае, когда в системе присутствуют все требуемые библиотеки. Без X Window ни GNOME, ни KDE работать не будут. В одной системе могут быть установлены оба комплекта. Использовать в одной программе и GNOME и KDE вряд ли получится. Использовать библиотеки GNOME вместо библиотек KDE или наоборот нельзя. Статически скомпонованные приложения будут работать где угодно.

2. Вспомогательные приложения: оконный менеджер, "рабочий стол", "панель запуска программ" - т.е. видимая "оболочка". Два оконных менеджера использовать одновременно нельзя. С любым оконным менеджером и рабочим столом (хоть GNOME, хоть KDE, хоть любым другим) можно запускать любые приложения, работающие по X-протоколу.

Цитата:
в традиционном программировании внешним телом программы является алгоритм, а весь ввод-вывод находится внутри него, вызываясь из алгоритма. Здесь же, наоборот, внешним является ввод-вывод, интерфейс, а алгоритм находится внутри него, вызываясь из него в виде различных функций. Такой подход удобен для написания всяких редакторов, оболочек, клиентских программ и прочей хрени, но, как мне кажется, он малопродуктивен при написании чего-то более серьезного и содержательного. Действительно, там, где первичен алгоритм, идея, сама программа, он ее дробит на части, заставляет занять ее неподобающее место в коде, вынуждает автора программы концентрироваться на внешней стороне, на картинках, украшательствах, ибо они теперь - основной алгоритм, вместо того, чтобы углубиться в создание основного алгоритма. Сама система сделана шиворот-навыворот.
Задачи бывают разные. Есть задачи, у которых вся работа - эта реакция на события. Оператор выдал команду - ее надо выполнить (быстро). Сработал датчик - на него надо отреагировать. И все - никакой постоянной работы (кроме отслеживания событий). Та "хрень", которую Вы перечислили, относится к этой категории. Если Ваша задача имеет жёсткий алоритм, не привязанный к действиям пользователя, возможно, стоит написать две программы - одну, построенную "классически", занимающуюся расчётами, и вторую, занимающуюся только графикой. Unix - система многозадачная
Ответить с цитированием
  (#10 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Thumbs up 09.11.2007, 10:55

Цитата:
Если Ваша задача имеет жёсткий алоритм, не привязанный к действиям пользователя, возможно, стоит написать две программы - одну, построенную "классически", занимающуюся расчётами, и вторую, занимающуюся только графикой.
Вот это интересно! А не подскажите, как грамотно организовать по этому принципу описанную мной плагиновую структуру? Как разбить и как синхронизировать приложения или процессы? Я имею ввиду не конкретную реализацию, не функции операционной системы (для Unix и Windows они будут разные), а общую логику.
Ответить с цитированием
  (#11 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 09.11.2007, 11:23

Запускаете из плагина дочерний процесс - и делаете в нём, что захотите. Связь - через любые средства межпроцессного взаимодействия, доступные в Вашей ОС (в Linux мне хватало локальных сокетов). Годится ли это для Ваших задач - не знаю.
Ответить с цитированием
  (#12 (permalink)) Старый
Matematic Matematic вне форума
Member
 
Аватар для Matematic
 
Сообщений: 388
Сказал(а) спасибо: 31
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 15.01.2007
По умолчанию 11.11.2007, 09:56

Alexey Dejneka, спасибо за хороший и квалифицированный ответ. Вы уже не в первый раз мне так грамотно и понятно отвечаете. Можно несколько уточнений?
Как я понял, и X Window, и X System - компоненты операционной системы, являющиеся буфером между прикладной программой и экраном в графическом режиме и другими устройствами ввода-вывода.
В связи с этим у меня возникли такие вопросы.
1. Являлись ли эти системы исторически частью Unix и Linux их унаследовала, или же они появились только в Linux? В каком году (приблизительно) эти компоненты были созданы?
2. Являются ли эти системы многооконными, т.е. создают ли они для каждого приложения свое окно, или же они рассматривают экран как единое целое, как единое "пространство" для всех программ и окна приходится рисовать вручную, либо же пользуясь надстройками типа KDE и GNOME?
3. Работают ли программы с этими системами по "классическому" принципу, т. е. программа вызывает их функции из своего тела, интерфейс классически встроен в алгоритм, или же работа приложения организована по каркасному принципу, как в Windows? То, что в многозадачной, да и в однозадачной ОС можно создать каркасное приложение, примерно как в Windows, руками я прекрасно понимаю. Вопрос в том, какой принцип заложен изначально.
4. Является ли библиотека функций X Window чем-то подобным BGI (Borland Graphics Interface) для MS-DOS в ранних компиляторах от Borland, или ее и внутреннее логическое устройство, и внешний вид (набор основных функций, их формат) мало похожи на BGI?

По поводу KDE и GNOME.
1. Я не совсем понял, будет ли программа, написанная для KDE, работать в GNOME и наоборот. Если ответ "Иногда - да, иногда нет", поясните, в каких случаях переносимость обеспечена, в каких она невозможна. Если ответ "Нет", объясните почему. Просто мне показалось, что ряд офисных популярных приложений под Linux работают и там, и там. Мой опыт знакомства с ОС Linux очень мал, поэтому я в этом не уверен. Мог чего-то и напутать.
2. Организованы ли графические программы для этих двух оболочек по принципу каркасного оконного приложения Windows? Или же они сделаны как-то по-другому? Или же при написании графических программ под эти оболочки предусмотрена какая-то альтернатива (можно делать и так, и так). В Windows, насколько я знаю, никакой альтернативы нет. Либо консольное приложение без графики, либо, если графическое, то только такое (уточните, пожалуйста, этот вопрос, я точно не уверен).
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 11.11.2007, 13:41

Цитата:
1. Являлись ли эти системы исторически частью Unix и Linux их унаследовала, или же они появились только в Linux? В каком году (приблизительно) эти компоненты были созданы?
Базовая система пришла из Unix. 1984-1987. http://en.wikipedia.org/wiki/X11

Цитата:
2. Являются ли эти системы многооконными, т.е. создают ли они для каждого приложения свое окно
Краткий ответ - да. Вообще, X11 позволяет нескольким приложениям работать с одним окном, или одному приложению создавать несколько окон, в том числе одновременно на нескольких машинах. Правда, высокоуровневые надстройки такие фокусы не очень любят.

Цитата:
3. Работают ли программы с этими системами по "классическому" принципу, т. е. программа вызывает их функции из своего тела, интерфейс классически встроен в алгоритм,
Если говорить про Xlib - базовую библиотеку работы с X-протоколом для языка C, то она используется классически. Когда хотите - вызываете функцию рисования или функцию чтения очередного сообщения из очереди. Никаких функций типа "ввести строку/число/имя файла с клавиатуры" - только "какую кнопку нажал пользователь?" Для DVD-проигрывателя это, наверное, удобно.

Надстройки, как правило, строятся по другому принципу - они дают набор объектов (кнопок/меню/полей ввода), а программа строится как набор обработчиков событий от этих объектов.

Цитата:
или же работа приложения организована по каркасному принципу, как в Windows?
В Windows не программировал, что такое "каркасный принцип" не знаю.

Цитата:
4. Является ли библиотека функций X Window чем-то подобным BGI (Borland Graphics Interface) для MS-DOS в ранних компиляторах от Borland
Является ли GDI чем-то подобным BGI? Решите сами: http://maben.homeip.net:8217/static/comput...s/xlib/top.html

Цитата:
1. Я не совсем понял, будет ли программа, написанная для KDE, работать в GNOME и наоборот.
Будет ли программа, написанная для Microsoft Foundation Classes, работать в Object Windows Library? А в Far-е?

Ни KDE, ни GNOME - это не операционки. Грубо говоря, они содержат:
1) Библиотеки разработки GUI. В рамках одной программы они вряд ли совместимы.
2) Графическую запускалку программ ("проводник"). Ей можно запускать все, что угодно - хоть FTP-сервер.
Ответить с цитированием
  (#14 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 11.11.2007, 15:24

Я сам не в теме, поэтому спрашиваю...
Т.е. Возможно такое, что я из КДЕ-проводника запущу Гномовское граф.приложение и оно запустится, используя имеющуюся на том же компе Гному?


импортирован с progz.ru
Ответить с цитированием
  (#15 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 11.11.2007, 16:35

Цитата:
Т.е. Возможно такое, что я из КДЕ-проводника запущу Гномовское граф.приложение и оно запустится, используя имеющуюся на том же компе Гному?
Да! Именно так и происходит. И наоборот, разумеется, тоже. Принадлежность к KDE/GNOME определяется иcпользуемыми библиотеками, и если приложение нормально установленно, то все необходимые библиотеки уже имеются. Однако, запускаются приложения в "родной" среде обычно несколько быстрее (поскольку все необходимые библиотеки уже загружены).
В то же время, OpenOffice, наколько я помню, нельзя отнести ни к KDE, ни к GNOME. (Поэтому он стартует одинаково долго везде )

KDE'шный проводник из под GNOME запускать тоже никто не мешает, как и из консоли
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некоторые принципы по написанию программ, для новичков dect Общие вопросы создания ПО 15 24.09.2011 19:18
Общие принципы организации синтаксического разбора в С++ 45182 Вопросы начинающих программистов 2 09.01.2011 18:41
Программа демонстрирующая принципы ООП (полиморфизм, инкапсуляцию, наследование) TidalAeon Вопросы начинающих программистов 0 11.12.2010 16:32
Принципы управления DVD и CD приводами tumanovalex Железо. Написание драйверов 0 29.08.2008 00:21
Принципы решения написания программы Frullani Lisp 2 27.09.2007 19:23
Принципы форматирования файлов shatush Общетематический 3 29.06.2007 23:16
Создание оконного приложения для Windows с 98 на VS2005 Antsu Visual C++ 5 17.01.2007 10:34
Объясните общие принципы работы CAsyncSocket Palmman Сетевое программирование 2 02.10.2006 20:28
Принципы создания средствами VC++ 6.0 интерфейса типа "проводник" Postum Visual C++ 8 26.01.2005 18:10
Принципы написания трояна Anonymous Delphi 30 19.03.2004 16:37
Принципы DoS-атак как их создавать Felix Delphi 2 11.01.2004 06:27
Принципы работы менеджера виртуальных экранов lv Visual C++ 0 01.11.2003 05:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов