Cleanup: Split up Window-Manager VR file (and related changes)
[blender.git] / source / blender / makesdna / DNA_screen_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_SCREEN_TYPES_H__
25 #define __DNA_SCREEN_TYPES_H__
26
27 #include "DNA_defs.h"
28 #include "DNA_listBase.h"
29 #include "DNA_vec_types.h"
30 #include "DNA_view2d_types.h"
31
32 #include "DNA_ID.h"
33
34 struct ARegion;
35 struct ARegionType;
36 struct PanelType;
37 struct Scene;
38 struct SpaceLink;
39 struct SpaceType;
40 struct uiLayout;
41 struct wmDrawBuffer;
42 struct wmTimer;
43 struct wmTooltipState;
44
45 /* TODO Doing this is quite ugly :)
46  * Once the top-bar is merged bScreen should be refactored to use ScrAreaMap. */
47 #define AREAMAP_FROM_SCREEN(screen) ((ScrAreaMap *)&(screen)->vertbase)
48
49 typedef struct bScreen {
50   ID id;
51
52   /* TODO Should become ScrAreaMap now.
53    * ** NOTE: KEEP ORDER IN SYNC WITH ScrAreaMap! (see AREAMAP_FROM_SCREEN macro above) ** */
54   /** Screens have vertices/edges to define areas. */
55   ListBase vertbase;
56   ListBase edgebase;
57   ListBase areabase;
58
59   /** Screen level regions (menus), runtime only. */
60   ListBase regionbase;
61
62   struct Scene *scene DNA_DEPRECATED;
63
64   /** General flags. */
65   short flag;
66   /** Winid from WM, starts with 1. */
67   short winid;
68   /** User-setting for which editors get redrawn during anim playback. */
69   short redraws_flag;
70
71   /** Temp screen in a temp window, don't save (like user prefs). */
72   char temp;
73   /** Temp screen for image render display or fileselect. */
74   char state;
75   /** Notifier for drawing edges. */
76   char do_draw;
77   /** Notifier for scale screen, changed screen, etc. */
78   char do_refresh;
79   /** Notifier for gesture draw. */
80   char do_draw_gesture;
81   /** Notifier for paint cursor draw. */
82   char do_draw_paintcursor;
83   /** Notifier for dragging draw. */
84   char do_draw_drag;
85   /** Set to delay screen handling after switching back from maximized area. */
86   char skip_handling;
87   /** Set when scrubbing to avoid some costly updates. */
88   char scrubbing;
89   char _pad[1];
90
91   /** Active region that has mouse focus. */
92   struct ARegion *active_region;
93
94   /** If set, screen has timer handler added in window. */
95   struct wmTimer *animtimer;
96   /** Context callback. */
97   void *context;
98
99   /** Runtime. */
100   struct wmTooltipState *tool_tip;
101
102   PreviewImage *preview;
103 } bScreen;
104
105 typedef struct ScrVert {
106   struct ScrVert *next, *prev, *newv;
107   vec2s vec;
108   /* first one used internally, second one for tools */
109   short flag, editflag;
110 } ScrVert;
111
112 typedef struct ScrEdge {
113   struct ScrEdge *next, *prev;
114   ScrVert *v1, *v2;
115   /** 1 when at edge of screen. */
116   short border;
117   short flag;
118   char _pad[4];
119 } ScrEdge;
120
121 typedef struct ScrAreaMap {
122   /* ** NOTE: KEEP ORDER IN SYNC WITH LISTBASES IN bScreen! ** */
123
124   /** ScrVert - screens have vertices/edges to define areas. */
125   ListBase vertbase;
126   /** ScrEdge. */
127   ListBase edgebase;
128   /** ScrArea. */
129   ListBase areabase;
130 } ScrAreaMap;
131
132 typedef struct Panel_Runtime {
133   /* Applied to Panel.ofsx, but saved separately so we can track changes between redraws. */
134   int region_ofsx;
135   char _pad[4];
136 } Panel_Runtime;
137
138 /** The part from uiBlock that needs saved in file. */
139 typedef struct Panel {
140   struct Panel *next, *prev;
141
142   /** Runtime. */
143   struct PanelType *type;
144   /** Runtime for drawing. */
145   struct uiLayout *layout;
146
147   /** Defined as UI_MAX_NAME_STR. */
148   char panelname[64];
149   /** Panel name is identifier for restoring location. */
150   char drawname[64];
151   /** Offset within the region. */
152   int ofsx, ofsy;
153   /** Panel size including children. */
154   int sizex, sizey;
155   /** Panel size excluding children. */
156   int blocksizex, blocksizey;
157   short labelofs;
158   char _pad[2];
159   short flag, runtime_flag;
160   short control;
161   short snap;
162   /** Panels are aligned according to increasing sort-order. */
163   int sortorder;
164   /** Runtime for panel manipulation. */
165   void *activedata;
166   /** Sub panels. */
167   ListBase children;
168
169   Panel_Runtime runtime;
170 } Panel;
171
172 /**
173  * Notes on Panel Categories:
174  *
175  * - #ARegion.panels_category (#PanelCategoryDyn)
176  *   is a runtime only list of categories collected during draw.
177  *
178  * - #ARegion.panels_category_active (#PanelCategoryStack)
179  *   is basically a list of strings (category id's).
180  *
181  * Clicking on a tab moves it to the front of region->panels_category_active,
182  * If the context changes so this tab is no longer displayed,
183  * then the first-most tab in #ARegion.panels_category_active is used.
184  *
185  * This way you can change modes and always have the tab you last clicked on.
186  */
187
188 /* region level tabs */
189 #
190 #
191 typedef struct PanelCategoryDyn {
192   struct PanelCategoryDyn *next, *prev;
193   char idname[64];
194   rcti rect;
195 } PanelCategoryDyn;
196
197 /* region stack of active tabs */
198 typedef struct PanelCategoryStack {
199   struct PanelCategoryStack *next, *prev;
200   char idname[64];
201 } PanelCategoryStack;
202
203 /* uiList dynamic data... */
204 /* These two Lines with # tell makesdna this struct can be excluded. */
205 #
206 #
207 typedef struct uiListDyn {
208   /** Number of rows needed to draw all elements. */
209   int height;
210   /** Actual visual height of the list (in rows). */
211   int visual_height;
212   /** Minimal visual height of the list (in rows). */
213   int visual_height_min;
214
215   /** Number of items in collection. */
216   int items_len;
217   /** Number of items actually visible after filtering. */
218   int items_shown;
219
220   /* Those are temp data used during drag-resize with GRIP button
221    * (they are in pixels, the meaningful data is the
222    * difference between resize_prev and resize)...
223    */
224   int resize;
225   int resize_prev;
226
227   /* Filtering data. */
228   /** Items_len length. */
229   int *items_filter_flags;
230   /** Org_idx -> new_idx, items_len length. */
231   int *items_filter_neworder;
232 } uiListDyn;
233
234 typedef struct uiList { /* some list UI data need to be saved in file */
235   struct uiList *next, *prev;
236
237   /** Runtime. */
238   struct uiListType *type;
239
240   /** Defined as UI_MAX_NAME_STR. */
241   char list_id[64];
242
243   /** How items are layedout in the list. */
244   int layout_type;
245   int flag;
246
247   int list_scroll;
248   int list_grip;
249   int list_last_len;
250   int list_last_activei;
251
252   /* Filtering data. */
253   /** Defined as UI_MAX_NAME_STR. */
254   char filter_byname[64];
255   int filter_flag;
256   int filter_sort_flag;
257
258   /* Custom sub-classes properties. */
259   IDProperty *properties;
260
261   /* Dynamic data (runtime). */
262   uiListDyn *dyn_data;
263 } uiList;
264
265 typedef struct TransformOrientation {
266   struct TransformOrientation *next, *prev;
267   /** MAX_NAME. */
268   char name[64];
269   float mat[3][3];
270   char _pad[4];
271 } TransformOrientation;
272
273 /** Some preview UI data need to be saved in file. */
274 typedef struct uiPreview {
275   struct uiPreview *next, *prev;
276
277   /** Defined as UI_MAX_NAME_STR. */
278   char preview_id[64];
279   short height;
280   char _pad1[6];
281 } uiPreview;
282
283 /* These two lines with # tell makesdna this struct can be excluded.
284  * Should be: #ifndef WITH_GLOBAL_AREA_WRITING */
285 #
286 #
287 typedef struct ScrGlobalAreaData {
288   /* Global areas have a non-dynamic size. That means, changing the window
289    * size doesn't affect their size at all. However, they can still be
290    * 'collapsed', by changing this value. Ignores DPI (ED_area_global_size_y
291    * and winx/winy don't) */
292   short cur_fixed_height;
293   /* For global areas, this is the min and max size they can use depending on
294    * if they are 'collapsed' or not. */
295   short size_min, size_max;
296   /** GlobalAreaAlign. */
297   short align;
298
299   /** GlobalAreaFlag. */
300   short flag;
301   char _pad[2];
302 } ScrGlobalAreaData;
303
304 enum GlobalAreaFlag {
305   GLOBAL_AREA_IS_HIDDEN = (1 << 0),
306 };
307
308 typedef enum GlobalAreaAlign {
309   GLOBAL_AREA_ALIGN_TOP,
310   GLOBAL_AREA_ALIGN_BOTTOM,
311 } GlobalAreaAlign;
312
313 typedef struct ScrArea_Runtime {
314   struct bToolRef *tool;
315   char is_tool_set;
316   char _pad0[7];
317 } ScrArea_Runtime;
318
319 typedef struct ScrArea {
320   struct ScrArea *next, *prev;
321
322   /** Ordered (bl, tl, tr, br). */
323   ScrVert *v1, *v2, *v3, *v4;
324   /** If area==full, this is the parent. */
325   bScreen *full;
326
327   /** Rect bound by v1 v2 v3 v4. */
328   rcti totrct;
329
330   /**
331    * eSpace_Type (SPACE_FOO).
332    *
333    * Temporarily used while switching area type, otherwise this should be SPACE_EMPTY.
334    * Also, versioning uses it to nicely replace deprecated * editors.
335    * It's been there for ages, name doesn't fit any more.
336    */
337   char spacetype;
338   /** #eSpace_Type (SPACE_FOO). */
339   char butspacetype;
340   short butspacetype_subtype;
341
342   /** Size. */
343   short winx, winy;
344
345   /** OLD! 0=no header, 1= down, 2= up. */
346   char headertype DNA_DEPRECATED;
347   /** Private, for spacetype refresh callback. */
348   char do_refresh;
349   short flag;
350   /**
351    * Index of last used region of 'RGN_TYPE_WINDOW'
352    * runtime variable, updated by executing operators.
353    */
354   short region_active_win;
355   char _pad[2];
356
357   /** Callbacks for this space type. */
358   struct SpaceType *type;
359
360   /* Non-NULL if this area is global. */
361   ScrGlobalAreaData *global;
362
363   /* A list of space links (editors) that were open in this area before. When
364    * changing the editor type, we try to reuse old editor data from this list.
365    * The first item is the active/visible one.
366    */
367   /** #SpaceLink. */
368   ListBase spacedata;
369   /* NOTE: This region list is the one from the active/visible editor (first item in
370    * spacedata list). Use SpaceLink.regionbase if it's inactive (but only then)!
371    */
372   /** #ARegion. */
373   ListBase regionbase;
374   /** #wmEventHandler. */
375   ListBase handlers;
376
377   /** #AZone. */
378   ListBase actionzones;
379
380   ScrArea_Runtime runtime;
381 } ScrArea;
382
383 typedef struct ARegion_Runtime {
384   /* Panel category to use between 'layout' and 'draw'. */
385   const char *category;
386
387   /**
388    * The visible part of the region, use with region overlap not to draw
389    * on top of the overlapping regions.
390    *
391    * Lazy initialize, zero'd when unset, relative to #ARegion.winrct x/y min. */
392   rcti visible_rect;
393
394   /* The offset needed to not overlap with window scrollbars. Only used by HUD regions for now. */
395   int offset_x, offset_y;
396 } ARegion_Runtime;
397
398 typedef struct ARegion {
399   struct ARegion *next, *prev;
400
401   /** 2D-View scrolling/zoom info (most regions are 2d anyways). */
402   View2D v2d;
403   /** Coordinates of region. */
404   rcti winrct;
405   /** Runtime for partial redraw, same or smaller than winrct. */
406   rcti drawrct;
407   /** Size. */
408   short winx, winy;
409
410   /** Region is currently visible on screen. */
411   short visible;
412   /** Window, header, etc. identifier for drawing. */
413   short regiontype;
414   /** How it should split. */
415   short alignment;
416   /** Hide, .... */
417   short flag;
418
419   /** Current split size in unscaled pixels (if zero it uses regiontype).
420    * To convert to pixels use: `UI_DPI_FAC * region->sizex + 0.5f`.
421    * However to get the current region size, you should usually use winx/winy from above, not this!
422    */
423   short sizex, sizey;
424
425   /** Private, cached notifier events. */
426   short do_draw;
427   /** Private, cached notifier events. */
428   short do_draw_overlay;
429   /** Private, set for indicate drawing overlapped. */
430   short overlap;
431   /** Temporary copy of flag settings for clean fullscreen. */
432   short flagfullscreen;
433
434   /** Callbacks for this region type. */
435   struct ARegionType *type;
436
437   /** #uiBlock. */
438   ListBase uiblocks;
439   /** Panel. */
440   ListBase panels;
441   /** Stack of panel categories. */
442   ListBase panels_category_active;
443   /** #uiList. */
444   ListBase ui_lists;
445   /** #uiPreview. */
446   ListBase ui_previews;
447   /** #wmEventHandler. */
448   ListBase handlers;
449   /** Panel categories runtime. */
450   ListBase panels_category;
451
452   /** Gizmo-map of this region. */
453   struct wmGizmoMap *gizmo_map;
454   /** Blend in/out. */
455   struct wmTimer *regiontimer;
456   struct wmDrawBuffer *draw_buffer;
457
458   /** Use this string to draw info. */
459   char *headerstr;
460   /** XXX 2.50, need spacedata equivalent?. */
461   void *regiondata;
462
463   ARegion_Runtime runtime;
464 } ARegion;
465
466 /** #ScrArea.flag */
467 enum {
468   HEADER_NO_PULLDOWN = (1 << 0),
469 //  AREA_FLAG_UNUSED_1           = (1 << 1),
470 //  AREA_FLAG_UNUSED_2           = (1 << 2),
471 #ifdef DNA_DEPRECATED_ALLOW
472   AREA_TEMP_INFO = (1 << 3), /* versioned to make slot reusable */
473 #endif
474   /** Update size of regions within the area. */
475   AREA_FLAG_REGION_SIZE_UPDATE = (1 << 3),
476   AREA_FLAG_ACTIVE_TOOL_UPDATE = (1 << 4),
477   // AREA_FLAG_UNUSED_5 = (1 << 5),
478
479   AREA_FLAG_UNUSED_6 = (1 << 6), /* cleared */
480
481   /**
482    * For temporary full-screens (file browser, image editor render)
483    * that are opened above user set full-screens.
484    */
485   AREA_FLAG_STACKED_FULLSCREEN = (1 << 7),
486   /** Update action zones (even if the mouse is not intersecting them). */
487   AREA_FLAG_ACTIONZONES_UPDATE = (1 << 8),
488 };
489
490 #define AREAGRID 4
491 #define AREAMINX 32
492 #define HEADER_PADDING_Y 6
493 #define HEADERY (20 + HEADER_PADDING_Y)
494
495 /** #bScreen.flag */
496 enum {
497   SCREEN_DEPRECATED = 1,
498   SCREEN_COLLAPSE_STATUSBAR = 2,
499 };
500
501 /** #bScreen.state */
502 enum {
503   SCREENNORMAL = 0,
504   SCREENMAXIMIZED = 1, /* one editor taking over the screen */
505   SCREENFULL = 2,      /* one editor taking over the screen with no bare-minimum UI elements */
506 };
507
508 /** #bScreen.redraws_flag */
509 typedef enum eScreen_Redraws_Flag {
510   TIME_REGION = (1 << 0),
511   TIME_ALL_3D_WIN = (1 << 1),
512   TIME_ALL_ANIM_WIN = (1 << 2),
513   TIME_ALL_BUTS_WIN = (1 << 3),
514   // TIME_WITH_SEQ_AUDIO    = (1 << 4), /* DEPRECATED */
515   TIME_SEQ = (1 << 5),
516   TIME_ALL_IMAGE_WIN = (1 << 6),
517   // TIME_CONTINUE_PHYSICS  = (1 << 7), /* UNUSED */
518   TIME_NODES = (1 << 8),
519   TIME_CLIPS = (1 << 9),
520
521   TIME_FOLLOW = (1 << 15),
522 } eScreen_Redraws_Flag;
523
524 /** #Panel.flag */
525 enum {
526   PNL_SELECT = (1 << 0),
527   PNL_CLOSEDX = (1 << 1),
528   PNL_CLOSEDY = (1 << 2),
529   PNL_CLOSED = (PNL_CLOSEDX | PNL_CLOSEDY),
530   /*PNL_TABBED    = (1 << 3), */ /*UNUSED*/
531   PNL_OVERLAP = (1 << 4),
532   PNL_PIN = (1 << 5),
533   PNL_POPOVER = (1 << 6),
534 };
535
536 /** #Panel.snap - for snapping to screen edges */
537 #define PNL_SNAP_NONE 0
538 /* #define PNL_SNAP_TOP     1 */
539 /* #define PNL_SNAP_RIGHT       2 */
540 #define PNL_SNAP_BOTTOM 4
541 /* #define PNL_SNAP_LEFT        8 */
542
543 /* #define PNL_SNAP_DIST        9.0 */
544
545 /* paneltype flag */
546 #define PNL_DEFAULT_CLOSED 1
547 #define PNL_NO_HEADER 2
548 #define PNL_LAYOUT_VERT_BAR 4
549
550 /* Fallback panel category (only for old scripts which need updating) */
551 #define PNL_CATEGORY_FALLBACK "Misc"
552
553 /** #uiList.layout_type */
554 enum {
555   UILST_LAYOUT_DEFAULT = 0,
556   UILST_LAYOUT_COMPACT = 1,
557   UILST_LAYOUT_GRID = 2,
558 };
559
560 /** #uiList.flag */
561 enum {
562   /* Scroll list to make active item visible. */
563   UILST_SCROLL_TO_ACTIVE_ITEM = 1 << 0,
564 };
565
566 /* Value (in number of items) we have to go below minimum shown items to enable auto size. */
567 #define UI_LIST_AUTO_SIZE_THRESHOLD 1
568
569 /* uiList filter flags (dyn_data) */
570 /* WARNING! Those values are used by integer RNA too, which does not handle well values > INT_MAX.
571  *          So please do not use 32nd bit here. */
572 enum {
573   UILST_FLT_ITEM = 1 << 30, /* This item has passed the filter process successfully. */
574 };
575
576 /** #uiList.filter_flag */
577 enum {
578   UILST_FLT_SHOW = 1 << 0,            /* Show filtering UI. */
579   UILST_FLT_EXCLUDE = UILST_FLT_ITEM, /* Exclude filtered items, *must* use this same value. */
580 };
581
582 /** #uiList.filter_sort_flag */
583 enum {
584   /* Plain values (only one is valid at a time, once masked with UILST_FLT_SORT_MASK. */
585   /** Just for sake of consistency. */
586   /* UILST_FLT_SORT_INDEX = 0, */ /* UNUSED */
587   UILST_FLT_SORT_ALPHA = 1,
588
589   /* Bitflags affecting behavior of any kind of sorting. */
590   /** Special flag to indicate that order is locked (not user-changeable). */
591   UILST_FLT_SORT_LOCK = 1u << 30,
592   /** Special value, bitflag used to reverse order! */
593   UILST_FLT_SORT_REVERSE = 1u << 31,
594 };
595
596 #define UILST_FLT_SORT_MASK (((unsigned int)(UILST_FLT_SORT_REVERSE | UILST_FLT_SORT_LOCK)) - 1)
597
598 /* regiontype, first two are the default set */
599 /* Do NOT change order, append on end. Types are hardcoded needed */
600 enum {
601   RGN_TYPE_WINDOW = 0,
602   RGN_TYPE_HEADER = 1,
603   RGN_TYPE_CHANNELS = 2,
604   RGN_TYPE_TEMPORARY = 3,
605   RGN_TYPE_UI = 4,
606   RGN_TYPE_TOOLS = 5,
607   RGN_TYPE_TOOL_PROPS = 6,
608   RGN_TYPE_PREVIEW = 7,
609   RGN_TYPE_HUD = 8,
610   /* Region to navigate the main region from (RGN_TYPE_WINDOW). */
611   RGN_TYPE_NAV_BAR = 9,
612   /* A place for buttons to trigger execution of something that was set up in other regions. */
613   RGN_TYPE_EXECUTE = 10,
614   RGN_TYPE_FOOTER = 11,
615   RGN_TYPE_TOOL_HEADER = 12,
616 };
617 /* use for function args */
618 #define RGN_TYPE_ANY -1
619
620 /* Region supports panel tabs (categories). */
621 #define RGN_TYPE_HAS_CATEGORY_MASK (1 << RGN_TYPE_UI)
622
623 /** #ARegion.alignment */
624 enum {
625   RGN_ALIGN_NONE = 0,
626   RGN_ALIGN_TOP = 1,
627   RGN_ALIGN_BOTTOM = 2,
628   RGN_ALIGN_LEFT = 3,
629   RGN_ALIGN_RIGHT = 4,
630   RGN_ALIGN_HSPLIT = 5,
631   RGN_ALIGN_VSPLIT = 6,
632   RGN_ALIGN_FLOAT = 7,
633   RGN_ALIGN_QSPLIT = 8,
634   /* Maximum 15. */
635
636   /* Flags start here. */
637   RGN_SPLIT_PREV = 32,
638 };
639
640 /** Mask out flags so we can check the alignment. */
641 #define RGN_ALIGN_ENUM_FROM_MASK(align) ((align) & ((1 << 4) - 1))
642
643 /** #ARegion.flag */
644 enum {
645   RGN_FLAG_HIDDEN = (1 << 0),
646   RGN_FLAG_TOO_SMALL = (1 << 1),
647   /**
648    * Force delayed reinit of region size data, so that region size is calculated
649    * just big enough to show all its content (if enough space is available).
650    * Note that only ED_region_header supports this right now.
651    */
652   RGN_FLAG_DYNAMIC_SIZE = (1 << 2),
653   /** Region data is NULL'd on read, never written. */
654   RGN_FLAG_TEMP_REGIONDATA = (1 << 3),
655   /** The region must either use its prefsizex/y or be hidden. */
656   RGN_FLAG_PREFSIZE_OR_HIDDEN = (1 << 4),
657   /** Size has been clamped (floating regions only). */
658   RGN_FLAG_SIZE_CLAMP_X = (1 << 5),
659   RGN_FLAG_SIZE_CLAMP_Y = (1 << 6),
660   /** When the user sets the region is hidden,
661    * needed for floating regions that may be hidden for other reasons. */
662   RGN_FLAG_HIDDEN_BY_USER = (1 << 7),
663 };
664
665 /** #ARegion.do_draw */
666 enum {
667   /* Region must be fully redrawn. */
668   RGN_DRAW = 1,
669   /* Redraw only part of region, for sculpting and painting to get smoother
670    * stroke painting on heavy meshes. */
671   RGN_DRAW_PARTIAL = 2,
672   /* For outliner, to do faster redraw without rebuilding outliner tree.
673    * For 3D viewport, to display a new progressive render sample without
674    * while other buffers and overlays remain unchanged. */
675   RGN_DRAW_NO_REBUILD = 4,
676
677   /* Set while region is being drawn. */
678   RGN_DRAWING = 8,
679   /* For popups, to refresh UI layout along with drawing. */
680   RGN_REFRESH_UI = 16,
681
682   /* Only editor overlays (currently gizmos only!) should be redrawn. */
683   RGN_DRAW_EDITOR_OVERLAYS = 32,
684 };
685
686 #endif /* __DNA_SCREEN_TYPES_H__ */