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