Xlib

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Xlib
software
Exemplu de captură de ecran
Tip Biblioteca C
Dezvoltator Fundația X.Org
Data primei versiuni 1985
Ultima versiune 1.7.2 (6 iunie 2021)
Sistem de operare Multiplatform
Limba C.
Licență Licență de expat, licență X11 și Notificare și renunțare la permisiunea istorică
( licență gratuită )
Site-ul web www.x.org , documentație

Xlib este o bibliotecă pentru protocolul X Window System , dezvoltat în C. Conține funcții care pot fi utilizate de un client pentru interfața cu serverul grafic. Folosind aceste funcții, programatorii pot scrie cod fără să cunoască detaliile protocolului . Puține aplicații folosesc direct Xlib; în general, utilizează alte biblioteci care utilizează funcții Xlib pentru a furniza blocuri logice pentru a construi interfața:

Xlib a apărut în jurul anului 1985 și este utilizat în interfețele grafice ale multor sisteme de operare de tip Unix . Biblioteca XCB este o alternativă la Xlib.

Tipuri de date

Xlib și rolul său în stiva grafică

Primele tipuri de date din Xlib sunt structura de Display și tipurile de identificatori.

În mod informal, ecranul este un dispozitiv fizic sau virtual pe care se efectuează operații grafice. Structura de Display conține informații pe ecran, dar mai ales legate de canalul dintre client și server. De exemplu, pe un sistem de operare asemănător Unix , structura de Display conține indicatorul către fișierul de soclu de canal (poate fi recuperat prin intermediul macrocomandă ConnectionNumber ). Majoritatea funcțiilor Xlib au o structură de Display ca argument deoarece funcționează pe canal sau sunt legate de un anumit canal. În special, toate funcțiile Xlib care interacționează cu serverul au nevoie de această structură pentru a accesa canalul. Unele alte funcții au nevoie de această structură chiar dacă operează local, deoarece operează pe date legate de un anumit canal. Operațiile de acest tip includ, de exemplu, operațiuni pe coada de evenimente, descrise mai jos.

Windows, colormaps și altele sunt administrate de server, ceea ce înseamnă că datele lor de instanță curente sunt toate pe server. Clientul operează asupra acestor obiecte prin identificatorii lor. Nu puteți opera direct pe un obiect, ci doar să cereți serverului să efectueze acțiunea asupra obiectului specificat de identificator.

Pixmap Windows , Pixmap , Font , Colormap sunt toți identificatori, care sunt numere întregi de 32 de biți în memorie (ca în același protocol ca X11). Un client creează o fereastră solicitând serverului să o creeze. Acest lucru se realizează apelând o funcție Xlib care returnează un identificator de fereastră, adică un număr. Această referință poate fi utilizată de client pentru a solicita alte operațiuni pe același obiect.

Identificatorii sunt unici pentru server. În cea mai mare parte pot fi utilizate de diferite aplicații pentru a se referi la aceleași obiecte. De exemplu, două aplicații conectate la același server pot utiliza aceeași referință pentru a specifica aceeași fereastră. Aceste aplicații utilizează două canale diferite și, prin urmare, au două structuri de Display separate; cu toate acestea, atunci când solicită o operație folosind același identificator, aceasta va fi efectuată pe același obiect.

Funcții

Funcțiile din biblioteca Xlib pot fi grupate în:

  1. operații pe conexiune ( XOpenDisplay , XCloseDisplay , ...);
  2. solicitări către server, inclusiv cereri de operațiuni ( XCreateWindow , XCreateGC , ...) și solicitări de informații ( XGetWindowProperty , ...);
  3. operațiuni locale ale clientului: operații pe coada de evenimente ( XNextEvent , XPeekEvent , ...) și alte operații pe date locale ( XLookupKeysym , XParseGeometry , XSetRegion , XCreateImage , XSaveContext , ...)

Exemplu

Următorul program creează o fereastră cu un mic pătrat negru în ea.

 / *
* O aplicație de bază cu Xlib desenând un pătrat într-o fereastră.
* gcc input.c -o output -lX11
* /
 
#include <X11 / Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main ()
{
    Afișaj * afișaj ;
    Fereastra fereastra ;
    Eveniment XEvent ;
    char * msg = "Bună ziua, lume!" ;
    int s ;
 
    / * deschide o conexiune cu serverul * /
    display = XOpenDisplay ( NULL );
    if ( afișează == NULL )
    {
        fprintf ( stderr , "Nu se poate deschide afișajul \ n " );
        ieșire ( 1 );
    }
 
    s = DefaultScreen ( display );
 
    / * creați o fereastră * /
    window = XCreateSimpleWindow ( display , RootWindow ( display , s ), 10 , 10 , 200 , 200 , 1 ,
                           BlackPixel ( display , s ), WhitePixel ( display , s ));
 
    / * alege evenimentele care ne interesează * /
    XSelectInput ( afișaj , fereastră , ExposureMask | KeyPressMask );
 
    / * afișează fereastra * /
    XMapWindow ( afișaj , fereastră );
 
    / * ciclu pentru evenimente * /
    în timp ce ( 1 )
    {
        XNextEvent ( afișare , & eveniment );
 
        / * desenați sau redesenați fereastra * /
        if (eveniment. tip == Expune)
        {
            XFillRectangle ( display , window , DefaultGC ( display , s ), 20 , 20 , 10 , 10 );
            XDrawString ( display , window , DefaultGC ( display , s ), 50 , 50 , msg , strlen ( msg ));
        }
        / * iese apăsând o tastă * /
        if ( eveniment . tip == Apăsați tasta )
            pauză ;
    }
 
    / * închide conexiunea la server * /
    XCloseDisplay ( display );
 
    retur 0 ;
 }

Clientul creează o conexiune cu serverul invocând XOpenDisplay . Apoi vă solicită să creați o fereastră cu XCreateSimpleWindow . Apelarea XMapWindow face fereastra vizibilă.

Pătratul este desenat apelând XFillRectangle . Acest lucru se poate face numai de când a fost creată fereastra. Cu toate acestea, execuția poate fi insuficientă, de fapt păstrarea conținutului ferestrei nu este garantată. De exemplu, dacă fereastra este acoperită și apoi descoperită din nou, conținutul acesteia poate fi necesar să fie redesenat. Programul este informat că fereastra sau o parte a acesteia trebuie desenată atunci când primește un eveniment Expose .

Din acest motiv, desenarea conținutului ferestrei se face într-o buclă de evenimente . Înainte de a intra în buclă sunt alese evenimentele de interes, în acest caz cu XSelectInput . Ciclul evenimentelor așteaptă un eveniment de intrare: dacă evenimentul este apăsat pe o tastă, aplicația este închisă, dacă este un eveniment de expunere (fereastra este vizibilă), conținutul este redesenat. Funcția XNextEvent îngheață și XNextEvent tamponul dacă nu există evenimente în coadă.

Elemente conexe

Alte proiecte

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT