๋ณธ๋ฌธ์œผ๋กœ ์ด๋™

XCB

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „.
XCB
๊ฐœ๋ฐœ์žJamey Sharp, Josh Triplett, Bart Massey
๋ฐœํ‘œ์ผ2001๋…„(25๋…„ ์ „)(2001)
์•ˆ์ •ํ™” ๋ฒ„์ „
1.17.0[1]ย ์œ„ํ‚ค๋ฐ์ดํ„ฐ์—์„œ ํŽธ์ง‘ํ•˜๊ธฐ / 2024๋…„ 4์›” 15์ผ(2๋…„ ์ „)(2024๋…„ 4์›” 15์ผ)
์ €์žฅ์†Œ
์šด์˜ ์ฒด์ œPOSIX
์ข…๋ฅ˜X ์œˆ๋„ ์ฝ”์–ด ํ”„๋กœํ† ์ฝœ ๊ฐœ๋ฐœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๋ผ์ด์„ ์ŠคMIT
์›น์‚ฌ์ดํŠธxcb.freedesktop.org
Xlib์™€ XCB, ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค

XCB(X protocol C-language Binding)๋Š” ์ปดํ“จํŒ…์—์„œ X ์œˆ๋„ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ C ์–ธ์–ด ๊ฒฐํ•ฉ์ด๋‹ค. ์ž์œ  ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ Xlib์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” 2001๋…„ Bart Massey๊ฐ€ ์‹œ์ž‘ํ•˜์˜€๋‹ค.

Xlib/XCB๋Š” ์ ์ง„์ ์ธ ์ด์‹ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด Xlib์™€ XCB์— ๋Œ€ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. Xlib/XCB๋Š” Xlib ํ”„๋กœํ† ์ฝœ ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ Xlib ์ „์†ก ๊ณ„์ธต์„ XCB๋กœ ๋Œ€์ฒดํ•˜๋ฉฐ XCB๋ฅผ ์ง์ ‘ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ฐ˜ XCB ์—ฐ๊ฒฐ๋กœ์˜ ์ ‘๊ทผ์„ ์ œ๊ณตํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์šด์˜ ์ฒด์ œ๋Š” X11 ๊ตฌํ˜„์„ ์œ„ํ•ด[์ถœ์ฒ˜ ํ•„์š”] Xlib/XCB๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ ๊นŒ๋‹ญ์€ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ†ตํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด X ์„œ๋ฒ„๋กœ์˜ ์—ฐ๊ฒฐ์„ ๊ฐœ์‹œํ•˜์—ฌ XCB์™€ Xlib๋ฅผ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.[2][3]

๋ชฉ์ 

[ํŽธ์ง‘]

XCB์˜ ์ฃผ ๋ชฉ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด
  • X11 ํ”„๋กœํ† ์ฝœ๋กœ์˜ ์ง์ ‘ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด
/* ์ฐฝ ์•ˆ์— ์ƒ์ž๋ฅผ ๊ทธ๋ ค๋‚ด๋Š” ๋‹จ์ˆœ XCB ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค */
/* ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:
 gcc -Wall x.c -lxcb
*/
#include <xcb/xcb.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  xcb_connection_t    *c;
  xcb_screen_t        *s;
  xcb_window_t         w;
  xcb_gcontext_t       g;
  xcb_generic_event_t *e;
  uint32_t             mask;
  uint32_t             values[2];
  int                  done = 0;
  xcb_rectangle_t      r = { 20, 20, 60, 60 };

                        /* ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๊ฐœ์‹œ */
  c = xcb_connect(NULL,NULL);
  if (xcb_connection_has_error(c)) {
    printf("display๋ฅผ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค\n");
    exit(1);
  }
                        /* ์ตœ์ดˆ์˜ ํ™”๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ */
  s = xcb_setup_roots_iterator( xcb_get_setup(c) ).data;

                       /* ๊ฒ€์€ ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ */
  g = xcb_generate_id(c);
  w = s->root;
  mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
  values[0] = s->black_pixel;
  values[1] = 0;
  xcb_create_gc(c, g, w, mask, values);

                       /* ์ฐฝ ๋งŒ๋“ค๊ธฐ */
  w = xcb_generate_id(c);
  mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
  values[0] = s->white_pixel;
  values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS;
  xcb_create_window(c, s->root_depth, w, s->root,
                    10, 10, 100, 100, 1,
                    XCB_WINDOW_CLASS_INPUT_OUTPUT, s->root_visual,
                    mask, values);

                        /* ์ฐฝ ๋ณด์ด๊ธฐ */
  xcb_map_window(c, w);

  xcb_flush(c);

                        /* ์ด๋ฒคํŠธ ๋ฃจํ”„ */
  while (!done && (e = xcb_wait_for_event(c))) {
    switch (e->response_type & ~0x80) {
    case XCB_EXPOSE:    /* ์ฐฝ์„ (๋‹ค์‹œ) ๊ทธ๋ฆฌ๊ธฐ */
      xcb_poly_fill_rectangle(c, w, g,  1, &r);
      xcb_flush(c);
      break;
    case XCB_KEY_PRESS:  /* ํ‚ค๊ฐ€ ๋ˆŒ๋ฆด ๋•Œ ๋๋‚ด๊ธฐ */
      done = 1;
      break;
    }
    free(e);
  }
                        /* ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ */
  xcb_disconnect(c);

  return 0;
}

์ด ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด XCB๋Š” Xlib์™€ ๋™๋“ฑํ•˜์ง€๋งŒ ๊ทธ ๋ณด๋‹ค ์‚ด์ง ๋‚ฎ์€ ์ˆ˜์ค€์˜ API๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ ์ •์˜

[ํŽธ์ง‘]

XCB ์ œ์ž‘์ž๋“ค์€ ์ „๋ฌธํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์–ธ์–ด ์ค‘๋ฆฝ์ ์ธ ๋ฐฉ์‹์œผ๋กœ X11 ํ”„๋กœํ† ์ฝœ์„ ๋ชจ๋ธ๋งํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค๊ณผ์˜ ๋ฐ”์ธ๋”ฉ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค. libxcb ๊ทธ ์ž์ฒด๋Š” ์ฝ”๋“œ ๋ฐœ์ƒ๊ธฐ๋กœ์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

์˜ˆ:

<xcb header="bigreq" extension-xname="BIG-REQUESTS"
    extension-name="BigRequests" extension-multiword="true"
    major-version="0" minor-version="0">

  <request name="Enable" opcode="0">
    <reply>
      <pad bytes="1" />
      <field type="CARD32" name="maximum_request_length" />
    </reply>
  </request>
</xcb>

๋กœ๊ณ 

[ํŽธ์ง‘]

XCB ๋กœ๊ณ ๋Š” Neko the Kitty ์›นํˆฐ ์ž‘๊ฐ€ Gearรณid Molloy๊ฐ€ ๋งŒ๋“ค์–ด ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ถ€ํ•œ ๊ฒƒ์ด๋‹ค.[4]

๊ธฐํƒ€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ

[ํŽธ์ง‘]
  • xpyb - XCB๋ฅผ ์ด์šฉํ•œ X ์œˆ๋„ ์‹œ์Šคํ…œ์œผ๋กœ์˜ ํŒŒ์ด์ฌ ๋ฐ”์ธ๋”ฉ. 2013๋…„ 6์›” ๊ธฐ์ค€์œผ๋กœ python3๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. freedesktop.org ์ œ๊ณต.

์ฐธ์กฐ

[ํŽธ์ง‘]
  1. โ†‘ โ€œlibxcb-1.17.0โ€.
  2. โ†‘ โ€œXlib/XCB: Xlib with XCB transportโ€. 2008๋…„ 1์›” 11์ผ. 2009๋…„ 9์›” 11์ผ์— ํ™•์ธํ•จ.
  3. โ†‘ Jamey Sharp and Josh Triplett (2006๋…„ 11์›” 26์ผ). โ€œlibx11 with Xlib/XCB now in experimental; please test with your packagesโ€ (๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ). ใ€Šdebian-devel-announceใ€‹. 2009๋…„ 9์›” 11์ผ์— ํ™•์ธํ•จ.
  4. โ†‘ KittyLogo (xcb.freedesktop.org)

์ฐธ๊ณ  ๋ฌธํ—Œ

[ํŽธ์ง‘]

์™ธ๋ถ€ ๋งํฌ

[ํŽธ์ง‘]