带有多个参数的Gtk信号

时间:2013-11-12 05:21:41

标签: c gtk signals

上下文

使用GtkEntry小部件编写一个简单的应用程序来处理用户的文本命令后,我想做一些设计更改。

截至目前,我在按键上使用信号挂钩。如果key(s)是指定值,则显示命令行并处理entry小部件上的各种操作。比如说。

  • Ctrl + a :将光标移动到输入开始。
  • Ctrl + u :删除光标前的文字。
  • ...

除了解析命令和保存/加载历史记录外。

我不满意这是如何拼接在一起的。命令解析成为以下的子集:

main_window -> mode_check -> command_line_act -> parse_cmd+execute

我认为一个好的方法是使用GtkEntry作为基础编写一个新的小部件 - 并在命令输入发送信号。所有内部功能如Ctrl + ...和历史记录都由新的小部件处理。

新小部件发出的信号,例如:

  • “CMDLINE中止”
  • “CMDLINE-CMD”
  • ...

状态

已经为此写了基础,但是当涉及发出多于一个参数的信号时,我很讨厌。

我有:

gtk_signal_emit(obj, sig, 0, command)
                                 |
                                 +---- string.

但是,(至少现在,最有可能更多/其他更多。):

gtk_signal_emit(obj, sig, 0, command, length)

gtk_emit_signal 错字固定。 Thanks to jku.。此外,现在使用 g_signal _


在小部件代码中:

static void
cmdline_class_init(CmdlineClass *klass)
{

我使用g_signal_new()作为一个参数:

cmdline_signals[CMDLINE_CMD] = g_signal_new(
                "cmdline-cmd",
                G_TYPE_FROM_CLASS(klass),
                G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                G_STRUCT_OFFSET(CmdlineClass, cmdline),
                NULL,
                NULL,
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE,
                1,
                G_TYPE_STRING
);

正如我所看到的,对于两个论点,应该将其改为:

cmdline_signals[CMDLINE_CMD] = g_signal_new(
                "cmdline-cmd",
                G_TYPE_FROM_CLASS(klass),
                G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                G_STRUCT_OFFSET(CmdlineClass, cmdline),
                NULL,
                NULL,
                g_cclosure_user_marshal_VOID__STRING_INT,
                G_TYPE_NONE,
                2,
                G_TYPE_STRING,
                G_TYPE_INT
);

花园里的麻烦

使用glib-genmarshal生成marshal.list持有的封送:

VOID:STRING,INT

这样可行,但在编译时给我一个警告:

warning: ISO C forbids conversion of object pointer to function pointer type

由glib-genmarshal生成的代码引起:

  typedef void (*GMarshalFunc_VOID__STRING_INT) (gpointer     data1,
                                                 gpointer     arg_1,
                                                 gint         arg_2,
                                                 gpointer     data2);

  register GMarshalFunc_VOID__STRING_INT callback;

  /* GCC Warnig: conversion of object pointer to function => */
  callback = (GMarshalFunc_VOID__STRING_INT) ( 
                    marshal_data ? 
                    marshal_data : 
                    cc->callback
  );

问题

这是错误的做法吗?有没有办法解决转换错误?等

作为一个注释:我对Gtk和Gui编程都很新。


侧点

有一些弃用我也想知道是否会影响代码/应该避免:

1 个答案:

答案 0 :(得分:2)

此警告确实在某些信号编组代码上出现(带有-pedantic),而不仅仅出现在您的代码中。据我所知,你没有做错任何事 - 除了使用gtk_signal_emit()(我假设你的意思是而不是gtk_emit_signal(),据我所知不存在):你不应该使用任何gtk_signal-prefixed code:那些东西都已弃用了。有关详细信息,请参阅reference。请改为使用GObjectg_signal_emit()g_signal_emit_by_name()应该适合您。

你提到的信号编组器弃用是关于同样的事情:GObject现在处理与此相关的所有事情(已经很长时间了)。

作为实用的建议:经常添加信号签名的东西不值得麻烦,这也可能是你的情况:也许你的信号根本不需要命令字符串,信号处理程序可以只查询它with your_object_get_command()?

实用建议#2:考虑使用GTK + 3获取新代码。没有所有那些令人讨厌的东西让每个人感到困惑都很可爱。