AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 787459
Accepted
Martin Vegter
Martin Vegter
Asked: 2024-12-01 16:31:14 +0800 CST2024-12-01 16:31:14 +0800 CST 2024-12-01 16:31:14 +0800 CST

evince: desabilitar todos os atalhos de teclado, exceto PageDown, PageUp

  • 772

Tenho um arquivo ~/.config/evince/accels, mas ele está vazio. Qual é a sintaxe para desabilitar os atalhos de teclado padrão idiotas?

Posso "descartar" os atalhos atuais e depois editá-los?

Eu constantemente perco minha posição na página ao pressionar alguma tecla acidentalmente.

Eu só quero manter PageDowne PageUppoder rolar as páginas.

Estou usando o Evince 43 no Debian

debian
  • 2 2 respostas
  • 55 Views

2 respostas

  • Voted
  1. Mr Wesley
    2024-12-08T14:42:03+08:002024-12-08T14:42:03+08:00

    Experimente estes. Certifique-se de chmod +x filenamedar a eles acesso de execução. only_direction_keys.shdesligará a maior parte do mapa de teclas, deixando as teclas de seta e PgUp e PgDn e iniciará o evince. Inicie este primeiro!

    Key_reset.shredefine suas combinações de teclas para as configurações que você tinha antes. Você vai querer executar isso depois de terminar.

    Por favor, revise o código antes de executar e faça quaisquer alterações que você ache que atendem às suas necessidades. O Evince é meio chato para alterar atalhos de teclado, mas essa solução alternativa pareceu funcionar muito bem quando eu o executei em alguns testes. Não é perfeito, mas dá conta do recado. Além disso, é uma boa ideia verificar o código antes de executá-lo às cegas de um estranho na web :)

    Primeiro, instale xbindkeys:

    sudo apt install xbindkeys
    

    E os scripts de shell:

    1. only_direction_keys.sh:
    #!/bin/bash
    
    # Create a default xbindkeys configuration file if it doesn't exist
    if [ ! -f ~/.xbindkeysrc ]; then
      touch ~/.xbindkeysrc
    fi
    
    # Backup the current xbindkeys config before we modify it
    cp ~/.xbindkeysrc ~/.xbindkeysrc.bak
    
    # Disable all keys except arrow keys and PageUp/PageDown
    
    # Start by clearing the current xbindkeys configuration
    > ~/.xbindkeysrc
    
    # Define keybindings for the allowed keys (arrow keys and PgUp/PgDn)
    # We will bind these keys to "do nothing" commands so they are active
    
    # Up arrow
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:111" >> ~/.xbindkeysrc
    
    # Down arrow
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:116" >> ~/.xbindkeysrc
    
    # Left arrow
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:113" >> ~/.xbindkeysrc
    
    # Right arrow
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:114" >> ~/.xbindkeysrc
    
    # Page Up
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:112" >> ~/.xbindkeysrc
    
    # Page Down
    echo "'echo'" >> ~/.xbindkeysrc
    echo "  m:0x0 + c:117" >> ~/.xbindkeysrc
    
    # Now we will block all other keys by binding them to a dummy action
    # Disable the remaining keys (this is a simple solution, not an exhaustive list)
    for keycode in {1..255}; do
      # Skip the allowed keys (up, down, left, right, PgUp, PgDn)
      if [[ "$keycode" != "111" && "$keycode" != "116" && "$keycode" != "113" && "$keycode" != "114" && "$keycode" != "112" && "$keycode" != "117" ]]; then
      echo "'xdotool key --clearmodifiers F13'" >> ~/.xbindkeysrc
      echo "  m:0x0 + c:$keycode" >> ~/.xbindkeysrc
    fi
    done
    
    # Apply the new xbindkeys configuration
    xbindkeys -p
    
    # Launch evince
    evince
    
    1. key_reset.sh:
    #!/bin/sh
    cp ~/.xbindkeysrc.bak ~/.xbindkeysrc
    xbindkeys -p
    
    • 1
  2. Best Answer
    meuh
    2024-12-08T17:10:57+08:002024-12-08T17:10:57+08:00

    Se olharmos para as fontes, nas NOTÍCIAS encontramos

    Evidenciar 45.alfa

    • Remover carregamento e salvamento do arquivo de aceleração personalizado

    então não acho que isso seja mais suportado. Também nas fontes, temos o código em ev-application.c

    ev_application_startup (GApplication *gapplication)
     const gchar *action_accels[] = {
      "win.open",       "<Ctrl>O", NULL,
      "win.open-copy",  "<Ctrl>N", NULL,
    ...
     for (it = action_accels; it[0]; it += g_strv_length ((gchar **)it) + 1)
       gtk_application_set_accels_for_action (GTK_APPLICATION (application), it[0], &it[1]);
    
    

    onde vemos as ligações fixas sendo configuradas.

    Para alterar ou remover uma ligação, podemos editar este código e recompilar o aplicativo, ou mais simplesmente podemos interpor um shim entre o aplicativo e a biblioteca gtk carregada dinamicamente. O shim poderia, por exemplo, não chamar a gtk_application_set_accels_for_action()função para win.open, e então remover a ligação <Ctrl>Opara essa ação. Ou poderíamos alterar a ligação para fazer <Ctrl>Zfuncionar em vez disso. Aqui está um arquivo adequado shim_gtk.c:

    /*
     * capture calls to a routine and replace with your code
     * gcc -Wall -O2 -fpic -shared -ldl -o shim_gtk.so shim_gtk.c
     * LD_PRELOAD=/.../shim_gtk.so /bin/evince
     * https://unix.stackexchange.com/q/787459/119298
     */
    #define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <dlfcn.h>
    
    void gtk_application_set_accels_for_action(char *app, char *action, char **accels){
        static char *(*real_fn)(char *app, char *action, char **accels) = NULL;
    
        if (!real_fn) {
            real_fn = dlsym(RTLD_NEXT, "gtk_application_set_accels_for_action");
            char *error = dlerror();
            if (error != NULL) {
                fprintf(stderr, "%s\n", error);
                exit(1);
            }
        }
    #if 0
        if(strcmp(action, "win.open")==0){
            fprintf(stderr, "not calling for %s\n", action);
        }else{
            fprintf(stderr, "doing call for %s\n", action);
            real_fn(app, action, accels);
        }
    #endif
    #if 1
        if(strcmp(action, "win.open")==0){
            fprintf(stderr, "binding for %s\n", action);
            static char *mybinding[] = { "<Ctrl>Z", 0 }; // nul terminated utf8
            real_fn(app, action, mybinding);
        }else{
            real_fn(app, action, accels);
        }
    #endif
    }
    

    Aqui o #if 0é usado para desabilitar algum código e #if 1habilitar algum outro código de exemplo para fazer como descrito acima. Compilar com

    gcc -Wall -O2 -fpic -shared -ldl -o shim_gtk.so shim_gtk.c
    

    e correr com

    LD_PRELOAD=/.../shim_gtk.so /bin/evince ...
    

    substituindo ...apropriadamente. Você deve remover as fprintf()chamadas de depuração, pois elas podem interferir no uso real do stderr pelo aplicativo.

    • 1

relate perguntas

  • Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve