AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 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:禁用除 PageDown、PageUp 之外的所有键盘快捷键

  • 772

我有文件~/.config/evince/accels但它是空的。禁用愚蠢的默认键盘快捷键的语法是什么?

我可以“转储”当前的快捷方式,然后进行编辑吗?

我经常会因为意外按下某些键而失去页面上的位置。

我只是想保留PageDown它,PageUp以便我可以滚动页面。

我在 Debian 上使用 Evince 43

debian
  • 2 2 个回答
  • 55 Views

2 个回答

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

    试试这些。一定要给chmod +x filename它们执行权限。only_direction_keys.sh将关闭大部分键盘映射,只留下箭头键和 PgUp 和 PgDn 键,然后启动 evince。首先启动这个!

    Key_reset.sh将您的按键绑定重置为之前的设置。完成后您需要运行此命令。

    请在运行前仔细查看代码,并进行任何您认为适合您需要的更改。更改 Evince 的键绑定有点麻烦,但当我通过一些测试运行它时,这种解决方法似乎效果很好。虽然不完美,但可以完成工作。此外,在盲目运行网络上陌生人的代码之前检查代码是个好主意 :)

    首先,安装xbindkeys:

    sudo apt install xbindkeys
    

    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

    如果我们查看新闻来源,我们会发现

    Evince 45.alpha

    • 删除自定义加速度文件的加载和保存

    所以我认为不再支持该功能。此外,在源代码中,我们在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]);
    
    

    我们看到固定绑定已经设置完毕。

    要更改或删除绑定,我们可以编辑此代码并重新编译应用程序,或者更简单地说,我们可以在应用程序和动态加载的 gtk 库之间插入一个垫片。例如,垫片可以不调用 函数gtk_application_set_accels_for_action(),win.open从而删除<Ctrl>O该操作的绑定。或者我们可以更改绑定以使其<Ctrl>Z工作。这是一个合适的文件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
    }
    

    这里#if 0用于禁用一些代码,并#if 1启用一些其他示例代码来执行上述操作。使用

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

    并运行

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

    进行适当的替换...。您应该删除调试fprintf()调用,因为它们可能会干扰应用程序对 stderr 的实际使用。

    • 1

相关问题

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve