กลับไปหน้าบทความ

อ่าน 5 นาที

เอ็กซ์ลิบ

Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X

เอ็กซ์ลิบ

เอ็กซ์ลิบ
นักพัฒนามูลนิธิ X.Org
ปล่อยกันยายน พ.ศ. 2528 [ 1 ] ( 1985-09 )
เวอร์ชันเสถียร
1.8.13 [ 2 ] แก้ไขข้อมูลนี้บนวิกิดาต้า / 7 กุมภาพันธ์ 2026 ( 7 กุมภาพันธ์ 2569 )
เขียนเป็นซี
พิมพ์ห้องสมุด
เว็บไซต์www.x.org เอกสารประกอบ : www.x.org/releases/current/doc/libX11/libX11/libX11.html
ที่เก็บข้อมูล
  • gitlab .freedesktop .org /xorg /lib /libx11
ไคลเอ็นต์ X11 ใช้ xlib ในการสื่อสารกับเซิร์ฟเวอร์แสดงผล

Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X ฟังก์ชันเหล่านี้ช่วยให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมได้โดยไม่ต้องรู้รายละเอียดของโปรโตคอล X

มีแอปพลิเคชันเพียงไม่กี่ตัวที่ใช้ Xlib โดยตรง แต่ส่วนใหญ่จะใช้ไลบรารีอื่นๆ ที่ใช้ฟังก์ชันของ Xlib เพื่อจัดเตรียมชุดเครื่องมือสำหรับวิดเจ็ต :

Xlib ซึ่งเปิดตัวสู่สาธารณะครั้งแรกในเดือนกันยายน พ.ศ. 2528 [ 1 ]ถูกใช้ในGUIสำหรับระบบปฏิบัติการที่คล้าย Unix หลายระบบ การนำ Xlib กลับมาใช้งานใหม่ได้รับการแนะนำในปี พ.ศ. 2550 โดยใช้XCB [ 3 ]

ประเภทข้อมูล

บทบาทของ KMS (Kernel mode-setting) ใน Linux ตัวอย่าง
ชุดกราฟิกของลินุกซ์
ภาพประกอบแสดง โครงสร้างกราฟิก ของ Linuxเวอร์ชันปัจจุบัน ณ วันที่ 24 สิงหาคม 2556
ตำแหน่งของโมดูลเคอร์เนล Linux บางตัว
เซิร์ฟเวอร์แสดงผลจะอยู่ระหว่างเคอร์เนล ( ในที่นี้คือเคอร์เนลของลินุกซ์ ) และไคลเอ็นต์ โดยจะสื่อสารกับไคลเอ็นต์ผ่านโปรโตคอลที่กำหนดไว้
ตำแหน่งของโมดูลเคอร์เนล Linux บางตัว
Simple DirectMedia Layerสามารถหลีกเลี่ยง Xlib และเขียนข้อมูลลงในเฟรมบัฟเฟอร์ ได้โดยตรง นอกจากนี้ยังมีเวอร์ชันที่ใช้งานได้กับEGL อีกด้วย

ประเภทข้อมูลหลักใน Xlib คือ โครงสร้าง Display[ 4 ]และประเภทของตัวระบุ

โดยทั่วไปแล้ว จอแสดงผลคืออุปกรณ์ทางกายภาพหรือเสมือนจริงที่ใช้ในการประมวลผลกราฟิกDisplayโครงสร้างของไลบรารี Xlib ประกอบด้วยข้อมูลเกี่ยวกับจอแสดงผล แต่ที่สำคัญกว่านั้นคือ ข้อมูลที่เกี่ยวข้องกับช่องทางการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ ตัวอย่างเช่น ในระบบปฏิบัติการแบบ UnixDisplayโครงสร้างจะประกอบด้วยตัวจัดการไฟล์ของซ็อกเก็ตของช่องทางการสื่อสารนี้ (สามารถเรียกใช้ได้โดยใช้ConnectionNumberมาโคร) ฟังก์ชัน Xlib ส่วนใหญ่มีDisplayโครงสร้างเป็นอาร์กิวเมนต์ เนื่องจากฟังก์ชันเหล่านั้นทำงานกับช่องทางการสื่อสารหรือเกี่ยวข้องกับช่องทางการสื่อสารเฉพาะ โดยเฉพาะอย่างยิ่ง ฟังก์ชัน Xlib ทั้งหมดที่โต้ตอบกับเซิร์ฟเวอร์จำเป็นต้องมีโครงสร้างนี้สำหรับการเข้าถึงช่องทางการสื่อสาร ฟังก์ชันอื่นๆ บางฟังก์ชันจำเป็นต้องมีโครงสร้างนี้ แม้ว่าจะทำงานในเครื่องก็ตาม เนื่องจากฟังก์ชันเหล่านั้นทำงานกับข้อมูลที่เกี่ยวข้องกับช่องทางการสื่อสารเฉพาะ การดำเนินการประเภทนี้รวมถึงการดำเนินการกับคิวเหตุการณ์ ซึ่งจะอธิบายไว้ด้านล่าง

หน้าต่าง แผนที่สี ฯลฯ ถูกจัดการโดยเซิร์ฟเวอร์ ซึ่งหมายความว่าข้อมูลเกี่ยวกับการใช้งานจริงทั้งหมดจะถูกจัดเก็บไว้ในเซิร์ฟเวอร์ ไคลเอนต์จะดำเนินการกับวัตถุเหล่านี้โดยใช้ตัวระบุ ของวัตถุ ไคลเอนต์ไม่สามารถดำเนินการกับวัตถุโดยตรงได้ แต่สามารถร้องขอให้เซิร์ฟเวอร์ดำเนินการโดยระบุตัวระบุของวัตถุเท่านั้น

ชนิดข้อมูลWindows, Pixmap, Font, Colormap, ฯลฯ ล้วนเป็นตัวระบุ ซึ่งเป็นจำนวนเต็ม 32 บิต (เช่นเดียวกับในโปรโตคอล X11 เอง) ไคลเอนต์ 'สร้าง' หน้าต่างโดยการร้องขอให้เซิร์ฟเวอร์สร้างหน้าต่าง การดำเนินการนี้ทำได้โดยการเรียกใช้ฟังก์ชัน Xlib ซึ่งจะส่งคืนตัวระบุสำหรับหน้าต่าง นั่นคือตัวเลข จากนั้นไคลเอนต์สามารถใช้ตัวระบุนี้เพื่อร้องขอการดำเนินการอื่นๆ บนหน้าต่างเดียวกันไปยังเซิร์ฟเวอร์ได้

ตัวระบุเหล่านี้มีเอกลักษณ์เฉพาะสำหรับเซิร์ฟเวอร์นั้นๆ ส่วนใหญ่สามารถใช้โดยแอปพลิเคชันต่างๆ เพื่ออ้างอิงถึงวัตถุเดียวกันได้ ตัวอย่างเช่น แอปพลิเคชันสองตัวที่เชื่อมต่อกับเซิร์ฟเวอร์เดียวกันจะใช้ตัวระบุเดียวกันเพื่ออ้างอิงถึงหน้าต่างเดียวกัน แอปพลิเคชันทั้งสองนี้ใช้ช่องทางการสื่อสารที่แตกต่างกันสองช่องทาง ดังนั้นจึงมี โครงสร้าง การแสดงผล ที่แตกต่างกันสองแบบ อย่างไรก็ตาม เมื่อพวกเขาร้องขอการดำเนินการกับตัวระบุเดียวกัน การดำเนินการเหล่านั้นจะถูกกระทำกับวัตถุเดียวกัน

พิธีการและกิจกรรมต่างๆ

ฟังก์ชัน Xlib ที่ส่งคำขอไปยังเซิร์ฟเวอร์โดยปกติจะไม่ส่งคำขอเหล่านั้นทันที แต่จะเก็บไว้ในบัฟเฟอร์ที่เรียกว่าบัฟเฟอร์คำขอคำว่าคำขอในที่นี้หมายถึงคำขอจากไคลเอ็นต์ที่ส่งไปยังเซิร์ฟเวอร์ บัฟเฟอร์คำขอสามารถมีคำขอทุกประเภทไปยังเซิร์ฟเวอร์ ไม่ใช่เฉพาะคำขอที่มีผลต่อหน้าจอเท่านั้น บัฟเฟอร์คำขอจะถูกล้าง (กล่าวคือ คำขอทั้งหมดที่ดำเนินการไปแล้วจะถูกส่งไปยังเซิร์ฟเวอร์) หลังจากเรียกใช้ฟังก์ชันXSyncหรือXFlushหลังจากเรียกใช้ฟังก์ชันที่ส่งค่ากลับจากเซิร์ฟเวอร์ (ฟังก์ชันเหล่านี้จะบล็อกจนกว่าจะได้รับคำตอบ) และในเงื่อนไขอื่นๆ อีกบางประการ

Xlib จะจัดเก็บเหตุการณ์ที่ได้รับไว้ในคิว แอปพลิเคชันไคลเอ็นต์สามารถตรวจสอบและดึงเหตุการณ์จากคิวได้ ในขณะที่เซิร์ฟเวอร์ X ส่งเหตุการณ์แบบอะซิงโครนัส แอปพลิเคชันที่ใช้ไลบรารี Xlib จำเป็นต้องเรียกฟังก์ชัน Xlib อย่างชัดเจนเพื่อเข้าถึงเหตุการณ์ในคิว ฟังก์ชันบางอย่างอาจทำให้เกิดการบล็อก ในกรณีนี้ ฟังก์ชันเหล่านั้นจะทำการล้างบัฟเฟอร์คำขอด้วย

แทนที่จะเป็นเช่นนั้น ข้อผิดพลาดจะถูกรับและจัดการแบบอะซิงโครนัส: แอปพลิเคชันสามารถจัดเตรียมตัวจัดการข้อผิดพลาดที่จะถูกเรียกใช้เมื่อใดก็ตามที่ได้รับข้อความแสดงข้อผิดพลาดจากเซิร์ฟเวอร์

เนื้อหาภายในหน้าต่างจะไม่ได้รับการเก็บรักษาไว้หากหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างถูกซ่อนไว้ ในกรณีนี้ แอปพลิเคชันจะได้รับการแจ้งExposeเตือนเมื่อหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างถูกทำให้มองเห็นได้อีกครั้ง จากนั้นแอปพลิเคชันจะต้องวาดเนื้อหาในหน้าต่างขึ้นมาใหม่

ฟังก์ชัน

ฟังก์ชันต่างๆ ในไลบรารี Xlib สามารถจัดกลุ่มได้ดังนี้:

  1. การดำเนินการบนการเชื่อมต่อ ( XOpenDisplay, XCloseDisplay, ...);
  2. คำขอไปยังเซิร์ฟเวอร์ รวมถึงคำขอสำหรับการดำเนินการ ( XCreateWindow, XCreateGC,...) และคำขอสำหรับข้อมูล ( XGetWindowProperty, ...); และ
  3. การดำเนินการที่เกิดขึ้นเฉพาะในฝั่งไคลเอ็นต์: การดำเนินการกับคิวเหตุการณ์ ( XNextEvent, XPeekEvent, ...) และการดำเนินการอื่นๆ กับข้อมูลภายในเครื่อง ( XLookupKeysym, XParseGeometry, XSetRegion, XCreateImage, XSaveContext, ...)

ตัวอย่าง

แอปพลิเคชัน Xlib อย่างง่ายที่วาดกล่องและข้อความในหน้าต่าง โดยไม่มีการตกแต่งใดๆจากตัวจัดการหน้าต่าง
แอปพลิเคชัน Xlib อย่างง่ายที่วาดกล่องและข้อความในหน้าต่าง พร้อมตกแต่ง ด้วย ตัวจัดการหน้าต่างIceWM

โปรแกรมต่อไปนี้สร้างหน้าต่างที่มีสี่เหลี่ยมสีดำเล็กๆ อยู่ตรงกลาง:

/*  แอปพลิเคชัน Xlib อย่างง่ายสำหรับการสร้างหน้าต่างและวาดกล่องในนั้น gcc input.c -o output -lX11 */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main ( void ) { Display * display ; Window window ; XEvent event ; char * msg = "Hello, World!" ; int s ; // เปิดการเชื่อมต่อกับเซิร์ฟเวอร์display = XOpenDisplay ( NULL ); if ( display == NULL ) { fprintf ( stderr , "ไม่สามารถเปิดจอแสดงผล\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 ); // ลูปเหตุการณ์for (;;) { 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 ; }

ไคลเอนต์สร้างการเชื่อมต่อกับเซิร์ฟเวอร์โดยการเรียกเมธอด `connect` XOpenDisplayจากนั้นร้องขอการสร้างหน้าต่างด้วยXCreateSimpleWindowเมธอด `window` จำเป็นต้องเรียกXMapWindowเมธอด `window` แยกต่างหากเพื่อแมปหน้าต่าง กล่าวคือ เพื่อทำให้หน้าต่างปรากฏบนหน้าจอ

สี่เหลี่ยมจะถูกวาดโดยการเรียกใช้ฟังก์ชันXFillRectangleการดำเนินการนี้สามารถทำได้หลังจากสร้างหน้าต่างแล้วเท่านั้น อย่างไรก็ตาม การดำเนินการเพียงครั้งเดียวอาจไม่เพียงพอ เนื่องจากเนื้อหาของหน้าต่างอาจไม่ได้รับการเก็บรักษาไว้เสมอไป ตัวอย่างเช่น หากหน้าต่างถูกปิดบังแล้วเปิดออกอีกครั้ง เนื้อหาของหน้าต่างอาจต้องถูกวาดใหม่ โปรแกรมจะได้รับแจ้งว่าหน้าต่างหรือส่วนใดส่วนหนึ่งของหน้าต่างต้องถูกวาดใหม่โดยการรับExposeเหตุการณ์

ดังนั้น การวาดเนื้อหาของหน้าต่างจึงเกิดขึ้นภายในลูปที่จัดการเหตุการณ์ก่อนเข้าสู่ลูปนี้ เหตุการณ์ที่แอปพลิเคชันสนใจจะถูกเลือก ในกรณีนี้คือ `event-on- XSelectInputwindow` ลูปเหตุการณ์จะรอเหตุการณ์ที่เข้ามา: หากเหตุการณ์นี้เป็นการกดปุ่ม แอปพลิเคชันจะปิดลง หากเป็นเหตุการณ์การแสดงผล เนื้อหาของหน้าต่างจะถูกวาด ฟังก์ชันXNextEventจะบล็อกและล้างบัฟเฟอร์คำขอหากไม่มีเหตุการณ์ใดอยู่ในคิว

ห้องสมุดอื่นๆ

Xlib ไม่รองรับปุ่ม เมนู แถบเลื่อน ฯลฯวิดเจ็ต เหล่านี้ มีให้ใช้งานโดยไลบรารีอื่นๆ ซึ่งใช้ Xlib อีกทีหนึ่ง โดยมีไลบรารีอยู่สองประเภท:

โดยทั่วไป แอปพลิเคชันที่ใช้ไลบรารีวิดเจ็ตเหล่านี้จะระบุเนื้อหาของหน้าต่างก่อนเข้าสู่ลูปหลัก และไม่จำเป็นต้องจัดการExposeเหตุการณ์และวาดเนื้อหาของหน้าต่าง ใหม่โดยชัดเจน

ไลบรารีXCBเป็นทางเลือกแทน Xlib โดยมีเป้าหมายหลักสองประการคือ การลดขนาดของไลบรารีและการเข้าถึงโปรโตคอล X11 โดยตรง มีการดัดแปลง Xlib เพื่อให้สามารถใช้ XCB เป็นเลเยอร์ระดับต่ำได้

  • เอกสารการเขียนโปรแกรมอย่างเป็นทางการของมูลนิธิ X.Orgรวมถึงเวอร์ชันล่าสุดของXlib - อินเทอร์เฟซภาษา C สำหรับ Xในหลายรูปแบบ
  • บทแนะนำสั้นๆ เกี่ยวกับ Xlib
  • หน้าคู่มือการใช้งานสำหรับฟังก์ชันทั้งหมดของ Xlib
  • หน้าเว็บของ Kenton Lee เกี่ยวกับ X Window และ Motif ถูกเก็บถาวรเมื่อวันที่ 20 พฤษภาคม 2013 ที่Wayback Machine
  • บทแนะนำการใช้งาน Xlib ที่ละเอียดขึ้น
  • การใช้ Xlib ในการสร้างโมดูลสกรีนเซฟเวอร์
  • Nye, Adrian (1990). คู่มือการเขียนโปรแกรม Xlibคู่มือฉบับสมบูรณ์สำหรับระบบ X Window เล่ม 1. O'Reilly Media. ISBN 0-937175-11-0.
  • Nye, Adrian (1990). คู่มืออ้างอิง Xlibคู่มือฉบับสมบูรณ์สำหรับระบบ X Window เล่ม 2. O'Reilly Media. ISBN 0-937175-12-9.
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Xlib&oldid=1358059370 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ เอ็กซ์ลิบ

Xlib (หรือที่รู้จักกันในชื่อlibX11 ) เป็นไลบรารีไคลเอ็นต์โปรโตคอลX Window Systemที่เขียนด้วยภาษาโปรแกรม Cประกอบด้วยฟังก์ชันสำหรับการโต้ตอบกับเซิร์ฟเวอร์ X

ประเภทข้อมูล

ประเภทข้อมูลหลักใน Xlib คือ โครงสร้าง Display [ 4 ] และประเภทของตัวระบุ

พิธีการและกิจกรรมต่างๆ

ฟังก์ชัน Xlib ที่ส่งคำขอไปยังเซิร์ฟเวอร์โดยปกติจะไม่ส่งคำขอเหล่านั้นทันที แต่จะเก็บไว้ในบัฟเฟอร์ที่เรียกว่า บัฟเฟอร์คำขอ คำว่า คำขอ ในที่นี้หมายถึงคำขอจากไคลเอ็นต์ที่ส่งไปยังเซิร์ฟเวอร์ บัฟเฟอร์คำขอสามารถมีคำขอทุกประเภทไปยังเซิร์ฟเวอร์...

ฟังก์ชัน

ฟังก์ชันต่างๆ ในไลบรารี Xlib สามารถจัดกลุ่มได้ดังนี้: