استفاده همزمان از چند نشانگر موس (cursor) در گنو/لینوکس
چرا؟
چند وقت پیشا به حدی بی حوصله شده بودیم که با دوستم تصمیم گرفتیم Minesweeper بازی کنیم. مسئله اینجا بود که این بازی یک نفره بود و ما فقط یک کامپیوتر داشتیم ولی میخواستیم دونفری بازی کنیم.
مشکل؟
تصمیم گرفتیم همزمان ۲ تا موس به کامپیوتر وصل کنیم، اما مشکل این بود که فقط یک cursor (نشانگر) وجود داره و دچار باگ race condition میشیم!
راه حل؟
تصمیم گرفتیم یک cursor دیگه هم به سیستم اضافه کنیم و خوشبختانه پیاده سازی این قضیه خیلی آسونتر از چیزیه که بنظر میرسه.
تعاریف:
اینجا ۲ تا تعریف خیلی ساده وجود داره:
Master: یک اشاره گر یا cursor که روی صفحه نمایش قابل مشاهده هست
Slave: یک موس یا کیبورد که به صورت فیزیکی وجود داره
مثلا در حال حاضر لپتاپ من یک تاچپد داره و یک موس رو با USB وصل کردم. در این حالت تاچپد و موس هر کدوم یک Slave هستن و cursor ای که روی نمایشگر میبینم یک Master
هدف:
- یک Master جدید بسازیم تا ۲ عدد cursor وجود داشته باشه
- Slave مربوط به موس رو برای Master جدید تنظیم کنیم تا بتونیم همزمان ۲عدد cursor فعال داشته باشیم.
پیاده سازی:
برای استفاده از دو یا چند cursor روی یک سیستم که از X استفاده میکنن، به بسته ای به اسم xinput نیاز داریم. این بسته بطور پیش فرض روی بعضی از توزیع ها نصب شده. اگر نصب نشده بود هم معمولا به همین اسم برای نصب موجوده.
برای دیدن لیست دوایس ها میتونیم از این دستور استفاده کنیم:
xinput list

الان id=14 نشون دهنده موسی هست که با USB وصل شده.
13 نشون دهنده تاچ پد هست، و 2 نشون دهنده cursor هست که از نوع Master میشه.
نکته: اگر تشخیص اینکه چه دیوایس الان وصل شده براتون سخته میتونید از دستور watch کمک بگیرید:
watch -d xinput --list
آپشن d- باعث میشه تفاوت هایی که در خروجی وجود داره رنگی بشه
خب الان میتونیم با دستور:
xinput create-master <id>
یک master جدید بسازیم. مثلا من برای id 15 رو در نظر میگیرم که کسی استفاده نمیکنه.
xinput create-master 15

میبینیم که پایین اضافه شد. حالا کافیه id مربوط به موس USB که ۱۴ بود رو برای master جدید که id اش ۱۵ هست تنظیم کنم. سینتکس این دستور به این شکل هست:
xinput reattach <id> <master>
که در این حالت میشه:
xinput reattach 14 15
و تمام! الان ۲ تا اشارگر داریم که میتونیم دو نفری بازی کنیم.
بدیهیه که با تکرار این مراحل میتونیم چندین اشارگر داشته باشیم. اگر کارتون تموم شد و خواستین master رو حذف کنین، کافیه از این دستور استفاده کنید:
xinput remove-master <id>
که توی این حالت میشه:
xinput remove-master 15
پاسخ ها