Blender V4.3
screen_edit.cc File Reference
#include <cmath>
#include <cstring>
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "BLI_blenlib.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_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 "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 (bScreen *screen, ScrArea *sa1, ScrArea *sa2, eScreenDir dir)
 
static bool screen_areas_align (bContext *C, bScreen *screen, ScrArea *sa1, ScrArea *sa2, const eScreenDir dir)
 
static bool screen_area_join_aligned (bContext *C, 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, bScreen *screen, ScrArea *sa1, ScrArea *sa2, bool close_all_remainders)
 
int screen_area_join (bContext *C, bScreen *screen, ScrArea *sa1, ScrArea *sa2)
 
bool screen_area_close (bContext *C, 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)
 
static bool screen_regions_poll (bContext *C, wmWindow *win, const bScreen *screen)
 
static void screen_refresh (bContext *C, wmWindowManager *wm, wmWindow *win, const bool force_full_refresh)
 
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, const rcti *rect_unscaled, eSpace_Type space_type, int display_type, bool dialog)
 
void ED_screen_animation_timer (bContext *C, 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_split()

◆ ED_area_exit()

◆ ED_area_icon()

int ED_area_icon ( const ScrArea * area)

◆ 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 817 of file screen_edit.cc.

References BKE_area_region_free(), BLI_freelinkN(), and ED_region_exit().

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 1973 of file screen_edit.cc.

References 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 810 of file screen_edit.cc.

References screen_refresh().

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 )

was_prev_temp for the case previous space was a temporary full-screen as well

Definition at line 1461 of file screen_edit.cc.

References AREA_FLAG_STACKED_FULLSCREEN, BLI_assert, ED_area_prevspace(), and ED_screen_restore_temp_type().

Referenced by ED_screen_full_restore(), fullscreen_back_exec(), render_view_cancel_exec(), render_view_show_invoke(), and wm_handler_fileselect_do().

◆ 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 1490 of file screen_edit.cc.

References CTX_wm_screen(), CTX_wm_window(), ED_screen_full_prevspace(), ED_screen_state_toggle(), SpaceLink::link_flag, SpaceLink::next, SCREENMAXIMIZED, SPACE_FLAG_TYPE_TEMPORARY, 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 784 of file screen_edit.cc.

References screen_refresh().

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 1994 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 1956 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 1599 of file screen_edit.cc.

References 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 1604 of file screen_edit.cc.

References bScreen::animtimer, bScreen::areabase, ScrAreaMap::areabase, BKE_workspace_layout_remove(), BKE_workspace_layout_screen_get(), BLI_assert, 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, ScrArea::full, ScrArea::global, wmWindow::global_areas, LISTBASE_FOREACH, screen_state_to_nonnormal(), SCREENFULL, SCREENNORMAL, state, UI_blocklist_free(), 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,
const rcti * rect_unscaled,
eSpace_Type space_type,
int display_type,
bool dialog )

◆ 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()

static void region_cursor_set ( wmWindow * win,
bool swin_changed )
static

◆ region_cursor_set_ex()

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

◆ region_poll()

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

Definition at line 664 of file screen_edit.cc.

References C, and params.

Referenced by screen_regions_poll().

◆ screen_add()

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

Empty screen, with 1 dummy area without space-data. Uses window size.

Definition at line 193 of file screen_edit.cc.

References BKE_libblock_alloc(), bScreen::do_refresh, ID_SCR, screen_addarea(), screen_geom_edge_add(), screen_geom_vertex_add(), SPACE_EMPTY, TIME_ALL_3D_WIN, TIME_ALL_ANIM_WIN, rcti::xmax, rcti::xmin, rcti::ymax, and rcti::ymin.

Referenced by ED_workspace_layout_add().

◆ screen_addarea()

static 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 73 of file screen_edit.cc.

References AREAMAP_FROM_SCREEN, and screen_addarea_ex().

Referenced by area_split(), and screen_add().

◆ screen_addarea_ex()

static 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,
bScreen * screen,
ScrArea * area )

Close a screen area, allowing most-aligned neighbor to take its place.

Definition at line 567 of file screen_edit.cc.

References area_getorientation(), float, LISTBASE_FOREACH, screen_area_join_ex(), SCREEN_DIR_IS_VERTICAL, and SCREEN_DIR_NONE.

Referenced by area_close_exec(), area_docking_apply(), area_join_modal(), and screen_area_join_ex().

◆ screen_area_create_with_geometry()

static 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 1133 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,
bScreen * screen,
ScrArea * sa1,
ScrArea * sa2 )

Join any two neighboring areas. Might involve complex changes.

Definition at line 562 of file screen_edit.cc.

References screen_area_join_ex().

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

◆ screen_area_join_aligned()

◆ screen_area_join_ex()

static bool screen_area_join_ex ( bContext * C,
bScreen * screen,
ScrArea * sa1,
ScrArea * sa2,
bool close_all_remainders )
static

◆ screen_area_set_geometry_rect()

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

Definition at line 1150 of file screen_edit.cc.

References rcti::xmax, rcti::xmin, rcti::ymax, and rcti::ymin.

Referenced by screen_global_area_refresh().

◆ screen_area_spacelink_add()

void screen_area_spacelink_add ( const Scene * scene,
ScrArea * area,
eSpace_Type space_type )

◆ screen_area_trim()

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

◆ screen_areas_align()

static bool screen_areas_align ( bContext * C,
bScreen * screen,
ScrArea * sa1,
ScrArea * sa2,
const eScreenDir dir )
static

◆ screen_areas_can_align()

◆ screen_change_prepare()

void screen_change_prepare ( bScreen * screen_old,
bScreen * screen_new,
Main * bmain,
bContext * C,
wmWindow * win )
Returns
the screen to activate.
Warning
The returned screen may not always equal screen_new!

Definition at line 1274 of file screen_edit.cc.

References bScreen::animtimer, bScreen::areabase, BLI_assert, BLI_findindex(), CTX_wm_manager(), ED_screen_exit(), LISTBASE_FOREACH, wmWindow::modalhandlers, Main::screens, UNUSED_VARS_NDEBUG, WM_event_remove_area_handler(), and WM_event_timer_sleep().

Referenced by ED_screen_change(), and ED_workspace_change().

◆ screen_change_update()

◆ screen_cursor_set()

◆ screen_data_copy()

◆ screen_delarea()

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

Definition at line 84 of file screen_edit.cc.

References BKE_screen_area_free(), BLI_remlink(), ED_area_exit(), and MEM_freeN().

Referenced by screen_area_join_aligned().

◆ screen_global_area_refresh()

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

◆ screen_global_header_size()

static int screen_global_header_size ( )
static

◆ screen_global_statusbar_area_refresh()

◆ screen_global_topbar_area_refresh()

static 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 263 of file screen_edit.cc.

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

◆ screen_refresh()

static void screen_refresh ( bContext * C,
wmWindowManager * wm,
wmWindow * win,
const bool force_full_refresh )
static
Parameters
force_full_refreshIf false, a full refresh will only be performed if the screen is tagged for refresh (bScreen.do_refresh), or region polling changes require a refresh.

Definition at line 732 of file screen_edit.cc.

References 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(), wmWindow::winid, WM_event_timer_sleep(), WM_window_get_active_screen(), and WM_window_set_dpi().

Referenced by ED_screen_ensure_updated(), and ED_screen_refresh().

◆ screen_regions_poll()

static 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 686 of file screen_edit.cc.

References CTX_wm_area(), CTX_wm_area_set(), CTX_wm_region(), CTX_wm_region_set(), CTX_wm_window(), CTX_wm_window_set(), ED_region_visibility_change_update(), ED_screen_areas_iter, LISTBASE_FOREACH, region_poll(), and RGN_FLAG_POLL_FAILED.

Referenced by screen_refresh().

◆ screen_set_3dview_camera()

◆ screen_state_to_nonnormal()

static 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 1524 of file screen_edit.cc.

References bScreen::animtimer, ScrAreaMap::areabase, BKE_workspace_layout_screen_get(), BLI_assert, CTX_data_main(), ED_area_data_swap(), ED_area_tag_refresh(), ED_workspace_layout_add(), ELEM, bScreen::flag, ScrArea::flag, ScrArea::full, GLOBAL_AREA_IS_HIDDEN, wmWindow::global_areas, bScreen::id, LISTBASE_FOREACH, MAX_ID_NAME, ID::name, 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, SCREENFULL, SCREENMAXIMIZED, SNPRINTF, bScreen::state, state, bScreen::temp, 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()

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

Definition at line 341 of file screen_edit.cc.

References ED_screen_verts_iter.

Referenced by screen_areas_align().

◆ screen_verts_valign()

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

Definition at line 355 of file screen_edit.cc.

References ED_screen_verts_iter.

Referenced by screen_areas_align().

◆ time_top_left_3dwindow()

static ARegion * time_top_left_3dwindow ( bScreen * screen)
static