Payamvdn/NorthPersian_fa_wiki huggingface dataset:
داد صحیح ۳۲ بیتی هستند که سه بیت پرارزش آن ها صفر است. هر کلاینت، مجموعه شناسه های ویژه خود را دارد که می تواند برای ساختن اشیاء آن ها را بکار برد. این مجموعه به دست سرور مشخص می شود. سرور این مجموعه شناسه را با جای دادن دو عدد صحیح در بسته پذیرش (همان بسته ای که سرور در آغاز کار در پاسخ به کلاینت برای ایجاد اتصال جدید، برای او می فرستد) مشخص می کند. کلاینت شناسه های خود را به گونه ای از این مجموعه گزینش می کند که برخوردی پیش نیاید: در بین پنجره ها، پیکس مپ ها، فونت ها، رنگ نگاشت ها و بافت های گرافیکی، دو شی دارای شناسه یکسانی نباشند. پس از اینکه یک منبع ساخته شد، کلاینت می تواند با شناسه آن منبع، از سرور درخواست کند که کاری را بر روی آن منبع انجام دهد. برخی از درخواست ها، بر روی منبع تأثیرگذار هستند و ممکن است آن منبع را دگرگون کنند (برای نمونه، درخواست جابجا کردن یک پنجره)؛ برخی دیگر، اطلاعاتی که دربارهٔ یک منبع در سرور ذخیره شده را درخواست می دهند (همچون درخواست برای خصوصیات یک پنجره). شناسه ها نه تنها در کلاینت، بلکه در سرور هم یکتا و منحصربه فرد هستند. برای نمونه، دو پنجره گوناگون هیچگاه شناسه یکسانی ندا
رند، حتی اگر دو کلاینت گوناگون آن ها را ساخته باشند. یک کلاینت می تواند با دادن شناسه هر شیئی، به آن دسترسی داشته باشد. یک کلاینت می تواند به اشیائی که دیگر کلاینت ها ساخته اند هم دسترسی داشته باشد، حتی اگر شناسه آن شی، بیرون از بازهٔ شناسه های آن کلاینت باشد. در نتیجه، دو کلاینت گوناگون که هر دو به یک سرور متصل هستند، می توانند از یک شناسه مشترک برای دسترسی داشتن به یک شی یکسان استفاده کنند. برای نمونه اگر کلاینتی یک شی با شناسه codice_8 ساخته باشد و این عدد codice_8 را به یک برنامه دیگر هم بدهد (این کار می تواند به هر شکل دلخواهی انجام شود، همانند ذخیره کردن این عدد در یک فایل به گونه ای که برنامه دیگر بتواند آن را از آن فایل بخواند)، برنامه دیگر هم می تواند تا بر روی همان پنجره کاری را انجام دهد. برای نمونه، برنامه گوست ویو در سامانه پنجره ای اکس از این ویژگی اینگونه بهره می برد: این برنامه یک زیرپنجره ساخته، سپس شناسه آن را در یک متغیر محیطی می گذارد، سپس برنامه گوست اسکریپت را فراخوانی می کند، سپس برنامه گوست اسکریپت، محتوای یک فایل پست اسکریپت را در این پنجره نمایش می دهد. معمولاً وقتی که یک کلاینت اتصا
لش را با سرور قطع می کند، منابع به وجود آمده به دست آن کلاینت نابود می شوند. با این حال، یک کلاینت پیش از پایان دادن به اتصال، می تواند از سرور بخواهد که منابع را نابود نکند. رویدادها. رویدادها، بسته هایی هستند که از سوی سرور برای کلاینت فرستاده می شوند، این بسته ها کلاینت را از رخ دادن رویدادی که ممکن است برای کلاینت جالب توجه باشد، آگاه می کنند. برای نمونه، هنگامی که کاربر کلیدی را فشار می دهد یا بر روی دکمه ای کلیک می کند، رویدادی برای کلاینت فرستاده می شود. رویدادها تنها برای ورودی گرفتن از کاربر و فعل و انفعالات او نیستند. برای نمونه، هنگامی که زیرپنجره ای در یک پنجره ساخته می شود، رویدادی برای آگاه کردن کلاینت از این رخداد، برای آن فرستاده می شود. هر رویدادی با یک پنجره در ارتباط است. برای نمونه، اگر کاربر هنگامی که نشانگر ماوس بر روی یک پنجره قرار دارد، روی آن پنجره کلیک کند، رویداد با آن پنجره در ارتباط خواهد بود. بستهٔ رویدادی که برای کلاینت فرستاده می شود، شناسه آن پنجره را در بر دارد. یک کلاینت می تواند از سرور بخواهد که رویدادی را برای یک کلاینت دیگر بفرستد؛ کلاینت ها از این ویژگی برای برقراری ارت
باط با یکدیگر استفاده می کنند. برای نمونه، هنگامی که کلاینتی از سرور درخواست می کند که متن انتخاب شده به دست کاربر برایش فرستاده شود، یک چنین رویدادی ساخته می شود (ممکن است کاربر متن موجود در پنجره ای که متعلق به یک کلاینت دیگر است را انتخاب کرده باشد)؛ این رویداد، برای کلاینتی فرستاده می شود که پنجره حاوی متن انتخاب شده را اداره می کند. هنگامی که محتویات بخشی از یک پنجره، نابود شده و سپس دوباره نمایان می شود، رویدادی به نام codice_10 برای کلاینت فرستاده می شود. محتوای یک پنجره می تواند در برخی شرایط نابود شود. برای نمونه اگر یک پنجره، بر روی پنجره دیگری جای بگیرد و همه یا بخشی از آن را بپوشاند، محتوای پنجره پوشیده شده نابود خواهد شد. البته این هنگامی است که سرور انباره پشتیبان برای آن پنجره را نگه داری نکرده باشد. سرور تضمین نمی کند که حتماً یک انباره پشتیبان نگه داری می کند، اما تضمین می کند که هر گاه نیاز به ترسیم دوباره محتوای یک پنجره بود، رویدادی را برای کلاینت بفرستد. بسیاری از رویدادها تنها هنگامی برای کلاینت فرستاده می شوند که کلاینت از پیش آمادگی خود را برای دریافت آن ها اعلام کرده باشد و مایل به در
یافت آن رویدادها بوده باشد. دلیل این کار این است که شاید تنها چند گونه رویداد خاص برای برخی از کلاینت ها جالب توجه باشد و کلاینت ها نخواهند به همه آن ها پاسخ دهند. برای نمونه، یک کلاینت ممکن است تنها بخواهد از رویدادهای صفحه کلید آگاه شود و علاقه ای به رویدادهای ماوس نداشته باشد. با این حال، رویدادهایی هستند که حتی اگر کلاینت از پیش آمادگی خود را برای دریافت آن ها نشان نداده باشد، باز هم برای کلاینت فرستاده می شوند. کلاینت ها با تنظیم کردن یکی از خصوصیات پنجره، مشخص می کنند که علاقه مند به دریافت کردن چه رویدادهایی هستند. برای نمونه، برای ترسیم دوباره پنجره ای که محتوای آن نابود شده، کلاینت باید رویداد codice_10 را دریافت و پذیرش کند (این رویداد برای همین کار در نظر گرفته شده و کلاینت را آگاه می کند که محتوای پنجره نیازمند ترسیم دوباره است). با این حال، این رویداد تنها هنگامی برای کلاینت فرستاده می شود که کلاینت از پیش اعلام کرده باشد که می خواهد آن را دریافت کند. این کار با تنظیم کردن خصوصیت ماسک رویداد پنجره، با یک مقدار مناسب انجام می شود. کلاینت های گوناگون می توانند رویدادهای مرتبط با یک پنجره یکسان را د
ریافت کنند. آن ها حتی می توانند ماسک رویداد آن پنجره را به گونهٔ متفاوتی مقداردهی کنند و بدین گونه، هر کدام رویدادهای گوناگونی را دریافت کنند. برای نمونه، یک کلاینت شاید بخواهد تنها رویدادهای مرتبط با صفحه کلیدی که برای یک پنجره رخ می دهد را دریافت کند، در حالی که کلاینت دیگر دوست دارد تنها رویدادهای مرتبط با ماوس برای همان پنجره را دریافت کند. این کار برای این شدنی است که سرور برای هر پنجره، ماسک رویداد جداگانه ای را به ازای هر کلاینت نگه داری می کند. با این حال، برخی از رویدادها تنها می توانند در هر زمان به دست یک کلاینت دریافت شوند و کلاینت های دیگر نمی توانند همزمان همان رویداد را دریافت کنند. این رویدادها، گزارش هایی را دربارهٔ کلیک کردن دکمه های ماوس و همچنین تغییرات مرتبط با مدیریت پنجره را می فرستند. برنامه codice_12 رویدادهای مرتبط با یک پنجره را نمایش می دهد. دستور codice_13 همه رویدادهای ممکن برای پنجره ای با شناسه codice_14 را دریافت کرده و چاپ می کند. نمونه. در ادامه نمونه ای از چگونگی تعامل و برپایی ارتباط بین یک کلاینت و سرور را مرور می کنیم. در این نمونه، کلاینت یک پنجره می سازد که جعبه ای سیا
ه رنگ در آن جای دارد، برنامه همین که یک کلید فشرده شد، خارج می شود. در این مثال، سرور هیچ پاسخی به سوی کلاینت نمی فرستد، چرا که درخواست های کلاینت پاسخی را در پی ندارند. اما این درخواست ها می توانند باعث رخ دادن یک خطا شوند: اگر پنجره دیگری بر روی پنجره جای گیرد و دوباره از روی آن برداشته شود، با فرض اینکه انباره پشتیبان نگه داری نشده باشد: اگر کلیدی فشرده شود: رنگ ها. در سطح پروتکل، رنگ ها به شکل اعداد صحیح ۳۲ بیتی بدون علامت نمایش می یابند که "pixelvalue" نامیده می شوند. عناصر زیر بر روی نمایش رنگ ها تأثیر دارند: در ساده ترین حالت، رنگ نگاشت جدولی است که هر سطر آن حاوی یک سه تایی آرجی بی است. یک pixelvalue به نام x، نشان دهنده رنگی است که در سطر xام جدول قرار گرفته است. اگر کلاینت قادر باشد مدخل های رنگ نگاشت را تغییر دهد، این بازنمایش جدید توسط "کلاس بصری" codice_30 نشان داده می شود. کلاس codice_31 هم کلاسی مشابه است، اما در این کلاس کلاینت نمی تواند مدخل های رنگ نگاشت را تغییر دهد. حدود ۶ کلاس بصری وجود دارد که هر کدام از آن ها روش متفاوتی را برای نمایش دادن سه تایی RGB در یک pixelvalue دارند. codice_30 و
codice_31 دو تا از این کلاس ها هستند. codice_34 و codice_35 هم دو تای دیگر هستند فرق آن ها در این است که این جدول ها فقط میزان شدت رنگ قهوه ای را نمایش می دهند. دو کلاس بصری باقی مانده با کلاس هایی که در بالا معرفی شدند متفاوت هستند، چرا که آن ها pixelvalueها را به سه قسمت تقسیم می کنند و برای تعیین کردن شدت رنگ های آبی، قرمز و سبز، از سه جدول مجزا برای هر کدام استفاده می کنند. بر طبق این نحوه نمایش رنگ، یک pixelvalue به صورت زیر به یک سه تایی RGB تبدیل می شود: این سازوکار نیازمند آن است که رنگ نگاشت از سه جدول مجزا تشکیل شده باشد و به ازای هر رنگ اولیه، یک جدول مجزا وجود داشته باشد. نتیجه این تبدیل، همچنان یک سه تایی از مقادیری است که مشخص کننده شدت رنگ ها هستند. کلاس های بصری که برای نمایش این تبدیل جدید استفاده می شود codice_36 و codice_37 هستند و فرق آن ها در این است که آیا کلاینت می تواند رنگ نگاشت ها را تغییر دهد یا خیر. این شش سازوکار برای نمایش رنگ ها به وسیلهٔ pixelvalueها، همگی نیازمند پارامترهای بیشتری هستند تا بتوانند کار کنند. این پارامترها در یک "گونه بصری" گردآوری می شوند. یک گونه بصری، حاوی ی
ک کلاس بصری و دیگر پارامترهای مورد نیاز برای نمایش رنگ هاست. هر سرور یک دسته ثابت از گونه های بصری دارد که هر کدام شناسه عددی مخصوص به خود را دارند. این شناسه ها اعداد صحیح ۳۲ بیتی بدون علامت هستند، اما الزاماً متفاوت با شناسه منابع یا اتم های (بعدا تشریح می شود) دیگر نیستند و ممکن است با آن ها همپوشانی داشته باشند. وقتی که اتصال یک کلاینت توسط سرور پذیرفته می شود، بسته پذیرشی که از طرف سرور برای کلاینت ارسال می شود حاوی دنباله ای از بلاک هاست که هر کدام از این بلاک ها، حاوی اطلاعاتی دربارهٔ یک صفحه نمایش هستند. بلاک متناظر با هر صفحه نمایش، حاوی فهرستی از بلاک های دیگر است که هر کدام از این بلاک ها، مربوط به عمق رنگ خاصی است که توسط آن صفحه نمایش پشتیبانی می شود. این فهرست، به ازای هر یک از عمق رنگ های مورد پشتیبانی، حاوی فهرستی از گونه های بصری است. در نتیجه، هر صفحه نمایش تعدادی عمق رنگ دارد که هر کدام از این عمق رنگ ها، دارای چند گونه بصری هستند. هر گونه بصری را می توان برای چندین صفحه نمایش با عمق های مختلف مورد استفاده قرار داد. بسته پذیرش به ازای هر گونه بصری، هم حاوی شناسه آن گونه بصری هست و هم حاوی پ
ارامترهای واقعی که در آن گونه بصری وجود دارد (کلاس بصری و موارد دیگر). کلاینت ها این اطلاعات را در خود ذخیره می کنند، چرا که بعداً نمی توانند آن ها را درخواست دهد. علاوه بر آن، کلاینت ها نمی توانند گونه های بصری را تغییر داده یا گونه های بصری جدید ایجاد کنند. درخواستی که برای ایجاد کردن یک پنجره جدید برای سرور ارسال می شود، حاوی عمق و شناسه گونه بصری ای است که باید برای نمایش دادن رنگ ها در آن پنجره، مورد استفاده قرار گیرد. رنگ نگاشت ها بدون توجه به اینکه سخت افزاری که صفحه نمایش را کنترل می کند (همانند کارت گرافیک) از یک پالت استفاده می کند یا نه، بکار برده می شوند. پالت هم جدولی است که برای نمایش دادن رنگ ها بکار برده می شود. حتی اگر سخت افزار از یک پالت استفاده نکند، سرورهاباز هم از رنگ نگاشت ها استفاده می کنند. هنگامی که سخت افزار از پالت بهره می برد، می توان تنها شمار محدودی از رنگ نگاشت ها را بکار گرفت. یک رنگ نگاشت هنگامی به کار گرفته می شود که سخت افزار بر طبق آن رنگ ها را نشان می دهد. یک کلاینت می تواند از سرور بخواهد که یک رنگ نگاشت را بکار بگیرد. با این حال، این کار ممکن است نیازمند از کار انداختن
رنگ نگاشت دیگری باشد. این کار باعث می شود پنجره هایی که از آن رنگ نگاشت از کار انداخته شده استفاده می کنند، با رنگ های مناسب خود نمایش نیابند که به این پدیده color flashing یا technicolor می گویند. این مشکل می تواند با استفاده از "رنگ نگاشت های استاندارد" رفع شود. رنگ نگاشت های استاندارد، رنگ نگاشت هایی هستند که در آن ها رابطه ای از پیش تعیین شده بین pixelvalueها و رنگ ها وجود دارد. به لطف این خصیصه رنگ نگاشت های استاندارد، برنامه های مختلف می توانند آن ها را بکار گیرند. به وجود آوردن رنگ نگاشت ها در قرارداد ICCCM بحث شده است. رنگ نگاشت های استاندارد توسط ICCCM و اکس لیب تنظیم می شوند. اتم ها. اتم ها اعداد ۳۲ بیتی هستند که رشته ها را نمایش می دهند. سازندگان پروتکل، اتم ها را به این دلیل معرفی کردند، که اتم ها رشته ها را به شکلی کوتاه و با اندازه ای ثابت نمایش می دهند. در حالی که یک رشته می تواند طول دلخواهی داشته باشد، یک اتم همیشه اندازه ثابت ۳۲ بیتی دارد. در مواردی که بسته هایی با یک رشته یکسان باید به صورت چند باره فرستاده شود، می توان با اتم ها، از شبکه به گونه بهینه تر سود جست. بسته های نوع رویداد که اند
ازه ثابت ۳۲ بایتی دارند، می توانند اتم ها را در خود جای دهند، اما ممکن است یک رشته متنی به اندازه ای بزرگ باشد که نتوان آن را در بسته های رویداد گنجاند. به گونه دقیقتر می توان گفت که اتم ها، شناسه هایی برای رشته هایی که در سرور ذخیره شده اند، هستند. آن ها همانند شناسه های منابع (پنجره، پیکس مپ و غیره) هستند. اما دو تفاوت با آن ها دارند. یکی اینکه شناسه اتم ها به دست سرور گزیده می شود و کلاینت در گزینش آن ها نقشی ندارد. به عبارتی دیگر، هنگامی که کلاینت درخواست ساختن یک اتم تازه را می دهد، تنها رشته ای که قرار است ذخیره شود را برای سرور می فرستد، نه شناسه آن اتم را. این شناسه را سرور گزینش کرده و به صورت یک پاسخ برای کلاینت می فرستد. دومین فرق مهم بین اتم ها و منابع این است که اتم ها با کلاینت ها در ارتباط نیستند و به آن ها وابسته نیستند. هنگامی که اتم ها در سرور ساخته می شوند، تا هنگامی که سرور خاموش یا راه اندازی دوباره نشده، در همان جا باقی خواهند ماند (منابع به گونه پیشفرض چنین رفتاری ندارند و وابسته به کلاینت هستند). از آنجا که اتم ها یک نوع شناسه هستند، یکتا هم هستند. با این حال، یک اتم و شناسه یک منبع می
توانند با یکدیگر همپوشانی داشته باشند. رشته ای که به یک اتم داده شده، "نام اتم" نامیده می شود. پس از اینکه یک اتم ساخته شد، نام آن را نمی توان تغییر داد و دو اتم هم نمی توانند نام یکسانی داشته باشند. در نتیجه، معمولاً از نام یک اتم برای اشاره به آن اتم استفاده می شود. «اتم ABCD» به شکل دقیقتر یعنی «اتمی که رشته ABCD به آن اختصاص یافته است». یک کلاینت، هم می تواند از سرور درخواست کند که یک اتم تازه بسازد و هم می تواند با دادن یک رشته به سرور، شناسه اتم آن را دریافت کند. برخی از اتم ها "از قبل تعریف شده" هستند. (سرور آن ها را با یک شناسه و رشته معین از قبل تعریف کرده است). اتم ها را می توان برای اهداف گوناگونی بکار برد. یکی از رایج ترین استفاده از اتم ها، برقرار کردن ارتباط بین دو یا چند کلاینت است که همگی به یک سرور یکسان متصل شده اند. آن ها به همراه ویژگی های پنجره ها استفاده می شوند که در ادامه تشریح می شود. با استفاده از برنامه codice_38 می توان فهرست همه اتم های موجود در سرور را چاپ کرد. این برنامه برای هر اتم، شناسه آن (که یک عدد است) و نام آن (که یک رشته است) را چاپ می کند. خصیصه ها. هر پنجره، یک سری وی
ژگی از پیش تعریف شده و یک سری خصیصه دارد که همه آن ها در سرور ذخیره می شوند و کلاینت می تواند برای دسترسی به آنها، درخواستی را برای سرور بفرستد. ویژگی ها، اطلاعاتی دربارهٔ یک پنجره هستند، مانند اندازه، مکان، رنگ پس زمینه و دیگر جیزها. خصیصه ها، اطلاعات دلخواهی هستند که به یک پنجره چسبیده می شوند. برخلاف ویژگی ها، خصیصه ها معنی خاصی در سطح پروتکل اکس ندارند. یک کلاینت می تواند هر گونه اطلاعات دلخواهی را در خصیصه یک پنجره ذخیره کند. یک خصیصه با نام، نوع و مقدار آن شناخته می شود. خصیصه ها همانند متغیرها در زبان های برنامه نویسی دستوری هستند، که یک کلاینت می تواند خصیصه تازه ای را با نام و نوع دلخواه ساخته و مقداری را در آن بگذارد. خصیصه ها مخصوص همان پنجره هستند: دو خصیصه همنام می تواند در دو پنجره گوناگون وجود داشته باشد، در حالی که مقدار و نوع آن ها با یکدیگر ناهمسان است. نام، نوع و مقدار یک خصیصه به صورت رشته، یا به شکل دقیق تر، اتم هستند. رشته ها در سرور ذخیره شده و کلاینت می تواند با شناسه ها به آن ها دسترسی داشته باشد. یک کلاینت می تواند با شناسهٔ اتمی که دربرگیرنده نام یک خصیصه است، به آن خصیصه دسترسی داش
ته باشد. خصیصه ها بیشتر برای ارتباطات بین کلاینتی بکار برده می شوند. برای نمونه، یک خصیصه به نام codice_39 (این خصیصه توسط اتمی که رشته اختصاص یافته به آن codice_40 است نامگذاری شده است) هست که برای ذخیره کردن نام پنجره ها بکار برده می شود. مدیر پنجره ها معمولاً این خصیصه را می خوانند و سپس آن را در نوار عنوان پنجره نمایش می دهند. برخی از انواع ارتباطات بین کلاینتی، از خصیصه های پنجره ریشه استفاده می کنند. برای نمونه، بر پایه مشخصاتی که فری دسکتاپ برای مدیر پنجره ها تعریف کرده، مدیر پنجره ها باید شناسه پنجره ای که هم اکنون فعال است و فوکوس را در اختیار دارد را در یکی از خصیصه های پنجره ریشه به نام codice_41 ذخیره کنند. منابع اکس که حاوی پارامترهای برنامه ها هستند هم در خصیصه های پنجره ریشه ذخیره می شوند. به این گونه، همه کلاینت ها می توانند به این خصیصه ها دسترسی داشته باشند، حتی اگر این کلاینت ها بر روی رایانه های گوناگون اجرا شوند. برنامه codice_42 خصیصه های یک پنجره دلخواه را نمایش می دهد. دستور codice_43، نام، نوع و مقدار همه خصیصه های پنجره ریشه را چاپ می کند. نگاشت کردن. در سامانه پنجره ای اکس، هر کلیدی
که بر روی دستگاه های ورودی از جمله ماوس و کیبورد وجود دارد، یک عدد منحصربفرد مابین ۸ تا ۲۵۵ دارد که به آن keycode می گویند. یک keycode تنها یک کلید ویژه را شناسایی می کند، نه یک کاراکتر یا لفظ (مانند Page up) که بر روی کلید چاپ شده اند را. درعوض هر کدام از این الفاظ یا کاراکترها با یک keysym شناسایی می شوند. درحالی که keycode تنها به کلیدی که فشرده شده است وابسته است، یک keysym ممکن است به اینکه دکمه Shift یا یک اصلاح گر دیگر هم فشرده شده باشد، بستگی داشته باشد. هنگامی که کلیدی فشرده یا رها می شود، سرور رویدادهایی از نوع codice_20 یا codice_45 را برای کلاینت های مورد نظر می فرستد. این رویدادها داده های زیر را در خود دارند: بنابراین سرور keycode و وضعیت اصلاح گرها را بدون اینکه تلاش کند خود آن ها را به یک کاراکتر ویژه ترجمه کند، برای کلاینت می فرستد و وظیفه ترجمه و تفسیر آن ها را بر دوش کلاینت واگذار می کند. برای نمونه، یک کلاینت ممکن است رویدادی مبنی بر اینکه یک کلید ویژه در حالی فشرده شده است که دکمه شیفت هم پایین نگه داشته شده، دریافت کند. اگر در حالت معمول این کلید خاص، کاراکتر 'a' را تولید می کرده، کلاین
ت (و نه سرور) این رویداد را به منزله وارد شدن کاراکتر 'A' تلقی می کند. درحالی که ترجمه keycodeها به keysym به دست کلاینت انجام می شود، جدولی که ارتباط بین آن ها را مشخص می کند در سرور نگهداری می شود. ذخیره کردن این جدول در سرور که یک جای عمومی و مرکزی است، این امکان را فراهم می کند تا همه کلاینت ها بتوانند به آن دسترسی داشته باشند. کلاینت ها تنها از سرور، نگاشت کردن keycodeها به keysymها را درخواست می کنند و از آن برای رمزگشایی کردن keycodeها و اصلاح گرها به یک keysym استفاده می کنند. با این حال، کلاینت ها می توانند این نگاشت کردن را به خواست خودشان تغییر دهند. یک اصلاح گر کلیدی است که هنگامی فشرده می شود، چگونگی تفسیر شدن کلیدها را تغییر می دهد. یکی از اصلاح گرهای رایج، کلید شیفت است. وقتی کلیدی که در حالت معمول کاراکتر 'a' را تولید می کند، به همراه کلید شیفت فشرده می شود، باعث تولید شدن یک کاراکتر بزرگ 'A' می شود. دیگر اصلاح گرهای رایج، کلید آلت، کنترل و متا هستند. سرور اکس حداکثر با هشت عدد اصلاح گر کار می کند. ضمناً، هر اصلاح گر می تواند بیش از یک کلید داشته باشد. این کار بایسته است، چرا که بیشتر کیبوردها
دو کلید برای برخی از اصلاح گرها دارند. برای نمونه، بیشتر کیبوردها دو کلید شیفت دارند (یکی در سمت چپ و دیگری در سمت راست). این دو کلید، در هنگام فشرده شدن هر کدام keycode ویژه و متفاوت از یکدیگری را تولید می کنند، اما سرور اکس هر دو آن ها را به عنوان اصلاح گر شیفت می شناسد. سرور اکس برای هر کدام از این هشت اصلاح گر، فهرستی از keycodeها را نگه می دارد که آن ها را به عنوان آن اصلاح گر تفسیر می کند. برای نمونه، اگر در فهرست اولین اصلاح گر (اصلاح گر شیفت)، یک kecode با مقدار codice_46 وجود داشته باشد، آنگاه سرور کلیدی که باعث تولید شدن keycodeای با مقدار codice_46 می شود را به عنوان یک کلید شیفت در نظر می گیرد. هرچند که فهرست های مربوط به نگاشت کردن اصلاح گرها در سرور نگهداری می شود، اما هر کلاینتی می تواند آن ها را به خواست خود تغییر دهد. برای نمونه، یک کلاینت می تواند درخواست دهد که کلید F1 به فهرست اصلاح گر شیفت افزوده شود. با این کار، کلید F1 همانند یک کلید شیفت کار می کند. با این حال، keycode اصلی متناظر با F1، همچنان در هنگام فشرده شدن این کلید تولید می شود. در نتیجه، F1 همانگونه کار می کند که پیش از آن کار
می کرده (برای نمونه ممکن است یک پنجره Help در هنگام فشرده شدن F1 باز شود)، اما همچنین به عنوان یک کلید شیفت هم کار می کند (برای نمونه فشردن کلید 'a' به همراه F1 می تواند باعث تولید شدن یک کاراکتر 'A' در یک ویرایشگر متن شود). سرور اکس همچنین سازوکار برای نگاشت کردن دکمه های ماوس دارد. با این حال، دکمه های ماوس تنها می توانند با یکدیگر جایگذاری شوند. این کار به ویژه برای تعویض کردن دکمه های چپ و راست برای استفاده آسان تر توسط افراد راست دست و چپ دست سودمند است. قاپیدن رویدادها. قاپیدن رویدادها وضعیتی است که در آن تمام رویدادهای مرتبط با کیبورد و ماوس، تنها برای یک کلاینت خاص ارسال می شود. به عبارت دیگر، یک کلاینت رویدادهایی که در اصل برای کلاینت های دیگر هستند را از آن ها می قاپد. یک کلاینت می تواند درخواست قاپیدن رویدادهای کیبورد، ماوس یا هر دو را از سرور درخواست کند. اگر سرور درخواست کلاینت را برآورده سازد، آنگاه تمام رویدادهای مرتبط با ماوس/کیبورد، برای آن کلاینت ارسال می شود؛ تا وقتی که کلاینت grab را رها کند. کلاینت های دیگر این رویدادها را دریافت نخواهند کرد. کلاینت در هنگام قاپیدن رویدادها، "پنجره قاپید
ن" را هم مشخص می کند. در این حالت، تمام رویدادها طوری برای کلاینت ارسال می شوند که انگار مرتبط با آن پنجره هستند. با این حال دیگر کلاینت ها هیچ رویدادی را دریافت نمی کنند، حتی اگر آن رویدادها را در پنجره قاپیدن انتخاب کرده باشند. دو نوع قاپیدن وجود دارد: کلاینت ها می توانند بر روی کیبورد، مکان نما، یا هر دو آن ها درخواست قاپیدن رویدادها را بکنند. یک درخواست قاپیدن، ممکن است حاوی درخواستی برای "فریز کردن" صفحه کلید یا مکان نما باشد. تفاوت گرب کردن (قاپیدن رویدادها) و فریز کردن در این است که در گرب، گیرندهٔ رویدادها تغییر می کند و رویدادها به کلاینتی غیر از کلاینت اصلی شان تحویل داده می شوند، در حالی که فریز کردن باعث می شود تا رویدادها به هیچ گیرنده ای تحویل داده نشوند. وقتی که دستگاهی فریز می شود، رویدادهایی که آن دستگاه تولید می کند در یک صف ذخیره می شوند تا بعدها پس از اتمام شدن عمل فریز، به گیرنده تحویل داده شوند. پارامتر دیگری هم در رابطه با رویدادهای مکان نما وجود دارد که در تحویل دادن رویدادها مؤثر است: ماسک رویداد، که مشخص می کند چه نوع رویدادهایی باید تحویل داده شوند و از چه نوع رویدادهایی باید صرف نظ
ر شود. دیگر موارد. رویدادها و درخواست های دیگری هم در پروتکل وجود دارد. برخی از درخواست ها، در مورد رابطهٔ پدری بین پنجره ها هستند. یک کلاینت می تواند درخواست کند تا پدر یک پنجره تغییر یابد. یا می تواند اطلاعاتی را در مورد پدر یک پنجره درخواست کند. برخی دیگر از درخواست ها، دربارهٔ انتخاب ها هستند، با این حال، بیشتر این درخواست ها به دست پروتکل های دیگری جز پروتکل اصلی تعریف و مشخص می شوند. دسته دیگر از درخواست ها، درخواست های مرتبط با فوکوس ورودی و شکل مکان نما هستند. همچنین یک کلاینت می تواند درخواست دهد مالک یک منبع (پنجره، pixmap و ...)، از بین برود که خود باعث از بین رفتن ارتباط سرور با آن می شود. در نهایت، یک کلاینت می تواند یک درخواست از نوع بدون عملیات را برای سرور بفرستد. اضافات و افزونه ها. پروتکل سامانه پنجره ای اکس به گونه گسترش پذیر ساخته شده است. این پروتکل سازوکاری را فراهم می کند که یک کلاینت به کمک آن می تواند از وجود داشتن یک افزونه مطمئن شود. همچنین پروتکل اصلی، چگونگی ساخته شدن بسته های درخواست، رویداد و خطایی که متعلق به یک افزونه هستند را هم مشخص می کند. یک کلاینت می تواند برای داده هایی
که وابسته و مرتبط به یک افزونه دلخواه هستند، فهرست همه افزونه های موجود را درخواست کند. بسته هایی که متعلق به یک افزونه هستند، مشابه همان بسته های اصلی پروتکل هستند. پروتکل اصلی، مشخص می کند که بسته های نوع درخواست، رویداد یا خطا، باید دربرگیرنده یک عدد صحیح باشند که این عدد صحیح، نوع آن بسته را مشخص می کند (برای نمونه، درخواست هایی که برای ساختن یک پنجره تازه بکار می روند، با عدد ۱ شماره گذاری می شوند). بازه ای از این اعداد صحیح برای افزونه ها رزرو شده است. اعتبارسنجی و تأیید هویت. در ابتدا، وقتی که کلاینت می خواهد ارتباطی را با سرور برقرار کند، سرور می تواند ارتباط را بپذیرد، آن را رد کند، یا کلاینت را اعتبارسنجی کند و در صورت تأیید شدن هویت کلاینت، ارتباط با آن را بپذیرد. روش های گوناگونی برای اعتبارسنجی هست. یک درخواست اعتبارسنجی، روشی که باید برای اعتبارسنجی بکار برده شود را در خود دارد. پروتکل، مراحل انجام اعتبارسنجی را مشخص و تعریف نمی کند، چرا که مراحل اعتبارسنجی بستگی به روشی دارد که برای اعتبارسنجی بکار برده می شود، پروتکل تنها مشخص می کند که این فرایند، یا با فرستادن بسته پذیرش یا با فرستادن بسته ع
دم پذیرش از سوی سرور، پایان می یابد. در طول یک فعل و انفعال عادی بین یک کلاینت و سرور، تنها درخواست هایی که با اعتبارسنجی در ارتباط هستند، در مورد "روش دسترسی مبتنی بر میزبان" هستند. به طور دقیق تر، یک کلاینت می تواند از سرور بخواهد که این روش فعال باشد یا نه، و همین طور می تواند از سرور بخواهد که فهرستی از میزبان هایی (کلاینت هایی) که مجاز به برقراری ارتباط هستند را بخواند یا تغییر دهد. برنامه های عادی از این گونه درخواست ها استفاده نمی کنند، این درخواست ها توسط برنامه codice_48 استفاده می شوند. این برنامه از این درخواست ها به این منظور استفاده می کند تا به یک کاربر یا یک اسکریپت، اجازه دسترسی داشتن به سرور اکس را بدهد. اکس لیب و دیگر کتابخانه های مرتبط. بیشتر برنامه های کلاینت با استفاده از کتابخانه اکس لیب با سرور ارتباط برقرار می کنند. در واقع، عمده کلاینت ها از کتابخانه های جی تی کی، کیوت، موتیف و ... استفاده می کنند که این کتابخانه ها خود در واقع در سطوح پایین تر از اکس لیب برای برقراری ارتباط با سرور استفاده می کنند. استفاده از اکس لیب اثرات زیر را به دنبال دارد: کتابخانه های سطح بالاتر همانند Xt (که م