Blender V5.0
screen_edit.cc File Reference
#include <cmath>
#include <cstring>
#include <limits>
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "BLI_listbase.h"
#include "BLI_rect.h"
#include "BLI_string_utf8.h"
#include "BLI_utildefines.h"
#include "BKE_context.hh"
#include "BKE_global.hh"
#include "BKE_icons.h"
#include "BKE_image.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_main.hh"
#include "BKE_report.hh"
#include "BKE_scene.hh"
#include "BKE_screen.hh"
#include "BKE_sound.h"
#include "BKE_workspace.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "ED_clip.hh"
#include "ED_node.hh"
#include "ED_screen.hh"
#include "ED_screen_types.hh"
#include "ED_sequencer.hh"
#include "RNA_access.hh"
#include "RNA_enum_types.hh"
#include "UI_interface.hh"
#include "WM_message.hh"
#include "WM_toolsystem.hh"
#include "DEG_depsgraph_query.hh"
#include "screen_intern.hh"

Go to the source code of this file.

Functions

static ScrAreascreen_addarea_ex (ScrAreaMap *area_map, ScrVert *bottom_left, ScrVert *top_left, ScrVert *top_right, ScrVert *bottom_right, const eSpace_Type space_type)
static ScrAreascreen_addarea (bScreen *screen, ScrVert *left_bottom, ScrVert *left_top, ScrVert *right_top, ScrVert *right_bottom, const eSpace_Type space_type)
static void screen_delarea (bContext *C, bScreen *screen, ScrArea *area)
ScrAreaarea_split (const wmWindow *win, bScreen *screen, ScrArea *area, const eScreenAxis dir_axis, const float fac, const bool merge)
bScreenscreen_add (Main *bmain, const char *name, const rcti *rect)
void screen_data_copy (bScreen *to, bScreen *from)
void screen_new_activate_prepare (const wmWindow *win, bScreen *screen_new)
eScreenDir area_getorientation (ScrArea *sa_a, ScrArea *sa_b)
void area_getoffsets (ScrArea *sa_a, ScrArea *sa_b, const eScreenDir dir, int *r_offset1, int *r_offset2)
static void screen_verts_halign (const wmWindow *win, const bScreen *screen, const short from_x, const short to_x)
static void screen_verts_valign (const wmWindow *win, const bScreen *screen, const short from_y, const short to_y)
static bool screen_areas_can_align (ReportList *reports, bScreen *screen, ScrArea *sa1, ScrArea *sa2, eScreenDir dir)
static bool screen_areas_align (bContext *C, ReportList *reports, bScreen *screen, ScrArea *sa1, ScrArea *sa2, const eScreenDir dir)
static bool screen_area_join_aligned (bContext *C, ReportList *reports, bScreen *screen, ScrArea *sa1, ScrArea *sa2)
static ScrAreascreen_area_trim (bContext *C, bScreen *screen, ScrArea **area, int size, eScreenDir dir, bool reverse)
static bool screen_area_join_ex (bContext *C, ReportList *reports, bScreen *screen, ScrArea *sa1, ScrArea *sa2, bool close_all_remainders)
int screen_area_join (bContext *C, ReportList *reports, bScreen *screen, ScrArea *sa1, ScrArea *sa2)
bool screen_area_close (bContext *C, ReportList *reports, bScreen *screen, ScrArea *area)
void screen_area_spacelink_add (const Scene *scene, ScrArea *area, eSpace_Type space_type)
static void region_cursor_set_ex (wmWindow *win, ScrArea *area, ARegion *region, bool swin_changed)
static void region_cursor_set (wmWindow *win, bool swin_changed)
void ED_screen_do_listen (bContext *C, const wmNotifier *note)
static bool region_poll (const bContext *C, const bScreen *screen, const ScrArea *area, const ARegion *region)
bool area_regions_poll (bContext *C, const bScreen *screen, ScrArea *area)
static bool screen_regions_poll (bContext *C, wmWindow *win, const bScreen *screen)
static void screen_refresh_if_needed (bContext *C, wmWindowManager *wm, wmWindow *win)
void ED_screen_refresh (bContext *C, wmWindowManager *wm, wmWindow *win)
void ED_screens_init (bContext *C, Main *bmain, wmWindowManager *wm)
void ED_screen_ensure_updated (bContext *C, wmWindowManager *wm, wmWindow *win)
void ED_region_remove (bContext *C, ScrArea *area, ARegion *region)
void ED_region_exit (bContext *C, ARegion *region)
void ED_area_exit (bContext *C, ScrArea *area)
void ED_screen_exit (bContext *C, wmWindow *window, bScreen *screen)
blender::StringRefNull ED_area_name (const ScrArea *area)
int ED_area_icon (const ScrArea *area)
static void screen_cursor_set (wmWindow *win, const int xy[2])
void ED_screen_set_active_region (bContext *C, wmWindow *win, const int xy[2])
int ED_screen_area_active (const bContext *C)
static ScrAreascreen_area_create_with_geometry (ScrAreaMap *area_map, const rcti *rect, eSpace_Type space_type)
static void screen_area_set_geometry_rect (ScrArea *area, const rcti *rect)
static void screen_global_area_refresh (wmWindow *win, bScreen *screen, const eSpace_Type space_type, GlobalAreaAlign align, const rcti *rect, const short height_cur, const short height_min, const short height_max)
static int screen_global_header_size ()
static void screen_global_topbar_area_refresh (wmWindow *win, bScreen *screen)
static void screen_global_statusbar_area_refresh (wmWindow *win, bScreen *screen)
void ED_screen_global_areas_sync (wmWindow *win)
void ED_screen_global_areas_refresh (wmWindow *win)
void screen_change_prepare (bScreen *screen_old, bScreen *screen_new, Main *bmain, bContext *C, wmWindow *win)
void screen_change_update (bContext *C, wmWindow *win, bScreen *screen)
bool ED_screen_change (bContext *C, bScreen *screen)
 Change the active screen.
static void screen_set_3dview_camera (Scene *scene, ViewLayer *view_layer, ScrArea *area, View3D *v3d)
void ED_screen_scene_change (bContext *C, wmWindow *win, Scene *scene, const bool refresh_toolsystem)
ScrAreaED_screen_full_newspace (bContext *C, ScrArea *area, int type)
void ED_screen_full_prevspace (bContext *C, ScrArea *area)
void ED_screen_restore_temp_type (bContext *C, ScrArea *area)
void ED_screen_full_restore (bContext *C, ScrArea *area)
static bScreenscreen_state_to_nonnormal (bContext *C, wmWindow *win, ScrArea *toggle_area, int state)
bScreenED_screen_state_maximized_create (bContext *C)
ScrAreaED_screen_state_toggle (bContext *C, wmWindow *win, ScrArea *area, const short state)
ScrAreaED_screen_temp_space_open (bContext *C, const char *title, eSpace_Type space_type, int display_type, bool dialog)
void ED_screen_animation_timer (bContext *C, Scene *scene, ViewLayer *view_layer, int redraws, int sync, int enable)
static ARegiontime_top_left_3dwindow (bScreen *screen)
void ED_screen_animation_timer_update (bScreen *screen, int redraws)
void ED_update_for_newframe (Main *bmain, Depsgraph *depsgraph)
bool ED_screen_stereo3d_required (const bScreen *screen, const Scene *scene)
SceneED_screen_scene_find_with_window (const bScreen *screen, const wmWindowManager *wm, wmWindow **r_window)
ScrAreaED_screen_area_find_with_spacedata (const bScreen *screen, const SpaceLink *sl, const bool only_visible)
SceneED_screen_scene_find (const bScreen *screen, const wmWindowManager *wm)
wmWindowED_screen_window_find (const bScreen *screen, const wmWindowManager *wm)

Function Documentation

◆ area_getoffsets()

void area_getoffsets ( ScrArea * sa_a,
ScrArea * sa_b,
eScreenDir dir,
int * r_offset1,
int * r_offset2 )

◆ area_getorientation()

eScreenDir area_getorientation ( ScrArea * sa_a,
ScrArea * sa_b )

◆ area_regions_poll()

bool area_regions_poll ( bContext * C,
const bScreen * screen,
ScrArea * area )

◆ area_split()

◆ ED_area_exit()

◆ ED_area_icon()

◆ ED_area_name()

◆ ED_region_exit()

◆ ED_region_remove()

void ED_region_remove ( bContext * C,
ScrArea * area,
ARegion * region )

Utility to exit and free an area-region. Screen level regions (menus/popups) need to be treated slightly differently, see ui_region_temp_remove().

Definition at line 906 of file screen_edit.cc.

References BKE_area_region_free(), BLI_freelinkN(), C, ED_region_exit(), ScrArea::regionbase, and ScrArea::type.

Referenced by region_quadview_exec().

◆ ED_screen_animation_timer()

◆ ED_screen_animation_timer_update()

void ED_screen_animation_timer_update ( bScreen * screen,
int redraws )

◆ ED_screen_area_active()

◆ ED_screen_area_find_with_spacedata()

ScrArea * ED_screen_area_find_with_spacedata ( const bScreen * screen,
const SpaceLink * sl,
const bool only_visible )

Definition at line 2150 of file screen_edit.cc.

References bScreen::areabase, BLI_findindex(), and LISTBASE_FOREACH.

◆ ED_screen_change()

◆ ED_screen_do_listen()

◆ ED_screen_ensure_updated()

void ED_screen_ensure_updated ( bContext * C,
wmWindowManager * wm,
wmWindow * win )

Definition at line 901 of file screen_edit.cc.

References C, and screen_refresh_if_needed().

Referenced by wm_draw_update().

◆ ED_screen_exit()

◆ ED_screen_full_newspace()

◆ ED_screen_full_prevspace()

void ED_screen_full_prevspace ( bContext * C,
ScrArea * area )

◆ ED_screen_full_restore()

void ED_screen_full_restore ( bContext * C,
ScrArea * area )

Restore a screen / area back to default operation, after temp full-screen modes.

Definition at line 1603 of file screen_edit.cc.

References C, CTX_wm_screen(), CTX_wm_window(), ED_screen_full_prevspace(), ED_screen_state_toggle(), ListBase::first, SpaceLink::link_flag, SpaceLink::next, SCREENMAXIMIZED, SPACE_FLAG_TYPE_TEMPORARY, ScrArea::spacedata, bScreen::state, and state.

Referenced by ED_workspace_layout_cycle().

◆ ED_screen_global_areas_refresh()

◆ ED_screen_global_areas_sync()

◆ ED_screen_refresh()

void ED_screen_refresh ( bContext * C,
wmWindowManager * wm,
wmWindow * win )

Make this screen usable. for file read and first use, for scaling window, area moves.

Definition at line 866 of file screen_edit.cc.

References C, bScreen::do_refresh, screen_refresh_if_needed(), and WM_window_get_active_screen().

Referenced by ED_screens_init(), screen_change_update(), wm_debug_menu_exec(), and WM_window_open().

◆ ED_screen_restore_temp_type()

◆ ED_screen_scene_change()

◆ ED_screen_scene_find()

Scene * ED_screen_scene_find ( const bScreen * screen,
const wmWindowManager * wm )

Definition at line 2171 of file screen_edit.cc.

References ED_screen_scene_find_with_window().

◆ ED_screen_scene_find_with_window()

Scene * ED_screen_scene_find_with_window ( const bScreen * screen,
const wmWindowManager * wm,
wmWindow ** r_window )

Find the scene displayed in screen.

Note
Assumes screen to be visible/active!

Definition at line 2133 of file screen_edit.cc.

References LISTBASE_FOREACH, wmWindowManager::windows, WM_window_get_active_scene(), and WM_window_get_active_screen().

Referenced by ED_screen_scene_find().

◆ ED_screen_set_active_region()

◆ ED_screen_state_maximized_create()

bScreen * ED_screen_state_maximized_create ( bContext * C)

Create a new temporary screen with a maximized, empty area. This can be closed with ED_screen_state_toggle().

Use this to just create a new maximized screen/area, rather than maximizing an existing one. Otherwise, maximize with ED_screen_state_toggle().

Definition at line 1751 of file screen_edit.cc.

References C, CTX_wm_window(), screen_state_to_nonnormal(), and SCREENMAXIMIZED.

Referenced by ED_screen_full_newspace().

◆ ED_screen_state_toggle()

ScrArea * ED_screen_state_toggle ( bContext * C,
wmWindow * win,
ScrArea * area,
short state )

This function toggles: if area is maximized/full then the parent will be restored.

Use ED_screen_state_maximized_create() if you do not want the toggle behavior when changing to a maximized area. I.e. if you just want to open a new maximized screen/area, not maximize a specific area. In the former case, space data of the maximized and non-maximized area should be independent, in the latter it should be the same.

Warning
area may be freed.

Definition at line 1756 of file screen_edit.cc.

References bScreen::animtimer, bScreen::areabase, ScrAreaMap::areabase, BKE_workspace_layout_remove(), BKE_workspace_layout_screen_get(), BLI_assert, C, CTX_data_main(), CTX_wm_area(), CTX_wm_area_set(), CTX_wm_manager(), CTX_wm_screen(), ED_area_data_swap(), ED_area_status_text(), ED_area_tag_refresh(), ED_screen_change(), ED_workspace_status_text(), ListBase::first, bScreen::flag, View3DOverlay::flag, ScrArea::full, bScreen::fullscreen_flag, FULLSCREEN_RESTORE_GIZMO_NAVIGATE, FULLSCREEN_RESTORE_STATS, FULLSCREEN_RESTORE_TEXT, SpaceClip::gizmo_flag, SpaceImage::gizmo_flag, SpaceSeq::gizmo_flag, View3D::gizmo_flag, ScrArea::global, GLOBAL_AREA_IS_HIDDEN, wmWindow::global_areas, LISTBASE_FOREACH, View3D::overlay, ScrArea::regionbase, wmWindowManager::runtime, SCLIP_GIZMO_HIDE_NAVIGATE, screen_state_to_nonnormal(), SCREENFULL, SCREENNORMAL, SEQ_GIZMO_HIDE_NAVIGATE, SI_GIZMO_HIDE_NAVIGATE, bScreen::skip_handling, SPACE_CLIP, SPACE_IMAGE, SPACE_SEQ, SPACE_VIEW3D, ScrArea::spacedata, ScrArea::spacetype, bScreen::state, state, UI_blocklist_free(), V3D_GIZMO_HIDE_NAVIGATE, V3D_OVERLAY_HIDE_TEXT, V3D_OVERLAY_STATS, WM_event_timer_remove(), WM_window_get_active_layout(), WM_window_get_active_screen(), and WM_window_get_active_workspace().

Referenced by ED_screen_full_restore(), ED_screen_restore_temp_type(), render_view_cancel_exec(), and screen_maximize_area_exec().

◆ ED_screen_stereo3d_required()

◆ ED_screen_temp_space_open()

ScrArea * ED_screen_temp_space_open ( bContext * C,
const char * title,
eSpace_Type space_type,
int display_type,
bool dialog )

Wrapper to open a temporary space either as full-screen space, or as separate window, as defined by display_type.

Parameters
titleTitle to set for the window, if a window is spawned.
rect_unscaledPosition & size of the window, if a window is spawned.

Definition at line 1903 of file screen_edit.cc.

References AREA_FLAG_STACKED_FULLSCREEN, bScreen::areabase, C, CTX_wm_area(), CTX_wm_screen(), ED_area_newspace(), ED_screen_full_newspace(), ListBase::first, ScrArea::flag, ScrArea::full, LISTBASE_FOREACH, SCREENMAXIMIZED, SPACE_FLAG_TYPE_TEMPORARY, ScrArea::spacedata, bScreen::state, USER_TEMP_SPACE_DISPLAY_FULLSCREEN, USER_TEMP_SPACE_DISPLAY_WINDOW, and WM_window_open_temp().

Referenced by userpref_show_exec(), and wm_handler_fileselect_do().

◆ ED_screen_window_find()

wmWindow * ED_screen_window_find ( const bScreen * screen,
const wmWindowManager * wm )

◆ ED_screens_init()

◆ ED_update_for_newframe()

◆ region_cursor_set()

void region_cursor_set ( wmWindow * win,
bool swin_changed )
static

◆ region_cursor_set_ex()

void region_cursor_set_ex ( wmWindow * win,
ScrArea * area,
ARegion * region,
bool swin_changed )
static

◆ region_poll()

bool region_poll ( const bContext * C,
const bScreen * screen,
const ScrArea * area,
const ARegion * region )
static

Definition at line 713 of file screen_edit.cc.

References BLI_assert_unreachable, C, params, and ARegion::runtime.

Referenced by area_regions_poll().

◆ screen_add()

bScreen * screen_add ( Main * bmain,
const char * name,
const rcti * rect )

◆ screen_addarea()

ScrArea * screen_addarea ( bScreen * screen,
ScrVert * left_bottom,
ScrVert * left_top,
ScrVert * right_top,
ScrVert * right_bottom,
const eSpace_Type space_type )
static

Definition at line 78 of file screen_edit.cc.

References AREAMAP_FROM_SCREEN, and screen_addarea_ex().

Referenced by area_split(), and screen_add().

◆ screen_addarea_ex()

ScrArea * screen_addarea_ex ( ScrAreaMap * area_map,
ScrVert * bottom_left,
ScrVert * top_left,
ScrVert * top_right,
ScrVert * bottom_right,
const eSpace_Type space_type )
static

◆ screen_area_close()

bool screen_area_close ( bContext * C,
ReportList * reports,
bScreen * screen,
ScrArea * area )

◆ screen_area_create_with_geometry()

ScrArea * screen_area_create_with_geometry ( ScrAreaMap * area_map,
const rcti * rect,
eSpace_Type space_type )
static

Add an area and geometry (screen-edges and -vertices) for it to area_map, with coordinates/dimensions matching rect.

Definition at line 1230 of file screen_edit.cc.

References screen_addarea_ex(), screen_geom_edge_add_ex(), screen_geom_vertex_add_ex(), rcti::xmax, rcti::xmin, rcti::ymax, and rcti::ymin.

Referenced by screen_global_area_refresh().

◆ screen_area_join()

int screen_area_join ( bContext * C,
ReportList * reports,
bScreen * screen,
ScrArea * sa1,
ScrArea * sa2 )

Join any two neighboring areas. Might involve complex changes.

Definition at line 599 of file screen_edit.cc.

References C, and screen_area_join_ex().

Referenced by area_docking_apply(), area_join_apply(), and area_split_cancel().

◆ screen_area_join_aligned()

◆ screen_area_join_ex()

◆ screen_area_set_geometry_rect()

void screen_area_set_geometry_rect ( ScrArea * area,
const rcti * rect )
static

◆ screen_area_spacelink_add()

◆ screen_area_trim()

ScrArea * screen_area_trim ( bContext * C,
bScreen * screen,
ScrArea ** area,
int size,
eScreenDir dir,
bool reverse )
static

◆ screen_areas_align()

◆ screen_areas_can_align()

◆ screen_change_prepare()

void screen_change_prepare ( bScreen * screen_old,
bScreen * screen_new,
Main * bmain,
bContext * C,
wmWindow * win )

◆ screen_change_update()

◆ screen_cursor_set()

◆ screen_data_copy()

◆ screen_delarea()

void screen_delarea ( bContext * C,
bScreen * screen,
ScrArea * area )
static

◆ screen_global_area_refresh()

◆ screen_global_header_size()

int screen_global_header_size ( )
static

◆ screen_global_statusbar_area_refresh()

◆ screen_global_topbar_area_refresh()

void screen_global_topbar_area_refresh ( wmWindow * win,
bScreen * screen )
static

◆ screen_new_activate_prepare()

void screen_new_activate_prepare ( const wmWindow * win,
bScreen * screen_new )

Prepare a newly created screen for initializing it as active screen.

Definition at line 268 of file screen_edit.cc.

References bScreen::do_draw, bScreen::do_refresh, bScreen::winid, and wmWindow::winid.

◆ screen_refresh_if_needed()

void screen_refresh_if_needed ( bContext * C,
wmWindowManager * wm,
wmWindow * win )
static

Refreshes the active screen of win if bScreen.do_refresh is set. Region polling is also done here, which will trigger a refresh on changes.

Screen refreshes should only be necessary if the screen layout changes in some way.

Definition at line 811 of file screen_edit.cc.

References bScreen::animtimer, C, bScreen::context, bScreen::do_refresh, ED_area_and_region_types_init(), ED_area_init(), ED_screen_areas_iter, ed_screen_context(), ED_screen_global_areas_refresh(), G, G_DEBUG_EVENTS, wmWindow::ghostwin, printf, screen_geom_vertices_scale(), screen_regions_poll(), bScreen::winid, wmWindow::winid, WM_event_timer_sleep(), WM_window_dpi_set_userdef(), and WM_window_get_active_screen().

Referenced by ED_screen_ensure_updated(), and ED_screen_refresh().

◆ screen_regions_poll()

bool screen_regions_poll ( bContext * C,
wmWindow * win,
const bScreen * screen )
static
Returns
true if any region polling state changed, and a screen refresh is needed.

Definition at line 783 of file screen_edit.cc.

References area_regions_poll(), C, CTX_wm_area(), CTX_wm_area_set(), CTX_wm_region(), CTX_wm_region_set(), CTX_wm_window(), CTX_wm_window_set(), and ED_screen_areas_iter.

Referenced by screen_refresh_if_needed().

◆ screen_set_3dview_camera()

◆ screen_state_to_nonnormal()

bScreen * screen_state_to_nonnormal ( bContext * C,
wmWindow * win,
ScrArea * toggle_area,
int state )
static
Parameters
toggle_areaIf this is set, its space data will be swapped with the one of the new empty area, when toggling back it can be swapped back again.
Returns
The newly created screen with the non-normal area.
Note
The caller must run ED_screen_change this is not done in this function as it would attempt to initialize areas that don't yet have a space-type assigned (converting them to 3D view without creating the space-data).

Definition at line 1637 of file screen_edit.cc.

References bScreen::animtimer, bScreen::areabase, ScrAreaMap::areabase, BKE_workspace_layout_screen_get(), BLI_assert, C, CTX_data_main(), ED_area_data_swap(), ED_area_tag_refresh(), ED_workspace_layout_add(), ELEM, ListBase::first, bScreen::flag, ScrArea::flag, View3DOverlay::flag, ScrArea::full, bScreen::fullscreen_flag, FULLSCREEN_RESTORE_GIZMO_NAVIGATE, FULLSCREEN_RESTORE_STATS, FULLSCREEN_RESTORE_TEXT, SpaceClip::gizmo_flag, SpaceImage::gizmo_flag, SpaceSeq::gizmo_flag, View3D::gizmo_flag, GLOBAL_AREA_IS_HIDDEN, wmWindow::global_areas, bScreen::id, LISTBASE_FOREACH, MAX_ID_NAME, ID::name, View3D::overlay, bScreen::redraws_flag, ScrArea::regionbase, RGN_FLAG_HIDDEN, RGN_TYPE_ASSET_SHELF, RGN_TYPE_ASSET_SHELF_HEADER, RGN_TYPE_EXECUTE, RGN_TYPE_FOOTER, RGN_TYPE_HEADER, RGN_TYPE_NAV_BAR, RGN_TYPE_TOOL_HEADER, RGN_TYPE_TOOLS, RGN_TYPE_UI, SCLIP_GIZMO_HIDE_NAVIGATE, SCREENFULL, SCREENMAXIMIZED, SEQ_GIZMO_HIDE_NAVIGATE, SI_GIZMO_HIDE_NAVIGATE, SNPRINTF_UTF8, SPACE_CLIP, SPACE_IMAGE, SPACE_SEQ, SPACE_VIEW3D, ScrArea::spacedata, ScrArea::spacetype, bScreen::state, state, bScreen::temp, V3D_GIZMO_HIDE_NAVIGATE, V3D_OVERLAY_HIDE_TEXT, V3D_OVERLAY_STATS, WM_window_get_active_screen(), and WM_window_get_active_workspace().

Referenced by ED_screen_state_maximized_create(), and ED_screen_state_toggle().

◆ screen_verts_halign()

void screen_verts_halign ( const wmWindow * win,
const bScreen * screen,
const short from_x,
const short to_x )
static

Definition at line 346 of file screen_edit.cc.

References ED_screen_verts_iter.

Referenced by screen_areas_align().

◆ screen_verts_valign()

void screen_verts_valign ( const wmWindow * win,
const bScreen * screen,
const short from_y,
const short to_y )
static

Definition at line 360 of file screen_edit.cc.

References ED_screen_verts_iter.

Referenced by screen_areas_align().

◆ time_top_left_3dwindow()

ARegion * time_top_left_3dwindow ( bScreen * screen)
static