рдпрд╣ рд╕рдм рдПрдХ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдФрд░ рд╡рд╣рд╛рдБ - рдХреБрдЦреНрдпрд╛рдд GNOME рд╢реЗрд▓ (рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЬреАрдПрдЪ), рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдЬреЗрдПрд╕ рдкрд░ рдЗрддрдирд╛ рдЬреЗрдПрд╕ рдкрд░, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдФрд░ рдареАрдХ рд╣реИред
рдЙрд╕реА рд╕рдордп, рдореЗрд░реЗ рдХрд╛рдо рдХреА рдЧрддрд┐ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд░ рдореЗрдВ outlook.office.com
рдЯреИрдм рдХреЗ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдФрд░ рдЧреБрдЬрд╝рд▓рд┐рдВрдЧ рдЯрди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрд▓рд░ рдЦреЛрдЬрдиреЗ рдХреА рдорд╛рдВрдЧ рдХреА рд╣реИред рдФрд░ рдЕрдм рдореИрдВрдиреЗ рдкрд╛рдпрд╛, рд╣рдорд╛рд░реЗ рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ, рдПрдХ рдкрд░реЗрд╢рд╛рдиреА - рдореЗрд▓рд░ рдиреЗ рдореБрдЭреЗ рдирдП рдЕрдХреНрд╖рд░реЛрдВ рдХреА рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ - рдФрд░ рдзреНрд╡рдирд┐, рдФрд░ рдкреЙрдк-рдЕрдк рд╢рд┐рд▓рд╛рд▓реЗрдЦред
рдХреНрдпрд╛ рдХрд░реЗрдВ? рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рддреБрд░рдВрдд рдирд╣реАрдВ рдЖрдпрд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдЗрдХ рд▓рд┐рдЦрдирд╛ рдФрд░ / рдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ / рдХреЛрдб / рдЯрди рдореЗрдВ рдлрдВрд╕рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╣реИрдмрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред 1

рддрдХрдиреАрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ
рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ рдПрдХ рдмрдбрд╝рд╛ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдФрд░ рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди: 20 рдорд┐рдирдЯ, 40 рдорд┐рдирдЯ, 1 рдШрдВрдЯрд╛, 2 рдШрдВрдЯреЗ, 4, 8 рдФрд░ 24 рдШрдВрдЯреЗред 2 рд╣рд╛рдБ, рд╕рдордп рд╕реБрд╕реНрдд рдХреА рддрд░рд╣ред
рдПрдХреНрд╕рдЯреЗрдВрд╢рди.gnome.org рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ "рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм рдмрдЯрди" рдХрд╛ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдерд╛, рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм рдЯрд╛рдЗрдо рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред

Extension.gnome.org рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред
рдЧреАрдереБрдм рдкрд░ рд╕реНрд░реЛрдд: рд╕рд┐рддрд╛рд░реЛрдВ, рдХрд╛рдВрдЯрд╛, рд╕реБрдзрд╛рд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВред
рдЬреАрдПрдЪ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: рдирд┐рд░реНрджреЗрд╢
- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдмрдВрдЯреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЛрдо-рдЧрдиреЛрдо-рд╢реЗрд▓ рдкреИрдХреЗрдЬ, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдиреЗрдХреНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
sudo apt install chrome-gnome-shell
- рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:
- рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдЙрдмрдВрдЯреВ 18.04 рдореЗрдВ, рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрд░реЛрдо / рдХреНрд░реЛрдорд┐рдпрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рдлреЗрдбреЛрд░рд╛ рдореЗрдВ 28/29 - рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рджреЛрдиреЛрдВ
- рд╣рдо рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ https://extensions.gnome.org : рд╕рдХреНрд╖рдо рдХрд░реЗрдВ, рдЕрдХреНрд╖рдо рдХрд░реЗрдВ, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓реЗрдВред
- рд▓рд╛рдн!
рд╢реБрд░реБрдЖрдд
рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрдирд╛рдПрдБ:
$ gnome-shell-extension-tool --create-extension Name: Do Not Disturb Time Description: Disables notifications and sound for a period Uuid: dnd@catbo.net Created extension in '~/.local/share/gnome-shell/extensions/dnd@catbo.net'
рдЗрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ extension.js
рдлрд╝рд╛рдЗрд▓ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ, рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
function enable() {}
рдкрд╣рд▓рд╛ рдХреЛрдб
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдКрдкрд░реА рджрд╛рдИрдВ рдУрд░ Status Menu
рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╣реИред
рддреЛ рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ? рдУрд╣, рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ, рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рдЦрдВрдбрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди julio641742
рдФрд░ рдЗрд╕рдХреЗ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдпрд╣ рдХреЛрдб dndButton
рд╡рд░реНрдЧ рдХреА dndButton
рдХреБрдВрдЬреА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ - рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдЯреЗрдЯрд╕ рдореЗрдиреВ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдмрдЯрди рд╣реИред рдФрд░ рд╣рдо рдЗрд╕реЗ Main.panel.addToStatusArea () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреИрдирд▓ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред 3
рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдореЗрдиреВ рдЖрдЗрдЯрдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
let menuItem = new PopupMenu.PopupMenuItem("hello, world!"); menuItem.connect("activate", (menuItem, event) => { log("hello, world!"); }); dndButton.menu.addMenuItem(menuItem);
рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, julio641742! рд▓рд┐рдВрдХ:
https://github.com/julio641742/gnome-shell-extension-reference
рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред
GNOME рд╢реЗрд▓ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреАрдЪрд░реНрд╕
рдмрд╛рд╣рд░ 2018 рдХрд╛ рдЕрдВрдд рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Node.js / V8 рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рд╣реИред рд╕рднреА рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ "рдиреЛрдб" рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред
рд▓реЗрдХрд┐рди рдЧрдиреЛрдо рд╢реЗрд▓ рдФрд░ рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдкреВрд░реЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди, рдореЛрдЬрд╝рд┐рд▓рд╛ рдХрд╛ рд╕реНрдкрд╛рдЗрдбрд░рдореЛрдВрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд▓рд╛рддрд╛ рд╣реИред
рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓
Node.js рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (), рдФрд░ рдХреЛрдИ рдлреИрдВрд╕реА ES6- рдЖрдпрд╛рдд рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдпрд╛рдд рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
//const PanelMenu = require("ui/panelMenu"); const PanelMenu = imports.ui.panelMenu;
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдордиреЗ GNOME рд╢реЗрд▓ рдкреИрдХреЗрдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ js / ui / panelMenu.js рдореЙрдбреНрдпреВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рдкреЙрдк-рдЕрдк рдореЗрдиреВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЯрди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рдВ, рдЧрдиреЛрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рдкреИрдирд▓ рдХреЗ рд╕рднреА рдмрдЯрди рдкреИрдирд▓рдореИрдиреЛрдВ.рдЬреЗрдПрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рд╕рд╣рд┐рдд: рдмреИрдЯрд░реА рд╕рдВрдХреЗрддрдХ, рд╡рд╛рдИ-рдлрд╛рдИ, рдзреНрд╡рдирд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рд╣реА рдмрдЯрди; рдЗрдирдкреБрдЯ рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪ рдПрди-рдЖрд░рдпреВред
рдЕрдЧрд▓рд╛, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ imports.searchPath
- рдпрд╣ рдЙрди рд░рд╛рд╕реНрддреЛрдВ (рдкрдВрдХреНрддрд┐рдпреЛрдВ) рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд╣рд╛рдБ рд╣рдорд╛рд░реЗ JS рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдЯрд╛рдЗрдорд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрдо рдпреВрдЯрд┐рд▓реНрд╕.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдПрдХреНрд╕рдЯреЗрдВрд╢рди.рдЬреЗрдПрд╕ рдХреЗ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХреЗ рдкрд╛рд╕ рд░рдЦрд╛ред рд╕рдордп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрдпрд╛рдд рдХрд░реЗрдВред
// , - ~/.local/share/gnome-shell/extensions/<your-extension>/ const Me = imports.misc.extensionUtils.getCurrentExtension(); // imports.searchPath.unshift(Me.path); // const timeUtils = imports.timeUtils;
рд▓реЙрдЧрд┐рдВрдЧ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдЦреИрд░, рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Node.js рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рд▓реЙрдЧрд┐рдВрдЧ рд╣реИред рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ () рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдб рдореЗрдВ рдХрдИ рд▓реЙрдЧрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рджреЗрдЦреЗрдВ gjs /../ global.cpp, static_funcs:
- "рд▓реЙрдЧ" = g_message ("JS LOG:" + рд╕рдВрджреЗрд╢) - Stderr рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ, рдЙрджрд╛рд╣рд░рдг:
$ cat helloWorld.js log("hello, world"); $ gjs helloWorld.js Gjs-Message: 17:20:21.048: JS LOG: hello, world
- "logError" - рдЕрдкрд╡рд╛рдж рд╕реНрдЯреИрдХ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ:
- рдкрд╣рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ, рдлрд┐рд░ рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ
- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
try { throw new Error('bum!'); } catch(e) { logError(e, "what a fuck"); }
рдФрд░ рдпрд╣ рд╕реНрдЯрд╛рдЗрд▓рд░ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛:
(gjs:28674): Gjs-WARNING **: 13:39:46.951: JS ERROR: what a fuck: Error: bum! ggg@./gtk.js:5:15 ddd@./gtk.js:12:5 @./gtk.js:15:1
- "рдкреНрд░рд┐рдВрдЯ" = g_print ("% s \ n", txt); - рдХреЗрд╡рд▓ рдкрд╛рда + "\ n" stdout рдореЗрдВ, рдЙрдкрд╕рд░реНрдЧ рдФрд░ рд░рдВрдЧ рдХреЗ рдмрд┐рдирд╛, рд▓реЙрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд ()
- "рдореБрджреНрд░рдХ" = g_printerr ("% s \ n", txt) - рдкреНрд░рд┐рдВрдЯ рд╕реЗ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ stderr рдореЗрдВ
рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╕реНрдкрд╛рдЗрдбрд░рдордВрдХреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбрд┐рдмрдЧрд░ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реНрд░рдорд╕рд╛рдзреНрдп рд░реВрдк рд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрд▓рдмреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ!)ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк JSRDbg рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ , рджреЛ ред
рдХреНрдпрд╛ GNOME рд╢реЗрд▓ рдХреЗ рдмрд╛рд╣рд░ JS рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рд╣реИ?
рд╡рд╣рд╛рдБ рд╣реИ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреАрдпреВрдЖрдИ) рд╕рд╣рд┐рдд рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдкрдХреЛ рдЬреАрдПрд╕ рдмрд┐рдирд╛рд░, рдЬреЗрдПрд╕-рдЬреАрдЯреАрдХреЗ рдХреЛрдб рд▓рд╛рдВрдЪрд░, рдЬреАрдпреВрдЖрдИ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ which gjs /usr/bin/gjs $ dpkg --search /usr/bin/gjs gjs: /usr/bin/gjs $ cat gtk.js const Gtk = imports.gi.Gtk; Gtk.init(null); let win = new Gtk.Window(); win.connect("delete-event", () => { Gtk.main_quit(); }); win.show_all(); Gtk.main(); $ gjs gtk.js
рдКрдкрд░, рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреЛрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ред рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ "рдореБрдЦреНрдп" рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?
рдЕрдЬрдЧрд░ рдХрд╛ рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╣реИ:
if __name__ == "__main__": main()
Node.js рдореЗрдВ - рдЗрд╕реА рддрд░рд╣:
if (require.main === module) { main(); }
рдореБрдЭреЗ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрддреНрддрд░ Gjs / GH рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд╛рдардХ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ (рдХрд┐рд╕реА рдиреЗ "рдбреЙрд╕рд┐рдпреВрдбреЛрд╡рд╛" рдХреНрдпреЛрдВ рдкрдврд╝рд╛? рд╕рдореНрдорд╛рди!)ред
рддреЛ, рдореБрд╢реНрдХрд┐рд▓ рдЪрд╛рд▓ рд╡рд░реНрддрдорд╛рди рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ 2 рдпрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рд╣рдо рдореБрдЦреНрдп () рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ:
if ( new Error().stack.split(/\r\n|\r|\n/g).filter(line => line.length > 0) .length == 1 ) { main(); }
рд╕рд╛рдлрд╝
рдкреНрд░рддреНрдпреЗрдХ рдЧрдиреЛрдо рд╢реИрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдкреВрд░реЗ рдЧрдиреЛрдо рд╢реИрд▓ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднреА рднреА рдмрд┐рдирд╛ рдкрдврд╝реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ Notification Area
, рдКрдкрд░ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд, рдЪрд┐рддреНрд░ рдореЗрдВ рдирдВрдмрд░ 4 (рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреЗ рд╕рд╛рде рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣рд╛рдВ рдирд╣реАрдВ):

let unseenlist = Main.panel.statusArea.dateMenu._messageList._notificationSection._list;
рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреЗ, рдЕрдкрдард┐рдд рд╕реВрдЪрдирд╛рдПрдВ, рд╕реВрдЪрдирд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ:
let number = unseenlist.get_n_children(); unseenlist.connect("actor-added", () => { log("added!"); }); unseenlist.connect("actor-removed", () => { log("removed!"); });
рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрднреА-рдХрднреА рдпрд╣ рддрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЕрдм рдПрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбрд┐рд╕реЗрдмрд▓ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рд╣рд░ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЪрд╛рд▓реВ-рдмрдВрдж рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛рд░реНрдпрд╢реАрд▓ рдЬреАрдПрдЪ рдХреЛ рддреЛрдбрд╝ рди рд╕рдХреЗ:
function disable() { dndButton.destroy(); }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд╡рдпрдВ рдмрдЯрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдЕрднрд┐рдиреЗрддрд╛-рдЬреЛрдбрд╝рд╛" / "рдЕрднрд┐рдиреЗрддрд╛-рд╣рдЯрд╛рдП рдЧрдП" рдШрдЯрдирд╛рдУрдВ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
var signal = unseenlist.connect("actor-added", () => { log("added!"); }); function disable() { dndButton.destroy(); unseenlist.disconnect(signal); }
рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХреЛрдб рдЗрд╕реА рдШрдЯрдирд╛ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдореЗрдиреВ рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ ... рдЧрдиреЛрдо рд╢реЗрд▓ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдареАрдХ рд╣реИ, рд╣рд╛рдБ, рд╣рдо рдЗрд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╕рдо рдЦрд╛рдПрдВрдЧреЗ, рдкрддреНрдерд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ GNOME рд╢реЗрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ GNOME рдХреЛ рдЙрдбрд╝реЗрдВрдЧреЗред рдЕрд╕рд▓реА рддрд╕реНрд╡реАрд░, рдард╛ред
рдЗрд╕рд▓рд┐рдП рдЧрдиреЛрдо рд╢реИрд▓ / рдЬреАрдЬреЗ рджреЛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ, рдЧреНрд▓рд┐рдм / рдЬреАрдЯреАрдХреЗ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рд╣рдЬреАрд╡рди рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдЧреНрд▓рд┐рдм / рдЬреАрдЯреАрдХреЗ рдХреЛ рдЕрдкрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдмрдЯрди, рдЯрд╛рдЗрдорд░ рдЖрджрд┐) рдХреЗ рд╕реНрдкрд╖реНрдЯ рд░рд┐рд▓реАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ (рдХреБрдЫ рднреА рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред
рдирддреАрдЬрддрди, рдЬреИрд╕реЗ рд╣реА рд╣рдорд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ "рдкреНрд░рд╡рд╛рд╣" рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ https://extensions.gnome.org рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
GnomeSession.PresenceStatus.BUSY рдФрд░ DBus рдореЛрдбред
рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рднреВрд▓реЗ рд╣реИрдВ, рддреЛ рд╣рдо "рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм" рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред
GNOME рдХреЗ тАЛтАЛрдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдЬ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж, рд╕реВрдХреНрддрд┐-рд╕рддреНрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдзреНрд╡рдЬ рд╕реНрдерд┐рдд рд╣реИ: рдпрд╣ GsmPresencePStreet.status рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рд╕реВрдХреНрддрд┐-рд╕рддреНрд░, рд╕реВрдХреНрддрд┐-рд╕рддреНрд░ / gsm-present.c рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рд╣рдо рдбреАрдмреАрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдзреНрд╡рдЬ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рди рдХреЗрд╡рд▓ рд╣рдореЗрдВ, рдмрд▓реНрдХрд┐ рдЬреАрдПрдЪ рдХреЛ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬреАрдПрдЪ рд╕реНрд░реЛрдд рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:
this._presence = new GnomeSession.Presence((proxy, error) => { this._onStatusChanged(proxy.status); }); ... this._presence.connectSignal('StatusChanged', (proxy, senderName, [status]) => { this._onStatusChanged(status); });
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, _onStatusChanged рд╡рд┐рдзрд┐ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреА рд╣реИред рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд╣рдордиреЗ 4 рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдПрдХ рдзреНрд╡рдирд┐ рдереАред
рдореНрдпреВрдЯ / рдЕрдирдореНрдпреВрдЯ рдХрд░реЗрдВ
рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд▓реНрд╕рдПрдбрд┐рдпреЛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдХреБрдЦреНрдпрд╛рдд рдХрд╛рдо рдХреБрдЦреНрдпрд╛рдд рд▓реЗрдирд╛рд░реНрдЯ рдкреЛрдПрдЯрд░рд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓реЗрдЦрдХред рдЕрдм рддрдХ, рдореИрдВ PulseAudio рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕-рдкрд╛рд╕ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрддрд░ рдкрд░ PulseAudio рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдирд┐рдХрд▓рд╛ рдХрд┐ рдореНрдпреВрдЯ / рдЕрдирдореНрдпреВрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ pactl
рдЙрдкрдпреЛрдЧрд┐рддрд╛ pactl
, рдпрд╛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреАрди рдЖрджреЗрд╢ рджрд┐рдП рдЧрдП рд╣реИрдВ:
- "pactl info":
default sink
рдкрддрд╛ рд▓рдЧрд╛рдПрдВ - рдЬреЛ рдзреНрд╡рдирд┐ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдпрджрд┐ рдХрдИ рд╣реИрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдзреНрд╡рдирд┐ рд╣реИ - "рдкреИрдХреНрдЯ рд▓рд┐рд╕реНрдЯ рд╕рд┐рдВрдХ": рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдореНрдпреВрдЯ / рдЕрдирдореНрдпреВрдЯ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
- "рдкреИрдХреНрдЯрд▓ рд╕реЗрдЯ-рд╕рд┐рдВрдХ-рдореНрдпреВрдЯ% (рдбрд┐рдлреЙрд▓реНрдЯ рд╕рд┐рдВрдХ) s% (isMute) s": рдореНрдпреВрдЯ / рдЕрдирдЯреНрдпреВрдЯ рдХреЗ рд▓рд┐рдП
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдХрдорд╛рдВрдб / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЪрд▓рд╛рдирд╛ рд╣реИ, рдЙрдирдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯрдбрдЖрдЙрдЯ рдХреЛ рдкрдврд╝рдирд╛ рд╣реИ рдФрд░ рдирд┐рдпрдорд┐рдд рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдорд╛рдирдХ рдХрд╛рд░реНрдпред
рдЧрдиреЛрдо рдореЗрдВ, рдЧреНрд▓рд┐рдм рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рд╕реА рдореЗрдВ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдПрд╕ рд╣реИред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ Gjs рдкреИрдХреЗрдЬ рдиреЗ C-API рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ, "рд╕рд╣рдЬ" рдкрд░рдд рдмрдирд╛рдИ рдереАред рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдмрд┐рдирд╛ рдЧреЙрдЧрд▓рд┐рдВрдЧ рдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдирддреАрдЬрддрди, рдЙрддреНрдХреГрд╖реНрдЯ рдЬрд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж , рд╣рдореЗрдВ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ:
let resList = GLib.spawn_command_line_sync(cmd);
рдмрдЪрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХреЛрдИ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдмреЗрд╣рддрд░ рдПрдХ рд╣реИ, рдЬрд┐рд╕реЗ GSettings (рдпрд╣ рдПрдкреАрдЖрдИ рд╣реИ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ GNOME рдЬреЛрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ GUI рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддрд╛ рд╣реИ:

- рдкреНрд▓реЗрди рдЯреЗрдХреНрд╕реНрдЯ рдлрд╛рдЗрд▓реНрд╕ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реИ? - рдкреБрд░рд╛рдиреЗ рдФрд░ рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкреВрдЫреЗрдВред GSettings рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
const Gio = imports.gi.Gio; settings = new Gio.Settings({ settings_schema: schemaObj }); settings.connect("changed::mute-audio", function() { log("I see, you changed it!"); });
рд╣рдорд╛рд░реЗ "рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм" рдореЗрдВ рдЕрдм рддрдХ рдХреА рдПрдХрдорд╛рддреНрд░ рд╕реЗрдЯрд┐рдВрдЧ "рдореНрдпреВрдЯ-рдСрдбрд┐рдпреЛ" рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "рд╢рд╛рдВрдд рдШрдВрдЯреЗ" рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдзреНрд╡рдирд┐ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдФрд░ рдереЛрдбрд╝рд╛ рдХреНрд▓рд╛рд╕рд┐рдХ, рдЬреАрдЯреАрдХреЗ рдЬреАрдпреВрдЖрдИ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдФрд░ рдЧрдВрджреЗ рдкрдВрдЬреЗ рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдВ) рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, GH рд╣рдореЗрдВ GUI рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░реАрдлрд╝реЗрдХреНрд╕реН рдлрд╛рдЗрд▓ рдХреЗ buildPrefsWidget () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, "рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдЯрди "рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ" рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕реБрдВрджрд░рддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред
рдЖрдЗрдП рдПрдХ рдЕрд▓рдЧ About рдЯреИрдм рдмрдирд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ Ebout рдХреЗ рдмрд┐рдирд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рдЖрдо рддреМрд░ рдкрд░, рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреАрдЯреАрдХреЗ рдореЗрдВ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ,
рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
- Gtk.Notebook рдПрдХ рдЯреИрдм рд╣реИ, рдЬреИрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ
- Gtk.VBox рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреА рд╕реВрдЪреА рдХреЛ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИ
- Gtk.Label рдПрдХ рдореВрд▓ рддрддреНрд╡, рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ HTML рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ
function buildPrefsWidget() {
рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:

рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
1. рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб: рд╕рдорд░реНрдерди рдФрд░ рд╕рдВрдЪрд╛рд▓рдирдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдХрд╛рдо рдореЗрдВ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 2 рдореЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
1) рд╕рдорд░реНрдерди рдореЛрдб рдореЗрдВ, рдЬрдм рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдкрд░ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдореЗрд▓, рд╕реНрд▓реИрдХ, рд╕реНрдХрд╛рдЗрдк рдФрд░ рдмрд╣реБрдд рдХреБрдЫ
2) рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдореЗрдВ, рдЬрдм рдХрдо рд╕реЗ рдХрдо 20 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЕрдиреНрдпрдерд╛ рдлреЛрдХрд╕ рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рд╢реНрд░рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдирдЧрдгреНрдп рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм рдореЛрдб рдЙрдкрдпреЛрдЧреА рд╣реИред
2. рдзреНрд╡рдирд┐ рдХреЛ рдХреИрд╕реЗ рдмрдВрдж рдХрд░реЗрдВрдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреВрд░реНрдг рдореМрди, рдореМрди, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рджрд░рдЕрд╕рд▓, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЖрдк рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рд╕реНрд▓реИрдХ / рд╕реНрдХрд╛рдЗрдк рдХреЛ рдбреВ рдиреЙрдЯ рдбрд┐рд╕реНрдЯрд░реНрдм рдореЛрдб рдореЗрдВ рд╕реБрдирд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдзреНрд╡рдирд┐рдпрд╛рдВ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реВрдЪрдирд╛рдПрдВ) рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдирд┐ рдПрдкреАрдЖрдИ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ), рдХреЗрд╡рд▓ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо / рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрд▓реНрд╕рдкреНрд░рд┐рдВрдЧ рдореЗрд▓рд░ рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ audio
рдЯреИрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рдмрдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рд╕реНрд▓реИрдХ рдХреЙрд▓ рдореЗрдВ рднрд╛рд╖рдг рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
3. рдкреИрдирд▓рдореЗрдиреБ.рдмрдЯрдиPanelMenu.Button - рдпрд╣ рдкреИрдирд▓ + рдкреЙрдк-рдЕрдк рдореЗрдиреВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЯрди рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдХреЛ рдШрд╛рд╡ рдкрд░ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА! рдореИрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдирдзрд┐рдХреГрдд рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдХреЛрдб рдХреА рдирдХрд▓ рдХреАред
4. рд╕реЗрдЯрд╕реНрдЯреИрдЯрд╕реИрдореЛрдЯ ()рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SetStatusRemote () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдЖрд░рдВрдн рдХрд░реЗрдВред