当做事的时候,也是在学习的时候!
分类: 系统运维
2015-05-20 16:24:41
一、 为了方便用户使用,定义了如下的宏
/* --- 便于使用的宏定义*/
#define g_signal_connect(instance, detailed_signal, c_handler, data) \
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
#define g_signal_connect_after(instance, detailed_signal, c_handler, data) \
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER)
#define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \
g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED)
#define g_signal_handlers_disconnect_by_func(instance, func, data) \
g_signal_handlers_disconnect_matched ((instance), \
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
0, 0, NULL, (func), (data))
#define g_signal_handlers_block_by_func(instance, func, data) \
g_signal_handlers_block_matched ((instance), \
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
0, 0, NULL, (func), (data))
#define g_signal_handlers_unblock_by_func(instance, func, data) \
g_signal_handlers_unblock_matched ((instance), \
(GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
0, 0, NULL, (func), (data))
二、 /* 信号连接实现函数*/
gulong
g_signal_connect_data (gpointer instance,//发送信号的对象
const gchar *detailed_signal,//信号名称
GCallback c_handler,//回调函数
gpointer data,//传递给回调函数的参数
GClosureNotify destroy_data,//销毁数据的函数
GConnectFlags connect_flags)//信号连接的选项
{
(1)/****************为了安全起见,做如下检查******************/
//检查发送信号的对象是否存在
g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0);
//检查发送的信号是否存在
g_return_val_if_fail (detailed_signal != NULL, 0);
//检查回调函数是否存在
g_return_val_if_fail (c_handler != NULL, 0);
(2)//根据信号名称获取信号id
signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE);
(3)//根据信号id 获取信号节点
SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id);
(4)//根据信号节点判断信号的有效性
if (detail && !(node->flags & G_SIGNAL_DETAILED))
g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal);
else if (!g_type_is_a (itype, node->itype))
g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance);
else
{
(5)//生成信号处理器
Handler *handler = handler_new (after);
//信号处理器 序号
handler_seq_no = handler->sequential_number;
handler->detail = detail;
//信号处理函数
handler->closure = g_closure_ref ((swapped ? g_cclosure_new_swap : g_cclosure_new) (c_handler, data, destroy_data));
g_closure_sink (handler->closure);
(6)//根据信号id,发出信号的对象,信号处理器插入到信号处理器列表中
handler_insert (signal_id, instance, handler);
}
三、 信号的触发(信号处理器的执行)
gtk_main()进入事件循环,生成GMainLoop对象,
由GMainLoop管理GMainContext对象,而GMainContext则管理则所有的事件源!
当相应的事件发生时候,查找信号处理器列表,然后执行。