ããã¯ãã¹ãŠã1ã€ã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ã«ç§»è¡ããããšããå§ãŸããŸãããããã«ã¯ãJavascriptã®æªåé«ã GNOME ShellïŒç¥ããŠGHïŒããããŸãã JSã§ã¯ãJSã§æ©èœããŸã-ãããŠå€§äžå€«ã§ãã
åæã«ããã©ãŠã¶ãŒã®outlook.office.com
ã¿ãã®æ°ã¡ã¬ãã€ãã®ãã¬ãŒãã³ã°ãšã¬ãã£ã¬ãã£ã§ã¯ãªããç§ã®ä»äºã®ããŒã¹ã¯é·ãéãéåžžã®ã¡ãŒã©ãŒãèŠã€ããããšãèŠæ±ããŠããŸããã ãããŠä»ãç§ã¯ãç§ãã¡ã®æ代ã«ã¯ãããã€ãã®ã»ãŒåªç§ãªåè£è
ãããããšãçºèŠããŸããã1ã€ã®åé¡-ã¡ãŒã©ãŒã¯æ°ããæçŽã®éç¥ã§ç§ãååŸãå§ããŸãã-ãããŠé³ãšãããã¢ããç¢æã
ã©ããã Do Not Disturbæ¡åŒµæ©èœãäœæãããšãã決å®ã¯ããã«ã¯åŸãããŸããã§ãããèªè»¢è»ãäœæããããéçºã§åæºããããã³ãŒãããšã©ãŒã倧éã«çºçãããããããšã¯æ¬åœã«æã¿ãŸããã§ããããä»ã§ã¯Habrãšçµéšãå
±æããããšèããŠããŸãã 1

æè¡çèŠä»¶
欲ããã§ã 倧ãã éžæããæéã«éç¥ãšé³ããªãã«ãããã¿ã³ïŒ20åã40åã1æéã2æéã4ã8ã24æéã 2ãããã¹ã©ãã¯ã®ãããªã¿ã€ãã³ã°ã
extensions.gnome.orgã®æ¡åŒµéšåã«ã¯ããDo Not Disturb Buttonããšããæ¡åŒµæ©èœããããæ¡åŒµæ©èœã Do Not Disturb Timeããèšè¿°ããããã®ã¢ãã«ãšããŠæ©èœããŸãã ã

extensions.gnome.orgããã€ã³ã¹ããŒã«ããŸãã
githubã®ãœãŒã¹ïŒæããã©ãŒã¯ãå
¥ããŠãæ¹åãæäŸããŸãã
GHæ¡åŒµæ©èœã®ã€ã³ã¹ããŒã«æ¹æ³ïŒæé
- UbuntuãäŸãšããŠäœ¿çšããŠããã©ãŠã¶ãŒã³ãã¯ã¿ã§ããchrome-gnome-shellããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
sudo apt install chrome-gnome-shell
- ãªã³ã¯ãã¯ãªãã¯ããŠããã©ãŠã¶ãŒæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŸãã
- ãªã³ã¯ãã¯ãªãã¯ããŠãã©ãŠã¶æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŠãã ãã
- Ubuntu 18.04ã§ã¯ãChrome / Chromiumãã©ãŠã¶ãFedora 28/29-FirefoxãšChromiumã®äž¡æ¹ã§åäœããŸãã
- ãªã¹ã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' # gnome-shell Alt+F2, r, Enter # https:
察å¿ãããã£ã¬ã¯ããªã®extension.js
ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ãã§ããæå°ããŒãžã§ã³ã§ã¯ã次ã®ããã«ãªããŸãã
function enable() {}
æåã®ã³ãŒã
æåStatus Menu
äžã®ã¹ã¯ãªãŒã³ã·ã§ããã®ããStatus Menu
å³äžã®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ã·ã§ã«ããã³JavaScriptæ©èœ
å€éšã¯2018幎æ«ã§ãããNode.js / V8ã¯Javascriptã³ãŒããå®è¡ããããã®ã¡ã€ã³ããŒã«ã§ãã ææ°ã®Webéçºã¯ãã¹ãŠãããŒããã«åºã¥ããŠããŸãã
ãã ããGNOMEã·ã§ã«ãšãã®åšèŸºã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãç°ãªãJavaScriptãšã³ãžã³ã§ããMozillaã®SpiderMonkeyã䜿çšããŠãããããããã©ãŒãã³ã¹ã«å€ãã®éèŠãªéããçããŸãã
ã¢ãžã¥ãŒã«ã®ã€ã³ããŒã
Node.jsãšã¯ç°ãªããrequireïŒïŒã¯ãªãã掟æãªES6-importããããŸããã 代ããã«ãç¹å¥ãªimportsãªããžã§ã¯ããããããã®å±æ§ã«ã¢ã¯ã»ã¹ããŠã¢ãžã¥ãŒã«ãããŒãããŸãïŒ
//const PanelMenu = require("ui/panelMenu"); const PanelMenu = imports.ui.panelMenu;
ãã®å Žåããããã¢ããã¡ãã¥ãŒãåãããã¿ã³ã®æ©èœãå®è£
ããGNOME Shellããã±ãŒãžã©ã€ãã©ãªããjs / ui / panelMenu.jsã¢ãžã¥ãŒã«ãããŠã³ããŒãããŸããã
ã¯ããGNOMEã䜿çšããææ°ã®Linuxãã¹ã¯ãããã®ããã«ã«ãããã¹ãŠã®ãã¿ã³ã¯ãpanelMenu.jsã«åºã¥ããŠããŸãã å«ãïŒããããªãŒã€ã³ãžã±ãŒã¿ãŒãWi-fiãé³éã®åãå³ãã¿ã³ã å
¥åèšèªã¹ã€ããen-ruã
次ã«ãç¹å¥ãªå±æ§imports.searchPath
ããããŸã-ããã¯ãJSã¢ãžã¥ãŒã«ãæ€çŽ¢ããããã¹ïŒè¡ïŒã®ãªã¹ãã§ãã ããšãã°ãã¿ã€ããŒé¢æ°ãå¥ã®timeUtils.jsã¢ãžã¥ãŒã«ã«å²ãåœãŠãæ¡åŒµæ©èœã®å
¥åãã€ã³ãextension.jsã®è¿ãã«é
眮ããŸããã 次ã®ããã«timeUtils.jsãã€ã³ããŒãããŸãã
// , - ~/.local/share/gnome-shell/extensions/<your-extension>/ const Me = imports.misc.extensionUtils.getCurrentExtension(); // imports.searchPath.unshift(Me.path); // const timeUtils = imports.timeUtils;
ãã®ã³ã°ãJavascriptã®ãããã°
Node.jsããªããããç¬èªã®ãã®ã³ã°ããããŸãã console.logïŒïŒã®ä»£ããã«ãã³ãŒãã§ããã€ãã®ãã®ã³ã°é¢æ°ã䜿çšã§ããŸããgjs/../ global.cppãstatic_funcsãåç
§ããŠãã ããã
- "log" = g_messageïŒ "JS LOGïŒ" + messageïŒ-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"); }
ãããŠãããã¯ã¹ã¿ã€ã«ã§stderrã«æç»ããŸãïŒ
(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
- "print" = g_printïŒ "ïŒ
s \ n"ãtxtïŒ; -logïŒïŒãšã¯ç°ãªããstdoutã®ããã¹ã+ "\ n"ã®ã¿ãæ¥é èŸãšè²ä»ããªã
- "printerr" = g_printerrïŒ "ïŒ
s \ n"ãtxtïŒ-å°å·ãšã®éãã¯stderrã®éãã§ã
ããããããã«äœ¿ããSpiderMonkeyçšã®ãããã¬ã¯ãããŸããïŒãã®ã³ã°ã«äœ¿çšã§ãããã¹ãŠã®ããŒã«ãããèŠåŽããŠæžããã®ã¯ç¡é§ã§ã¯ãããŸããã§ããïŒïŒã å¿
èŠã«å¿ããŠãJSRDbgïŒ one ã twoãè©Šãããšãã§ããŸãã
GNOME Shellã®å€éšã«JSã³ãŒãã®å¯¿åœã¯ãããŸããïŒ
ãããŸãã ã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒGUIïŒãå«ããã«æ©èœã®ã¢ããªã±ãŒã·ã§ã³ã¯ãJavascriptã§èšè¿°ã§ããŸãã GUIãŠã£ã³ããŠã®äœæäŸã§ãããjs-GTKã³ãŒãã©ã³ãã£ãŒã§ããgjs binarã䜿çšããŠå®è¡ããå¿
èŠããããŸãã
$ 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
äžèšã§ãã³ãŒããã¢ãžã¥ãŒã«ã«åå²ããJavascriptããããŒãããããšã«èšåããŸããã åé¡ãçºçããŸãããã¢ãžã¥ãŒã«èªäœã§ãã¡ã€ã³ãã¢ãžã¥ãŒã«ãšããŠèµ·åãããããå¥ã®ã¢ãžã¥ãŒã«ããããŒããããããå€æããã«ã¯ã©ãããã°ããã§ããïŒ
Pythonã«ã¯æ¬ç©ã®æ§é ããããŸãã
if __name__ == "__main__": main()
Node.jsã§-åæ§ã«ïŒ
if (require.main === module) { main(); }
Gjs / GHã«å¯Ÿãããã®è³ªåã«å¯Ÿããå
¬åŒã®åçã¯èŠã€ãããŸããã§ããããèªè
ãšå
±æããã®ãæ¥ããããªãã¯ããã¯ãæãã€ããŸããïŒãªã誰ãããdosyudovaããèªãã ã®ã§ããïŒ
ãããã£ãŠãããªãããŒãªããªãã¯ã¯ãçŸåšã®ã³ãŒã«ã¹ã¿ãã¯ã®åæã«åºã¥ããŠããŸãã2è¡ä»¥äžã§æ§æãããŠããå ŽåãmainïŒïŒã¢ãžã¥ãŒã«ã«ã¯å«ãŸããŸããã
if ( new Error().stack.split(/\r\n|\r|\n/g).filter(line => line.length > 0) .length == 1 ) { main(); }
ããŠã¹ããŒãã³ã°
åGNOMEã·ã§ã«æ¡åŒµæ©èœã¯ãGNOMEã·ã§ã«å
šäœã®ãã¹ãŠã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããŸãã ããšãã°ããŸã æªèªã®éç¥ã®æ°ã衚瀺ããã«ã¯ãäžã®äžå€®ã«ãã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!"); });
ããã¯åé¡ãããŸãããããŠãŒã¶ãŒã¯Xæ¡åŒµæ©èœãäžèŠã«ãªã£ããšå€æãããã¿ã³ãã¯ãªãã¯ããŠæ¡åŒµæ©èœãç¡å¹ã«ããããšãã§ããŸãã æ¡åŒµæ©èœã®å Žåãããã¯disableïŒïŒé¢æ°ãåŒã³åºãããšãšåçã§ãããç¡å¹ã«ããæ¡åŒµæ©èœãåäœäžã®GHãç Žå£ããªãããã«ããããåªåãæãå¿
èŠããããŸãã
function disable() { dndButton.destroy(); }
ãã®å Žåããã¿ã³èªäœãåé€ããããšã«å ããŠãã€ãã³ããactor-addedã/ãactor-removedãã®ç»é²ã解é€ããå¿
èŠããããŸããäŸïŒ
var signal = unseenlist.connect("actor-added", () => { log("added!"); }); function disable() { dndButton.destroy(); unseenlist.disconnect(signal); }
ãããè¡ãããªãå Žåããã³ãã©ãŒã®ã³ãŒãã¯å¯Ÿå¿ããã€ãã³ãã§åŒã³åºããç¶ããããååšããªãã¡ãã¥ãŒãã¿ã³ã®ç¶æ
ãæŽæ°ããããšããŸã... GNOME Shellã¯å€±æãå§ããŸãã ãããã¯ããç§ãã¡ã¯ãããããŸãããŠãŒã¶ãŒã¯èªããŸããç³ã¯GNOMEã·ã§ã«éçºè
ãšGNOMEå
šè¬ã«é£ã¶ã§ãããã å®éã®ç»åãThã
GNOME Shell / Gjsã¯ãGlib / GTKãšJavascriptã®2ã€ã®ã·ã¹ãã ã®å
±çã§ããããªãœãŒã¹ç®¡çãžã®ã¢ãããŒããç°ãªããŸãã Glib / GTKã§ã¯ããªãœãŒã¹ïŒãã¿ã³ãã¿ã€ããŒãªã©ïŒãæ瀺çã«è§£æŸããå¿
èŠããããŸãã ãªããžã§ã¯ããJavascriptãšã³ãžã³ã«ãã£ãŠäœæãããå Žåãéåžžã©ããåäœããŸãïŒäœããªãªãŒã¹ããŸããïŒã
ãã®çµæãæ¡åŒµæ©èœã®æºåãæŽããããããŒãããªããªããšããã«ã https://extensions.gnome.orgã§å®å
šã«å
¬éã§ããŸã ã
GnomeSession.PresenceStatus.BUSYããã³DBusã¢ãŒãã
å¿ããŠããªãå Žåã¯ããŠãŒã¶ãŒãžã®éç¥ã®è¡šç€ºããªãã«ããæ¡åŒµæ©èœããµã€ã¬ã³ãããå®è¡ããŠããŸãã
GNOMEã«ã¯ãã§ã«ãã®ç¶æ
ãæ
åœãããã©ã°ããããŸãã ãŠãŒã¶ãŒããã°ã€ã³ãããšãgnome-sessionããã»ã¹ãäœæããããã®ãã©ã°ãé
眮ãããŸããããã¯GsmPresencePrivate.statuså±æ§ã§ããgnome-sessionã®ãœãŒã¹ãgnome-session / gsm-presence.cãåç
§ããŠãã ããã DBusã€ã³ã¿ãŒãã§ã€ã¹ïŒãã®ãããªããã»ã¹ééä¿¡ïŒãä»ããŠãã®ãã©ã°ã«ã¢ã¯ã»ã¹ã§ããŸãã
ç§ãã¡ã ãã§ãªããGHèªäœãéç¥ã衚瀺ããªãããã«ãã®ãã©ã°ã«é¢ããæ
å ±ãå¿
èŠã§ãã ããã¯GHãœãŒã¹ã§èŠã€ããã®ã«ååç°¡åã§ãïŒ
this._presence = new GnomeSession.Presence((proxy, error) => { this._onStatusChanged(proxy.status); }); ... this._presence.connectSignal('StatusChanged', (proxy, senderName, [status]) => { this._onStatusChanged(status); });
ãã®å Žåã_onStatusChangedã¡ãœããã¯ç¶æ
ã®å€åã«å¿çãããã³ãã©ãŒã§ãã ãã®ã³ãŒããèªåèªèº«ã«ã³ããŒããŠé©çšããŸãã4ã€ã®éç¥ãèŠã€ããé³ãããŸããã
ãã¥ãŒã/ãã¥ãŒã解é€
ææ°ã®Linuxãã¹ã¯ãããã¯ãPulseAudioã«ãã£ãŠå¶åŸ¡ãããŸãã æªåé«ãä»äº æªåé«ãã¬ããŒãã»ããšã¿ãªã³ã°ã®ããã°ã©ã å¶äœè
ã ãããŸã§ãPulseAudioã®ã³ãŒããæã«å
¥ããããšã¯ãããŸããã§ããããPulseAudioãããçšåºŠç解ããæ©äŒãåŸãããããšãå¬ããæããŸããã
ãã®çµæããã¥ãŒã/ãã¥ãŒã解é€ã«ã¯ã1ã€ã®pactl
ãŠãŒãã£ãªãã£ããŸãã¯ããã«åºã¥ã3ã€ã®ã³ãã³ãã§ååã§ããããšãå€æããŸããã
- ãpactl infoãïŒ
default sink
èŠã€ãã-è€æ°ã®ãµãŠã³ãåºåãããå Žåãã©ã®ãµãŠã³ãåºåãããã©ã«ãã®ãµãŠã³ãã - ãpactl list sinksãïŒå¯Ÿå¿ããããã€ã¹ã®ãã¥ãŒã/ãã¥ãŒã解é€ã¹ããŒã¿ã¹ã確èªããŸã
- ãpactl set-sink-muteïŒ
ïŒdefaultSinkïŒsïŒ
ïŒisMuteïŒsãïŒãã¥ãŒã/ãã¥ãŒã解é€èªäœ
ãããã£ãŠãç§ãã¡ã®ã¿ã¹ã¯ã¯ãã³ãã³ã/ããã»ã¹ãå®è¡ãããããã®åºåstdoutãèªã¿åããå®æçã«ç®çã®å€ãæ€çŽ¢ããããšã§ãã èŠããã«ãæšæºã¿ã¹ã¯ã
GNOMEã§ã¯ãglibã³ã¢ã©ã€ãã©ãªãããã»ã¹ã®äœæãæ
åœããããã«åªããããã¥ã¡ã³ããããã€ããããŸãã ãããŠãã¡ãã圌女ã¯Cã«ããŸããJSãããŸãã Gjsããã±ãŒãžã¯ãC-APIãšJavascriptã®éã«ã¹ããŒãã§ãçŽæçãªãã¬ã€ã€ãŒãäœæããããšãç¥ãããŠããŸãã ããããäŸãå¿
èŠã§ãããã°ãŒã°ã«ãªãã§ã¯ã§ããªãããšãç解ããŠããŸãã
ãã®çµæãåªããèŠç¹ã®ãããã§ãåäœããã³ãŒããåŸãããŸãã
let resList = GLib.spawn_command_line_sync(cmd);
èšå®ãä¿åãã ã¬ãžã¹ããªå
ãã¡ãããLinuxã«ã¯ã¬ãžã¹ããªã¯ãããŸããã ããã§ã¯ãWindowsã§ã¯ãããŸããã GSettingsïŒããã¯APIïŒãšåŒã°ããããåªãããã®ããããããã€ãã®å®è£
ãªãã·ã§ã³ãèåŸã«é ãããŠããŸããããã©ã«ãã§ã¯ãGNOMEã¯Dconfã䜿çšããŸãã ããã¯ãGUIãã¬ãŒã ã¯ãŒã¯ã®å€èŠ³ã§ãã

-èšå®ããã¬ãŒã³ããã¹ããã¡ã€ã«ã«ä¿åãããããåªããŠãããã®ã¯äœã§ããïŒ -å€ãã²ããçãããLinuxãŠãŒã¶ãŒãå°ããŸãã 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!"); });
ãããŸã§ã®ããµã€ã¬ã³ããã®å¯äžã®èšå®ã¯ããã¥ãŒããªãŒãã£ãªããªãã·ã§ã³ã§ããŠãŒã¶ãŒã¯ãéããªæéããŸãã¯ãŠãŒã¶ãŒã®èŠæ±ãªãã«ãµãŠã³ãããªãã«ã§ããŸãã
å°ãã¯ã©ã·ãã¯ãªGTK GUI
æ¡åŒµæ©èœã®èšå®ããŠãŒã¶ãŒã«çŸãã衚瀺ããããã«ïŒãŸããæ±ãã足ã§ã¬ãžã¹ããªã«å
¥ããªãããã«ïŒãGHã¯GUIã³ãŒããèšè¿°ãããããprefs.jsãã¡ã€ã«ã®buildPrefsWidgetïŒïŒé¢æ°ã«å
¥ããããšãææ¡ããŸãã ãã®å Žåããã€ã³ã¹ããŒã«ãããŠããæ¡åŒµæ©èœãã®ãªã¹ãã®æ¡åŒµæ©èœã®å察åŽã«ã ããã«è¿œå ã®ãã¿ã³ããã®æ¡åŒµæ©èœãæ§æãããã衚瀺ãããŸãã
Eboutãªââãã§ã¯ãç³ãèš³ãããŸããããããã°ã©ã ã¯å®å
šã§ã¯ãªãããšãããã£ãŠããããã[About]ã¿ããå¥ã«äœæããŸãããã
äžè¬çã«ãå€å
žçãªã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããããã«ãGTKã«ã¯ããŸããŸãªãã«ãã£ã³ã°ãããã¯ã
ãããã ããã§æ°éãšå質ã確èªã§ããŸã ã
ãã®ãã¡ã®ããã€ãã䜿çšããŸãã
- Gtk.Notebookã¯ã¿ãã§ããããã©ãŠã¶ã®ããã§ã
- Gtk.VBoxã¯ããŠã£ãžã§ãããªã¹ããåçŽã«æ§ç¯ããããã®ã³ã³ããã§ã
- Gtk.Labelã¯ãHTMLããã©ãŒãããããæ©èœãæã€åºæ¬èŠçŽ ã§ããç¢æã§ãã
function buildPrefsWidget() {
æçµçãªã¹ã¯ãªãŒã³ã·ã§ããïŒ

ãªãã·ã§ãã«
1.åäœã¢ãŒãïŒãµããŒããšäœæ¥ç§ã®å Žåãããã°ã©ããŒã®ä»äºã«ã¯2ã€ã®ã¢ãŒããé¢ä¿ããŠããŸãã
1ïŒãµããŒãã¢ãŒãã§ãã¡ãŒã«ãSlackãSkypeãªã©ã®ã€ãã³ãã«ãã°ããå¿çããå¿
èŠãããå Žå
2ïŒåäœã¢ãŒãã§ã¯ãå°ãªããšã20åééç¥ãåæžããããšãéèŠã§ããããããªããšããã©ãŒã«ã¹ã倱ãããæçµçãªåŽåçç£æ§ãç¡èŠã§ããŸãã ããã«ã¯ããµã€ã¬ã³ãã¢ãŒãã䟿å©ã§ãã
2.ãµãŠã³ãããªãã«ããæ¹æ³å®å
šãªãã¥ãŒãããã¥ãŒãã¯å€ãããããã«æãããããããŸããã å®éãçæ³çã«ã¯ãSlack / Skypeããµã€ã¬ã³ãã¢ãŒãã§èãããšããå§ãããŸããããã®ä»ã®ãµãŠã³ãïŒå®éã®éç¥ïŒã¯èãããŸããã ãããããã®ããã«ã¯ãäœããã®åœ¢ã§åºå¥ããå¿
èŠããããŸãã ãã¡ãããéç¥å°çšã®ãµãŠã³ãAPIãäœæããããšãã§ããŸãïŒããã¯æ¢ã«ååšããŸãïŒããã®ãããªæ©èœã䜿çšããªãããã°ã©ã /ããã°ã©ããŒã®ã¿ãåžžã«ååšããŸãã äŸãšããŠã¯ãMailspringã¡ãŒã©ãŒããããŸããããã¯åã«audio
ã¿ã°ãä»ããŠãµãŠã³ããåçããã ãã§ãããSlackã³ãŒã«ã®ã¹ããŒããšåºå¥ããããšã¯ã§ããŸããã
3. PanelMenu.ButtonPanelMenu.Button-ããã¯ããã«+ãããã¢ããã¡ãã¥ãŒã®å®éã®ãã¿ã³ã§ãããèªåã§ææ¡ããŠãŒãããäœæããããšãã§ããŸããäž¡æ¹ãšãå·ã®ãã人ã«æè¬ãããŸãïŒ è¿
éãªçµæãç®æããŠãããããéå
¬åŒã®ããã¥ã¡ã³ãããã³ãŒããã³ããŒããŸããã
4. SetStatusRemoteïŒïŒSetStatusRemoteïŒïŒã䜿çšããŠãå®éã«ã¢ãŒãå€æŽãéå§ããŸãã