我正在从事一项小型的教育工作,我创建了一个窗口,它应该覆盖整个显示器。然而,从底部的screnshot看到的“特殊”区域没有被覆盖。我的窗口是一个坚实的红色,没有菜单栏滚动条等,无论如何,这是覆盖顶部菜单栏和码头。在我的屏幕截图中,我正在测试Ubuntu和Mint,这是Gtk OS的一致行为我需要设置我的窗口所以它涵盖所有这些可能吗?
我试过gdk_window_fullscreen
但它没有做任何事情,甚至不是全屏,你认为它是因为我从另一个线程运行这个函数吗?我怎么知道这个函数是否需要从主线程运行?
使用主线程中的Firefox代码打开无框窗口:
var aEditorDOMWindow = Services.ww.openWindow(null, core.addon.path.content + 'panel.xul', '_blank', 'chrome,width=1,height=1,screenX=0,screenY=0', null);
现在加载完成后,在主线程上获取此窗口的GdkWindow *,并作为字符串传递给另一个线程
线程现在将字符串带到GdkWindow *然后将其带到GtkWindow *
var gdkWinPtr = ostypes.TYPE.GdkWindow.ptr(ctypes.UInt64(aHwndStr));
var gtkWinPtr = ostypes.HELPER.gdkWinPtrToGtkWinPtr(gdkWinPtr);
然后线程执行gtk_window_set_keep_above
,因为如果有另一个应用程序聚焦,它会聚焦这个人,它将使他保持在现有的全屏窗口之上
var rez_topIt = ostypes.API('gtk_window_set_keep_above')(gtkWinPtr, true);
然后用于运行gtk_window_present
的线程,但我删除它,因为我注意到它会使应用程序崩溃,这是代码:
var rez_focus = ostypes.API('gtk_window_present')(gtkWinPtr);
实验性的尝试我试过但是没有办法使窗口覆盖特殊的UI:
ostypes.API('gdk_window_set_type_hint')(gdkWinPtr, ostypes.CONST.WINDOW_TYPE_HINT_SPLASHSCREEN);
ostypes.API('gtk_window_set_position')(gtkWinPtr, ostypes.CONST.GTK_WIN_POS_NONE);
var geom = ostypes.TYPE.GdkGeometry();
geom.max_width = aOptions.fullWidth;
geom.max_height = aOptions.fullHeight;
var rez_geo = ostypes.API('gtk_window_set_geometry_hints')(gtkWinPtr, null, geom.address(), ostypes.CONST.GDK_HINT_MAX_SIZE);
现在线程工作已经完成,它将进入主线程。现在主线程使用firefox javascript将窗口移动到最左上方(我之前使用Gdk调用计算)并且还将此窗口的宽度和高度设置为所有监视器的计算(我之前使用其他gdk执行此操作)呼叫)
aEditorDOMWindow.moveTo(collCanMonInfos[0].xTopLeft, collCanMonInfos[0].yTopLeft);
aEditorDOMWindow.resizeTo(collCanMonInfos[0].nWidth, collCanMonInfos[0].nHeight);
这导致窗口SOMETIMES覆盖所有监视器,其他时间只覆盖它打开的窗口。它永远不会覆盖像taskbar / dock / menubars这样的特殊用户界面。
如果你能告诉我如何实现一个完全覆盖所有非常感激的窗口,我试图教一些人一些东西,我遇到了一团糟。
以下是我正在制作的插件的YouTube视频:https://www.youtube.com/watch?v=aJM5NQK67N4
我停止使用gdk_fullscreen
,因为当它间歇性地工作时,它不允许窗口在一个监视器外扩展。
答案 0 :(得分:2)
面板通常使用struts实现,窗口管理器可以决定永远不允许窗口覆盖它们;这就是“全屏幕窗口”全部概念的原因之一"介绍:它给窗口管理器一个暗示,要求全屏的窗口应覆盖所有其他窗口;没有装饰;并且还涵盖所有最终的"系统"组件,如面板。