ইনপুট রাউটিং

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

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

উদাহরণস্বরূপ, যদি একটি Android ডিভাইসে 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" ইনপুট ডিভাইসটি যে পোর্টে সংযুক্ত তা নির্দিষ্ট করে৷ নির্দিষ্ট ডিভাইসের সাথে যুক্ত পোর্ট নির্ধারণ করতে, নিম্নলিখিত টার্মিনাল কমান্ডটি ব্যবহার করুন এবং তারপর ইভেন্ট হাব স্টেটে সেই ডিভাইসগুলির location বৈশিষ্ট্য পর্যালোচনা করুন।

adb shell dumpsys input

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

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

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

গতিশীল মাল্টি-ডিসপ্লেগুলির জন্য রাউটিং

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

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

বাস্তবায়ন

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

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

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

উদাহরণস্বরূপ, যদি একটি Android ডিভাইসে 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" ইনপুট ডিভাইসটি যে পোর্টে সংযুক্ত তা নির্দিষ্ট করে৷ নির্দিষ্ট ডিভাইসের সাথে যুক্ত পোর্ট নির্ধারণ করতে, নিম্নলিখিত টার্মিনাল কমান্ডটি ব্যবহার করুন এবং তারপর ইভেন্ট হাব স্টেটে সেই ডিভাইসগুলির location বৈশিষ্ট্য পর্যালোচনা করুন।

adb shell dumpsys input

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

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

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

গতিশীল মাল্টি-ডিসপ্লেগুলির জন্য রাউটিং

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

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

বাস্তবায়ন

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