Blender V4.5
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_listbase.h"
#include "BLI_rect.h"
#include "BLI_string.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 "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, 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_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 889 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 2038 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 884 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 1574 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 849 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 2059 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 2021 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 1683 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 )

◆ 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 696 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 76 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 1213 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 586 of file screen_edit.cc.

References C, reports, 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 266 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 794 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_get_active_screen(), and WM_window_set_dpi().

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 766 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 1608 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 344 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 358 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