How updates happen for struts, workareas, and screen/xinerama regions/edges: One of three things causes meta_window_update_struts to be called (a) initial window map (window.c:meta_window_new_with_attrs()) (b) update of _net_wm_strut* properties (window.c:process_property_notify()) (c) screen resizes (e.g. via xrandr; from screen.c:meta_screen_resize_func()) meta_window_update_struts (MetaWindow *window) - Gets new list of struts from window properties - Makes sure window doesn't single-handedly fill the screen - records new struts if different and calls invalidate_work_areas() invalidate_work_areas () - Calls meta_workspace_invalidate_work_area() for each workspace it's on meta_workspace_invalidate_work_area() - Cleans out all strut lists - queues all windows for resizing - Calls meta_screen_queue_workarea_recalc (workspace->screen); meta_screen_queue_workarea_recalc() - Adds set_work_area_idle_func() as an idle handler set_work_area_idle_func() - Calls set_work_area_hint() set_work_area_hint() - Calls meta_workspace_get_work_area_all_xineramas() - Sets _NET_WORKAREA property meta_workspace_get_work_area_all_xineramas() - Calls ensure_work_areas_validated() ensure_work_areas_validated() - Loops over xineramas - Loops over windows, then struts: - Adds struts to list first time through xinerama loop - Find the amount of the strut on the given xinerama for