Codebase list gnome-shell-extension-autohidetopbar / debian/20140113-1 extension.js
debian/20140113-1

Tree @debian/20140113-1 (Download .tar.gz)

extension.js @debian/20140113-1raw · history · blame

//
// Hides the Gnome "top bar" except in overview mode.
// https://extensions.gnome.org/extension/545/hide-top-bar/
// https://github.com/mlutfy/hidetopbar
//
// See README for more information.
//

const Main = imports.ui.main;
const Layout = imports.ui.layout;
const Meta = imports.gi.Meta;
const Tweener = imports.ui.tweener;
const Settings = imports.misc.extensionUtils.getCurrentExtension()
                    .imports.convenience.getSettings();
                    
const PANEL_ACTOR = Main.panel.actor;
const PANEL_BOX = PANEL_ACTOR.get_parent();

let _panelHeight = PANEL_ACTOR.get_height();

let _showEvent = 0;
let _hideEvent = 0;

let _stgsEventAnim = 0;
let _stgsEventAnim2 = 0;
let _stgsEventHotCorner = 0;
let _stgsEventSensitive = 0;
let _stgsEventOverv = 0;
let _stgsEventPressTime = 0;
let _stgsEventPressThresh = 0;

let _leaveEvent = 0;
let _menuEvent = 0;
let _blockerMenu = 0;

let _panelPressure = 0;
let _panelBarrier = 0;

let _settingsHotCorner = Settings.get_boolean('hot-corner');
let _settingsMouseSensitive = Settings.get_boolean('mouse-sensitive');
let _settingsShowOverview = Settings.get_boolean('mouse-triggers-overview');
let _settingsAnimTimeOverv = Settings.get_double('animation-time-overview');
let _settingsAnimTimeAutoh = Settings.get_double('animation-time-autohide');

function _hidePanel(animationTime, trigger) {
    _panelHeight = PANEL_ACTOR.get_height();
    
    if(global.get_pointer()[1] < _panelHeight && trigger == "mouse-left") {
        return;
    }
    
    let x = Number(_settingsHotCorner);
    PANEL_BOX.height = x;
    
    Tweener.addTween(PANEL_BOX, {
        y: x - _panelHeight,
        time: animationTime,
        transition: 'easeOutQuad',
        onComplete: function() { PANEL_ACTOR.set_opacity(x*255); }
    });
}

function _showPanel(animationTime, trigger) {
    if(trigger == "mouse-enter" && _settingsShowOverview)
        Main.overview.show();
    if(PANEL_BOX.y > 1-_panelHeight) return;
    PANEL_BOX.height = _panelHeight;
    PANEL_ACTOR.set_opacity(255);
    
    Tweener.addTween(PANEL_BOX, {
        y: 0,
        time: animationTime,
        transition: 'easeOutQuad'
    });
}

function _handleMenus() {
    if(!Main.overview.visible) {
        let blocker = Main.panel.menuManager.activeMenu;
        if(blocker == null) {
            _hidePanel(_settingsAnimTimeAutoh, "mouse-left");
        } else {
            _blockerMenu = blocker;
            _menuEvent = _blockerMenu.connect('open-state-changed', function(menu, open){
                if(!open) {
                    _blockerMenu.disconnect(_menuEvent);
                    _menuEvent = 0; _blockerMenu = 0;
                    _handleMenus();
                }
            });
        }
    }
}

function _updateMouseSensitive() {
    _settingsMouseSensitive = Settings.get_boolean('mouse-sensitive');
    if(_settingsMouseSensitive) {
        _disable_mouse_sensitive();
        _leaveEvent = PANEL_ACTOR.connect('leave-event', _handleMenus);
        _initPressureBarrier();
    } else _disable_mouse_sensitive();
}

function _disable_mouse_sensitive() {
    if(_panelBarrier && _panelPressure) {
            _panelPressure.removeBarrier(_panelBarrier);
            _panelBarrier.destroy();
    }
    if(_leaveEvent) PANEL_ACTOR.disconnect(_leaveEvent);
}

function _initPressureBarrier() {
    _panelPressure = new Layout.PressureBarrier(
        Settings.get_int('pressure-threshold'),
        Settings.get_int('pressure-timeout'), 
        imports.gi.Shell.KeyBindingMode.NORMAL
    );
    _panelPressure.setEventFilter(function(event) {
        if (event.grabbed && Main.modalCount == 0)
            return true;
        return false;
    });
    _panelPressure.connect('trigger', function(barrier) {
        if (Main.layoutManager.primaryMonitor.inFullscreen)
            return;
        _showPanel(_settingsAnimTimeAutoh, "mouse-enter");
    });
    let monitor = Main.layoutManager.primaryMonitor;
    _panelBarrier = new Meta.Barrier({ display: global.display,
                           x1: monitor.x, x2: monitor.x + monitor.width,
                           y1: monitor.y, y2: monitor.y,
                           directions: Meta.BarrierDirection.POSITIVE_Y });
    _panelPressure.addBarrier(_panelBarrier);
}

function _setup_settings_handler() {
    _stgsEventAnim = Settings.connect('changed::animation-time-overview',
        function() { 
            _settingsAnimTimeOverv = Settings.get_double('animation-time-overview');
    });
    _stgsEventAnim2 = Settings.connect('changed::animation-time-autohide',
        function() { 
            _settingsAnimTimeAutoh = Settings.get_double('animation-time-autohide');
    });
    _stgsEventOverv = Settings.connect('changed::mouse-triggers-overview',
        function() { 
            _settingsShowOverview = Settings.get_boolean('mouse-triggers-overview');
    });
    _stgsEventHotCorner = Settings.connect('changed::hot-corner', function() { 
        _settingsHotCorner = Settings.get_boolean('hot-corner');
        _hidePanel(0.1);
    });
    _stgsEventPressTime = Settings.connect('changed::pressure-timeout', _updateMouseSensitive);
    _stgsEventPressThresh = Settings.connect('changed::pressure-threshold', _updateMouseSensitive);
    _stgsEventSensitive = Settings.connect('changed::mouse-sensitive', _updateMouseSensitive);
}

function _disconnect_settings_handler() {
    if(_stgsEventAnim) Settings.disconnect(_stgsEventAnim);
    if(_stgsEventAnim2) Settings.disconnect(_stgsEventAnim2);
    if(_stgsEventOverv) Settings.disconnect(_stgsEventOverv);
    if(_stgsEventHotCorner) Settings.disconnect(_stgsEventHotCorner);
    if(_stgsEventPressThresh) Settings.disconnect(_stgsEventPressThresh);
    if(_stgsEventPressTime) Settings.disconnect(_stgsEventPressTime);
    if(_stgsEventSensitive) Settings.disconnect(_stgsEventSensitive);
}

function init() { }

function enable() {    
    Main.layoutManager.removeChrome(PANEL_BOX);
    Main.layoutManager.addChrome(PANEL_BOX, { affectsStruts: false });
    
    _showEvent = Main.overview.connect('showing', function() {
        _showPanel(_settingsAnimTimeOverv);
    });
    _hideEvent = Main.overview.connect('hiding', function() {
        _hidePanel(_settingsAnimTimeOverv);
    });
    
    _setup_settings_handler();
    _updateMouseSensitive();
    
    _hidePanel(0.1);
}

function disable() {
    Main.layoutManager.removeChrome(PANEL_BOX);
    Main.layoutManager.addChrome(PANEL_BOX, { affectsStruts: true });
    
    if(_showEvent) Main.overview.disconnect(_showEvent);
    if(_hideEvent) Main.overview.disconnect(_hideEvent);
    
    _disconnect_settings_handler();
    _disable_mouse_sensitive();
    
    _showPanel(0.1);
}