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

◆ 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 834 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 1990 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 827 of file screen_edit.cc.

References C, and 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 )

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

References C, and 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 2011 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 1973 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 1616 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 1621 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, ScrArea::full, ScrArea::global, GLOBAL_AREA_IS_HIDDEN, wmWindow::global_areas, LISTBASE_FOREACH, ScrArea::regionbase, screen_state_to_nonnormal(), SCREENFULL, SCREENNORMAL, bScreen::skip_handling, bScreen::state, 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()

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

References BLI_assert_unreachable, C, params, ARegionType::poll, and ARegion::type.

Referenced by screen_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 73 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,
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 1150 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 567 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()

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

◆ 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 )
Returns
the screen to activate.
Warning
The returned screen may not always equal screen_new!

Definition at line 1291 of file screen_edit.cc.

References bScreen::animtimer, bScreen::areabase, BLI_assert, BLI_findindex(), C, 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()

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

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

◆ screen_refresh()

void screen_refresh ( bContext * C,
wmWindowManager * wm,
wmWindow * win,
const bool force_full_refresh )
static

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

References C, 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(), RGN_FLAG_POLL_FAILED, and V2D_IS_INIT.

Referenced by screen_refresh().

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

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

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

ARegion * time_top_left_3dwindow ( bScreen * screen)
static