
рд╣рд╛рдп, рд╣реИрдмреНрд░ред
рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдореИрдВ
Ubuntu рдЯрдЪ рдХреЛ
рдСрд▓рд╡рд┐рдирд░ A10 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛,
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореИрдВрдиреЗ рдиреЛрдЯреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦ рд▓рд┐рдпрд╛ред рдЕрдм, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрдмрдВрдЯреВ рдЯрдЪ рдЕрдВрддрддрдГ рдЕрдкрдиреЗ
рдореАрд░ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рд░реНрд╡рд░ рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реБрдЖред
рдпрд╣ рд▓реЗрдЦ рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд╣рд╛рдВ рд╕реЗ UT рдХреЗ рд╕рд╛рде рдШрдирд┐рд╖реНрда рдкрд░рд┐рдЪрдп рд╢реБрд░реВ рд╣реЛрдЧрд╛ред
рдкреНрд░рд╕реНрддреБрддрд┐ рд╢реИрд▓реА рддрдХрдиреАрдХреА рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмреБрд░рд╛ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ
рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
рдкрд░рд┐рдЪрдп
рдХрд╛рдореЗрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реИ
рд▓рд┐рдмрд╛рдпрдмреНрд░рд┐рд╕ рдПрдХ рдкрд░рдд рд╣реИ рдЬреЛ
рдмрд╛рдпреЛрдирд┐рдХ рдпреВрдЬрд╝рд░реНрд╕ рд╕реЗ
рдЧреНрд▓рд┐рдмрдХ рдпреВрдЬрд╝рд░рд╕реНрдкреЗрд╕ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреБрдЫ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдлреНрд▓рд╛рдИ рдкрд░ рдЧреНрд▓рд┐рдмрдХ рд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рд▓рд┐рдирдХреНрд╕-рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд▓рд╛рдн, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдЬреАрдкреАрдпреВ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╣реИред
рд╕рд░рдлреЗрд╕рд┐рдВрдЧрд▓рд░ рдХреНрдпрд╛ рд╣реИ
рд╕рд░рдлреЗрд╕рдлреНрд▓рд┐рдВрдЧрд░ - рдПрдХ рджреЗрд╢реА рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗрд╡рд╛, рдЧреНрд░рд╛рдлрд┐рдХ рдкрд░рддреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкреНрд░рдмрдВрдзрдХред
рдмрд╛рдЗрдВрдбрд░ рдЖрдИрдкреАрд╕реА рдФрд░
рд╕рд░рдлреЗрд╕рдлрд┐рдВрдЧрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:
рдЙрдмрдЯрди рд╕реНрдкрд░реНрд╢
рдЙрдмрдВрдЯреВ рдЯрдЪ рдбреЗрд╡рд▓рдкрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реНрд╡рдпрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реЗрд╡рд╛рдПрдВ рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ -
рдЙрдмрдВрдЯреВ рдЯрдЪ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдпрд╛
рдУрдкрдирдиреЗрдЯ рдкрд░ рдПрдХ
рдиреЛрдЯ рдореЗрдВ ред
рдмреЗрд╕ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп
рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдмреА 4.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдпрд╛
рд╕рд╛рдЗрдЬреЗрдирдореЙрдб-10.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реАрдПрдо
рд╕рдмрдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА -
phablet.ubuntu.com/gitweb )ред
рджрд▓рд╡рд┐рдХ рдФрд░
рдЬрд╛рд╡рд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдХреЛ рдЗрд╕рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдореВрд▓ рднрд╛рдЧ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛рдПрдВ рдФрд░
рдПрдЪрдПрдПрд▓ рдмрд╛рдХреА рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк
рдПрдУрдПрд╕рдкреА 4.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореВрд▓ рдПрдкреАрдЖрдИ рдХреЛ 4.1 рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдпрд╛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдирд┐рд░реНрджреЗрд╢, рдФрд░ рд░рд┐рд▓реАрдЬ рд╕реЗ рд░рд┐рд▓реАрдЬ рддрдХ рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рд╕реЗ рдЖрдЪреНрдЫрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реИред
рдпреВрдЯреА рдШрдЯрдХ
рдЪреЗрд░реЛрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рдПрдХ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд
рдпреВрдХреНрд░реЛрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЕрдВрд╢:
static int ubuntum(void *a) { chroot("/data/ubuntu"); chdir("/"); char *const envp[8] = { "container=aal", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "SHELL=/bin/bash", "HOME=/root", "USER=root", "USERNAME=root", "LOGNAME=root", NULL }; execle("/sbin/init", "/sbin/init", "--verbose", NULL, envp); return 0; }
рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдЙрдмрдВрдЯреВ рдХреЗ
рдЪреЗрд░реЛрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП,
рд▓рд┐рдмрд╛рдпрдмреНрд░рд┐рд╕ рддрдВрддреНрд░ рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдЙрдмрдВрдЯреВ рдЯрдЪ рдШрдЯрдХ
рдпреВрдЯреА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рд╕реЗ рд╕реВрдк рдХреЛ
~ рдлреИрдмрд▓реЗрдЯ-рдЯреАрдо рд▓реИрдирдЪреИрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:
рдирд╡реАрдирддрдо рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
bzr branch lp:platform-api bzr branch lp:qtubuntu
рдЙрдмрдВрдЯреВ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо рдПрдкреАрдЖрдИ
рдЙрдмрдВрдЯреВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (рдПрдВрдбреНрд░реЙрдЗрдб) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд╣реИред
рддрд░реАрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:- ubuntu_application_ui_show_surface
- ubuntu_application_ui_hide_surface
- ubuntu_application_ui_move_surface_to
- ubuntu_application_ui_resize_surface_to
Doc / mainpage.md рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдПрдкреА рд╕реНрд░реЛрдд рдХреЗ рдкреЗрдбрд╝ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рд╢рд╛рдорд┐рд▓ - рд╕рд╛рд░ рдШреЛрд╖рдгрд╛ рдордВрдЪ рдПрдкреАрдЖрдИ
- Android - Android рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо API рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдБрдЧрд╛ - Android 4.2 рдХреЗ рд▓рд┐рдП)
рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ
/ ubuntu / рдЖрд╡реЗрджрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред
рдбреЗрдмрд┐рдпрди / рдирд┐рдпрдВрддреНрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐:
Package: libplatform-api1-hybris Depends: libhybris Description: Hybris implementation of the Platform API (runtime) This package provides the hybris implementation of the Platform API. The produced library should be used via libhybris, to communicate with the Android userspace, which is where the Ubuntu Application Manager lives.
рд╣рд╛рдБ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐
рдПрдВрдбреНрд░реЙрдЗрдб / рд╣рд╛рдЗрдмреНрд░рд┐рд╕ / рдПрдВрдбреНрд░реЙрдЗрдб.mk рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ
libubuntu_application_api рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдПрдВрдбреНрд░реЙрдЗрдб
рд▓рд┐рдмрд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб
рдпреВрдЬрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
LOCAL_SRC_FILES := \ ubuntu_application_api_for_hybris.cpp \ ubuntu_application_gps_for_hybris.cpp \ ubuntu_application_sensors_for_hybris.cpp \ ../default/default_ubuntu_application_sensor.cpp \ ../default/default_ubuntu_application_ui.cpp \ ../default/default_ubuntu_ui.cpp \ application_manager.cpp LOCAL_MODULE := libubuntu_application_api LOCAL_SHARED_LIBRARIES := \ libandroidfw \ libbinder \ libutils \ libgui \ libEGL \ libGLESv2 \ libhardware \ libhardware_legacy
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдПрдкреАрдЖрдИ / src / рдПрдВрдбреНрд░реЙрдЗрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рдЕрдкреНрд░рд╛рдкреНрдп рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
CMakeLists.txt рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА glibc рдХреЗ рд▓рд┐рдП рдЪрд▓ рд░рд╣реА рд╣реИред
рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рд╣реИ -
ubuntu_application_api.cpp , рдЬрд┐рд╕реЗ рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ:
extern void *android_dlopen(const char *filename, int flag); extern void *android_dlsym(void *handle, const char *symbol);
- рдПрдВрдбреНрд░реЙрдЗрдб рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рд╕реЗ рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд▓рд┐рдмрд╛рдпрдмреНрд░рд┐рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдирд╛ ред
struct Bridge { static const char* path_to_library() { return "/system/lib/libubuntu_application_api.so"; } Bridge() : lib_handle(android_dlopen(path_to_library(), RTLD_LAZY)) { assert(lib_handle && "Error loading ubuntu_application_api"); } ....... void* resolve_symbol(const char* symbol) const { return android_dlsym(lib_handle, symbol); } void* lib_handle; };
-
libubuntu_application_api.so рд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкреБрд▓, рдЬреЛ рджреЗрд╢реА рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ "рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ"
рдПрдВрдбреНрд░реЙрдЗрдб / рд╣рд╛рдЗрдмреНрд░рд┐рд╕ / рдПрдВрдбреНрд░реЙрдЗрдбрдПрдордХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рд╣реИред
#define IMPLEMENT_VOID_FUNCTION3(symbol, arg1, arg2, arg3) \ void symbol(arg1 _1, arg2 _2, arg3 _3) { \ static void (*f)(arg1, arg2, arg3) = NULL; \ DLSYM(&f, #symbol); \ f(_1, _2, _3); } ....... IMPLEMENT_VOID_FUNCTION2(ubuntu_application_ui_init, int, char**); IMPLEMENT_FUNCTION0(StageHint, ubuntu_application_ui_setup_get_stage_hint); IMPLEMENT_FUNCTION0(FormFactorHint, ubuntu_application_ui_setup_get_form_factor_hint); IMPLEMENT_VOID_FUNCTION1(ubuntu_application_ui_start_a_new_session, SessionCredentials*); IMPLEMENT_VOID_FUNCTION2(ubuntu_application_ui_set_clipboard_content, void*, size_t); .......
-
libubuntu_application_api.so рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрдкреАрдЖрдИ рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ред
рддреЛ, рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП:- libubuntu_application_api.so - рдмрд╛рдпреЛрдирд┐рдХ рдХреЗ рддрд╣рдд рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдПрдВрдбреНрд░реЙрдЗрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ;
- libubuntu_application_api.so - glibc рдХреЗ рддрд╣рдд рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, linux userpace (chroot) рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, libhybris рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдг рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрджрд┐ рдЖрдк
рдорд░реНрдЬ-153874 рдЪрд░реНрдЪрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдкрд░ рдЙрдирдХреА рдмрд╣рд╕ рдХреЛ
рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдХрд╛рди рдлреАрдХрд╛ рдкрдбрд╝ рдЬрд╛рдПрдВрдЧреЗред
Ubuntu рдЖрд╡реЗрджрди рдкреНрд░рдмрдВрдзрдХ
рдЙрдмрдВрдЯреВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛
, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдПрдкреА / рдПрдВрдбреНрд░реЙрдЗрдб / рд╣рд╛рдЗрдмреНрд░рд┐рд╕ рдореЗрдВ, рдЙрдмрдВрдЯреБрдкреНрдкрд╛рдордиреЗрдЧрд░ рдХреЗ рд╕реНрд░реЛрдд рд╣реИрдВ - рдЙрдмрдВрдЯреВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕, рдпрд╣
рдПрдВрдбреНрд░реЙрдЗрдб рдпреВрдЬрд░реНрд╕рд╕реНрдкреЗрд╕ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдФрд░,
рдПрдВрдбреНрд░реЙрдЗрдб рдкреАрдХреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ
рд▓рд┐рдмрд╛рд╕рддреБ_рдПрдкреНрд▓рд┐рдХреЗрд╢рди_рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░
рдмрд┐рдВрджрд░ рдЖрдИрдкреАрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред
LOCAL_SRC_FILES:= \ application_manager.cpp \ default_application_manager.cpp \ LOCAL_MODULE:= ubuntuappmanager LOCAL_MODULE_TAGS := optional LOCAL_SHARED_LIBRARIES := \ libbinder \ libinput \ libgui \ libskia \ libandroidfw \ libutils \ libEGL \ libGLESv2 \ libubuntu_application_api
рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ,
default_application_manager.h рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░
рдбрд╛рд▓рддрд╛ рд╣реИ :
void update_app_lists(); void binderDied(const android::wp<android::IBinder>& who); void register_a_surface(...); void request_fullscreen(...); int get_session_pid(const android::sp<android::IApplicationManagerSession>& session); void focus_running_session_with_id(int id); void unfocus_running_sessions(); int32_t query_snapshot_layer_for_session_with_id(int id); android::IApplicationManagerSession::SurfaceProperties query_surface_properties_for_session_id(int id); void switch_focused_application_locked(size_t index_of_next_focused_app); void switch_focus_to_next_application_locked(); void kill_focused_application_locked(); void start_a_new_session( int32_t session_type, int32_t stage_hint, const android::String8& app_name, const android::String8& desktop_file, const android::sp<android::IApplicationManagerSession>& session, int fd);
QtUbuntu
рд╣рдо рдпреВрдмреАрдЯреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдПрдкреАрдЖрдИ рдФрд░ рдХреНрдпреВрдЯреА / рдХреНрдпреВрдПрдордПрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдпреВрдЯреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк
Qt Platform Abstraction рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдордВрдЪ рд╕реЗ рд╕рд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИ, рдЬрд┐рд╕ рдкрд░ Qt рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд QPA рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
QPA рдкреНрд▓рдЧрдЗрди createPlatformWindow рдЬреИрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ
рдХрд░рддрд╛ рд╣реИ , рдФрд░ рдлрд┐рд░ Qt рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬрдм рдпрд╣ рдПрдХ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ abstraction рдкреНрд▓рдЧрдЗрди рд╕реЗ
createPlatformWindow рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрдмрдВрдЯреВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдкреАрдП рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
~/ubuntu/qtubuntu $ tree . тФЬтФАтФА qtubuntu.pro тФЬтФАтФА src тФВ тФЬтФАтФА modules тФВ тФВ тФЬтФАтФА application <------------------ QML plugin тФВ тФВ тФВ тФЬтФАтФА application.cc | Ubuntu Application Manager тФВ тФВ тФВ тФЬтФАтФА application.h | QtQuick тФВ тФВ тФВ тФЬтФАтФА application.pro | тФВ тФВ тФВ тФЬтФАтФА application_image.cc | тФВ тФВ тФВ тФЬтФАтФА application_image.h | тФВ тФВ тФВ тФЬтФАтФА application_list_model.cc | тФВ тФВ тФВ тФЬтФАтФА application_list_model.h | тФВ тФВ тФВ тФЬтФАтФА application_manager.cc | тФВ тФВ тФВ тФЬтФАтФА application_manager.h | тФВ тФВ тФВ тФЬтФАтФА application_window.cc | тФВ тФВ тФВ тФЬтФАтФА application_window.h | тФВ тФВ тФВ тФЬтФАтФА input_filter_area.cc | тФВ тФВ тФВ тФЬтФАтФА input_filter_area.h | тФВ тФВ тФВ тФЬтФАтФА logging.h | тФВ тФВ тФВ тФЬтФАтФА plugin.cc | тФВ тФВ тФВ тФФтФАтФА qmldir | тФВ тФВ тФЬтФАтФА ---------------------------------- тФВ тФВ тФФтФАтФА modules.pro тФВ тФЬтФАтФА platforms тФВ тФВ тФЬтФАтФА base тФВ тФВ тФЬтФАтФА platforms.pro тФВ тФВ тФФтФАтФА ubuntu <-------------- QPA тФВ тФВ тФЬтФАтФА clipboard.cc тФВ тФВ тФЬтФАтФА clipboard.h тФВ тФВ тФЬтФАтФА input.cc тФВ тФВ тФЬтФАтФА input.h тФВ тФВ тФЬтФАтФА integration.cc <-- `createPlatformWindow` тФВ тФВ тФЬтФАтФА integration.h тФВ тФВ тФЬтФАтФА main.cc тФВ тФВ тФЬтФАтФА screen.cc тФВ тФВ тФЬтФАтФА screen.h тФВ тФВ тФЬтФАтФА ubuntu.json тФВ тФВ тФЬтФАтФА ubuntu.pro тФВ тФВ тФЬтФАтФА window.cc тФВ тФВ тФФтФАтФА window.h тФВ тФФтФАтФА src.pro тФФтФАтФА tests
Ubuntu.pro рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдордВрдЪ
libubuntu_application_api.so рдХреЗ
рдЧреНрд▓рд┐рдм рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде
рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИрдПрдХреАрдХрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо API рд╕реЗрдЯ рд╕реЗ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ
редcc рдФрд░
window.cc :
#include <ubuntu/application/ui/ubuntu_application_ui.h> ubuntu_application_ui_start_a_new_session(&credentials); ubuntu_application_ui_destroy_surface(surface_); ubuntu_application_ui_create_surface(&surface_, "QUbuntuWindow", geometry.width(), geometry.height(), static_cast<SurfaceRole>(role), flags, eventCallback, this); ubuntu_application_ui_move_surface_to(surface_, geometry.x(), geometry.y()); ubuntu_application_ui_request_fullscreen_for_surface(surface_); ubuntu_application_ui_move_surface_to(surface_, rect.x(), rect.y()); ubuntu_application_ui_resize_surface_to(surface_, rect.width(), rect.height()); ubuntu_application_ui_request_fullscreen_for_surface(surface_); ubuntu_application_ui_show_surface(surface_); ubuntu_application_ui_hide_surface(surface_);
рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрдм рд╣рдорд╛рд░рд╛ Qt рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣
рдХреНрд╡рдмрдВрдЯреВ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ
QPA рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ -
QUbuntuIntegration :: createPlatformWindow рдПрдХреАрдХрд░рдг. cc рдлрд╝рд╛рдЗрд▓ рд╕реЗ:
QPlatformWindow* QUbuntuIntegration::createPlatformWindow(QWindow* window) { .......
Window.cc рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
qubuntuWindow рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо
qubuntuWindow :: createWindow () рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдкрд╛рддреЗ рд╣реИрдВ:
void QUbuntuWindow::createWindow() { ....... ubuntu_application_ui_create_surface( &surface_, "QUbuntuWindow", geometry.width(), geometry.height(), static_cast<SurfaceRole>(role), flags, eventCallback, this); ....... ubuntu_application_ui_move_surface_to(surface_, geometry.x(), geometry.y()); ....... }
рдпрд╣ рдмреЗрд╣рдж рдЕрд▓рдЧ-
рдерд▓рдЧ рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдХреЙрд▓
рдЙрдмрдВрдЯреВ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ
libubuntu_application_api.so рдХреЗ
рдЧреНрд▓рд┐рдмреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
libubuntu_application_api.so рдХреЗ рдмрд╛рдпреЛрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдПрдХ рдкреБрд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред
рдПрдкреАрдЖрдИ / рдПрдВрдбреНрд░реЙрдпрдб ред
рдХреНрдпрд╛ рд╣рдо рдХреВрдж рд░рд╣реЗ рд╣реИрдВ?рдЗрдЪреНрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП grep рдХреЗ рд╕рд╛рде рдХреВрджрддреЗ рд╣реБрдП, рд╣рдо
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдПрдкреАрдЖрдИ / рдПрдВрдбреНрд░реЙрдЗрдб / рдбрд┐рдлрд╝реЙрд▓реНрдЯ / default_ubuntu_application_ui.cpp рдкрд░ рдЖрддреЗ рд╣реИрдВ :
рд╣рдореЗрдВ рдмрд╕ matryoshka рдЦреЛрд▓рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐
ubuntu :: application :: ui :: рд╕рддреНрд░ рдФрд░, рддрджрдиреБрд╕рд╛рд░,
ubuntu :: application :: ui :: рднреВрддрд▓ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рд╡реЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ -
ubuntu_application_api_for_hybris.cpp :
namespace android { ....... struct Session : public ubuntu::application::ui::Session, public UbuntuSurface::Observer { ....... Session(.....) { ...... ubuntu::application::ui::Surface::Ptr create_surface( const ubuntu::application::ui::SurfaceProperties& props, const ubuntu::application::ui::input::Listener::Ptr& listener) { .......
рдкреБрд░рд╕реНрдХреГрдд рдХрд░реЗрдВ,
UbuntuSurface рдЦреЛрдЬреЗрдВ :
struct UbuntuSurface : public ubuntu::application::ui::Surface { ....... UbuntuSurface(const sp<SurfaceComposerClient>& client, .......) : ubuntu::application::ui::Surface(listener) {
рд╣рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ
рдорд┐рд▓рддреА рд╣реИ android :: SurfaceControl , рдЬреЛ
android рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ
:: SurfaceComposerClient () -> createSurface () ред
Android рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЙрд▓
:: SurfaceComposerClient (
рдЪреМрдЦрдЯреЗ / рдореВрд▓ / libs / gui / Surface.cpp ) рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛, рд╣рд┐рд▓рдирд╛, рдкрд░рддреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реБрдП, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрдм рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдЕрдЧрд▓реЗ рдХреНрдпреВрдЯреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреНрдпреВрдкреАрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЙрдмрдВрдЯреВ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рдЦреБрдж рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЙрдмрдВрдЯреВ рдЯрдЪ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрддреНрдордирд┐рд░реНрднрд░ рд╣реИред рдЖрдЧреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕реЗ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
Qmlscene рдФрд░
ubuntuappmanager рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рдореБрджреНрджреЗ,
рд╕рд░реНрдлреЗрд╕рдлреНрд▓рд┐рдВрдЧрд░ рдФрд░
InputDispatcher рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирдкреБрдЯ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЗрд╕ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рдХреЗ рдХреЛрдиреЛрдВ рд╕реЗ рдЕрдиреНрдп рдкреНрд░рд╢реНрди
рдЕрдирд╕реБрдирд╛ рд░рд╣ рдЧрдПред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИред
рдПрдХ рд╣рдлреНрддреЗ рдмрд╛рдж рдлреЛрди рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдУрдПрд╕ рдкрд░ рдЖ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдкрддрд╛ рд╣реИ ...