GNOME3: az út

Utam, vissza a GNOME3-ra, nem egészen zökkenőmentes. Azt találtam ki, hogy ebből négy problémát bemutatok a mélyentisztelt nagyközönségnek is - ezekre nem volt triviális segítség a neten. Talán valakinek hasznára leszek, talán gondolatébresztőként, inspirálólag hat egy-egy saját probléma megoldásához az adott témakörben. Lec szíí:

  1. stáció: sötét téma, kivételekkel
  2. stáció: hotkey - terminál
  3. stáció: átkozott, háttérbe nyíló ablakok
  4. stáció: használjuk az notifyt, mert cooool

1. stáció: sötét téma, kivételekkel
KDE alatt is sötét témát használtam, ott a GTK2-es kivételeket nagyon egyszerűen megtettem: annyi volt, hogy a $GTK2_RC_FILES környezeti változóval megadtam egy alternatív, világos téma gtkrc-jének elérését és már ragyogott is az alkalmazás, mint laci fogai a reklámban. Na ez az, ami nem működött GNOME3-al.

A gnome-settings-daemon futtatásával a GTK2 az X11 protokollon át le tudja kérni az aktuális téma nevét, a téma pedig a /usr/share/themes/[témaneve]/gtk-2.0/gtkrc fájlból felülbírál minden ~/.gtkrc beállítást. KDE alatt erre nem volt lehetősége, emiatt nem bírálta felül a $GTK2_RC_FILES-ben megadott gtkrc-t.

Itt csak azt a megoldást találtam, hogy a /usr/share/themes/Adwaita/gtk-2.0/gtkrc fájlban kikommenteztem a gtk-color-scheme változót és helyette a $GTK2_RC_FILES-el megadott fájlból definiálom, a téma így nem bírálja felül, csak felhasználja.

GTK3-nál ez sokkal egyszerűbb, hiszen az $XDG_CONFIG_HOME környezeti változóval meg lehet adni az alternatív gtk-3.0/settings.ini helyét, amibe már nincs benne a gtk-application-prefer-dark-theme*, így a világos témát használja.

* A GTK3-as témák már alapból tartalmazhatnak egy sötét verziót is, amit az alkalmazás aktiválhat. Szerintem ez jó ötlet, bár az alkalmazások széles köre egyhamar biztos nem fogja támogatni, ezért én a GTK helyében parancssori opcióval kapcsolhatóvá tenném és döntsön a juzer, hogy adott alkalmazást hogy akarja látni. Jelenleg ez a $XDG_CONFIG_HOME trükk működik, de ronda egy hack..

Hogy az activityből is alternatív témával induljon az alkalmazás, azt valahogy így hakkold meg:


 sed 's/^Exec=.*/&sh -c \'XDG_CONFIG_HOME=/home/dap/.config2 gedit %U\'/' /usr/share/applications/gedit.desktop

Egyébként ezek lettek az Adwaita GTK2 sötét színei (csak GTK3-ra van gyári sötét témája, ez annak az átirata):


 gtk-color-scheme = "base_color:#4f524f\nfg_color:#eeeeec\ntooltip_fg_color:#eeeeee\nselected_bg_color:#3465a4\nselected_fg_color:#eeeeec\ntext_color:#eeeeec\nbg_color:#363b3b\ntooltip_bg_color:#000000"

2. stáció: hotkey - terminál
A terminál nekem olyan mint a kenyér. Be is állítottam a System settingben egy jó hotkeyt rá, de az $SSH_AUTH_SOCK az istennek se volt jelen, így nem ment a kulcsos ssh. Erre Ubuntuék adtak választ. Nem volt könnyű megtalálni ezt a tippet, bár magamtól rájönni mégtöbb idő lett volna.

3. stáció: átkozott, háttérbe nyíló ablakok
A hotkeyel nyitott új, sokadik böngészőablakok csak addig nyíltak előtérbe, amíg be nem zártam egyet közülük. Ha egyet bezártam, utána már csak háttérben nyíltak, ha pedig csak (részleges) takarásban tudtak indulni, akkor lent a notify is felugrott, hogy "xy window is ready". Ez nevezik "smart focusnak" - nem túl találó elnevezés. ;)

Találtam ezzel kapcsolatban egy kevés picsogást, de hamar beláttam, hogy ezt nem lehet holmi fehérgalléros beállítással orvosolni.

Szóval felcsaptam a gépháztetőt és lespannoltam a shell extensions programozással. A /usr/share/gnome-shell/js/ui alá bekukucskálva máris látszik, hogy a gnome-shell teljes UI logikája kvázi javascript. Itt már sejtettem, hogy nem lesz nehéz dolgom, de talán még annál is könyebb volt. Bár API doksit nem találtam, de a példák és a forrás alapján nagyon gyorsan összedobtam az első saját extensionom a fantáziadús "always_focus_new_window" címmel. Ennyi az egész:


const Lang = imports.lang;

function AlwaysFocusNewWindow() {}

AlwaysFocusNewWindow.prototype = {
    enable : function() {
        this._signal_handler =
          global.display.connect('window-created', Lang.bind(this, this._onWindowCreated));
    },
    disable : function() {
        global.display.disconnect(this._signal_handler);
    },

    _onWindowCreated : function(display, window) {
        if (!window || window.has_focus() || window.is_skip_taskbar())
            return;

        let app = this._tracker.get_window_app(window);
        let title = app.get_name();
        //global.log("_onWindowCreated %s;%s".format(title, window.title));

        window.activate(global.get_current_time());
    }
};

function init() {
    return new AlwaysFocusNewWindow();
}

4. stáció: használjuk az notifyt, mert cooool
Imádom a G3 notify rendszerét, azt a kis fel-felugró sort odalent. A telepathy (magyarul a gétalk kliens) alapból használja, de ugye ezeket az IM csodákat csak a csajok és a gayek használják, a férfi IRC-el, esetleg bitlbeezik, értemmm?? :)

Ha IRC akkor nálam Xchat. Az Xchat alapból tudja használni a G3 notifyt a Show tray balloonst bekapcsolva, de sajnos szűrni, azt nem tud - vagy minden csatorna/privi felugrik, vagy egyik se. A jobb jel-zaj arány érdekében érdemes pluginnal csinálni.
Ha Xchat plugin, akkor nálam ruby. A Fedora az xchat-ruby csomagban hozza a szükséges illesztőt.

A következőt dobtam össze a ~/.xchat2/notifier.rb fájlba:


include XChatRuby

class Notifier < XChatRubyPlugin
  def initialize
    hook_server("PRIVMSG", XCHAT_PRI_NORM, method(:privmsg))
  end
  def privmsg(words, words_eol, data)
    # words[0] -> ':' + user that sent the text
    # words[1] -> PRIVMSG
    # words[2] -> channel
    # words[3] -> ':' + text
    text = words_eol[3][1..-1]
    words[0] =~ /:(.*?)!/
    user = $1
    if words[2][0].chr == '#'
      command("tray -b \"#{words[2]} <#{user}>\" \"#{text}\"")
    else
      command("tray -b \"<#{user}>\" \"#{text}\"")
    end
  end
end

Gondolom triviális, hogy a szűrőket hogy építettem bele, DIY.

Mellesleg belefutottam egy távoli DoS sebezhetőségbe az xchat-ruby illesztőben, fixeltem és lejelentettem közbe.

Közbe persze vinni kellett az ipart is, mozgalmas kis nap volt. A kummantásért bocs, főnök! ;)