리눅스에서 그래픽의 기초는 X window 이다. X window는 리눅스의 표준 그래픽 인터페이스이고, 대부분이 X window를 토대로 만들어 진다. 윈도우에서 창을 띄우기 위해 API를 사용하고 나아가 MFC를 사용하는 것 처럼 리눅스에서는 X window의 라이브러리를 사용한다. 대표적인 것을 몇가지 보면, 텍스트 기반의 터미널 에뮬레이터는 xterm의 인터페이스를 사용하고, 로그인 관리자는 xdm, 시계는 xclock 등이 있다. 이들은 당연히 X window 라이브러리로 작성되어 있다.
이러한 X window의 특징을 보면 아래와 같다.
1. 네트워크 기반의 그래픽 환경이다.
2. 이식성이 뛰어나다.
3. 아이콘, 스크롤바, 색상 등 그래픽 환경에 필요한 자원들이 정의되어 있지 않다.
4. 사용자가 원하는 인터페이스를 만들 수 있다.
5. 서로 다른 이 기종과 함께 사용할 수 있다.
6. 디스플레이 장치에 의존적이지 않다.
X 윈도의 구성원리는 조금 특이하다.흔히 사용하는 프로그램들을 클라이언트라 하고, 각각의 장치들(키보드, 마우스 등)과 클라이언트를 서로 연결해 소통하는 역할을 하는 것을 서버라고 지칭한다. 이렇게 글로만 보면 굉장히 어렵게 느껴진다.
그림으로 보면 위와 같다. 흔히 사용하는 브라우저나 터미널창이 client가 되고, server와 소통한다. server는 또 각 디바이스들의 정보를 받는다. 즉, 서버는 각 디바이스들의 정보를 받아 클라이언트로 넘겨주고, 다시 그 결과를 스크린으로 보여주는 중계자 역할을 한다. 여기서 중요한 점은, 클라이언트는 직접 사용자와 통신할 수 없고, 반드시 서버를 통해 키보드나 마우스 입력을 받을 수 있다.
위와 같은 구조에서 서로간에 소통을 하려면 일종의 규약이 필요하다. 컴퓨터 공학에서는 이를 프로토콜이라고 하는데, X 윈도에서의 프로토콜을 X Protocol이라고 한다. 단순하다.
X 프로토콜이란, X 윈도에서 서버와 클라이언트는 서로 IPC(InterProcessor Communication : 프로세서 간의 통신)를 통해 소통하는데, 이때 메시지를 통해 서로 소통한다. 이 메시지의 형태와 사용법이 X 프로토콜이다.
중요한 점은, 이러한 메시지 교환은 굳이 IPC가 아니고 네트워크를 통해서도 가능하다. 이로 인해서 네트워크에 존재하는 X 클라이언트를 자신의 화면에 출력하여 실행하는 것도 가능하다.
다만, X 프로토콜은 매우 기본적인 기능( 마우스 반응 읽기 같은)만 하는 X lib라는 라이브러리의 루틴에서 발생하는데, X lib는 굉장히 낮은 수준의 라이브러리라 프로그램 개발에는 이것보다 더 많은 기능을 가진 상위의 라이브러리가 필요하다. 이러한 라이브러리들을 X toolkit이라고 한다.
X toolkit안에는 흔히 들어봤을 QT, GTK, Motif, Xaw, Xt Intrinsics 같은 것들이 있다.
이 X 윈도로 개발한 시스템에 특정 형태(바의 모양, 패널의 모양 등)를 갖추어 주는 프로그램을 윈도우 매니저라고 하는데, 윈도우 매니저에 따라 인터페이스의 모양과 느낌이 결정된다. 대표적인 윈도우 매니저의 예로는, fvwm, twm, mwm, window maker, afterStep 등이 있다.