]> git.decadent.org.uk Git - ion3.git/blob - ioncore/resize.h
[svn-inject] Installing original source of ion3
[ion3.git] / ioncore / resize.h
1 /*
2  * ion/ioncore/resize.h
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2006. 
5  *
6  * Ion is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  */
11
12 #ifndef ION_IONCORE_RESIZE_H
13 #define ION_IONCORE_RESIZE_H
14
15 #include "common.h"
16 #include "frame.h"
17 #include "infowin.h"
18 #include "rectangle.h"
19 #include "sizehint.h"
20
21
22 /* To make it easier for region_managed_rqgeom handlers, the geom
23  * parameter contain a complete requested geometry for the region that
24  * wants its geometry changed. The REGION_WEAK_* flags are used to
25  * indicate that the respective geometry value has not been changed or
26  * that the requestor doesn't really care what the result is. In any case,
27  * managers are free to give the managed object whatever geometry it wishes.
28  */
29 #define REGION_RQGEOM_WEAK_X    0x0001
30 #define REGION_RQGEOM_WEAK_Y    0x0002
31 #define REGION_RQGEOM_WEAK_W    0x0004
32 #define REGION_RQGEOM_WEAK_H    0x0008
33 #define REGION_RQGEOM_WEAK_ALL  0x000f
34 #define REGION_RQGEOM_TRYONLY   0x0010
35 #define REGION_RQGEOM_ABSOLUTE  0x0020
36 #define REGION_RQGEOM_GRAVITY   0x0040
37
38 #define REGION_RQGEOM_NORMAL    0
39 #define REGION_RQGEOM_VERT_ONLY (REGION_RQGEOM_WEAK_X|REGION_RQGEOM_WEAK_W)
40 #define REGION_RQGEOM_HORIZ_ONLY (REGION_RQGEOM_WEAK_Y|REGION_RQGEOM_WEAK_H)
41 #define REGION_RQGEOM_H_ONLY    (REGION_RQGEOM_VERT_ONLY|REGION_RQGEOM_WEAK_Y)
42 #define REGION_RQGEOM_W_ONLY    (REGION_RQGEOM_HORIZ_ONLY|REGION_RQGEOM_WEAK_X)
43
44 #define REGION_ORIENTATION_NONE 0
45 #define REGION_ORIENTATION_HORIZONTAL 1
46 #define REGION_ORIENTATION_VERTICAL 2
47
48
49 #define RQGEOMPARAMS_INIT {{0, 0, 0, 0}, 0, 0}
50
51
52 DECLSTRUCT(WRQGeomParams){
53     WRectangle geom;
54     int flags;
55     int gravity;
56 };
57
58
59 typedef void WDrawRubberbandFn(WRootWin *rw, const WRectangle *geom);
60
61
62 DECLCLASS(WMoveresMode){
63     Obj obj;
64     WSizeHints hints;
65     int dx1, dx2, dy1, dy2;
66     WRectangle origgeom;
67     WRectangle geom;
68     WRegion *reg;
69     WDrawRubberbandFn *rubfn;
70     int parent_rx, parent_ry;
71     enum {MOVERES_SIZE, MOVERES_POS} mode;
72     bool resize_cumulative;
73     bool snap_enabled;
74     WRectangle snapgeom;
75     int rqflags;
76     WInfoWin *infowin;
77 };
78
79
80 extern WMoveresMode *region_begin_resize(WRegion *reg, 
81                                          WDrawRubberbandFn *rubfn,
82                                          bool cumulative);
83
84 extern WMoveresMode *region_begin_move(WRegion *reg,
85                                        WDrawRubberbandFn *rubfn,
86                                        bool cumulative);
87
88 /* dx1/dx2/dy1/dy2: left/right/top/bottom difference to previous values. 
89  * left/top negative, bottom/right positive increases size.
90  */
91 extern void moveresmode_delta_resize(WMoveresMode *mode, 
92                                      int dx1, int dx2, int dy1, int dy2,
93                                      WRectangle *rret);
94 extern void moveresmode_delta_move(WMoveresMode *mode, 
95                                    int dx, int dy, WRectangle *rret);
96 extern bool moveresmode_do_end(WMoveresMode *mode, bool apply);
97 extern WRegion *moveresmode_target(WMoveresMode *mode);
98
99 extern WMoveresMode *moveres_mode(WRegion *reg);
100
101
102
103 /* Note: even if REGION_RQGEOM_(X|Y|W|H) are not all specified, the
104  * geom parameter should contain a proper geometry!
105  */
106 DYNFUN void region_managed_rqgeom(WRegion *reg, WRegion *sub, 
107                                   const WRQGeomParams *rqgp,
108                                   WRectangle *geomret);
109 DYNFUN void region_managed_rqgeom_absolute(WRegion *reg, WRegion *sub, 
110                                            const WRQGeomParams *rqgp,
111                                            WRectangle *geomret);
112
113 extern void region_rqgeom(WRegion *reg, const WRQGeomParams *rqgp,
114                           WRectangle *geomret);
115
116 /* Implementation for regions that do not allow subregions to resize
117  * themselves; default is to give the size the region wants.
118  */
119 extern void region_managed_rqgeom_unallow(WRegion *reg, WRegion *sub,
120                                           const WRQGeomParams *rq,
121                                           WRectangle *geomret);
122 /* default */
123 extern void region_managed_rqgeom_allow(WRegion *reg, WRegion *sub,
124                                         const WRQGeomParams *rq,
125                                         WRectangle *geomret);
126
127 extern void region_managed_rqgeom_absolute_default(WRegion *reg, WRegion *sub,
128                                                    const WRQGeomParams *rq,
129                                                    WRectangle *geomret);
130
131
132 DYNFUN void region_size_hints(WRegion *reg, WSizeHints *hints_ret);
133 DYNFUN int region_orientation(WRegion *reg);
134
135 extern void region_size_hints_correct(WRegion *reg, 
136                                       int *wp, int *hp, bool min);
137
138 extern uint region_min_h(WRegion *reg);
139 extern uint region_min_w(WRegion *reg);
140
141 extern void frame_maximize_vert(WFrame *frame);
142 extern void frame_maximize_horiz(WFrame *frame);
143
144 extern void region_convert_root_geom(WRegion *reg, WRectangle *geom);
145
146 extern void region_absolute_geom_to_parent(WRegion *reg, 
147                                            const WRectangle *rgeom,
148                                            WRectangle *pgeom);
149
150 #endif /* ION_IONCORE_RESIZE_H */