Blender  V3.3
space_statusbar.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include <stdio.h>
8 #include <string.h>
9 
10 #include "MEM_guardedalloc.h"
11 
12 #include "BLI_blenlib.h"
13 
14 #include "BKE_context.h"
15 #include "BKE_screen.h"
16 
17 #include "ED_screen.h"
18 #include "ED_space_api.h"
19 
20 #include "RNA_access.h"
21 
22 #include "UI_interface.h"
23 
24 #include "WM_api.h"
25 #include "WM_message.h"
26 #include "WM_types.h"
27 
28 /* ******************** default callbacks for statusbar space ******************** */
29 
31 {
32  ARegion *region;
33  SpaceStatusBar *sstatusbar;
34 
35  sstatusbar = MEM_callocN(sizeof(*sstatusbar), "init statusbar");
36  sstatusbar->spacetype = SPACE_STATUSBAR;
37 
38  /* header region */
39  region = MEM_callocN(sizeof(*region), "header for statusbar");
40  BLI_addtail(&sstatusbar->regionbase, region);
41  region->regiontype = RGN_TYPE_HEADER;
42  region->alignment = RGN_ALIGN_NONE;
43 
44  return (SpaceLink *)sstatusbar;
45 }
46 
47 /* not spacelink itself */
48 static void statusbar_free(SpaceLink *UNUSED(sl))
49 {
50 }
51 
52 /* spacetype; init callback */
54 {
55 }
56 
58 {
59  SpaceStatusBar *sstatusbarn = MEM_dupallocN(sl);
60 
61  /* clear or remove stuff from old */
62 
63  return (SpaceLink *)sstatusbarn;
64 }
65 
66 /* add handlers, stuff you only do once or on area/region changes */
68 {
70  region->flag |= RGN_FLAG_DYNAMIC_SIZE;
71  }
72  ED_region_header_init(region);
73 }
74 
75 static void statusbar_operatortypes(void)
76 {
77 }
78 
79 static void statusbar_keymap(struct wmKeyConfig *UNUSED(keyconf))
80 {
81 }
82 
84 {
85  ARegion *region = params->region;
86  wmNotifier *wmn = params->notifier;
87 
88  /* context changes */
89  switch (wmn->category) {
90  case NC_SCREEN:
91  if (ELEM(wmn->data, ND_LAYER, ND_ANIMPLAY)) {
92  ED_region_tag_redraw(region);
93  }
94  break;
95  case NC_WM:
96  if (wmn->data == ND_JOB) {
97  ED_region_tag_redraw(region);
98  }
99  break;
100  case NC_SCENE:
101  if (wmn->data == ND_RENDER_RESULT) {
102  ED_region_tag_redraw(region);
103  }
104  break;
105  case NC_SPACE:
106  if (wmn->data == ND_SPACE_INFO) {
107  ED_region_tag_redraw(region);
108  }
109  break;
110  case NC_ID:
111  if (wmn->action == NA_RENAME) {
112  ED_region_tag_redraw(region);
113  }
114  break;
115  }
116 }
117 
119 {
120  struct wmMsgBus *mbus = params->message_bus;
121  ARegion *region = params->region;
122 
123  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
124  .owner = region,
125  .user_data = region,
127  };
128 
129  WM_msg_subscribe_rna_anon_prop(mbus, Window, view_layer, &msg_sub_value_region_tag_redraw);
130  WM_msg_subscribe_rna_anon_prop(mbus, ViewLayer, name, &msg_sub_value_region_tag_redraw);
131 }
132 
134 {
135  SpaceType *st = MEM_callocN(sizeof(*st), "spacetype statusbar");
136  ARegionType *art;
137 
138  st->spaceid = SPACE_STATUSBAR;
139  strncpy(st->name, "Status Bar", BKE_ST_MAXNAME);
140 
141  st->create = statusbar_create;
142  st->free = statusbar_free;
143  st->init = statusbar_init;
144  st->duplicate = statusbar_duplicate;
145  st->operatortypes = statusbar_operatortypes;
146  st->keymap = statusbar_keymap;
147 
148  /* regions: header window */
149  art = MEM_callocN(sizeof(*art), "spacetype statusbar header region");
150  art->regionid = RGN_TYPE_HEADER;
151  art->prefsizey = 0.8f * HEADERY;
152  art->prefsizex = UI_UNIT_X * 5; /* Mainly to avoid glitches */
159  BLI_addhead(&st->regiontypes, art);
160 
162 }
#define BKE_ST_MAXNAME
Definition: BKE_screen.h:53
void BKE_spacetype_register(struct SpaceType *st)
Definition: screen.c:391
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:60
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
#define UNUSED(x)
#define ELEM(...)
#define HEADERY
#define RGN_ALIGN_ENUM_FROM_MASK(align)
@ RGN_FLAG_DYNAMIC_SIZE
@ RGN_TYPE_HEADER
@ RGN_ALIGN_RIGHT
@ RGN_ALIGN_NONE
@ SPACE_STATUSBAR
@ ED_KEYMAP_UI
Definition: ED_screen.h:691
@ ED_KEYMAP_HEADER
Definition: ED_screen.h:697
@ ED_KEYMAP_VIEW2D
Definition: ED_screen.h:694
void ED_region_do_msg_notify_tag_redraw(struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val)
void ED_region_header_layout(const struct bContext *C, struct ARegion *region)
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:655
void ED_region_header_init(struct ARegion *region)
Definition: area.c:3417
void ED_region_header_draw(const struct bContext *C, struct ARegion *region)
Read Guarded memory(de)allocation.
#define UI_UNIT_X
#define NC_ID
Definition: WM_types.h:345
#define ND_SPACE_INFO
Definition: WM_types.h:464
#define ND_RENDER_RESULT
Definition: WM_types.h:394
#define ND_JOB
Definition: WM_types.h:364
#define NC_WM
Definition: WM_types.h:324
#define NC_SCREEN
Definition: WM_types.h:327
#define ND_ANIMPLAY
Definition: WM_types.h:372
#define NC_SCENE
Definition: WM_types.h:328
#define ND_LAYER
Definition: WM_types.h:398
#define NA_RENAME
Definition: WM_types.h:527
#define NC_SPACE
Definition: WM_types.h:342
Scene scene
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
static void area(int d1, int d2, int e1, int e2, float weights[2])
static const pxr::TfToken st("st", pxr::TfToken::Immortal)
static void statusbar_free(SpaceLink *UNUSED(sl))
static SpaceLink * statusbar_duplicate(SpaceLink *sl)
static void statusbar_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area))
static void statusbar_keymap(struct wmKeyConfig *UNUSED(keyconf))
static void statusbar_header_region_init(wmWindowManager *UNUSED(wm), ARegion *region)
static void statusbar_header_region_listener(const wmRegionListenerParams *params)
static void statusbar_operatortypes(void)
static SpaceLink * statusbar_create(const ScrArea *UNUSED(area), const Scene *UNUSED(scene))
static void statusbar_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
void ED_spacetype_statusbar(void)
void(* draw)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:151
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
Definition: BKE_screen.h:167
void(* listener)(const wmRegionListenerParams *params)
Definition: BKE_screen.h:165
int keymapflag
Definition: BKE_screen.h:208
void(* layout)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:161
void(* init)(struct wmWindowManager *wm, struct ARegion *region)
Definition: BKE_screen.h:147
short alignment
short regiontype
unsigned int data
Definition: WM_types.h:308
unsigned int action
Definition: WM_types.h:308
unsigned int category
Definition: WM_types.h:308
#define WM_msg_subscribe_rna_anon_prop(mbus, type_, prop_, value)