1 /***********************************************************************
2  *
3  * afterstep per-screen data include file
4  *
5  ***********************************************************************/
6 
7 #ifndef MY_LOOK_HEADER_INCLUDED
8 #define MY_LOOK_HEADER_INCLUDED
9 
10 #include "../libAfterImage/asvisual.h"
11 #include "../libAfterImage/asimage.h"
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 struct MyStyle;
18 struct ASSupportedHints;
19 struct MyFrame;
20 struct ASHashTable;
21 struct ScreenInfo;
22 
23 #define ICON_STYLE_FOCUS   "ButtonTitleFocus"
24 #define ICON_STYLE_STICKY  "ButtonTitleSticky"
25 #define ICON_STYLE_UNFOCUS "ButtonTitleUnfocus"
26 
27 #define DEFAULT_OBJ_NAME        "default"
28 #define ICON_OBJ_PREFIX 	    "icon_"
29 #define VERTICAL_OBJ_PREFIX 	"vert_"
30 #define DEFAULT_ICON_OBJ_NAME   ICON_OBJ_PREFIX DEFAULT_OBJ_NAME
31 #define DEFAULT_VERTICAL 	    VERTICAL_OBJ_PREFIX DEFAULT_OBJ_NAME
32 #define DEFAULT_ICON_VERTICAL   VERTICAL_OBJ_PREFIX DEFAULT_ICON_OBJ_NAME
33 
34 /* look file flags */
35 typedef enum
36 {
37 	TxtrMenuItmInd      = (0x01 << 0),
38 	MenuMiniPixmaps     = (0x01 << 1),
39 	GradientText        = (0x01 << 2),
40 	TitlebarNoPush      = (0x01 << 3),
41 	IconNoBorder        = (0x01 << 4),
42 	SeparateButtonTitle = (0x01 << 5),    /* icon title is a separate window */
43 	DecorateFrames      = (0x01 << 6),
44 	DontDrawBackground	= (0x01 << 7),
45 	IconsGrowVertically = (0x01 << 8),
46 	MenuShowUnavailable = (0x01 << 9),
47 	/* this flags add up to the above set for no-flag options, so we can track
48 	 what option was specifyed in config */
49 	LOOK_TitleButtonSpacing = (0x01 << 16),
50 	LOOK_TitleButtonStyle   = (0x01 << 17),
51 	LOOK_TitleButtonXOffset = (0x01 << 18),
52 	LOOK_TitleButtonYOffset = (0x01 << 19),
53 	LOOK_ResizeMoveGeometry = (0x01 << 20),
54 	LOOK_StartMenuSortMode  = (0x01 << 21),
55 	LOOK_DrawMenuBorders    = (0x01 << 22),
56 	LOOK_ButtonSize         = (0x01 << 23),
57 	LOOK_RubberBand         = (0x01 << 24),
58 	LOOK_ShadeAnimationSteps= (0x01 << 25),
59 	LOOK_TitleTextAlign     = (0x01 << 26)
60 
61 }LookFlags;
62 
63 /* this flags can be used to selectively load some parts of Look */
64 typedef enum
65 {
66   LL_MyStyles 		= (0x01<<0),
67   LL_MSMenu 		= (0x01<<1),	/* menu MyStyle pointers */
68   LL_MSWindow 		= (0x01<<2),	/* focussed, unfocussed, sticky window styles */
69 
70   LL_MenuIcons 		= (0x01<<3),	/* Menu icons: pin-on, arrow, close */
71 
72   /* TODO: Titlebuttons - we 'll move them into  MyStyles */
73   /* we will translate button numbers from the user input */
74   LL_Buttons 		= (0x01<<4),
75   /* assorted numerical look parameters */
76   LL_SizeWindow 	= (0x01<<5),
77   LL_Boundary 		= (0x01<<6),
78   LL_Layouts     	= (0x01<<7),
79   LL_MenuParams 	= (0x01<<8),
80   LL_Icons 			= (0x01<<9),
81   LL_Misc 			= (0x01<<10),
82   LL_Flags 			= (0x01<<11),
83 
84   LL_Balloons 		= (0x01<<12),
85   LL_SupportedHints = (0x01<<13),
86   LL_DeskBacks  	= (0x01<<14),
87   LL_DeskConfigs	= (0x01<<15),
88   LL_IconBoxConfig  = (0x01<<16),
89 
90   LL_ImageServer    = (0x01<<30),
91   /* EVERYTHING !!!!! */
92   LL_Everything 	= (0xFFFFFFFF&(~LL_ImageServer))
93 }
94 LookLoadFlags;
95 
96 /**********************************************************************/
97 /* Desktop configuration : */
98 /**********************************************************************/
99 typedef struct MyBackground
100 {
101 	unsigned long magic ;
102 	char 	  *name ;
103 	enum {
104 		MB_BackImage = 0,
105 		MB_BackMyStyle,
106 		MB_BackCmd
107 	} type ;
108 	char      *data ;
109 
110 	ASGeometry cut;
111 	ASGeometry scale;
112 	ARGB32     tint;
113 	ARGB32     pad_color;
114 	ASFlagType align_flags;
115 
116 	int        ref_count ;
117 
118 	char *loaded_im_name ;
119 	Pixmap loaded_pixmap ;
120 }MyBackground;
121 
122 typedef struct MyDesktopConfig
123 {
124 	unsigned long magic ;
125 	int   desk ;
126 	char *back_name ;
127 	char *layout_name ;
128 }MyDesktopConfig;
129 
130 #define FR_N_Mask           (0x01<<FR_N)
131 #define FR_E_Mask           (0x01<<FR_E)
132 #define FR_S_Mask           (0x01<<FR_S)
133 #define FR_W_Mask           (0x01<<FR_W)
134 #define FR_NE_Mask          (0x01<<FR_NE)
135 #define FR_NW_Mask          (0x01<<FR_NW)
136 #define FR_SE_Mask          (0x01<<FR_SE)
137 #define FR_SW_Mask          (0x01<<FR_SW)
138 #define FRAME_PARTS_MASK    (FR_N_Mask|FR_E_Mask|FR_S_Mask|FR_W_Mask| \
139 							 FR_NE_Mask|FR_NW_Mask|FR_SE_Mask|FR_SW_Mask)
140 
141 #define MYFRAME_TITLE_BACK_BTN				0
142 #define MYFRAME_TITLE_BACK_SPACER			1
143 #define MYFRAME_TITLE_BACK_TITLE_SPACER		2
144 #define MYFRAME_TITLE_BACK_INVALID			3
145 #define MYFRAME_TITLE_SIDE_MASK				0x03  /* ORed values of everything above */
146 #define MYFRAME_TITLE_SIDE_BITS				2     /* number of set bits in above mask */
147 #define MYFRAME_GetTbarLayoutElem(layout,i)    (((layout)>>((i)*MYFRAME_TITLE_SIDE_BITS))&MYFRAME_TITLE_SIDE_MASK)
148 #define MYFRAME_SetTbarLayoutElem(layout,i,elem)    (layout = (((layout)&(~(MYFRAME_TITLE_SIDE_MASK<<((i)*MYFRAME_TITLE_SIDE_BITS))))|(((elem)&MYFRAME_TITLE_SIDE_MASK)<<((i)*MYFRAME_TITLE_SIDE_BITS))))
149 
150 #define MYFRAME_TITLE_SIDE_ELEMS			3     /* number of set bits in above mask */
151 
152 #define MYFRAME_TITLE_BACK_TITLE_LABEL		MYFRAME_TITLE_SIDE_ELEMS
153 
154 
155 #define MYFRAME_TITLE_BACKS					(MYFRAME_TITLE_SIDE_ELEMS+1+MYFRAME_TITLE_SIDE_ELEMS)
156 
157 #define MYFRAME_TITLE_BACK_LBTN				MYFRAME_TITLE_BACK_BTN
158 #define MYFRAME_TITLE_BACK_LSPACER			MYFRAME_TITLE_BACK_SPACER
159 #define MYFRAME_TITLE_BACK_LTITLE_SPACER	MYFRAME_TITLE_BACK_TITLE_SPACER
160 #define MYFRAME_TITLE_BACK_LBL				MYFRAME_TITLE_BACK_TITLE_LABEL
161 #define MYFRAME_TITLE_BACK_LEFT2RIGHT(l) 	(MYFRAME_TITLE_BACKS-1-(l))
162 #define MYFRAME_TITLE_BACK_RTITLE_SPACER	MYFRAME_TITLE_BACK_LEFT2RIGHT(MYFRAME_TITLE_BACK_TITLE_SPACER)
163 #define MYFRAME_TITLE_BACK_RSPACER			MYFRAME_TITLE_BACK_LEFT2RIGHT(MYFRAME_TITLE_BACK_SPACER)
164 #define MYFRAME_TITLE_BACK_RBTN				MYFRAME_TITLE_BACK_LEFT2RIGHT(MYFRAME_TITLE_BACK_BTN)
165 
166 #define MYFRAME_DEFAULT_TITLE_LAYOUT		0xFFFFFFFF
167 
168 typedef struct MyFrame
169 {
170 	unsigned long magic ;
171 	char      *name;
172 	ASFlagType   set_parts;
173 	ASFlagType   parts_mask; /* first 8 bits represent one enabled side/corner each */
174 	struct icon_t    *parts[FRAME_PARTS];
175 	char             *part_filenames[FRAME_PARTS];
176 	char             *title_style_names[BACK_STYLES];
177 	char             *frame_style_names[BACK_STYLES];
178 	char             *title_back_filenames[MYFRAME_TITLE_BACKS];
179 	struct icon_t    *title_backs[MYFRAME_TITLE_BACKS];
180 	ASGeometry        title_back_slicing[MYFRAME_TITLE_BACKS];
181 	ASFlagType   set_part_size ;
182 	unsigned int part_width[FRAME_PARTS];
183 	unsigned int part_length[FRAME_PARTS];
184 	ASFlagType   set_part_bevel ;
185 /* this must not be inline functions !!!! */
186 #define SetPartFBevelMask(frame,mask)  ((frame)->set_part_bevel |= (mask))
187 #define SetPartUBevelMask(frame,mask)  ((frame)->set_part_bevel |= ((mask)<<FRAME_PARTS))
188 #define SetPartSBevelMask(frame,mask)  ((frame)->set_part_bevel |= ((mask)<<(FRAME_PARTS+FRAME_PARTS)))
189 
190 #define SetPartFBevelSet(frame,part)  ((frame)->set_part_bevel |= (0x01<<(part)))
191 #define SetPartUBevelSet(frame,part)  ((frame)->set_part_bevel |= ((0x01<<FRAME_PARTS)<<(part)))
192 #define SetPartSBevelSet(frame,part)  ((frame)->set_part_bevel |= ((0x01<<(FRAME_PARTS+FRAME_PARTS))<<(part)))
193 
194 #define IsPartFBevelSet(frame,part)  ((frame)->set_part_bevel&(0x01<<(part)))
195 #define IsPartUBevelSet(frame,part)  ((frame)->set_part_bevel&((0x01<<FRAME_PARTS)<<(part)))
196 #define IsPartSBevelSet(frame,part)  ((frame)->set_part_bevel&((0x01<<(FRAME_PARTS+FRAME_PARTS))<<(part)))
197 	ASFlagType   part_fbevel[FRAME_PARTS];
198 	ASFlagType   part_ubevel[FRAME_PARTS];
199 	ASFlagType   part_sbevel[FRAME_PARTS];
200 	ASFlagType   set_part_align ;
201 	ASFlagType   part_align[FRAME_PARTS];
202 	ASFlagType   set_title_attr ;
203 
204 	ASGeometry   part_slicing[FRAME_SIDES];
205 
206 #define MYFRAME_TitleFBevelSet      (0x01<<1)
207 #define MYFRAME_TitleUBevelSet      (0x01<<2)
208 #define MYFRAME_TitleSBevelSet      (0x01<<3)
209 #define MYFRAME_TitleBevelSet       (MYFRAME_TitleFBevelSet|MYFRAME_TitleUBevelSet|MYFRAME_TitleSBevelSet)
210 #define MYFRAME_TitleAlignSet       (0x01<<4)
211 #define MYFRAME_TitleFCMSet         (0x01<<5)
212 #define MYFRAME_TitleUCMSet         (0x01<<6)
213 #define MYFRAME_TitleSCMSet         (0x01<<7)
214 #define MYFRAME_TitleCMSet          (MYFRAME_TitleFCMSet|MYFRAME_TitleUCMSet|MYFRAME_TitleSCMSet)
215 
216 #define MYFRAME_TitleBackAlignSet_Start     		(0x01<<8)
217 #define MYFRAME_TitleBackAlignSet_LBtn  			(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_LBTN)
218 #define MYFRAME_TitleBackAlignSet_LSpacer 		 	(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_LSPACER)
219 #define MYFRAME_TitleBackAlignSet_LTitleSpacer  	(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_LTITLE_SPACER)
220 #define MYFRAME_TitleBackAlignSet_Lbl  				(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_LBL)
221 #define MYFRAME_TitleBackAlignSet_RTitleSpacer     	(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_RTITLE_SPACER)
222 #define MYFRAME_TitleBackAlignSet_RSpacer  			(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_RSPACER)
223 #define MYFRAME_TitleBackAlignSet_RBtn  			(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACK_RBTN)
224 #define MYFRAME_TitleBackAlignSet_End       		(MYFRAME_TitleBackAlignSet_Start<<MYFRAME_TITLE_BACKS)
225 
226 #define MYFRAME_CondenseTitlebarSet   	(0x01<<16)
227 #define MYFRAME_LeftTitlebarLayoutSet   (0x01<<17)
228 #define MYFRAME_RightTitlebarLayoutSet  (0x01<<18)
229 #define MYFRAME_LeftBtnAlignSet   		(0x01<<19)
230 #define MYFRAME_RightBtnAlignSet  		(0x01<<20)
231 
232 #define MYFRAME_TitleFHueSet         (0x01<<21)
233 #define MYFRAME_TitleUHueSet         (0x01<<22)
234 #define MYFRAME_TitleSHueSet         (0x01<<23)
235 #define MYFRAME_TitleHueSet          (MYFRAME_TitleFHueSet|MYFRAME_TitleUHueSet|MYFRAME_TitleSHueSet)
236 #define MYFRAME_TitleFSatSet         (0x01<<24)
237 #define MYFRAME_TitleUSatSet         (0x01<<25)
238 #define MYFRAME_TitleSSatSet         (0x01<<26)
239 #define MYFRAME_TitleSatSet          (MYFRAME_TitleFSatSet|MYFRAME_TitleUSatSet|MYFRAME_TitleSSatSet)
240 
241 #define MYFRAME_TitleHSpacingSet     (0x01<<27)
242 #define MYFRAME_TitleVSpacingSet     (0x01<<28)
243 
244 	ASFlagType   title_fbevel, title_ubevel, title_sbevel;
245 	unsigned int title_fcm, title_ucm, title_scm ;
246 	int 		 title_fhue, title_uhue, title_shue;
247 	unsigned int title_fsat, title_usat, title_ssat;
248 	ASFlagType   title_align, title_backs_align[MYFRAME_TITLE_BACKS];
249 	ASGeometry   title_backs_slicing[MYFRAME_TITLE_BACKS];
250 	ASFlagType   left_btn_align, right_btn_align ;
251 
252 	ASFlagType   condense_titlebar ;
253 
254 #define MYFRAME_HOR_MASK    ((0x01<<FR_N)|(0x01<<FR_S))
255 #define MYFRAME_VERT_MASK   ((0x01<<FR_W)|(0x01<<FR_E))
256 #define IsSideVertical(side)  ((side) == FR_W || (side)== FR_E)
257 #define IsFrameCorner(p)   ((p)>=FRAME_SIDES)
258 #define IsFramePart(f,p)   (get_flags((f)->parts_mask,0x01<<(p))&&((f)->parts[(p)] || (((f)->part_width[(p)] || p >= FRAME_SIDES) && (f)->part_length[(p)])))
259 
260 	int title_h_spacing, title_v_spacing ;
261 
262 	unsigned long left_layout, right_layout ;
263 
264 #define MYFRAME_NOBORDER			(0x01<<0)
265 #define MYFRAME_INHERIT_DEFAULTS	(0x01<<1)
266 	ASFlagType flags ;
267 	ASFlagType set_flags ;
268 
269 }MyFrame;
270 
271 extern int    _as_frame_corner_xref[FRAME_SIDES+1];
272 #define LeftCorner(side)    _as_frame_corner_xref[(side)]
273 #define RightCorner(side)   _as_frame_corner_xref[(side)+1]
274 
275 
276 
277 /**********************************************************************/
278 /* MyLook itself : */
279 /**********************************************************************/
280 typedef struct MyLook
281 {
282 	unsigned long magic;
283 	/* The following two things are mostly used by ASRenderer : */
284 	char         *name;         /* filename of the look */
285 	int           ref_count ;   /* number of times referenced */
286 	/* Actuall Look data : */
287 	unsigned long flags;
288 	/* the rest of the stuff is related to windows.
289 		Window gets values when its first initialized, and then we have
290 		to go and update it whenever we move it from one desk to another.
291 	*/
292 	unsigned short look_id;
293 	unsigned short deskback_id_base ;
294 
295 	/* update mystyle_fix_styles() and InitLook() if you add a style */
296 	struct ASHashTable *styles_list;  /* hash of MyStyles by name */
297 	struct ASHashTable *backs_list;   /* hash of MyBackgrounds   by name */
298 	struct ASHashTable *desk_configs; /* hash of MyDesktopConfig by desk number */
299 
300 	unsigned int    KillBackgroundThreshold ; /* if WIDTHxHEIGHT of the background image is greater then this value, then
301 											   * image will be destroyed when there are no windows on the desktop and desktop
302 											   * is switched */
303 
304 	struct MyStyle *MSMenu[MENU_BACK_STYLES]; /* menu MyStyles */
305 
306 	/* focussed, unfocussed, sticky window styles */
307 	struct MyStyle *MSWindow[BACK_STYLES];
308 
309 	ASGeometry resize_move_geometry;  /* position of the size window */
310 
311 	char *DefaultIcon;      /* Icon to use when no other icons are found */
312 
313 	struct icon_t *MenuArrow;
314 
315 	char *CursorFore, *CursorBack ;
316 
317 	/* here buttons are mentioned in the same order they are in look and feel file */
318 	MyButton     buttons[TITLE_BUTTONS];
319 	/* thes is compiled set of pointers to above buttons : */
320 	unsigned int button_xref[TITLE_BUTTONS];   /* translates button numbering in look and feel into indexes in array */
321 	MyButton    *ordered_buttons[TITLE_BUTTONS];
322 #define DEFAULT_FIRST_RIGHT_BUTTON  5
323 	unsigned int button_first_right ;          /* index of pointer to the first right button in the above array */
324 
325 
326 	/* Menu parameters */
327 #define DRAW_MENU_BORDERS_NONE          0
328 #define DRAW_MENU_BORDERS_ITEM          1
329 #define DRAW_MENU_BORDERS_OVERALL       2
330 #define DRAW_MENU_BORDERS_FOCUSED_ITEM  3
331 #define DRAW_MENU_BORDERS_O_AND_F       4
332 
333 	int DrawMenuBorders;
334 	int StartMenuSortMode;
335 	int menu_hcm, menu_icm, menu_scm;                    /* composition methods */
336 
337 	/* Icons parameters */
338 	ASGeometry *configured_icon_areas ;
339 	unsigned int configured_icon_areas_num ;
340 	unsigned int ButtonWidth, ButtonHeight;
341 	unsigned int ButtonIconSpacing;
342 	ASFlagType   ButtonAlign, ButtonBevel;
343 
344 	unsigned int minipixmap_width, minipixmap_height ;
345 
346 	/* misc stuff */
347 	int RubberBand;
348 
349 	/* these affect window placement : */
350 	/* None of it should be used by placement related functions from this
351 		structure - they should consult copies of it stored in ASWindow
352 		structure.
353 	*/
354 	int TitleButtonStyle;     /* 0 - afterstep, 1 - WM old, 2 - free hand */
355 	/* array of two elements cos we allow different values for buttons
356 	 * on the right and on the left :*/
357 	int TitleButtonSpacing[2];
358 	int TitleButtonXOffset[2];
359 	int TitleButtonYOffset[2];
360 
361 /* title bar text alignment  */
362 #define JUSTIFY_CENTER 0
363 #define JUSTIFY_LEFT   1
364 #define JUSTIFY_RIGHT  2
365 	int TitleTextAlign;       /* alignment of title bar text */
366 
367 	struct ASSupportedHints *supported_hints;
368 
369 	struct ASHashTable *FramesList ;/* hash table of named MyFrames */
370 	char *DefaultFrameName;
371 
372 	struct ASBalloonLook *balloon_look ;
373 
374 	ARGB32	desktop_animation_tint ;
375 
376 	struct ScreenInfo *scr ;          /* same as ASDefaultScr if NULL */
377 
378 }MyLook;
379 
380 MyFrame *create_myframe();
381 MyFrame *create_default_myframe(ASFlagType default_title_align);
382 void inherit_myframe( MyFrame *frame, MyFrame *ancestor );
383 MyFrame *myframe_find( const char *name );
384 void myframe_load ( MyFrame * frame, struct ASImageManager *imman );
385 Bool filename2myframe_part (MyFrame *frame, int part, char *filename);
386 Bool myframe_has_parts(const MyFrame *frame, ASFlagType mask);
387 void destroy_myframe( MyFrame **pframe );
388 void check_myframes_list( MyLook *look );
389 
390 
391 char *make_myback_image_name( MyLook *look, char *name );
392 void check_mybacks_list( MyLook *look );
393 MyBackground *create_myback( char *name );
394 MyBackground *add_myback( MyLook *look, MyBackground *back );
395 void myback_delete( MyBackground **myback, ASImageManager *imman );
396 
397 MyDesktopConfig *create_mydeskconfig( int desk, char *data );
398 void init_deskconfigs_list( MyLook *look );
399 void mydeskconfig_delete( MyDesktopConfig **dc );
400 inline MyDesktopConfig *add_deskconfig_to_list( ASHashTable *list, MyDesktopConfig *dc );
401 MyDesktopConfig *add_deskconfig( MyLook *look, MyDesktopConfig *dc );
402 
403 ARGB32 get_random_tint_color();
404 
405 
406 void mylook_init (MyLook * look, Bool free_resources, unsigned long what_flags /*see LookLoadFlags */ );
407 MyLook *mylook_create ();
408 void mylook_destroy (MyLook ** look);
409 
410 void mylook_set_font_size_var (MyLook * look);
411 
412 
413 struct MyStyle *mylook_get_style(MyLook *look, const char *name);
414 inline MyBackground  *mylook_get_desk_back(MyLook *look, long desk);
415 inline MyBackground  *mylook_get_back(MyLook *look, char *name);
416 inline MyDesktopConfig *mylook_get_desk_config(MyLook *look, long desk);
417 
418 
419 
420 /* MyLook : */
421 void myobj_destroy (ASHashableValue value, void *data);
422 
423 #ifdef __cplusplus
424 }
425 #endif
426 
427 
428 #endif /* MY_LOOK_HEADER_INCLUDED */
429