Desative a tecla SUPER durante aplicativos em tela cheia

8

Existe uma maneira de desligar a tecla SUPER durante as sessões de jogos ou aplicativos em tela cheia em geral?

Kay T
fonte
Sim, é possível. Começarei a escrever um script para isso em breve e publicarei assim que estiver funcionando #
Sergiy Kolodyazhnyy
isso seria demais!
Kay
1
Resposta publicado, deixe-me saber o que você pensa
Sergiy Kolodyazhnyy
2
Nota para os futuros visitantes que escrevi anteriormente um script relacionado, para desativar a Super chave por janela específica. Por favor, verifique se você estiver interessado: askubuntu.com/q/754884/295286
Sergiy Kolodyazhnyy

Respostas:

11

Introdução

O script a seguir desabilita a Supertecla se alguma janela do X11 estiver no modo de tela cheia. Ele deve ser adicionado como um aplicativo de inicialização, mas também pode ser executado em modo independente.

Uso

Para executar o script manualmente, basta:

python disable_super_key.py

Para fazer com que o script seja iniciado automaticamente no login, consulte Como inicio os aplicativos automaticamente no login?

Obtendo o código-fonte do script

Pode-se copiar a fonte do script desta resposta ou obtê-la através da clonagem do meu repositório GitHub .

Instruções para quem tem git:

  1. cd /opt
  2. sudo git clone https://github.com/SergKolo/sergrep.git
  3. chmod -R +x sergrep

O script estará localizado em /opt/sergrep/disable_super_key.py

Código fonte do script

#!/usr/bin/env python
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: August 1st , 2016
# Purpose: Disable Super key that calls Unity Dash, when any 
#          X11 window is in fullscreen state
# 
# Written for: https://askubuntu.com/q/805807/295286
# Tested on: Ubuntu 16.04 LTS 
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import  Gdk,Gio
import subprocess
import signal
import time
import sys

debug = False

def gsettings_get(schema,path,key):
    """ fetches value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.get_value(key)

def gsettings_set(schema,path,key,value):
    """ sets value of gsettings schema """
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.set_string(key,value)


def gsettings_reset(schema,path,key):
    """ resets schema:key value to default"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.reset(key)

def run_cmd(cmdlist):
    """ reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout


def main():
    """ defines entry point of the program """
    screen = Gdk.Screen.get_default()
    while True:

        key_state = str(gsettings_get('org.compiz.unityshell', 
                                  '/org/compiz/profiles/unity/plugins/unityshell/', 
                                  'show-launcher'))
        active_xid = str(screen.get_active_window().get_xid())
        wm_state =  run_cmd( ['xprop', '-root', '-notype','-id',active_xid, '_NET_WM_STATE'])  

        if debug : print(key_state,wm_state)

        if 'FULLSCREEN' in wm_state:
            if "Super" in  key_state:    
                gsettings_set('org.compiz.unityshell', 
                              '/org/compiz/profiles/unity/plugins/unityshell/',
                              'show-launcher', 
                              'Disabled')

        else:
            if "Disabled" in key_state :
               gsettings_reset( 'org.compiz.unityshell', 
                                '/org/compiz/profiles/unity/plugins/unityshell/',
                                'show-launcher')


        time.sleep(0.25)


def sigterm_handler(*args):
    """ ensures that Super key has been reset upon exit"""
    gsettings_reset( 'org.compiz.unityshell', 
                     '/org/compiz/profiles/unity/plugins/unityshell/',
                     'show-launcher')

    if debug: print('CAUGHT SIGTERM')
    sys.exit(0)


if __name__ == "__main__":
    signal.signal(signal.SIGTERM,sigterm_handler)
    main()

Depuração

Caso seja necessário depurar, altere a linha 32 de debug = Falsepara debug = Truee execute o script na linha de comando

Sergiy Kolodyazhnyy
fonte
Me pediram para fazer esse script funcionar por área de trabalho específica. Para os interessados, você pode encontrar a solução aqui askubuntu.com/a/816512/295286 OBSERVAÇÃO Também que este script foi atualizado para lidar com o término do script para reativar a chave SUPER quando o script
terminar