]> git.decadent.org.uk Git - ion3.git/blob - mod_query/input.c
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / mod_query / input.c
1 /*
2  * ion/mod_query/input.c
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2007. 
5  *
6  * See the included file LICENSE for details.
7  */
8
9 #include <libmainloop/defer.h>
10 #include <ioncore/common.h>
11 #include <ioncore/window.h>
12 #include <ioncore/global.h>
13 #include <ioncore/regbind.h>
14 #include <ioncore/event.h>
15 #include <ioncore/names.h>
16 #include "inputp.h"
17
18
19 /*{{{ Dynfuns */
20
21
22 /*EXTL_DOC
23  * Scroll input \var{input} text contents up.
24  */
25 EXTL_EXPORT_MEMBER
26 void input_scrollup(WInput *input)
27 {
28     CALL_DYN(input_scrollup, input, (input));
29 }
30
31
32 /*EXTL_DOC
33  * Scroll input \var{input} text contents down.
34  */
35 EXTL_EXPORT_MEMBER
36 void input_scrolldown(WInput *input)
37 {
38     CALL_DYN(input_scrolldown, input, (input));
39 }
40
41
42 void input_calc_size(WInput *input, WRectangle *geom)
43 {
44     *geom=input->last_fp.g;
45     {
46         CALL_DYN(input_calc_size, input, (input, geom));
47     }
48 }
49
50
51 const char *input_style(WInput *input)
52 {
53     const char *ret="input";
54     CALL_DYN_RET(ret, const char*, input_style, input, (input));
55     return ret;
56 }
57
58
59 /*}}}*/
60
61
62 /*{{{ Resize and draw config update */
63
64
65 static void input_do_refit(WInput *input, WWindow *par)
66 {
67     WRectangle g;
68     input_calc_size(input, &g);
69     window_do_fitrep(&input->win, par, &g);
70 }
71
72
73 void input_refit(WInput *input)
74 {
75     input_do_refit(input, NULL);
76 }
77
78
79 void input_fitrep(WInput *input, WWindow *par, const WFitParams *fp)
80 {
81     input->last_fp=*fp;
82     input_do_refit(input, par);
83 }
84
85
86 void input_updategr(WInput *input)
87 {
88     GrBrush *brush;
89     
90     brush=gr_get_brush(input->win.win,
91                        region_rootwin_of((WRegion*)input),
92                        input_style(input));
93     
94     if(brush==NULL)
95         return;
96     
97     if(input->brush!=NULL)
98         grbrush_release(input->brush);
99     input->brush=brush;
100     input_refit(input);
101     
102     region_updategr_default((WRegion*)input);
103     
104     window_draw((WWindow*)input, TRUE);
105 }
106
107
108 /*}}}*/
109
110
111 /*{{{ Init/deinit */
112
113
114 bool input_init(WInput *input, WWindow *par, const WFitParams *fp)
115 {
116     Window win;
117
118     input->last_fp=*fp;
119
120     if(!window_init((WWindow*)input, par, fp))
121         return FALSE;
122
123     win=input->win.win;
124     
125     input->brush=gr_get_brush(win, region_rootwin_of((WRegion*)par),
126                               input_style(input));
127     
128     if(input->brush==NULL)
129         goto fail;
130     
131     input_refit(input);
132     window_select_input(&(input->win), IONCORE_EVENTMASK_NORMAL);
133
134     region_add_bindmap((WRegion*)input, mod_query_input_bindmap);
135     
136     region_register((WRegion*)input);
137     
138     return TRUE;
139     
140 fail:
141     window_deinit((WWindow*)input);
142     return FALSE;
143 }
144
145
146 void input_deinit(WInput *input)
147 {
148     if(input->brush!=NULL)
149         grbrush_release(input->brush);
150     
151     window_deinit((WWindow*)input);
152 }
153
154
155 /*EXTL_DOC
156  * Close input not calling any possible finish handlers.
157  */
158 EXTL_EXPORT_MEMBER
159 void input_cancel(WInput *input)
160 {
161     region_defer_rqdispose((WRegion*)input);
162 }
163
164
165 /*}}}*/
166
167
168 /*{{{ Focus  */
169
170
171 static void input_inactivated(WInput *input)
172 {
173     window_draw((WWindow*)input, FALSE);
174 }
175
176
177 static void input_activated(WInput *input)
178 {
179     window_draw((WWindow*)input, FALSE);
180 }
181
182
183 /*}}}*/
184
185
186 /*{{{{ Misc */
187
188
189 void mod_query_get_minimum_extents(GrBrush *brush, bool with_spacing, 
190                                    int *w, int *h)
191 {
192     GrBorderWidths bdw;
193     GrFontExtents fnte;
194     int spc;
195     
196     grbrush_get_border_widths(brush, &bdw);
197     grbrush_get_font_extents(brush, &fnte);
198     
199     spc=(with_spacing ? bdw.spacing : 0);
200     
201     *h=(fnte.max_height+bdw.top+bdw.bottom+spc);
202     *w=(bdw.left+bdw.right+spc);
203 }
204
205
206 /*}}}*/
207
208
209 /*{{{ Dynamic function table and class implementation */
210
211
212 static DynFunTab input_dynfuntab[]={
213     {(DynFun*)region_fitrep, (DynFun*)input_fitrep},
214     {region_updategr, input_updategr},
215     {region_activated, input_activated},
216     {region_inactivated, input_inactivated},
217     END_DYNFUNTAB
218 };
219
220
221 EXTL_EXPORT
222 IMPLCLASS(WInput, WWindow, input_deinit, input_dynfuntab);
223
224     
225 /*}}}*/