Кіріспе
X Window System негізгі протоколы – Unix, Unix сияқты және басқа операциялық жүйелерде графикалық пайдаланушы интерфейстерін құру үшін қолданылатын биттік карталар дисплейлеріне арналған желілік терезелік жүйе болып табылады. X Window жүйесі клиент-сервер моделіне негізделген: бір сервер экран, пернетақта және тышқан сияқты кіріс/шығыс жабдықтарын басқарады; барлық қолданбалық бағдарламалар клиенттер ретінде әрекет етеді, пайдаланушымен және сервер арқылы басқа клиенттермен өзара әрекеттеседі. Осы өзара әрекеттесу X Window System негізгі протоколымен реттеледі. X Window System-ге қатысты басқа да протоколдар бар, олар X Window System негізгі протоколының үстінде немесе жеке протоколдар ретінде құрылған. X Window System негізгі протоколында желі арқылы төрт түрлі пакет асинхронды түрде жіберіледі: сұраулар, жауаптар, оқиғалар және қателер. Клиент серверге белгілі бір операцияны орындауды (мысалы, жаңа терезе құру) және сақтаған деректерін қайтаруды сұрау үшін сұраулар жібереді. Сервер осындай деректерді беру үшін жауаптар жібереді. Оқиғалар сервер арқылы клиенттерге пайдаланушының әрекеттері немесе оларды қызықтыратын басқа оқиғалар туралы хабарлау үшін жіберіледі. Қателер – сервердің клиентке оның сұрауларын өңдеу кезінде туындаған қателер туралы хабарлау үшін жіберген пакеттері. Сұраулар жауаптарды, оқиғаларды және қателерді тудыруы мүмкін; басқаша айтқанда, протокол желі арқылы пакеттерді жіберудің нақты ретін міндеттейді. Негізгі протоколға бірнеше кеңейтімдер бар, олардың әрқайсысының өз сұраулары, жауаптары, оқиғалары және қателері бар. X 1984 жылы MIT-те пайда болды (оның қазіргі X11 нұсқасы 1987 жылдың қыркүйегінде жарық көрді). Оның авторлары Боб Шейфлер мен Джим Геттис бастапқы принцип ретінде оның негізгі протоколының «механизм құру, саясат емес» болуын белгіледі. Нәтижесінде негізгі протокол клиенттер арасындағы және клиент пен пайдаланушы арасындағы өзара әрекеттесуді нақтыламайды. Бұл өзара әрекеттесу ICCCM және freedesktop.org сияқты жеке спецификациялардың пәні болып табылады және әдетте белгілі бір виджет жиынтығын пайдалану арқылы автоматты түрде орындалады.
The X Window System core protocol is the base protocol of the X Window System, which is a networked windowing system for bitmap displays used to build graphical user interfaces on Unix, Unix like, and other operating systems. The X Window System is based on a client–server model: a single server controls the input/output hardware, such as the screen, the keyboard, and the mouse; all application programs act as clients, interacting with the user and with the other clients via the server. This interaction is regulated by the X Window System core protocol. Other protocols related to the X Window System exist, both built at the top of the X Window System core protocol or as separate protocols. In the X Window System core protocol, only four kinds of packets are sent, asynchronously, over the network: requests, replies, events, and errors. Requests are sent by a client to the server to ask it to perform some operation (for example, create a new window) and to send back data it holds. Replies are sent by the server to provide such data. Events are sent by the server to notify clients of user activity or other occurrences they are interested in. Errors are packets sent by the server to notify a client of errors occurred during processing of its requests. Requests may generate replies, events, and errors; other than this, the protocol does not mandate a specific order in which packets are sent over the network. Some extensions to the core protocol exist, each one having its own requests, replies, events, and errors. X originated at MIT in 1984 (its current release X11 appeared in September 1987). Its designers Bob Scheifler and Jim Gettys set as an early principle that its core protocol was to "create mechanism, not policy". As a result, the core protocol does not specify the interaction between clients and between a client and the user. These interactions are the subject of separate specifications, such as the ICCCM and the freedesktop. org specifications, and are typically enforced automatically by using a given widget set.
Терезелер
Көптеген графикалық пайдаланушы интерфейстерінде әдетте терезе деп аталатын нәрсе X терезесі жүйесінде жоғарғы деңгейдегі терезе деп аталады. Терезе деген термин басқа терезеде орналасқан терезелерді, яғни бас терезедегі ішкі терезелерді көрсету үшін де қолданылады. Батырмалар, мәзірлер, белгішелер және т.б. графикалық элементтер кіші терезелерді пайдалану арқылы жүзеге асырылуы мүмкін. Клиент терезенің құрылуын сұрауы мүмкін. Нақтырақ айтқанда, ол қолданыстағы терезеде кіші терезе құруды сұрай алады. Нәтижесінде клиенттер жасаған терезелер ағашқа (иерархияға) орналасады. Бұл ағаштың түбірі – түбір терезе, ол сервердің автоматты түрде іске қосылғанда құратын арнайы терезе. Барлық басқа терезелер тікелей немесе жанама түрде түбір терезенің ішкі терезелері болып табылады. Жоғарғы деңгейдегі терезелер түбір терезенің тікелей ішкі терезелері болып табылады. Көрінетіндей, түбір терезе виртуалды жұмыс үстелі сияқты үлкен және барлық басқа терезелердің артында орналасқан. Терезенің мазмұнының уақыт өте келе сақталуына кепілдік берілмейді. Атап айтқанда, терезе мазмұны терезе жылжығанда, оның мөлшері өзгертілгенде, басқа терезелермен жабылып, жалпы алғанда толық немесе ішінара көрінбейтін болғанда жойылуы мүмкін. Атап айтқанда, егер X сервері терезе мазмұнының резервтік көшірмесін сақтамаса, мазмұн жоғалады. Клиент терезенің сақталуын қамтамасыз ету үшін резервтік сақтауды сұрауы мүмкін, бірақ сервердің бұған міндеттілігі жоқ. Сондықтан клиенттер резервтік сақтау сақталады деп болжауға болмайды. Егер терезенің көрінетін бөлігінде анықталмаған мазмұн болса, клиентке терезенің мазмұны қайтадан салынуы керектігі туралы хабарлау үшін оқиға жіберіледі. Әрбір терезеге оған байланысты атрибуттар жиынтығы бар, мысалы, терезенің геометриясы (мөлшері мен орны), фондық сурет, оның резервтік сақтау орны сұралған ба, жоқ па және т.б. Протокол клиенттің терезенің атрибуттарын тексеруге және өзгертуге арналған сұрауларды қамтиды. Терезелер InputOutput немесе InputOnly болуы мүмкін. InputOutput терезелері экранға шығарылады және сурет салу үшін қолданылады. InputOnly терезелері экранға ешқашан көрсетілмейді және тек кіріс қабылдау үшін қолданылады. Әдетте терезелердің айналасында көрінетін сәндік жиек және тақырып жолағы (мүмкін, батырмаларды қоса алғанда) терезе менеджері жасады, бірақ терезелерді жасайтын клиент емес. Терезе менеджері сонымен қатар осы элементтермен байланысты кірісті басқарады, мысалы пайдаланушы терезенің жиегін басып, сүйрегенде терезенің мөлшерін өзгерту. Клиенттер әдетте өздері жасаған терезеде жұмыс істейді, терезе менеджерінің жасаған өзгерістерін ескермейді. Оның ескеруі керек бір өзгеріс – терезе менеджерлерін қайта атау, бұл қазіргі заманғы терезе менеджерлерінің көпшілігі жоғарғы деңгейдегі терезелердің бас терезені емес, басқа терезеге ауыстырады. Негізгі протокол тұрғысынан қарағанда, терезе менеджері басқа қолданбалардан ешқандай айырмашылығы жоқ клиент болып табылады. Терезе туралы деректерді xwininfo бағдарламасын іске қосу арқылы алуға болады. Бұрыштан командалық жол аргументін бергенде, бұл бағдарлама терезенің кіші терезелерінің ағашын, олардың идентификаторларымен және геометриялық деректерімен бірге көрсетеді.
Пикскаптар мен сызғыш
Пикзмап – сурет салуға арналған жад аймағы. Терезелерден өзгеше, пикзмаптар автоматты түрде экранда көрсетілмейді. Дегенмен, пикзмаптың мазмұны (немесе оның бір бөлігі) терезеге көшірілуі мүмкін, сондай-ақ терезеден пикзмапқа көшіру де қолданылады. Бұл, мысалы, қос буферлеу тәсіліне мүмкіндік береді. Терезелерде қолданылатын көптеген графикалық операциялар пикзмаптарда да орындалуы мүмкін. Терезелер мен пикзмаптар бірлесіп drawables деп аталады, ал олардың мазмұны деректері серверде сақталады. Клиент drawables мазмұнын серверден клиентке немесе керісінше жіберуге сұрау жіберуі мүмкін.
Графикалық контексттер мен қаріптер
Клиент бірнеше графикалық операцияларды сұрауға болады, мысалы, белгілі бір аумақты тазалау, аумақты басқа аумаққа көшіру, нүктелер, сызықтар, тіктөртбұрыштар және мәтін салу. Тазалаудан басқа, барлық операцияларды барлық графикалық элементтерде – терезелерде де, пиксел карталарында да орындауға болады. Көптеген графикалық операция сұраулары графикалық контексті қамтиды, ол графикалық операциялардың параметрлерін сақтайтын құрылым. Графикалық контекстке алдыңғы план түсі, фон түсі, мәтін шрифті және басқа графикалық параметрлер кіреді. Графикалық операцияны сұрағанда клиент графикалық контексті қосады. Графикалық контекстің барлық параметрлері операцияға әсер етпейді: мысалы, шрифт сызық салуға әсер етпейді. Негізгі протокол серверлік шрифттерді пайдалануды белгілейді. Мұндай шрифттер файлдар түрінде сақталады және сервер оларға тікелей жергілікті файлдық жүйе арқылы немесе желі арқылы басқа бағдарлама – шрифт сервері арқылы қол жеткізеді. Клиенттер серверде қол жетімді шрифттердің тізімін сұрап ала алады және серверден (егер бұрыннан болмаса) шрифтті жүктеуді немесе басқа клиенттер пайдаланбаса, жүктелген шрифтті жоюды сұратуы мүмкін. Клиент шрифт туралы жалпы ақпаратты (мысалы, шрифт өрлеуін) және белгілі бір шрифтпен салынғанда белгілі бір жол қандай орынды алатынын сұрап білуге болады. X Window негізгі протоколы деңгейінде шрифттердің атаулары кездейсоқ жолдар болып табылады. X логикалық шрифты сипаттау конвенциялары шрифттерді олардың атрибуттарына сәйкес қалай атау керектігін анықтайды. Бұл конвенциялар сонымен қатар шрифттерге қосатын міндетті емес қасиеттердің мәндерін де анықтайды. xlsfonts бағдарламасы серверде сақталған шрифттердің тізімін шығарады. xfontsel бағдарламасы шрифттердің глифтерін көрсетеді және пайдаланушыға оны басқа терезеге көшіру үшін шрифт атауын таңдауға мүмкіндік береді. Серверлік шрифттерді пайдалану қазіргі уақытта клиенттік шрифттердің пайдасына ескірген деп есептеледі. Мұндай шрифттерді сервер емес, клиент көрсетеді, Xft немесе cairo кітапханалары және XRender кеңейтімдерінің көмегімен. Негізгі протокол клиенттік шрифттер туралы ешқандай ереже бермейді.
Оқиғалар
Оқиғалар – сервердің клиентке клиент қызығушылық танытатын жағдай болғанын хабарлау үшін жіберген пакеттері. Мысалы, пайдаланушы перне басса немесе тышқан батырмасын басқанда оқиға жіберіледі. Оқиғалар енгізу үшін ғана қолданылмайды: мысалы, оқиғалар берілген терезеде жаңа ішкі терезелердің құрылуын көрсету үшін жіберіледі. Әрбір оқиға терезеге қатысты. Мысалы, егер пайдаланушы көрсеткіші терезенің ішінде болған кезде шертетін болса, оқиға сол терезенің аясында болады. Оқиға пакеті сол терезенің идентификаторын қамтиды. Клиент серверден басқа клиентке оқиға жіберуді сұрай алады; бұл клиенттер арасындағы байланыс үшін қолданылады. Мұндай оқиға, мысалы, клиент қазіргі таңдалған мәтінді сұрағанда туындайды: бұл оқиға таңдалған мәтінді ұстап тұрған тереземен жұмыс істейтін клиентке жіберіледі. Expose оқиғасы терезенің бір бөлігі жойылғанда және мазмұны көрінетін болғанда жіберіледі. Терезенің мазмұны кейбір жағдайларда жойылуы мүмкін, мысалы, егер терезе жабылып, сервер резервтік көшірмені сақтамаса. Сервер клиентке терезенің бөлігін қайта салу қажеттігін хабарлау үшін Expose оқиғасын жасайды. Көптеген оқиғалар клиент оларға қызығушылық танытса ғана жіберіледі. Себебі клиенттер тек кейбір оқиғаларға қызығушылық танытуы мүмкін. Мысалы, клиент пернетақтамен байланысты оқиғаларға қызығушылық танытуы мүмкін, бірақ тышқанмен байланысты оқиғаларға қызығушылық танытпауы мүмкін. Дегенмен, кейбір оқиғалар клиенттерге тіпті олар арнайы сұрамаған жағдайда да жіберіледі. Клиенттер терезенің атрибутын орнату арқылы қандай оқиғалардың түрлерін алуға ниеттенетінін көрсетеді. Мысалы, мазмұны жойылған терезені қайта салу үшін клиентке Expose оқиғалары жіберілуі керек, олар терезені қайта салу қажеттігін хабарлайды. Бірақ клиентке Expose оқиғалары тек егер клиент осы оқиғаларға қызығушылығын білдірген жағдайда ғана жіберіледі, бұл терезенің оқиға маскасы атрибутын дұрыс орнату арқылы жасалады. Әртүрлі клиенттер бір терезеде оқиғаларды сұрауы мүмкін. Олар тіпті бір терезенің оқиға маскасын әртүрлі орнатуы мүмкін. Мысалы, бір клиент тек терезенің пернетақта оқиғаларын сұрауы мүмкін, ал екінші клиент сол терезенің тышқан оқиғаларын ғана сұрауы мүмкін. Бұл мүмкін, өйткені сервер әр терезе үшін әр клиент үшін жеке оқиға маскасын сақтайды. Алайда, әр терезенің бір клиент ғана таңдауы мүмкін оқиғалардың кейбір түрлері бар. Атап айтқанда, бұл оқиғалар тышқан батырмасын шерту және терезелерді басқаруға байланысты кейбір өзгерістер туралы хабарлайды. xev бағдарламасы терезенің аясындағы оқиғаларды көрсетеді. Атап айтқанда, xev id WID командасы WID идентификаторы бар терезенің аясындағы барлық мүмкін оқиғаларды сұрап, оларды шығарып береді.
Атомдар
Атомдар – жолдарды бейнелейтін 32 биттік бүтін сандар. Протокол жасаушылары атомдарды енгізді, себебі олар жолдарды қысқа және белгілі бір мөлшерде көрсетеді: жол кез келген ұзындықта болуы мүмкін, ал атом әрқашан 32 биттік бүтін сан болады. Атомның ықшамдығы, бірнеше рет бірдей жолдармен жіберілетін пакеттерде оларды міндетті түрде пайдалану арқылы қолданылды; бұл желіні тиімді пайдалануға мүмкіндік береді. Атомдардың белгілі бір мөлшері, оқиғалар үшін де белгілі бір мөлшерді – атап айтқанда, 32 байтты анықтау арқылы пайдаланылды: белгілі бір мөлшердегі пакеттер атомдарды қамтуы мүмкін, бірақ ұзын жолдарды қамтуы мүмкін емес. Нақтырақ айтқанда, атомдар – серверде сақталатын жолдардың идентификаторлары. Олар ресурстардың идентификаторларына (Windows, Pixmaps және т.б.) ұқсас, бірақ екі жағынан да ерекшеленеді. Біріншіден, атомдардың идентификаторын клиент емес, сервер таңдайды. Басқаша айтқанда, клиент жаңа атом құруды сұрағанда, ол серверге тек сақталуға тиіс жолды жібереді, оның идентификаторын емес; осы идентификаторды сервер таңдайды және клиентке жауап ретінде қайтарады. Ресурстар мен атомдардың екінші маңызды айырмашылығы – атомдар клиенттермен байланысты емес. Бір рет құрылғаннан кейін, атом сервер тоқтағанша немесе қайта іске қосылғанша сақталады (бұл ресурстардың әдепкі мінез-құлқы емес). Атомдар – идентификаторлар, сондықтан олар бірегей. Дегенмен, атом мен ресурс идентификаторы сәйкес келуі мүмкін. Атоммен байланысты жол атомның атауы деп аталады. Атомның атауын құрғаннан кейін өзгертуге болмайды, және екі атомның атауы да бірдей болмайды. Сондықтан, атомды көрсету үшін атомның атауы жиі қолданылады: «ABCD атомы» дегеніміз, дәлірек айтқанда, «қатысты жолы ABCD атомы» немесе «атауы ABCD атомы». Клиент жаңа атом құруды және белгілі бір жолдың атомын (идентификаторын) сұрауы мүмкін. Кейбір атомдар алдын ала анықталған (сервер белгілі бір идентификатормен және жолмен құрады). Атомдар көптеген мақсаттар үшін қолданылады, көбінесе бір серверге қосылған әртүрлі клиенттер арасындағы байланысқа қатысты. Атап айтқанда, олар терезелердің қасиеттерімен бірге қолданылады, олар төменде сипатталған. Сервердегі барлық атомдардың тізімін xlsatoms бағдарламасын пайдаланып басып шығаруға болады. Бұл бағдарлама әр атомның (идентификатордың, яғни санның) атауын (оның байланысты жолын) басып шығарады.
Қасиеттері
Әрбір терезеде алдын ала анықталған атрибуттар мен қасиеттер жиынтығы болады, олардың бәрі серверде сақталады және клиенттерге тиісті сұраулар арқылы қолжетімді. Атрибуттар – терезе туралы деректер, мысалы, оның өлшемі, орны, фон түсі және т.б. Қасиеттер – терезеге тіркелген кез келген деректер. Атрибуттардан өзгеше, қасиеттер X Window негізгі протоколы деңгейінде мағынаға ие емес. Клиент терезенің қасиетінде кез келген деректерді сақтай алады. Қасиет атау, тип және мән сипатталады. Қасиеттер императивті бағдарламалау тілдеріндегі айнымалыларға ұқсас, клиент белгілі бір атаумен және типпен жаңа қасиетті құрып, оған мән сақтай алады. Қасиеттер терезелермен байланысты: екі әртүрлі терезеде бірдей атаумен екі қасиет болуы мүмкін, бірақ олардың типтері мен мәндері әртүрлі болуы мүмкін. Қасиеттің атауы, типі және мәні – жолдар; дәлірек айтқанда, олар атомдар, яғни серверде сақталған және клиенттерге идентификаторлар арқылы қолжетімді жолдар. Клиенттік қосымша берілген қасиеттің атауын қамтитын атомның идентификаторын пайдаланып оған қол жеткізе алады. Қасиеттер көбінесе клиенттер арасындағы байланыс үшін қолданылады. Мысалы, "WM NAME" деп аталатын қасиет (атоммен аталатын қасиет, оның сәйкес жолы "WM NAME") терезелердің атауын сақтау үшін қолданылады. Терезе басқарушылары әдетте осы қасиетті терезе атауын тақырып жолағында көрсету үшін оқиды. Клиенттер арасындағы байланыстың кейбір түрлері түбір терезенің қасиеттерін пайдаланады. Мысалы, freedesktop терезе басқарушысының спецификациясына сәйкес, терезе басқарушылары қазіргі белсенді терезенің идентификаторын түбір терезенің "NET ACTIVE WINDOW" деп аталатын қасиетінде сақтауы керек. Бағдарламалардың параметрлерін қамтитын X ресурстары да түбір терезенің қасиеттерінде сақталады; осылайша, әртүрлі компьютерлерде жұмыс істесе де, барлық клиенттер оларға қол жеткізе алады. xprop бағдарламасы берілген терезенің қасиеттерін шығарып береді; xprop root түбір терезенің әрбір қасиетінің атауын, типін және мәнін шығарып береді.
Басқа
Негізгі протоколда басқа да сұраулар мен оқиғалар бар. Сұраулардың бірінші түрі терезелер арасындағы ата-аналық қатынасқа қатысты: клиент терезенің ата-анасын өзгертуді сұрауы немесе терезелердің ата-аналық байланысы туралы ақпарат алуы мүмкін. Басқа сұраулар таңдаумен байланысты, бірақ олар көбінесе басқа протоколдармен реттеледі. Тағы бір сұраулар кіріс фокусы мен курсордың пішіні туралы. Клиент сондай-ақ ресурстың (терезе, пикзмап, т.б.) иесін жоюды сұрауы мүмкін, бұл сервердің осымен байланысын үзуге себеп болады. Соңында, клиент серверге ешқандай операция жасамау үшін сұрау жібере алады.
Ұзартулар
X Window негізгі протоколы кеңейтілуге мүмкіндік беру үшін жасалды. Негізгі протокол қолжетімді кеңейтулерді анықтау механизмін және кеңейту сұраулары, оқиғалары мен қателік пакеттерін қалай жасауды белгілейді. Атап айтқанда, клиент нақты бір кеңейтуге қатысты деректерді алу үшін барлық қолжетімді кеңейтулердің тізімін сұрауы мүмкін. Кеңейту пакеттері негізгі протокол пакеттеріне ұқсас. Негізгі протокол сұрау, оқиға және қате пакеттерінде олардың түрін көрсететін бүтін сан болатынын анықтайды (мысалы, жаңа терезе құру сұрауы 1 нөмірмен белгіленеді). Осы бүтін сандардың бір бөлігі кеңейтулер үшін резервтелген.
Рұқсат беру
Клиент сервермен алғашқы байланыс орнатқанда, сервер байланысты қабылдау арқылы, одан бас тарту арқылы немесе аутентификация сұрау арқылы жауап бере алады. Аутентификация сұрауы қолданылатын аутентификация әдісінің атын қамтиды. Негізгі протокол аутентификация процесін көрсетпейді, ол қолданылған аутентификация түріне байланысты, бірақ сервер қабылдау немесе бас тарту жауабымен аяқталады. Клиент пен сервер арасындағы қалыпты өзара әрекеттесу кезінде аутентификацияға қатысты сұраулар тек хостқа негізделген қолжетімділік әдісіне байланысты болады. Атап айтқанда, клиент осы әдісті қосуды, сондай-ақ қосылуға рұқсат етілген хосттардың (клиенттердің) тізімін оқуды және өзгертуді сұрауы мүмкін. Көптеген қолданбалар бұл сұрауларды пайдаланбайды; олар xhost бағдарламасымен пайдаланушыға немесе сценарийге хостқа қолжетімділік тізіміне қол жеткізу үшін қолданылады. Хостқа негізделген қолжетімділік әдісі қауіпсіз емес деп есептеледі.
Белгіленбеген бөлшектер
X Window System негізгі протоколы клиенттер арасындағы байланысты міндеттемейді және графикалық пайдаланушы интерфейстерінде (түймелер, мәзірлер және т.б.) кездесетін визуалды элементтерді терезелер арқылы қалай құру керектігін анықтамайды. Графикалық пайдаланушы интерфейсі элементтері виджет құралдар жиынтығын іске асыратын клиенттік кітапханалармен анықталады. Клиенттер арасындағы байланыс ICCCM және freedesktop сипаттамалары сияқты басқа стандарттармен реттеледі. Клиенттер арасындағы байланыс таңдаулар, қиып алу буферлері және сүйреп тастау үшін маңызды, бұл пайдаланушының деректерді бір терезеден екінші терезеге беру әдістері. Терезелер әртүрлі бағдарламалармен басқарылатындықтан, осы деректерді алмасу үшін протокол қажет. Клиенттер арасындағы байланыс сонымен қатар X терезе менеджерлеріне де қатысты, олар терезелердің сыртқы түрін және графикалық пайдаланушы интерфейсінің жалпы көрінісі мен сезімін басқаратын бағдарламалар.
Сессияны басқару
Клиенттер арасындағы байланыс белгілі бір деңгейде маңызды болатын тағы бір мәселе – сессияны басқару. Пайдаланушы сессиясының қалай басталатыны негізгі протоколмен қарастырылмайды. Әдетте, бұл X дисплей менеджері арқылы автоматты түрде жүзеге асырылады. Дегенмен, пайдаланушы xinit немесе startx бағдарламаларын қолмен іске қосып сессияны бастауға да болады.