3 /* local subsystem functions */
4 static void _e_win_free(E_Win *win);
5 static void _e_win_del(void *obj);
6 static void _e_win_prop_update(E_Win *win);
7 static void _e_win_state_update(E_Win *win);
8 static void _e_win_cb_move(Ecore_Evas *ee);
9 static void _e_win_cb_resize(Ecore_Evas *ee);
10 static void _e_win_cb_delete(Ecore_Evas *ee);
12 /* local subsystem globals */
13 static Eina_List *wins = NULL;
15 #ifdef HAVE_ELEMENTARY
16 /* intercept elm_win operations so we talk directly to e_border */
18 #include <Elementary.h>
20 typedef struct _Elm_Win_Trap_Ctx
29 _elm_win_trap_add(Evas_Object *o __UNUSED__)
31 Elm_Win_Trap_Ctx *ctx = calloc(1, sizeof(Elm_Win_Trap_Ctx));
32 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, NULL);
37 _elm_win_trap_del(void *data, Evas_Object *o __UNUSED__)
39 Elm_Win_Trap_Ctx *ctx = data;
40 EINA_SAFETY_ON_NULL_RETURN(ctx);
43 e_border_hide(ctx->border, 1);
44 e_object_del(E_OBJECT(ctx->border));
50 _elm_win_trap_hide(void *data, Evas_Object *o __UNUSED__)
52 Elm_Win_Trap_Ctx *ctx = data;
53 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
54 if (!ctx->border) return EINA_TRUE;
55 e_border_hide(ctx->border, 1);
60 _elm_win_trap_show(void *data, Evas_Object *o)
62 Elm_Win_Trap_Ctx *ctx = data;
63 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
66 Ecore_X_Window xwin = elm_win_xwindow_get(o);
67 E_Container *con = e_util_container_window_find(xwin);
68 Evas *e = evas_object_evas_get(o);
69 Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
73 E_Manager *man = e_manager_current_get();
74 EINA_SAFETY_ON_NULL_RETURN_VAL(man, EINA_TRUE);
75 con = e_container_current_get(man);
76 if (!con) con = e_container_number_get(man, 0);
77 EINA_SAFETY_ON_NULL_RETURN_VAL(con, EINA_TRUE);
81 ctx->border = e_border_new(con, xwin, 0, 1);
82 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx->border, EINA_TRUE);
83 ctx->border->placed = ctx->placed;
84 ctx->border->internal = 1;
85 ctx->border->internal_ecore_evas = ee;
87 if (ctx->centered) e_border_center(ctx->border);
88 e_border_show(ctx->border);
93 _elm_win_trap_move(void *data, Evas_Object *o __UNUSED__, int x, int y)
95 Elm_Win_Trap_Ctx *ctx = data;
96 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
97 ctx->centered = EINA_FALSE;
98 ctx->placed = EINA_TRUE;
99 if (!ctx->border) return EINA_TRUE;
100 e_border_move_without_border(ctx->border, x, y);
105 _elm_win_trap_resize(void *data, Evas_Object *o __UNUSED__, int w, int h)
107 Elm_Win_Trap_Ctx *ctx = data;
108 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
109 ctx->centered = EINA_FALSE;
110 if (!ctx->border) return EINA_TRUE;
111 e_border_resize_without_border(ctx->border, w, h);
116 _elm_win_trap_center(void *data, Evas_Object *o __UNUSED__)
118 Elm_Win_Trap_Ctx *ctx = data;
119 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
120 ctx->centered = EINA_TRUE;
121 if (!ctx->border) return EINA_TRUE;
122 if (ctx->centered) e_border_center(ctx->border);
127 _elm_win_trap_lower(void *data, Evas_Object *o __UNUSED__)
129 Elm_Win_Trap_Ctx *ctx = data;
130 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
131 if (!ctx->border) return EINA_TRUE;
132 e_border_lower(ctx->border);
137 _elm_win_trap_raise(void *data, Evas_Object *o __UNUSED__)
139 Elm_Win_Trap_Ctx *ctx = data;
140 EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_TRUE);
141 if (!ctx->border) return EINA_TRUE;
142 e_border_raise(ctx->border);
146 static const Elm_Win_Trap _elm_win_trap = {
147 ELM_WIN_TRAP_VERSION,
153 _elm_win_trap_resize,
154 _elm_win_trap_center,
158 /* alpha_set */ NULL,
159 /* aspect_set */ NULL,
160 /* avoid_damage_set */ NULL,
161 /* borderless_set */ NULL,
162 /* demand_attention_set */ NULL,
163 /* focus_skip_set */ NULL,
164 /* fullscreen_set */ NULL,
165 /* iconified_set */ NULL,
166 /* layer_set */ NULL,
167 /* manual_render_set */ NULL,
168 /* maximized_set */ NULL,
169 /* modal_set */ NULL,
170 /* name_class_set */ NULL,
171 /* object_cursor_set */ NULL,
172 /* override_set */ NULL,
173 /* rotation_set */ NULL,
174 /* rotation_with_resize_set */ NULL,
175 /* shaped_set */ NULL,
176 /* size_base_set */ NULL,
177 /* size_step_set */ NULL,
178 /* size_min_set */ NULL,
179 /* size_max_set */ NULL,
180 /* sticky_set */ NULL,
181 /* title_set */ NULL,
182 /* urgent_set */ NULL,
183 /* withdrawn_set */ NULL
187 /* externally accessible functions */
191 #ifdef HAVE_ELEMENTARY
192 if (!elm_win_trap_set(&_elm_win_trap)) return 0;
203 e_object_del(E_OBJECT(wins->data));
210 e_win_new(E_Container *con)
215 win = E_OBJECT_ALLOC(E_Win, E_WIN_TYPE, _e_win_free);
216 if (!win) return NULL;
217 e_object_del_func_set(E_OBJECT(win), _e_win_del);
218 win->container = con;
219 win->ecore_evas = e_canvas_new(con->manager->root,
222 e_canvas_add(win->ecore_evas);
223 ecore_evas_data_set(win->ecore_evas, "E_Win", win);
224 ecore_evas_callback_move_set(win->ecore_evas, _e_win_cb_move);
225 ecore_evas_callback_resize_set(win->ecore_evas, _e_win_cb_resize);
226 ecore_evas_callback_delete_request_set(win->ecore_evas, _e_win_cb_delete);
227 win->evas = ecore_evas_get(win->ecore_evas);
228 ecore_evas_name_class_set(win->ecore_evas, "E", "_e_internal_window");
229 ecore_evas_title_set(win->ecore_evas, "E");
230 obj = evas_object_rectangle_add(win->evas);
231 evas_object_name_set(obj, "E_Win");
232 evas_object_data_set(obj, "E_Win", win);
246 win->min_aspect = 0.0;
247 win->max_aspect = 0.0;
248 wins = eina_list_append(wins, win);
250 win->pointer = e_pointer_window_new(win->evas_win, 0);
255 e_win_show(E_Win *win)
258 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
261 _e_win_prop_update(win);
262 ecore_evas_lower(win->ecore_evas);
263 win->border = e_border_new(win->container, win->evas_win, 1, 1);
264 // dont need this - special stuff
265 // win->border->ignore_first_unmap = 1;
267 win->border->re_manage = 0;
268 win->border->internal = 1;
269 win->border->internal_ecore_evas = win->ecore_evas;
270 if (win->state.no_remember) win->border->internal_no_remember = 1;
272 _e_win_prop_update(win);
273 e_border_show(win->border);
274 // done now by e_border specially
275 // ecore_evas_show(win->ecore_evas);
279 e_win_hide(E_Win *win)
282 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
283 if (win->border) e_border_hide(win->border, 1);
287 * This will move window to position, automatically accounts border decorations.
289 * Don't need to account win->border->client_inset, it's done
290 * automatically, so it will work fine with new windows that still
291 * don't have the border.
293 * @parm x horizontal position to place window.
294 * @parm y vertical position to place window.
297 e_win_move(E_Win *win, int x, int y)
300 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
302 e_border_move_without_border(win->border, x, y);
304 ecore_evas_move(win->ecore_evas, x, y);
308 * This will resize window, automatically accounts border decorations.
310 * Don't need to account win->border->client_inset, it's done
311 * automatically, so it will work fine with new windows that still
312 * don't have the border.
314 * @parm w horizontal window size.
315 * @parm h vertical window size.
318 e_win_resize(E_Win *win, int w, int h)
321 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
323 e_border_resize_without_border(win->border, w, h);
325 ecore_evas_resize(win->ecore_evas, w, h);
329 * This will move and resize window to position, automatically
330 * accounts border decorations.
332 * Don't need to account win->border->client_inset, it's done
333 * automatically, so it will work fine with new windows that still
334 * don't have the border.
336 * @parm x horizontal position to place window.
337 * @parm y vertical position to place window.
338 * @parm w horizontal window size.
339 * @parm h vertical window size.
342 e_win_move_resize(E_Win *win, int x, int y, int w, int h)
345 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
347 e_border_move_resize_without_border(win->border, x, y, w, h);
349 ecore_evas_move_resize(win->ecore_evas, x, y, w, h);
353 e_win_raise(E_Win *win)
356 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
358 e_border_raise(win->border);
362 e_win_lower(E_Win *win)
365 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
367 e_border_lower(win->border);
371 e_win_placed_set(E_Win *win, int placed)
374 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
375 win->placed = placed;
377 _e_win_prop_update(win);
381 e_win_evas_get(E_Win *win)
383 E_OBJECT_CHECK_RETURN(win, NULL);
384 E_OBJECT_TYPE_CHECK_RETURN(win, E_WIN_TYPE, NULL);
389 e_win_move_callback_set(E_Win *win, void (*func)(E_Win *win))
392 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
397 e_win_resize_callback_set(E_Win *win, void (*func)(E_Win *win))
400 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
401 win->cb_resize = func;
405 e_win_delete_callback_set(E_Win *win, void (*func)(E_Win *win))
408 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
409 win->cb_delete = func;
413 e_win_shaped_set(E_Win *win, int shaped)
416 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
417 ecore_evas_shaped_set(win->ecore_evas, shaped);
421 e_win_avoid_damage_set(E_Win *win, int avoid)
424 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
425 ecore_evas_avoid_damage_set(win->ecore_evas, avoid);
429 e_win_borderless_set(E_Win *win, int borderless)
432 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
433 ecore_evas_borderless_set(win->ecore_evas, borderless);
437 e_win_layer_set(E_Win *win, int layer)
440 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
441 ecore_evas_layer_set(win->ecore_evas, layer);
445 e_win_sticky_set(E_Win *win, int sticky)
448 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
449 ecore_evas_sticky_set(win->ecore_evas, sticky);
453 e_win_size_min_set(E_Win *win, int w, int h)
456 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
460 _e_win_prop_update(win);
464 e_win_size_max_set(E_Win *win, int w, int h)
467 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
471 _e_win_prop_update(win);
475 e_win_size_base_set(E_Win *win, int w, int h)
478 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
482 _e_win_prop_update(win);
486 e_win_step_set(E_Win *win, int x, int y)
489 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
493 _e_win_prop_update(win);
497 e_win_name_class_set(E_Win *win, const char *name, const char *class)
500 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
501 ecore_evas_name_class_set(win->ecore_evas, name, class);
505 e_win_title_set(E_Win *win, const char *title)
508 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
509 ecore_evas_title_set(win->ecore_evas, title);
513 e_win_centered_set(E_Win *win, int centered)
516 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
517 if ((win->state.centered) && (!centered))
519 win->state.centered = 0;
520 _e_win_state_update(win);
522 else if ((!win->state.centered) && (centered))
524 win->state.centered = 1;
525 _e_win_state_update(win);
527 if ((win->border) && (centered))
528 e_border_center(win->border);
532 e_win_dialog_set(E_Win *win, int dialog)
535 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
536 if ((win->state.dialog) && (!dialog))
538 win->state.dialog = 0;
539 _e_win_prop_update(win);
541 else if ((!win->state.dialog) && (dialog))
543 win->state.dialog = 1;
544 _e_win_prop_update(win);
549 e_win_no_remember_set(E_Win *win, int no_remember)
552 E_OBJECT_TYPE_CHECK(win, E_WIN_TYPE);
553 win->state.no_remember = no_remember;
557 e_win_evas_object_win_get(Evas_Object *obj)
563 if (!obj) return NULL;
564 evas = evas_object_evas_get(obj);
565 wobj = evas_object_name_find(evas, "E_Win");
566 if (!wobj) return NULL;
567 win = evas_object_data_get(wobj, "E_Win");
572 e_win_border_icon_set(E_Win *win, const char *icon)
576 border = win->border;
578 if (border->internal_icon)
580 eina_stringshare_del(border->internal_icon);
581 border->internal_icon = NULL;
584 border->internal_icon = eina_stringshare_add(icon);
588 e_win_border_icon_key_set(E_Win *win, const char *key)
592 border = win->border;
594 if (border->internal_icon_key)
596 eina_stringshare_del(border->internal_icon_key);
597 border->internal_icon_key = NULL;
600 border->internal_icon_key = eina_stringshare_add(key);
603 /* local subsystem functions */
605 _e_win_free(E_Win *win)
608 e_object_del(E_OBJECT(win->pointer));
610 e_canvas_del(win->ecore_evas);
611 ecore_evas_free(win->ecore_evas);
614 e_border_hide(win->border, 1);
615 e_object_del(E_OBJECT(win->border));
617 wins = eina_list_remove(wins, win);
622 _e_win_del(void *obj)
627 if (win->border) e_border_hide(win->border, 1);
631 _e_win_prop_update(E_Win *win)
633 ecore_x_icccm_size_pos_hints_set(win->evas_win,
634 win->placed, ECORE_X_GRAVITY_NW,
635 win->min_w, win->min_h,
636 win->max_w, win->max_h,
637 win->base_w, win->base_h,
638 win->step_x, win->step_y,
639 win->min_aspect, win->max_aspect);
640 if (win->state.dialog)
642 ecore_x_icccm_transient_for_set(win->evas_win, win->container->manager->root);
643 ecore_x_netwm_window_type_set(win->evas_win, ECORE_X_WINDOW_TYPE_DIALOG);
647 ecore_x_icccm_transient_for_unset(win->evas_win);
648 ecore_x_netwm_window_type_set(win->evas_win, ECORE_X_WINDOW_TYPE_NORMAL);
653 _e_win_state_update(E_Win *win)
655 Ecore_X_Atom state[1];
658 if (win->state.centered)
659 state[num++] = E_ATOM_WINDOW_STATE_CENTERED;
662 ecore_x_window_prop_card32_set(win->evas_win, E_ATOM_WINDOW_STATE, state, num);
664 ecore_x_window_prop_property_del(win->evas_win, E_ATOM_WINDOW_STATE);
668 _e_win_cb_move(Ecore_Evas *ee)
672 win = ecore_evas_data_get(ee, "E_Win");
674 ecore_evas_geometry_get(win->ecore_evas, &win->x, &win->y, &win->w, &win->h);
675 if (win->cb_move) win->cb_move(win);
679 _e_win_cb_resize(Ecore_Evas *ee)
683 win = ecore_evas_data_get(ee, "E_Win");
685 ecore_evas_geometry_get(win->ecore_evas, &win->x, &win->y, &win->w, &win->h);
686 if (win->cb_resize) win->cb_resize(win);
690 _e_win_cb_delete(Ecore_Evas *ee)
694 win = ecore_evas_data_get(ee, "E_Win");
696 if (win->cb_delete) win->cb_delete(win);