Xlib
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Xlib는 X Window System의 클라이언트 라이브러리로, 그래픽 사용자 인터페이스를 개발하는 데 사용된다. Display 구조체와 식별자를 중심으로 자료형을 구성하며, 윈도우, 픽스맵, 폰트, 컬러맵 등의 객체는 식별자를 통해 서버에서 관리된다. Xlib 함수는 서버 연결, 서버 요청, 클라이언트 로컬 작업 등으로 분류되며, 이벤트 큐와 오류 처리 메커니즘을 제공한다. Xlib는 위젯을 직접 제공하지 않으며, X Toolkit Intrinsics(Xt) 기반 라이브러리나 Xlib를 직접 사용하는 라이브러리를 통해 위젯을 사용할 수 있다. Xlib의 대안으로 XCB가 있다.
더 읽어볼만한 페이지
- X 라이브러리 - XCB
XCB는 X 윈도 시스템과 통신하기 위한 C 라이브러리로, Xlib를 대체하며 더 작고 현대적인 형태, X11 프로토콜 직접 접근, XML 프로토콜 설명을 통한 확장 용이성, 비동기 통신 지원을 특징으로 한다. - X 라이브러리 - FLTK
- C 라이브러리 - OpenSSL
OpenSSL은 1998년에 설립된 암호화 도구 프로젝트로, 다양한 암호화 알고리즘과 프로토콜을 지원하며, 아파치 라이선스를 채택했고, 보안 문제와 API 호환성 문제 등의 비판을 받았다. - C 라이브러리 - SQLite
SQLite는 D. 리처드 히프가 설계한 서버리스 구조의 임베디드 SQL 데이터베이스 엔진으로, 별도의 DBMS 없이 프로그램에 통합되어 작동하며 전체 데이터베이스를 단일 파일로 저장하는 특징이 있고, 다양한 운영체제와 환경에서 널리 사용된다. - 표시 이름과 문서 제목이 같은 위키공용분류 - 라우토카
라우토카는 피지 비치레부섬 서부에 위치한 피지에서 두 번째로 큰 도시이자 서부 지방의 행정 중심지로, 사탕수수 산업이 발달하여 "설탕 도시"로 알려져 있으며, 인도에서 온 계약 노동자들의 거주와 미 해군 기지 건설의 역사를 가지고 있고, 피지 산업 생산의 상당 부분을 담당하는 주요 기관들이 위치해 있다. - 표시 이름과 문서 제목이 같은 위키공용분류 - 코코넛
코코넛은 코코넛 야자나무의 열매로 식용 및 유지로 사용되며, 조리되지 않은 과육은 100g당 354kcal의 열량을 내는 다양한 영양 성분으로 구성되어 있고, 코코넛 파우더의 식이섬유는 대부분 불용성 식이섬유인 셀룰로오스이며, 태국 일부 지역에서는 코코넛 수확에 훈련된 원숭이를 이용하는 동물 학대 문제가 있다.
Xlib - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
유형 | 클라이언트 라이브러리 |
용도 | X 윈도 시스템 |
개발 | X.Org 재단 |
발표 | 약 1985년 |
안정화 버전 | 1.8.7 |
안정화 버전 발표일 | 2023년 10월 10일 |
프로그래밍 언어 | C |
라이선스 | MIT 라이선스 |
웹사이트 | X.Org 공식 웹사이트 Xlib 문서 |
2. 자료형
Xlib의 주요 자료형은 `Display` 구조체[4]와 식별자이다.
디스플레이는 그래픽 작업이 수행되는 물리적 또는 가상 장치이다. Xlib의 `Display` 구조체는 디스플레이에 대한 정보뿐만 아니라, 클라이언트와 서버 간의 채널(통신)에 관련된 정보도 담고 있다. 예를 들어, 유닉스 계열 운영 체제에서 `Display` 구조체는 이 채널의 소켓 파일 핸들을 포함하며, `ConnectionNumber` 매크로를 사용하여 이 값을 얻을 수 있다.
대부분의 Xlib 함수는 `Display` 구조체를 인수로 사용하는데, 이는 이 함수들이 특정 채널에서 작동하거나 특정 채널과 관련되기 때문이다. 특히 서버와 상호 작용하는 모든 Xlib 함수는 채널에 접근하기 위해 이 구조체가 필요하며, 일부 다른 함수는 로컬에서 작동하더라도 특정 채널과 관련된 데이터에 대해 작동하기 때문에 이 구조가 필요하다.
윈도우, 컬러맵 등은 서버에 의해 관리된다. 즉, 실제 구현에 대한 데이터는 모두 서버에 저장된다. 클라이언트는 이러한 객체에 대해 해당 객체의 식별자를 사용하여 작동한다. 클라이언트는 객체에 직접 작동할 수 없으며, 객체의 식별자를 지정하여 서버에 작업을 요청할 수 있을 뿐이다.
`Windows`, `Pixmap`, `Font`, `Colormap` 등의 유형은 모두 32비트 정수인 식별자이다(X11 프로토콜 자체와 마찬가지로). 클라이언트는 서버에 윈도우 생성을 요청하여 윈도우를 '생성'하며, 이는 윈도우의 식별자(숫자)를 반환하는 Xlib 함수 호출을 통해 수행된다. 이 식별자는 클라이언트가 서버에 동일한 윈도우에 대한 다른 작업을 요청하는 데 사용될 수 있다.
식별자는 서버에 고유하며, 대부분의 식별자는 서로 다른 애플리케이션에서 동일한 객체를 참조하는 데 사용될 수 있다. 예를 들어, 동일한 서버에 연결된 두 애플리케이션은 동일한 식별자를 사용하여 동일한 윈도우를 참조할 수 있다. 이 두 애플리케이션은 서로 다른 두 채널을 사용하므로 서로 다른 `Display` 구조체를 갖지만, 동일한 식별자에 대한 작업을 요청하면 이러한 작업은 동일한 객체에서 수행된다.
2. 1. Display 구조체
`Display` 구조체[4]는 Xlib에서 가장 중요한 자료형 중 하나로, 클라이언트와 X 서버 간의 연결을 나타낸다. 이 구조체는 그래픽 작업이 수행되는 물리적 또는 가상 장치(디스플레이)에 대한 정보뿐만 아니라, 클라이언트와 서버 간의 통신 채널에 대한 핵심 정보도 포함한다.예를 들어, 유닉스 계열 운영 체제에서 `Display` 구조체는 이 채널의 소켓 파일 핸들을 포함하며, 이는 `ConnectionNumber` 매크로를 통해 얻을 수 있다.[2] 대부분의 Xlib 함수는 `Display` 구조체를 인수로 받는데, 이는 이 함수들이 채널을 통해 서버와 통신하거나 특정 채널과 관련된 데이터(예: 이벤트 큐)를 조작하기 때문이다.[3]
서버와 상호 작용하는 모든 Xlib 함수는 채널에 접근하기 위해 `Display` 구조체를 필요로 한다. 로컬에서 작동하는 일부 함수들조차도 특정 채널과 관련된 데이터를 다루기 때문에 이 구조체를 필요로 한다.
2. 2. 식별자
서버가 관리하는 윈도우, 컬러맵 등의 객체는 식별자로 참조된다. `Windows`, `Pixmap`, `Font`, `Colormap` 등의 자료형은 모두 32비트 정수 식별자이다.[4] 클라이언트는 객체를 직접 조작하는 대신, 식별자를 통해 서버에 작업을 요청한다. 식별자는 서버 내에서 고유하며, 여러 애플리케이션이 동일한 식별자를 사용하여 동일한 객체를 참조할 수 있다.[2]3. 프로토콜 및 이벤트
Xlib는 X 서버에 요청을 즉시 보내지 않고 요청 버퍼(Request Buffer/Output Buffer)에 저장하며, 수신된 이벤트는 큐에 저장한다.[1] 클라이언트 애플리케이션은 Xlib 함수를 호출하여 큐에서 이벤트를 확인하고 가져온다. 오류는 비동기적으로 수신 및 처리된다. 윈도우 내용 보존은 보장되지 않으므로, 가려졌다 다시 보이는 경우 `Expose` 이벤트가 전송되어 애플리케이션이 윈도우 내용을 다시 그리도록 한다.
3. 1. 요청 버퍼
Xlib 함수는 X 서버에 대한 요청을 즉시 보내지 않고 '요청 버퍼'에 저장한다. 여기서 "요청"은 클라이언트가 서버에 전달하는 것을 의미하며, 화면에 보이는 효과를 일으키는 요청뿐만 아니라 모든 종류의 요청을 포함할 수 있다. 요청 버퍼는 다음과 같은 경우에 플러시(즉, 버퍼에 있는 모든 요청이 서버로 전송됨)된다.[1]- `XSync` 또는 `XFlush` 함수를 호출하는 경우
- 서버에서 값을 반환하는 함수를 호출하는 경우 (이 함수들은 응답을 받을 때까지 차단됨)
- 기타 특정 조건
`XSync` 함수와 `XFlush` 함수는 Xlib에서 비동기적인 통신을 제어하고 동기화하는 데 중요한 역할을 한다.
3. 2. 이벤트 큐
Xlib는 수신된 이벤트를 큐에 저장한다. 클라이언트 애플리케이션은 Xlib 함수를 호출하여 큐에서 이벤트를 검사하고 가져올 수 있다. X 서버는 이벤트를 비동기적으로 보내지만, Xlib를 사용하는 애플리케이션은 큐의 이벤트에 접근하기 위해 명시적으로 Xlib 함수를 호출해야 한다. 이러한 함수 중 일부는 블로킹될 수 있으며, 이 경우 요청 버퍼도 함께 플러시된다.[1]3. 3. 오류 처리
X 서버에 대한 요청은 즉시 처리되지 않고 버퍼에 저장되었다가 특정 조건에서 한 번에 처리된다. 오류 또한 비동기적으로 처리되는데, 애플리케이션은 오류 처리기를 등록하여 서버로부터 오류 메시지를 받을 수 있다.[1]3. 4. Expose 이벤트
윈도우의 일부분이 가려졌다가 다시 보이게 될 때, 윈도우 내용의 보존은 보장되지 않는다. 이 경우, X 서버는 `Expose` 이벤트를 애플리케이션에 전송한다. 애플리케이션은 이 이벤트를 받아서 윈도우 내용을 다시 그려야 한다.4. 함수
Xlib 함수는 크게 세 가지로 분류할 수 있다.
# 연결 관련: 서버 연결과 관련된 작업을 수행한다.
# 서버 요청 관련: 서버에 특정 작업을 요청하거나 정보를 얻어오는 함수들이다.
# 클라이언트 로컬 작업 관련: 클라이언트 측에서 로컬 데이터를 처리하는 함수들이다.
4. 1. 연결 관련 함수
클라이언트는 `XOpenDisplay`를 호출하여 서버 연결을 만든다.[1] `XCloseDisplay`는 서버 연결을 닫는다.[1] Xlib 라이브러리의 함수는 연결에 관한 조작 (`XOpenDisplay`, `XCloseDisplay` 등)을 포함한다.[1]4. 2. 서버 요청 관련 함수
Xlib 라이브러리에서 서버에 요청을 하는 함수는 다음과 같다.- 윈도우 생성:
- `XCreateWindow`: 윈도우 생성을 요청한다.
- `XCreateSimpleWindow`: 단순한 형태의 윈도우 생성을 요청한다.[1]
- 그래픽 컨텍스트(GC) 생성:
- `XCreateGC`: 그래픽 컨텍스트(GC)를 생성한다.[1]
- 윈도우 속성 정보 요청:
- `XGetWindowProperty`: 윈도우 속성 정보를 요청한다.[1]
- 윈도우 화면 표시:
- `XMapWindow`: 윈도우를 화면에 표시(매핑)한다.[1]
- 도형 그리기:
- `XFillRectangle`: 사각형을 그린다.[1]
- 문자열 그리기:
- `XDrawString`: 문자열을 그린다.[1]
4. 3. 클라이언트 로컬 작업 관련 함수
Xlib 라이브러리 함수 중 클라이언트 측에서 로컬로 작업을 수행하는 함수들은 다음과 같이 분류할 수 있다.- 이벤트 큐 조작: `XNextEvent`, `XPeekEvent` 등
- 로컬 데이터 조작: `XLookupKeysym`, `XParseGeometry`, `XSetRegion`, `XCreateImage`, `XSaveContext` 등
`XSelectInput` 함수는 수신할 이벤트 종류를 선택하는 데 사용된다.[1]
이벤트 큐에서 이벤트를 가져오는 함수로는 `XNextEvent`와 `XPeekEvent`가 있다.[1] 로컬 데이터를 조작하는 함수로는 `XLookupKeysym`, `XParseGeometry`, `XSetRegion`, `XCreateImage`, `XSaveContext` 등이 있다.[1]
5. 예제
c
/*
- 창 안에 상자를 그려내는 단순 Xlib 응용 프로그램입니다.
- gcc input.c -o output -lX11
- /
#include
#include
#include
#include
int main() {
Display *display;
Window window;
XEvent event;
char *msg = "Hello, World!";
int s;
/* 서버 연결 개시 */
display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "display를 열 수 없습니다\n");
exit(1);
}
s = DefaultScreen(display);
/* 창 만들기 */
window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 200, 1,
BlackPixel(display, s), WhitePixel(display, s));
/* 이용하려는 이벤트 종류 선택 */
XSelectInput(display, window, ExposureMask | KeyPressMask);
/* 창 보이기 */
XMapWindow(display, window);
/* 이벤트 루프 */
while (1) {
XNextEvent(display, &event);
/* 창을 (다시) 그리기 */
if (event.type == Expose) {
XFillRectangle(display, window, DefaultGC(display, s), 20, 20, 10, 10);
XDrawString(display, window, DefaultGC(display, s), 50, 50, msg, strlen(msg));
}
/* 키 눌림이 있으면 끝내기 */
if (event.type == KeyPress)
break;
}
/* 서버 연결 닫기 */
XCloseDisplay(display);
return 0;
}
```
클라이언트는 `XOpenDisplay`를 호출하여 서버 연결을 만든다.[2] 그 뒤 `XCreateSimpleWindow`로 창 만들기를 요청한다.[2] `XMapWindow`를 별도로 호출하여 창을 매핑(보여주기)해야 한다.[2]
`XFillRectangle`을 호출하여 사각형을 그린다.[2] 이 동작은 창이 만들어진 뒤에만 수행할 수 있다.[2] 그러나 한 번만 수행하는 것으로는 충분하지 않다.[2] 창의 내용은 언제나 보존될 것임을 보증하지는 않기 때문이다.[2] 예를 들어, 창이 다른 무언가에 의해 가려졌다가 다시 보이게 되면 내용물은 다시 그려야 할 수 있다.[2] 이 프로그램은 창이나 창의 일부가 `Expose` 이벤트를 받으면 그리기가 필요함을 알 수 있다.[2]
따라서 창 내용 그리기는 이벤트 루프 내에서 수행된다.[2] 이 루프에 들어가기 전에 응용 프로그램이 관심 있는 이벤트를 선택하는데, 이 경우 `XSelectInput`을 사용한다.[2] 이벤트 루프는 들어오는 이벤트를 기다린다.[2] 이 이벤트가 키 누름이면 응용 프로그램이 종료되고, 노출 이벤트이면 창 내용이 그려진다.[2] `XNextEvent` 함수는 대기열에 이벤트가 없으면 차단하고 요청 버퍼를 플러시한다.[2]
6. 관련 라이브러리
Xlib는 버튼, 메뉴, 스크롤바와 같은 위젯을 직접 제공하지 않으며, 이러한 위젯은 Xlib를 사용하는 다른 라이브러리에서 제공된다. 관련 라이브러리로는 Xt를 기반으로 하는 라이브러리와 Xt 없이 Xlib를 직접 사용하는 라이브러리가 있다. XCB는 Xlib의 대안이다.
6. 1. 위젯 라이브러리
Xlib는 버튼, 메뉴, 스크롤바와 같은 위젯을 직접 제공하지 않습니다. 이러한 위젯은 Xlib를 기반으로 하는 다른 라이브러리들을 통해 제공됩니다. 이러한 라이브러리에는 크게 두 가지 종류가 있습니다.- Xt (X Toolkit Intrinsics) 라이브러리 기반: Xt 라이브러리는 위젯을 지원하지만, 구체적인 위젯은 제공하지 않습니다. Xaw, 모티프와 같은 위젯 세트 라이브러리가 Xt를 기반으로 특정 위젯을 제공합니다.
- Xlib를 직접 사용하는 라이브러리: GTK, Qt, FLTK, fpGUI와 같은 라이브러리들은 Xt를 사용하지 않고 Xlib를 직접 사용하여 위젯 세트를 제공합니다.
이러한 위젯 라이브러리를 사용하는 애플리케이션은 일반적으로 메인 루프에 들어가기 전에 창의 내용을 지정하며, `Expose` 이벤트에 대한 처리 및 창 내용 다시 그리기를 명시적으로 처리할 필요가 없습니다.
6. 2. XCB
XCB는 Xlib의 대안이다. XCB의 두 가지 주요 목표는 라이브러리 크기 감소와 X11 프로토콜에 대한 직접 접근이다. XCB를 하위 계층으로 사용하여 Xlib 인터페이스를 제공하는 구현도 있다.[1]참조
[1]
웹사이트
XDC2007 Notes
https://www.x.org/wi[...]
2007-02-09
[2]
웹사이트
Display Structure on freedesktop CVS
https://web.archive.[...]
2007-08-24
[3]
웹사이트
Display Structure on freedesktop CVS
http://webcvs.freede[...]
2008-05-08
[4]
웹인용
Display Structure on freedesktop CVS
https://web.archive.[...]
2008-05-08
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com