modal dialog 的实现; mainloop的嵌套; g_object_notify的使用方法

modal dialog 的实现

gtk中,modal dialog的实现一般是说通过g_main_loop的嵌套来实现的。但最近发现并非如此。

是否为modal dialog, 主要由是否调用如下函数控制:

1、gtk_window_set_modal(window, TRUE);而这个函数主要做几件事情:

 (1)、向window manager设置_NET_WM_STATE atom中_NET_WM_STATE_MODAL 的值

 (2)、gtk_grab_add(window)

            gtk_grab_add(window)后,和这个window在一个group的窗口收到的点击事件等都不被处理

            当这个modal window 被hide或关掉后,再调用gtk_grab_remove(window)函数。

2、gtk_window_set_type_hint(window, GDK_WINDOW_TYPE_HINT_DIALOG);

      当设置了这个属性后,window manager将会将原来的窗口始终显示在点击出的窗口之下,即使之前的窗口已经获得了focus。

 

mainloop的嵌套

当已有了一个main loop在跑的情况下,在这个main loop的回调函数中可以new并run另一个main loop, 这时第一个main loop被block在执行这个回调函数中,而新生成的main loop由于和第一个main loop使用同一个context,将代替第一个main loop处理事件循环。

gboolean

shutdown_loop(GtkWidget *widget, GdkEventAny *evt, gpointer user_data)

{

       GMainLoop *loop = (GMainLoop *)user_data;

       if(g_main_loop_is_running(loop))

            g_main_loop_quit(loop);

      return FALSE;

}

g_boolean

show_modal_window(GtkWidget *widget, GdkEventButton *evt)

{

    ...

    GMainLoop *loop = g_main_loop_new(NULL, FALSE); // NULL ensures that this loop uses default context

   g_signal_connect(window, "delete_event", G_CALLBACK(shutdown_loop), loop);

   g_main_loop_run(loop);

   g_main_loop_unref(loop);

   return FALSE;

}

当一个dialog是否为modal,并不由其是否实现红色部分的代码(嵌套main loop)控制,而是由上面说过的两个函数决定的。

第二个loop的存在,使得即使在没有第一个loop的情况下,单独调用show_modal_window, 仍然可以处理消息循环。

 

 

g_object_notify的使用方法

0、注册部分

     g_object_class_install_property(gobject_class,

                                                        PROP_MODAL,

               g_param_spec_boolean("modal", P_("Modal"), P_("if true, the window is modal( other windows are not usable while this one is up)"),   FALSE, GTK_PARAM_READWRITE)

                                                       );

1、emit部分

     g_object_notify(G_OBJECT(window), "modal");

2.  connect部分

     g_signal_connect(window, "notify::modal", G_CALLBACK(notify_modal_received), NULL);

3、回调函数

     void notify_modal_received(GtkWidget *window, GParamSpec *pspec)

     {

         printf("notify modal received");

      }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值