Handle changes of resolution and screen configuration
This commit is contained in:
parent
eca887df7c
commit
499eaf95fb
1 changed files with 56 additions and 16 deletions
|
@ -172,11 +172,64 @@ handleMessage dispvar m = do
|
||||||
modify $ \state -> state {phiRepaint = True}
|
modify $ \state -> state {phiRepaint = True}
|
||||||
_ ->
|
_ ->
|
||||||
case (fromMessage m) of
|
case (fromMessage m) of
|
||||||
Just event@PropertyEvent {} ->
|
Just event ->
|
||||||
Widget.withDisplay dispvar $ flip handlePropertyUpdate event
|
Widget.withDisplay dispvar $ flip handleEvent event
|
||||||
_ ->
|
_ ->
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
|
handleEvent :: (Widget w s c) => Display -> Event -> PhiX w s c ()
|
||||||
|
handleEvent disp PropertyEvent { ev_atom = atom } = do
|
||||||
|
phi <- asks phiPhi
|
||||||
|
atoms <- asks phiAtoms
|
||||||
|
panels <- gets phiPanels
|
||||||
|
|
||||||
|
when (atom == atom_XROOTPMAP_ID atoms || atom == atom_XROOTMAP_ID atoms) $ do
|
||||||
|
updateRootImage disp
|
||||||
|
sendMessage phi ResetBackground
|
||||||
|
sendMessage phi Repaint
|
||||||
|
|
||||||
|
handleEvent disp ConfigureEvent { ev_window = window } | window == defaultRootWindow disp = do
|
||||||
|
phi <- asks phiPhi
|
||||||
|
xconfig <- asks phiXConfig
|
||||||
|
config <- asks phiPanelConfig
|
||||||
|
panels <- gets phiPanels
|
||||||
|
let screens = map panelScreenArea panels
|
||||||
|
screens' <- liftIO $ phiXScreenInfo xconfig disp
|
||||||
|
|
||||||
|
when (screens /= screens') $ do
|
||||||
|
liftIO $ do
|
||||||
|
mapM (freePixmap disp . panelPixmap) panels
|
||||||
|
mapM_ (destroyWindow disp . panelWindow) $ drop (length screens') panels
|
||||||
|
|
||||||
|
let panelsScreens = zip screens' $ map Just panels ++ repeat Nothing
|
||||||
|
|
||||||
|
panels' <- forM panelsScreens $ \(screen, mpanel) ->
|
||||||
|
case mpanel of
|
||||||
|
Just panel -> do
|
||||||
|
let rect = panelBounds config screen
|
||||||
|
win = panelWindow panel
|
||||||
|
|
||||||
|
liftIO $ withRectangle rect $ moveResizeWindow disp win
|
||||||
|
|
||||||
|
panel' <- createPanel disp win screen
|
||||||
|
setPanelProperties disp panel'
|
||||||
|
|
||||||
|
return panel'
|
||||||
|
Nothing -> do
|
||||||
|
win <- liftIO $ createPanelWindow disp config screen
|
||||||
|
panel <- createPanel disp win screen
|
||||||
|
setPanelProperties disp panel
|
||||||
|
liftIO $ mapWindow disp $ panelWindow panel
|
||||||
|
return panel
|
||||||
|
|
||||||
|
modify $ \state -> state { phiPanels = panels' }
|
||||||
|
|
||||||
|
sendMessage phi $ UpdateScreens $ map (\panel -> (panelScreenArea panel, panelWindow panel)) panels'
|
||||||
|
sendMessage phi Repaint
|
||||||
|
|
||||||
|
handleEvent _ _ = return ()
|
||||||
|
|
||||||
|
|
||||||
receiveEvents :: Phi -> Widget.Display -> IO ()
|
receiveEvents :: Phi -> Widget.Display -> IO ()
|
||||||
receiveEvents phi dispvar = do
|
receiveEvents phi dispvar = do
|
||||||
connection <- Widget.withDisplay dispvar $ return . Fd . connectionNumber
|
connection <- Widget.withDisplay dispvar $ return . Fd . connectionNumber
|
||||||
|
@ -242,7 +295,6 @@ updatePanels dispvar = do
|
||||||
-- update window
|
-- update window
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
(withDimension area $ clearArea disp (panelWindow panel) 0 0) True
|
(withDimension area $ clearArea disp (panelWindow panel) 0 0) True
|
||||||
--(withDimension area $ copyArea disp (panelPixmap panel) (panelWindow panel) (defaultGC disp $ defaultScreen disp) 0 0) 0 0
|
|
||||||
sync disp False
|
sync disp False
|
||||||
|
|
||||||
return $ panel { panelWidgetCache = cache' }
|
return $ panel { panelWidgetCache = cache' }
|
||||||
|
@ -250,18 +302,6 @@ updatePanels dispvar = do
|
||||||
modify $ \state -> state { phiPanels = panels' }
|
modify $ \state -> state { phiPanels = panels' }
|
||||||
|
|
||||||
|
|
||||||
handlePropertyUpdate :: Display -> Event -> PhiX w s c ()
|
|
||||||
handlePropertyUpdate disp PropertyEvent { ev_atom = atom } = do
|
|
||||||
phi <- asks phiPhi
|
|
||||||
atoms <- asks phiAtoms
|
|
||||||
panels <- gets phiPanels
|
|
||||||
|
|
||||||
when (atom == atom_XROOTPMAP_ID atoms || atom == atom_XROOTMAP_ID atoms) $ do
|
|
||||||
updateRootImage disp
|
|
||||||
sendMessage phi ResetBackground
|
|
||||||
sendMessage phi Repaint
|
|
||||||
|
|
||||||
|
|
||||||
updateRootImage :: Display -> PhiX w s c ()
|
updateRootImage :: Display -> PhiX w s c ()
|
||||||
updateRootImage disp = do
|
updateRootImage disp = do
|
||||||
atoms <- asks phiAtoms
|
atoms <- asks phiAtoms
|
||||||
|
@ -332,7 +372,7 @@ createPanelWindow disp config screenRect = do
|
||||||
rootwin = defaultRootWindow disp
|
rootwin = defaultRootWindow disp
|
||||||
mask = cWEventMask.|.cWColormap.|.cWBackPixel.|.cWBorderPixel
|
mask = cWEventMask.|.cWColormap.|.cWBackPixel.|.cWBorderPixel
|
||||||
|
|
||||||
liftIO $ allocaSetWindowAttributes $ \attr -> do
|
allocaSetWindowAttributes $ \attr -> do
|
||||||
set_colormap attr colormap
|
set_colormap attr colormap
|
||||||
set_background_pixel attr 0
|
set_background_pixel attr 0
|
||||||
set_border_pixel attr 0
|
set_border_pixel attr 0
|
||||||
|
|
Reference in a new issue