aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/libraries
diff options
context:
space:
mode:
authorDavid Walter Seikel2014-05-11 13:34:49 +1000
committerDavid Walter Seikel2014-05-11 13:34:49 +1000
commit041d246dfc219a0bb2e10345090a4ff9613b5920 (patch)
tree16530dbff036c15964e26ef28f68f76e66d3f501 /src/libraries
parentResize instead of mapping windows. Got the basics of a window manager in a f... (diff)
downloadSledjHamr-041d246dfc219a0bb2e10345090a4ff9613b5920.zip
SledjHamr-041d246dfc219a0bb2e10345090a4ff9613b5920.tar.gz
SledjHamr-041d246dfc219a0bb2e10345090a4ff9613b5920.tar.bz2
SledjHamr-041d246dfc219a0bb2e10345090a4ff9613b5920.tar.xz
Change internal windows from Elm win to Elm layout.
Diffstat (limited to 'src/libraries')
-rwxr-xr-xsrc/libraries/build.lua3
-rw-r--r--src/libraries/winFang.c121
-rw-r--r--src/libraries/winFang.edc115
-rw-r--r--src/libraries/winFang.h9
4 files changed, 172 insertions, 76 deletions
diff --git a/src/libraries/build.lua b/src/libraries/build.lua
index 4e277e1..45c436d 100755
--- a/src/libraries/build.lua
+++ b/src/libraries/build.lua
@@ -15,7 +15,7 @@ end
15 15
16LDFLAGS = '-L ' .. dir .. ' ' .. LDFLAGS 16LDFLAGS = '-L ' .. dir .. ' ' .. LDFLAGS
17 17
18removeFiles(dir, {'LumbrJack.o', lib_d .. '/libLumbrJack.so', 'Runnr.o', lib_d .. '/libRunnr.so', 'SledjHamr.o', lib_d .. '/libSledjHamr.so', 'winFang.o', lib_d .. '/libwinFang.so'}) 18removeFiles(dir, {'LumbrJack.o', lib_d .. '/libLumbrJack.so', 'Runnr.o', lib_d .. '/libRunnr.so', 'SledjHamr.o', lib_d .. '/libSledjHamr.so', '../../media/winFang.edj', 'winFang.o', lib_d .. '/libwinFang.so'})
19 19
20runCommand('C libraries', dir, 'gcc ' .. CFLAGS .. ' -fPIC -c LumbrJack.c') 20runCommand('C libraries', dir, 'gcc ' .. CFLAGS .. ' -fPIC -c LumbrJack.c')
21runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libLumbrJack.so -o ' .. lib_d .. '/libLumbrJack.so LumbrJack.o') 21runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libLumbrJack.so -o ' .. lib_d .. '/libLumbrJack.so LumbrJack.o')
@@ -32,5 +32,6 @@ CFLAGS = CFLAGS .. ' -DPACKAGE_LOCALE_DIR=\\"' .. locale_d .. '\\"'
32runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -fPIC -c SledjHamr.c') 32runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -fPIC -c SledjHamr.c')
33runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libSledjHamr.so -o ' .. lib_d .. '/libSledjHamr.so SledjHamr.o') 33runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libSledjHamr.so -o ' .. lib_d .. '/libSledjHamr.so SledjHamr.o')
34 34
35runCommand(nil, dir, 'edje_cc ' .. EDJE_FLAGS .. ' winFang.edc ../../media/winFang.edj')
35runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -fPIC -c winFang.c') 36runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -fPIC -c winFang.c')
36runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libwinFang.so -o ' .. lib_d .. '/libwinFang.so winFang.o') 37runCommand(nil, dir, 'gcc ' .. CFLAGS .. ' -shared -Wl,-soname,libwinFang.so -o ' .. lib_d .. '/libwinFang.so winFang.o')
diff --git a/src/libraries/winFang.c b/src/libraries/winFang.c
index 6b15a6d..2cbd04d 100644
--- a/src/libraries/winFang.c
+++ b/src/libraries/winFang.c
@@ -21,7 +21,7 @@ printf("%s %s\n", evas_object_type_get(objs), evas_object_name_get(objs));
21 21
22static void _checkWindowBounds(winFang *win, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) 22static void _checkWindowBounds(winFang *win, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
23{ 23{
24 Evas_Object *img = elm_win_inlined_image_object_get(win->win), *test; 24 Evas_Object *img = win->win, *test;
25 Eina_List *objs, *this; 25 Eina_List *objs, *this;
26 Evas_Coord mw, mh; 26 Evas_Coord mw, mh;
27 int padding = 1, i = 0, overs[4][2]; 27 int padding = 1, i = 0, overs[4][2];
@@ -80,7 +80,7 @@ static void cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event_
80 Evas_Event_Mouse_Move *ev = event_info; 80 Evas_Event_Mouse_Move *ev = event_info;
81 winFang *win = data; 81 winFang *win = data;
82 Evas_Coord x, y, w, h, dx = 0, dy = 0, dw = 0, dh = 0, mx, my; 82 Evas_Coord x, y, w, h, dx = 0, dy = 0, dw = 0, dh = 0, mx, my;
83 Evas_Object *img = elm_win_inlined_image_object_get(win->win); 83 Evas_Object *img = win->win;
84 int i; 84 int i;
85 85
86 if (!ev->buttons) return; 86 if (!ev->buttons) return;
@@ -126,7 +126,7 @@ static void _onBgMove(void *data, Evas *evas, Evas_Object *obj, void *event_info
126{ 126{
127 Evas_Event_Mouse_Move *ev = event_info; 127 Evas_Event_Mouse_Move *ev = event_info;
128 winFang *win = data; 128 winFang *win = data;
129 Evas_Object *img = elm_win_inlined_image_object_get(win->win); 129 Evas_Object *img = win->win;
130 Evas_Coord x, y, w, h; 130 Evas_Coord x, y, w, h;
131 131
132 if (1 != ev->buttons) return; 132 if (1 != ev->buttons) return;
@@ -165,8 +165,6 @@ void winFangShow(winFang *win)
165winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, char *name, EPhysics_World *world) 165winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, char *name, EPhysics_World *world)
166{ 166{
167 winFang *result; 167 winFang *result;
168 Evas_Object *obj, *obj1;
169 Evas *obj2;
170 char buf[PATH_MAX]; 168 char buf[PATH_MAX];
171 int i; 169 int i;
172 170
@@ -182,84 +180,81 @@ winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, ch
182 result->w = w; 180 result->w = w;
183 result->h = h; 181 result->h = h;
184 182
185 // In theory this should create an EWS window, in practice, I'm not seeing any difference.
186 // Guess I'll have to implement my own internal window manager. I don't think a basic one will be that hard. Famous last words.
187// elm_config_engine_set("ews");
188 if (result->internal) 183 if (result->internal)
189 { 184 {
190 result->win = elm_win_add(parent->win, name, ELM_WIN_INLINED_IMAGE);
191 eina_clist_add_head(&parent->winFangs, &result->node); 185 eina_clist_add_head(&parent->winFangs, &result->node);
192 obj = elm_win_inlined_image_object_get(result->win); 186
193 evas_object_name_set(obj, "winFang"); 187 result->win = elm_layout_add(parent->win);
188 evas_object_name_set(result->win, "winFang");
189 evas_object_size_hint_weight_set(result->win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
190 snprintf(buf, sizeof(buf), "%s/winFang.edj", elm_app_data_dir_get());
191 elm_layout_file_set(result->win, buf, "winFang/layout");
192 if (title)
193 elm_object_part_text_set(result->win, TITLE, title);
194
195 result->grid = elm_grid_add(parent->win);
196 elm_grid_size_set(result->grid, result->w, result->h);
197 evas_object_size_hint_weight_set(result->grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
198 evas_object_size_hint_align_set(result->grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
199 elm_object_part_content_set(result->win, SWALLOW, result->grid);
200 evas_object_show(result->grid);
201
202 evas_object_resize(result->win, result->w, result->h);
203 evas_object_move(result->win, result->x, result->y);
204 elm_layout_sizing_eval(result->win);
205 evas_object_show(result->win);
206
194 // On mouse down we try to shift focus to the backing image, this seems to be the correct thing to force focus onto it's widgets. 207 // On mouse down we try to shift focus to the backing image, this seems to be the correct thing to force focus onto it's widgets.
195 // According to the Elm inlined image window example, this is what's needed to. 208 // According to the Elm inlined image window example, this is what's needed to.
196 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, result); 209 evas_object_event_callback_add(result->win, EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down_elm, result);
197 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _onBgMove, result); 210 evas_object_event_callback_add(result->win, EVAS_CALLBACK_MOUSE_MOVE, _onBgMove, result);
198 elm_win_alpha_set(result->win, EINA_TRUE); 211
199 212 result->e = evas_object_evas_get(result->win);
200 // image object for win is unlinked to its pos/size - so manual control
201 // this allows also for using map and other things with it.
202 evas_object_move(obj, result->x, result->y);
203 // Odd, it needs to be resized twice. WTF?
204 evas_object_resize(obj, result->w, result->h);
205
206 obj2 = evas_object_evas_get(obj);
207 result->e = obj2;
208 // Create corner handles. 213 // Create corner handles.
209 snprintf(buf, sizeof(buf), "%s/pt.png", elm_app_data_dir_get()); 214 snprintf(buf, sizeof(buf), "%s/pt.png", elm_app_data_dir_get());
210 for (i = 0; i < 4; i++) 215 for (i = 0; i < 4; i++)
211 { 216 {
212 char key[32];
213 int cx = result->x, cy = result->y; 217 int cx = result->x, cy = result->y;
214 218
215 if (i == 1) cx += result->w; 219 if (i == 1) cx += result->w;
216 else if (i == 2) {cx += result->w; cy += result->h;} 220 else if (i == 2) {cx += result->w; cy += result->h;}
217 else if (i == 3) cy += result->h; 221 else if (i == 3) cy += result->h;
218 snprintf(key, sizeof(key), "h-%i\n", i); 222 result->hand[i] = eo_add(EVAS_OBJ_IMAGE_CLASS, result->e,
219 result->hand[i] = eo_add(EVAS_OBJ_IMAGE_CLASS, obj2,
220 evas_obj_image_filled_set(EINA_TRUE), 223 evas_obj_image_filled_set(EINA_TRUE),
221 evas_obj_image_file_set(buf, NULL), 224 evas_obj_image_file_set(buf, NULL),
222 evas_obj_size_set(31, 31), 225 evas_obj_size_set(31, 31),
223 evas_obj_position_set(cx - 15, cy - 15), 226 evas_obj_position_set(cx - 15, cy - 15),
224 eo_key_data_set(key, result->hand[i], NULL),
225 evas_obj_visibility_set(EINA_TRUE) 227 evas_obj_visibility_set(EINA_TRUE)
226 ); 228 );
227 evas_object_event_callback_add(result->hand[i], EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, result); 229 evas_object_event_callback_add(result->hand[i], EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, result);
228 eo_unref(result->hand[i]); 230 eo_unref(result->hand[i]);
229 } 231 }
232
230 } 233 }
231 else 234 else
232 { 235 {
233 result->win = elm_win_add(NULL, name, ELM_WIN_BASIC); 236 result->win = elm_win_add(NULL, name, ELM_WIN_BASIC);
234 evas_object_move(result->win, result->x, result->y); 237 evas_object_move(result->win, result->x, result->y);
235 evas_object_smart_callback_add(result->win, "delete,request", _on_done, NULL); 238 evas_object_smart_callback_add(result->win, "delete,request", _on_done, NULL);
236 } 239 elm_win_title_set(result->win, title);
237 240
238 elm_win_title_set(result->win, title); 241 snprintf(buf, sizeof(buf), "%s/sky_04.jpg", elm_app_data_dir_get());
239 242 result->bg = eo_add(ELM_OBJ_IMAGE_CLASS, result->win,
240 snprintf(buf, sizeof(buf), "%s/sky_04.jpg", elm_app_data_dir_get()); 243 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
241 result->bg = eo_add(ELM_OBJ_IMAGE_CLASS, result->win, 244 elm_obj_image_fill_outside_set(EINA_TRUE),
242 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND), 245 elm_obj_image_file_set(buf, NULL),
243 elm_obj_image_fill_outside_set(EINA_TRUE), 246 evas_obj_color_set(50, 0, 100, 100),
244 elm_obj_image_file_set(buf, NULL), 247 evas_obj_visibility_set(EINA_TRUE)
245 evas_obj_color_set(50, 0, 100, 100), 248 );
246 evas_obj_visibility_set(EINA_TRUE) 249 elm_win_resize_object_add(result->win, result->bg);
247 ); 250 evas_object_resize(result->win, result->w, result->h);
248 elm_win_resize_object_add(result->win, result->bg); 251 }
249
250 // Every window gets a free vertical box.
251 // TODO - Any widgets created without positon and size get packed to the end.
252 result->box = eo_add(ELM_OBJ_BOX_CLASS, result->win,
253 elm_obj_box_homogeneous_set(EINA_FALSE),
254 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
255 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL)
256 );
257 elm_win_resize_object_add(result->win, result->box);
258 252
259 if (result->internal) 253 if (result->internal)
260 { 254 {
255/*
261 result->title = eo_add(ELM_OBJ_LABEL_CLASS, result->win, 256 result->title = eo_add(ELM_OBJ_LABEL_CLASS, result->win,
262 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), 257 evas_obj_size_hint_align_set(EVAS_HINT_FILL, 1.0),
263 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0), 258 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0),
264 evas_obj_visibility_set(EINA_TRUE) 259 evas_obj_visibility_set(EINA_TRUE)
265 ); 260 );
@@ -268,7 +263,7 @@ winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, ch
268 elm_object_text_set(result->title, buf); 263 elm_object_text_set(result->title, buf);
269 elm_box_pack_end(result->box, result->title); 264 elm_box_pack_end(result->box, result->title);
270 eo_unref(result->title); 265 eo_unref(result->title);
271 266*/
272#if 0 267#if 0
273 // EPysics enable the window. 268 // EPysics enable the window.
274 if (world) 269 if (world)
@@ -284,25 +279,18 @@ winFang *winFangAdd(winFang *parent, int x, int y, int w, int h, char *title, ch
284 } 279 }
285#endif 280#endif
286 281
282/*
287 obj1 = eo_add(ELM_OBJ_SEPARATOR_CLASS, result->win, 283 obj1 = eo_add(ELM_OBJ_SEPARATOR_CLASS, result->win,
288 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), 284 evas_obj_size_hint_align_set(EVAS_HINT_FILL, 1.0),
289 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0), 285 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0),
290 elm_obj_separator_horizontal_set(EINA_TRUE), 286 elm_obj_separator_horizontal_set(EINA_TRUE),
291 evas_obj_visibility_set(EINA_TRUE) 287 evas_obj_visibility_set(EINA_TRUE)
292 ); 288 );
293 elm_box_pack_end(result->box, obj1); 289 elm_box_pack_end(result->box, obj1);
294 eo_unref(obj1); 290 eo_unref(obj1);
295 291*/
296 result->content = eo_add(EVAS_OBJ_RECTANGLE_CLASS, result->win,
297 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL),
298 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
299 evas_obj_color_set(0, 0, 0, 0),
300 evas_obj_visibility_set(EINA_TRUE)
301 );
302 elm_box_pack_end(result->box, result->content);
303 } 292 }
304 293
305 evas_object_resize(result->win, result->w, result->h);
306 evas_object_show(result->win); 294 evas_object_show(result->win);
307 295
308 return result; 296 return result;
@@ -315,9 +303,7 @@ void winFangDel(winFang *win)
315 303
316 if (!win) return; 304 if (!win) return;
317 305
318 eo_unref(win->content); 306 if (win->bg) eo_unref(win->bg);
319 eo_unref(win->box);
320 eo_unref(win->bg);
321 EINA_CLIST_FOR_EACH_ENTRY(wf, &win->winFangs, winFang, node) 307 EINA_CLIST_FOR_EACH_ENTRY(wf, &win->winFangs, winFang, node)
322 { 308 {
323 winFangDel(wf); 309 winFangDel(wf);
@@ -333,15 +319,6 @@ void winFangDel(winFang *win)
333 evas_object_del(win->win); 319 evas_object_del(win->win);
334} 320}
335 321
336void useBox(winFang *win)
337{
338 eo_do(win->content,
339 evas_obj_visibility_set(EINA_FALSE),
340 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, 0.0),
341 evas_obj_size_set(0, 0)
342 );
343}
344
345Widget *widgetAdd(winFang *win, const Eo_Class *klass, Evas_Object *parent, char *title) 322Widget *widgetAdd(winFang *win, const Eo_Class *klass, Evas_Object *parent, char *title)
346{ 323{
347 Widget *result; 324 Widget *result;
diff --git a/src/libraries/winFang.edc b/src/libraries/winFang.edc
new file mode 100644
index 0000000..0fca7a9
--- /dev/null
+++ b/src/libraries/winFang.edc
@@ -0,0 +1,115 @@
1// The images we use.
2images
3{
4 image: "bubble.png" COMP; // COMP means to use lossless compression.
5 image: "bubble_sh.png" COMP;
6 image: "logo.png" COMP;
7 image: "pt.png" COMP;
8 image: "sky_01.jpg" COMP;
9 image: "sky_02.jpg" COMP;
10 image: "sky_03.jpg" COMP;
11 image: "sky_04.jpg" COMP;
12}
13
14collections {
15
16 group {
17 name: "winFang/layout";
18
19 data {
20 item: "title" "<b>Layout based internal window</b>";
21 }
22
23 parts {
24
25 // The first part, the black background RECTangle of the screens.
26 part
27 { name: "winFang/background";
28 type: IMAGE;
29 // Ignore mouse events.
30 mouse_events: 0;
31 // Each part has one or more descriptions, or states.
32 // They all have to have at least this default state.
33 description
34 { state: "default" 0.0;
35 // RGBA, so this is purple, and semi transparent.
36// color: 50 0 100 100; // pre multiplied R = (r * a) / 255
37 color: 126 0 255 100; // r = (R * 255) / a
38 aspect_preference: HORIZONTAL;
39 image {
40 normal: "sky_04.jpg";
41 }
42 }
43 }
44
45 part {
46 name: "winFang/title";
47 type: TEXT;
48
49 description {
50 state: "default" 0.0;
51 color: 255 255 255 255;
52 rel1 {
53 relative: 0.0 0.0;
54 to: "winFang/background";
55 }
56 rel2 {
57 relative: 1.0 0.0;
58 to: "winFang/background";
59 offset: 0 15;
60 }
61 text {
62 text: "bla";
63 size: 10;
64 font: "sans";
65 min: 0 1;
66 max: 0 1;
67 }
68 }
69 }
70
71 part {
72 name: "winFang/box";
73 type: BOX;
74
75 description {
76 state: "default" 0.0;
77
78 box {
79 layout: "vertical";
80 }
81 rel1 {
82 relative: 0.0 0.0;
83 to: "winFang/title";
84 offset: 0 15;
85 }
86 rel2 {
87 relative: 1.0 1.0;
88 to: "winFang/background";
89 }
90 }
91 } // winFang/box
92
93 part {
94 name: "winFang/content";
95 type: SWALLOW;
96
97 description {
98 state: "default" 0.0;
99 fixed: 1 1;
100
101 rel1 {
102 relative: 0.0 0.0;
103 to: "winFang/title";
104 offset: 0 15;
105 }
106 rel2 {
107 relative: 1.0 1.0;
108 to: "winFang/background";
109 }
110 }
111 } // winFang/content
112
113 }
114 }
115}
diff --git a/src/libraries/winFang.h b/src/libraries/winFang.h
index 17cf942..c614b04 100644
--- a/src/libraries/winFang.h
+++ b/src/libraries/winFang.h
@@ -16,6 +16,11 @@
16#include <EPhysics.h> 16#include <EPhysics.h>
17 17
18 18
19#define BOX "winFang/box"
20#define TITLE "winFang/title"
21#define SWALLOW "winFang/content"
22
23
19typedef struct _winFang 24typedef struct _winFang
20{ 25{
21 Evas *e; 26 Evas *e;
@@ -23,8 +28,7 @@ typedef struct _winFang
23 Evas_Object *win; 28 Evas_Object *win;
24 Evas_Object *title; 29 Evas_Object *title;
25 Evas_Object *bg; 30 Evas_Object *bg;
26 Evas_Object *box; 31 Evas_Object *grid;
27 Evas_Object *content;
28 EPhysics_Body *body; 32 EPhysics_Body *body;
29 Eina_Clist widgets; 33 Eina_Clist widgets;
30 Eina_Clist winFangs; 34 Eina_Clist winFangs;
@@ -59,7 +63,6 @@ void winFangHide(winFang *win);
59void winFangShow(winFang *win); 63void winFangShow(winFang *win);
60void winFangDel(winFang *win); 64void winFangDel(winFang *win);
61 65
62void useBox(winFang *win);
63Widget *widgetAdd(winFang *win, const Eo_Class *klass, Evas_Object *parent, char *title); 66Widget *widgetAdd(winFang *win, const Eo_Class *klass, Evas_Object *parent, char *title);
64 67
65#endif 68#endif