ইনপুট রাউটিং

অ্যান্ড্রয়েড ৯ এবং এর পূর্ববর্তী সংস্করণগুলোতে টাচের মাধ্যমে একাধিক ডিসপ্লে ব্যবহার করার কোনো উপায় ছিল না, কারণ ডিসপ্লে এবং ইনপুট ডিভাইসগুলোর মধ্যে কোনো অ্যাসোসিয়েশন মেকানিজম ছিল না। উদাহরণস্বরূপ, একটি টাচস্ক্রিন ডিসপ্লেতে একটি HDMI ভিডিও আউটপুট (যা অ্যান্ড্রয়েডে একটি ডিসপ্লে হিসেবে গণ্য হতো) এবং টাচস্ক্রিনের জন্য একটি USB আউটপুট (যা একটি ইনপুট ডিভাইস হিসেবে গণ্য হতো) থাকতে পারত। যদি একাধিক ডিভাইস এভাবে সংযুক্ত করা হতো, তাহলে কোন ইনপুট ডিভাইসটি কোন ডিসপ্লের, তা নির্ধারণ করার কোনো উপায় থাকত না। একাধিক বিল্ট-ইন ডিসপ্লেযুক্ত ফোল্ডেবল ডিভাইসগুলোর ক্ষেত্রেও একই সমস্যা প্রযোজ্য।

অ্যান্ড্রয়েড ১০-এ কোন ইনপুট ডিভাইস কোন ডিসপ্লের সাথে যুক্ত, তা নির্দিষ্ট করার একটি পদ্ধতি যোগ করা হয়েছে। এই সংযোগটি পোর্ট নম্বরের মাধ্যমে করা হয়, যেখানে পোর্ট বলতে সেই ফিজিক্যাল পোর্টকে বোঝায় যার সাথে একটি ডিসপ্লে সংযুক্ত থাকে।

উদাহরণস্বরূপ, যদি একটি অ্যান্ড্রয়েড ডিভাইসে hdmi1 এবং hdmi2 লেবেলযুক্ত দুটি HDMI পোর্ট থাকে, তাহলে ডিসপ্লে পোর্টের মান হতে পারে 1 এবং 2 একই ফিজিক্যাল HDMI পোর্টে ভিন্ন কোনো ডিসপ্লে (যেমন ভিন্ন ডিসপ্লে মডেল বা প্রস্তুতকারকের) সংযুক্ত করা হলেও পোর্টের মান একই থাকে। এটি ডিভাইস প্রস্তুতকারকদের ডিসপ্লে অ্যাসেম্বল এবং আপগ্রেড করার জন্য নির্দেশাবলী প্রদান করতে সক্ষম করে।

অ্যাসোসিয়েশনটি /vendor/etc/input-port-associations.xml ফাইলে কনফিগার করা হয়। উদাহরণস্বরূপ:

<ports>
    <port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
    <port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>

উপরের উদাহরণে, display="0" সেই পোর্টটিকে নির্দিষ্ট করে যেখানে ডিসপ্লেটি সংযুক্ত আছে। input="usb-xhci-hcd.0.auto-1.1/input0" সেই পোর্টটিকে নির্দিষ্ট করে যেখানে ইনপুট ডিভাইসটি সংযুক্ত আছে। নির্দিষ্ট ডিভাইসগুলির সাথে যুক্ত পোর্টগুলি নির্ধারণ করতে, নিম্নলিখিত টার্মিনাল কমান্ডটি ব্যবহার করুন, এবং তারপরে ইভেন্ট হাব স্টেটে (Event Hub State) সেই ডিভাইসগুলির location property) পর্যালোচনা করুন।

adb shell dumpsys input

যদি একাধিক ডিভাইস সংযুক্ত থাকে, তাহলে ইনপুট ডিসপ্যাচার স্টেটে থাকা RecentQueue অ্যারেটি পরীক্ষা করার জন্য একটি নির্দিষ্ট ডিভাইসে ট্যাপ করুন। এর মাধ্যমে আপনি সেই ডিভাইসগুলোকে শনাক্ত করতে পারবেন যেগুলো সবচেয়ে সাম্প্রতিক ইভেন্টটি তৈরি করেছে। এরপর আপনি ইভেন্ট হাব স্টেটে সংশ্লিষ্ট ডিভাইসটি খুঁজে নিতে পারবেন।

সংযুক্ত ডিসপ্লেগুলিতে বরাদ্দ করা ডিসপ্লে পোর্টগুলি নির্ধারণ করতে, adb shell dumpsys display ব্যবহার করুন এবং তারপরে `Display Devices`-এর অধীনে প্রতিটি ডিসপ্লের জন্য DisplayDeviceInfo এর ` address প্রপার্টিটি দেখুন। বিকল্পভাবে, সমস্ত সংযুক্ত ডিসপ্লের শনাক্তকরণ তথ্য ডাম্প করতে adb shell dumpsys SurfaceFlinger --display-id ব্যবহার করুন। আরও দেখুন `Static display identifiers`

যদি আপনি কোনো নির্দিষ্ট ইনপুট ডিভাইসের জন্য একটি অ্যাসোসিয়েশন নির্দিষ্ট করেন এবং সংশ্লিষ্ট ডিসপ্লেটি সিস্টেমে উপস্থিত না থাকে, তাহলে সেই ডিসপ্লেটি প্রদর্শিত না হওয়া পর্যন্ত ইনপুট ডিভাইসটি নিষ্ক্রিয় থাকে। এই অ্যাসোসিয়েশনটি শুধুমাত্র টাচ ডিভাইসের ক্ষেত্রেই কার্যকর হয়।

ডায়নামিক মাল্টি-ডিসপ্লের জন্য রাউটিং

অ্যান্ড্রয়েড ১০ আপনাকে স্ট্যাটিক মাল্টি-ডিসপ্লে ডিভাইস সেট আপ করার সুবিধা দেয়। ডাইনামিক অ্যাসোসিয়েশন এখনও চালু করা হয়নি। তবে, কিছু ব্যবহারের ক্ষেত্র সমাধান করা যেতে পারে এমন ডিসপ্লে এবং ইনপুট প্যানেলের জন্য রাউটিং তথ্য সরবরাহ করে যেগুলো সবসময় উপস্থিত থাকে না, অথবা ভার্চুয়াল ইনপুট ডিভাইস ব্যবহার করে এবং তারপর সেই ভার্চুয়াল ডিভাইসগুলোতে অতিরিক্ত রাউটিং তথ্য সরবরাহ করে। যদি একটি ডিভাইস ইমপ্লিমেন্টেশন সমর্থন করে:

  • ডকিং স্টেশনের মাধ্যমে ডেস্কটপের মতো অভিজ্ঞতা পাওয়া যায়, এবং এর ফলে ডকের সাথে সংযুক্ত ইনপুট অ্যাক্সেসরি (যা পোর্ট দ্বারা স্বতন্ত্রভাবে চিহ্নিত) থেকে বাহ্যিক ডিসপ্লেতে (যা পোর্ট দ্বারা চিহ্নিত) ইনপুট পাঠানোর জন্য একটি রাউটিং কনফিগারেশন প্রদান করা যেতে পারে।
  • যখন প্রাথমিক স্ক্রিনটি বাহ্যিক ডিসপ্লের সাথে সংযুক্ত থাকে এবং ইনপুট উৎস (যেমন টাচপ্যাড) হিসেবে কাজ করে, তখন ভার্চুয়াল টাচ প্যানেল (অনন্য ভার্চুয়াল আইডি দ্বারা চিহ্নিত) থেকে বাহ্যিক ডিসপ্লেতে (পোর্ট দ্বারা চিহ্নিত) ইনপুট পাঠানোর জন্য একটি রাউটিং কনফিগারেশন প্রদান করা যেতে পারে।

বাস্তবায়ন

  • ফিজিক্যাল ডিভাইসগুলোর ক্ষেত্রে, ইনপুট ডিভাইস যে পোর্টে সংযুক্ত থাকে এবং ডিসপ্লে যে পোর্টে সংযুক্ত থাকে, সেই পোর্টগুলো ব্যবহার করে ডিসপ্লেগুলোকে টাচস্ক্রিনের সাথে মেলানো হয়।
  • ম্যাপিংগুলো InputReaderConfiguration এ সংরক্ষিত থাকে।
  • TouchInputMapper.mViewport সেই ভিউপোর্টে সেট করা হয় যা InputDevice.location এর জন্য নির্দিষ্ট করা পোর্টের সাথে মেলে।
  • যদি ম্যাপিং ফাইলে কোনো ইনপুট ডিভাইস পোর্ট নির্দিষ্ট করা থাকে এবং বর্তমানে এমন কোনো ভিউপোর্ট না থাকে যার সাথে একটি মিলে যায় এমন ডিসপ্লে পোর্ট আছে, তাহলে সেই পোর্টের ইনপুট ডিভাইসটি নিষ্ক্রিয় হয়ে যায়।
  • যদি কোনো নির্দিষ্ট ইনপুট ডিভাইসের জন্য পোর্ট উল্লেখ করা না থাকে, তাহলে বিদ্যমান নিয়ম অনুযায়ী ভিউপোর্ট সেট করা হয়।
  • ইনপুট ড্রাইভারগুলিতে কোনো কার্নেল পরিবর্তনের প্রয়োজন নেই।
  • EVIOCGPHYS ioctl ব্যবহার করে ইনপুট ডিভাইস পোর্টগুলো নির্ধারণ করা হয়।