【问题标题】:Why does GTK2's gtk_widget_add_accelerator not add a shortcut sometimes?为什么 GTK2 的 gtk_widget_add_accelerator 有时不加快捷方式?
【发布时间】:2018-05-18 09:28:29
【问题描述】:

我看到 gtk_widget_add_accelerator 间歇性无法工作的问题。在 Ubuntu 16.04 上运行的 GTK2 应用程序上,一些菜单项有快捷方式,而另一些则没有。我安装了符号和源代码以查看发生了什么,并且 gtk_widget_add_accelerator 内部的信号检查失败:

g_signal_query (g_signal_lookup (accel_signal, G_OBJECT_TYPE (widget)), &query);
if (!query.signal_id ||
    !(query.signal_flags & G_SIGNAL_ACTION) ||
    query.return_type != G_TYPE_NONE ||
    query.n_params)
{
    /* hmm, should be elaborate enough */
    g_warning (G_STRLOC ": widget `%s' has no activatable signal \"%s\" without arguments",
     G_OBJECT_TYPE_NAME (widget), accel_signal);
    return;
}

所以我把那段代码复制到我调用 gtk_widget_add_accelerator 之前,比如this

const char *Signal = "activate";
GSignalQuery query;
g_signal_query (g_signal_lookup (Signal, G_OBJECT_TYPE (w)), &query);

if (!stricmp(Sc, "Ctrl+C")) // This is the short cut that doesn't work
{
    if (!query.signal_id)
        printf("Bad sig id\n");
    else if (!(query.signal_flags & G_SIGNAL_ACTION))
        printf("No sig act\n");
    else if (query.return_type != G_TYPE_NONE)
        printf("Ret type err\n");
    else if (query.n_params)
        printf("Param err.\n");
    else
        printf("Pre-cond ok.\n");
}

gtk_widget_add_accelerator( w,
                            Signal,
                            Menu->AccelGrp,
                            GtkKey,
                            mod,
                            Gtk::GTK_ACCEL_VISIBLE
                        );

它会打印“Pre-cond ok”。这意味着在我的应用程序级别有一个有效信号,但不在 GTK2 库中。那么是否存在构建问题?标题不匹配? IDK。

所以我开始仔细研究我正在构建的对象。 make file 使用这些标志:

Libs =  \
    -lmagic \
    -static-libgcc  \
    `pkg-config --libs gtk+-2.0`
Inc =  \
    -I./include/common \
    -I./include/linux/Gtk \
    -I/usr/include/gstreamer-1.0 \
    -I/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include \
    `pkg-config --cflags gtk+-2.0` \
    -Iinclude/common \
    -Iinclude/linux \
    -Iinclude/linux/Gtk

看起来很标准,对吧?

所以我有点不知道为什么这不起作用。有什么想法吗?

作为参考,这是创建信号的代码:

Info = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(Txt));

Gtk::gulong ret = Gtk::g_signal_connect_data(Info,
                                            "activate",
                                            (Gtk::GCallback) MenuItemCallback,
                                            this,
                                            NULL,
                                            Gtk::G_CONNECT_SWAPPED);

以及我的应用中“查询”的内容:

(gdb) p query
$1 = {signal_id = 132, signal_name = 0x7ffff76c4859 "activate", 
  itype = 17714704, 
  signal_flags = (Gtk::G_SIGNAL_RUN_FIRST | Gtk::G_SIGNAL_ACTION), 
  return_type = 4, n_params = 0, param_types = 0x0}

当我踏入 GTK2 库时:

(gdb) p query
$3 = {signal_id = 132, signal_name = 0x7ffff76c4859 "activate", 
  itype = 17714704, signal_flags = (G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION), 
  return_type = 4, n_params = 0, param_types = 0x0}

但它只在 g_warning 行之后到达那个阶段。也许这是由于编译器优化。

【问题讨论】:

    标签: gtk2


    【解决方案1】:

    好的。似乎 Gtk 的调试符号让我走错了路。我从源代码构建并安装了 GTK2,它好多了。

    gtk_widget_add_accelerator 实际上是在做正确的事情,而不是落入它的信号错误处理程序中。真正的问题是,当我将项目转换为也支持图标的项目时,我正在用 LgiMenuItem::Icon 中的不同对象替换菜单项。这将删除我之前添加的加速器。当所有丢失的加速器都有图标时,我注意到了这一点。

    因此,“解决方案”是在将菜单项转换为支持图标的菜单项后重新添加快捷方式。也许我会重新考虑代码以提高效率,但在这一点上我很高兴它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多