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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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");

      }

 

 

 

 

 

linux uos wine悬浮窗口置顶问题 linux 统信uos 和 麒麟 窗口最前段(上层)显示。 阅读详情

相关推荐

[Effective WX] 有关wxGTK的模态对话框(modal dialog)弹出的非模态窗口的问题

有这样的wx gtk上的编程问题: 已经有一个模态对话框(因为它是通过ShowModal()显示出来的),然后从它上面弹出一个非模态窗口(为什么会是非模态,应该是或者是业务需求,或者是产品代码中已存在所需功能的这样的非模态窗口类),调用它的Show()函数将其显示出来。结果我们发现,根本就 不能在对这个非模态窗口最任何操作。它无法接受任何用户,反而它的父窗口(那个模态对话框)仍像之前一样可以接

zeroom的技术专栏 1977

X Desktop Group(扩展窗口管理器提示)

很久之前曾经翻译过窗口管理器的文件,现在和大家共享出来,方便大家阅读,对于一些部分是根据自己的理解结合原文进行的一个翻译,小白翻译可能有不足的地方,欢迎大家提出建议。 原文地址: https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html 扩展窗口管理器提示 扩展窗口管理器提示 目录 介绍. 2 1.版本... 2 2.这是什么规格?... 2 3.本规范中使用的语言... 2 4.采用此规范的先决...

qq_43287763的博客 3201

改变Dialog的样式

private void setDialogSize(Dialog dg) { dg.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题 Window dialogWindow = dg.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes();

u010431640的博客 544

转载!有关GTK开发的笔记[整理中]

<br />1、关于窗口     // 创建顶层窗体,后面有POPUP的    GtkWidget *main_window;    main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);     // 设置title文字,注意UTF8格式的文字转换,否则是乱码<br />    gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL)); 

坚持写下去 2092

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

转载自: http://blog.csdn.net/hwizhao/archive/2009/02/10/3873577.aspx   modal dialog实现   gtk中,modal dialog实现一般是说通过g_main_loop的嵌套实现的。但最近发现并非如...

Linux Job 299

google :xlib maximize window notify

xlib maximize window notify http://bighow.net/5376444-xlib_PropertyNotify_Events__FullScreen_Maximize_.html xlib PropertyNotify Events (FullScreen/Maximize) How do you rea

middilestep的专栏 1071

x11学习一:linux下x11通过wid获取窗口类型(桌面窗口、普通窗口、dock窗口等)

需要的库 xcb-ewmh x11 xext xrender 可能上述只需要一部分 第一步(初始化atom) //初始化atom //QX11Info::connection()是 xcb_connection_t *,在qt里面直接使用这个,其他的地方也可以有替代和创建 //该步骤为了初始化m_ewmh_connection;一次初始化,重复使用。 void initAtom() { xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_

depend的博客 6099

PyGobject(三十二)布局容器之Window

Gtk.Window是一个可以包含其他部件一个顶层窗口。允许用户操作窗口(调整其大小,移动它,关闭它,...)

Yu的专栏 2676

g_object_notify使用方法

引用自: http://blog.csdn.net/hwizhao/archive/2009/02/10/3873577.aspx     g_object_notify使用方法 0、注册部分      g_object_class_install_property(gobject_class,                                  ...

Linux Job 523

GTK窗口置顶资料整理

GTK中提供了下列几种窗口置顶函数: gtk_window_set_keep_above(GTK_WINDOW(window),TRUE); //xfce下不起作用 gtk_window_set_type_hint (GTK_WINDOW(window),GDK_WINDOW_TYPE_HINT_DOCK); // 大多数desk panel使用的方式   示例代码: /** * g...

Linux Job 1531

GTK常用控件之窗口( GtkWindow )

窗口的创建: GtkWidget *gtk_window_new(GtkWindowType type); GtkWindowType是一个枚举,有两种情况: GTK_WINDOW_TOPLEVEL:顶层窗口,有边框 GTK_WINDOW_POPUP:   弹式窗口,没边框 返回值:窗口指针 标题的设置: void gtk_window_set_title(

秋叶原 && Mike || 麦克 6704

GTK编程基础------对话框

对话框        对话框是一类GtkWindow,它用于提供顶层窗口。它可以为用户提供消息,可以获得用户信息,或者提供一些简短的动作。         对话款构件被一个水平分割线分隔成两半。上半部放置的是用户界面的主要部分。下半部被称为动作区域,它包括一系列的按钮。当点击,每个按钮会发出一个唯一标识的信号,告诉程序员哪个按钮被点击了。         一般来说,对话框构件可以

轻飘飞扬 8156

GTK的对话框(转)

<br />http://hi.baidu.com/lammy/blog/item/99e3dda2baa9bca4cbefd0df.html<br /> <br /> <br /> <br />对话框是GUI系统跟用户交流的桥梁,是人机交互的重要手段;没有了对话框,就像人们不能用电一样,会给系统带来很多的不便。<br />        GTK的对话框数据结构如下:typedef struct<br /> {<br /> GtkWidget *vbox;<br /> GtkWidget *act

亭子的专栏 1461

linux安装gtk命令,Ubuntu下安装GTK+3的方法

在Ubuntu下安装GTK+3或者安装最新的GTK+4方法是一样的,下面就具体讲解。如果是安装GTK+4,则把下面涉及的命令中的“3”改为“4”即可。如果我们要在Ubuntu系统下使用基于GTK+3开发的App,那么我们无需安装任何东西,直接双击该App即可使用。如果我们要安装GTK+3.0进行开发,可使用以下命令:sudo apt-get install libgtk-3-dev下载安装完毕之后...

weixin_35112750的博客 4355
上一篇: const at the end of function and passing const object in a function call
下一篇: delete event和destroy信号
hwizhao
博客等级 码龄19年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值