1

我有一个下面列出的小应用程序,它只是在其中创建了一个 x 窗口和一个小窗口。我稍后计划制作一个实验性 IDE,其中所有的工具栏和菜单都是子窗口,并且可以选择想要管理它们的任何窗口管理器。

我想做的是启动一个 xmonad 实例,并使它不是从根窗口重新设置和控制窗口,而是在我的应用程序窗口内重新设置和控制窗口。

这可能吗?

PS这是应用程序。

module Main where
import Graphics.X11.Xlib

y f = w where w = f w

main = do
 display <- openDisplay ""

 let screen = defaultScreen display

 root <- rootWindow display screen
 mainWindow <- createSimpleWindow
 display 
 root 
 0 0 100 100
 1
 (blackPixel display screen)
 (whitePixel display screen)
 setTextProperty display mainWindow "Subwindows" wM_NAME

 subWindow <- createSimpleWindow
  display 
  mainWindow
  0 0 100 100
  1
  (whitePixel display screen)
  (blackPixel display screen)
  mapWindow display subWindow

  mapWindow display mainWindow

  y $ \loop -> allocaXEvent $ \eventPointer -> do
   nextEvent display eventPointer
   event <- get_EventType eventPointer
   case () of
   _ | event == expose -> loop
     | otherwise -> return ()
4

1 回答 1

1

原则上“只是”用可以在启动时指定的窗口 ID 替换 xmonad 中所有硬编码的根窗口引用的问题。但是除非 xmonad 已经具有该功能,否则您肯定必须破解 xmonad 代码才能添加它。

你可以运行你自己的整个 X 服务器并假装你的窗口是一个根窗口——比如 Xephyr 或 Xnest。这肯定比添加 xmonad 功能来使用非根窗口要困难得多,但它的优点是它可以与任何窗口管理器一起使用。

另一种方法可能是从 xmonad 中提取代码并将其粘贴到您的应用程序中......

于 2012-02-17T18:22:25.753 回答