EWS is a new Ecor_Evas engine that builds on top of other engines. It
will create a backing store Ecore_Evas and ecore_evas_ews_new()
windows are created in it as images, but transparent to the outside
users (similar to buffer's ecore_evas_object_image_new()).
It provides a basic windowing system, with a known background object
that can be changed to your pleasure, and issue Ecore_Events to notify
of new windows and changes like movement, etc. Then you can write a
simple window manager based on it. (See example, Elementary will
contain one as well).
Backing store is determined by your best engine (as in
ecore_evas_new()) or specified with ecore_evas_ews_engine_set() or
environment variable $ECORE_EVAS_EWS (format:
engine-name❌y:w:h:options). The size can be set with
ecore_evas_ews_setup().
SVN revision: 63848
devs/devilhorns/wayland_egl
parent
98b3d37f90
commit
163272dc48
16 changed files with 1878 additions and 31 deletions
@ -0,0 +1,253 @@ |
||||
/**
|
||||
* Ecore example illustrating the ews of ecore evas usage. |
||||
* |
||||
* You'll need at least one Evas engine built for it (excluding the |
||||
* buffer one). See stdout/stderr for output. |
||||
* |
||||
* @verbatim |
||||
* gcc -o ecore_evas_ews_example ecore_evas_ews_example.c `pkg-config --libs --cflags ecore-evas` |
||||
* @endverbatim |
||||
*/ |
||||
|
||||
#include <Ecore.h> |
||||
#include <Ecore_Evas.h> |
||||
#include <unistd.h> |
||||
#include <stdio.h> |
||||
#include <ctype.h> |
||||
|
||||
static Eina_Bool |
||||
_wm_win_add(void *data, int type, void *event_info) |
||||
{ |
||||
Ecore_Evas *ee = event_info; |
||||
printf("WM: new window=%p\n", ee); |
||||
return EINA_TRUE; |
||||
} |
||||
|
||||
static Eina_Bool |
||||
_wm_win_move(void *data, int type, void *event_info) |
||||
{ |
||||
Ecore_Evas *ee = event_info; |
||||
int x, y; |
||||
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL); |
||||
printf("WM: window=%p moved to %d,%d\n", ee, x, y); |
||||
return EINA_TRUE; |
||||
} |
||||
|
||||
static Eina_Bool |
||||
_wm_win_resize(void *data, int type, void *event_info) |
||||
{ |
||||
Ecore_Evas *ee = event_info; |
||||
int w, h; |
||||
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); |
||||
printf("WM: window=%p resized to %dx%d\n", ee, w, h); |
||||
return EINA_TRUE; |
||||
} |
||||
|
||||
static Eina_Bool |
||||
_wm_win_show(void *data, int type, void *event_info) |
||||
{ |
||||
Ecore_Evas *ee = event_info; |
||||
printf("WM: show window=%p\n", ee); |
||||
return EINA_TRUE; |
||||
} |
||||
|
||||
static void |
||||
optional_ews_window_manager_setup(void) |
||||
{ |
||||
ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_ADD, _wm_win_add, NULL); |
||||
ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_MOVE, _wm_win_move, NULL); |
||||
ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_RESIZE, _wm_win_resize, NULL); |
||||
ecore_event_handler_add(ECORE_EVAS_EWS_EVENT_SHOW, _wm_win_show, NULL); |
||||
|
||||
/* one may use any known unique identifier, like an app function pointer */ |
||||
ecore_evas_ews_manager_set(optional_ews_window_manager_setup); |
||||
} |
||||
|
||||
static void |
||||
optional_ews_setup(void) |
||||
{ |
||||
Evas_Object *bg; |
||||
Evas *e; |
||||
|
||||
ecore_evas_ews_setup(0, 0, 800, 600); /* "screen" size */ |
||||
e = ecore_evas_ews_evas_get(); /* forces "screen" to be allocated */ |
||||
|
||||
bg = evas_object_rectangle_add(e); |
||||
evas_object_color_set(bg, 128, 32, 32, 255); |
||||
ecore_evas_ews_background_set(bg); |
||||
} |
||||
|
||||
static Eina_Bool |
||||
_stdin_cb(void *data, Ecore_Fd_Handler *handler) |
||||
{ |
||||
const Eina_List *l; |
||||
Ecore_Evas *ee; |
||||
char c = getchar(); |
||||
|
||||
if (c == EOF) |
||||
{ |
||||
ecore_main_loop_quit(); |
||||
return EINA_FALSE; |
||||
} |
||||
|
||||
switch (c) { |
||||
case 'h': |
||||
printf("hide all windows\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_hide(ee); |
||||
break; |
||||
case 's': |
||||
printf("show all windows\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_show(ee); |
||||
break; |
||||
case 'l': |
||||
printf("move all windows left\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int x, y; |
||||
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL); |
||||
ecore_evas_move(ee, x - 10, y); |
||||
} |
||||
break; |
||||
case 'r': |
||||
printf("move all windows right\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int x, y; |
||||
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL); |
||||
ecore_evas_move(ee, x + 10, y); |
||||
} |
||||
break; |
||||
case 't': |
||||
printf("move all windows top\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int x, y; |
||||
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL); |
||||
ecore_evas_move(ee, x, y - 10); |
||||
} |
||||
break; |
||||
case 'b': |
||||
printf("move all windows bottom\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int x, y; |
||||
ecore_evas_geometry_get(ee, &x, &y, NULL, NULL); |
||||
ecore_evas_move(ee, x, y + 10); |
||||
} |
||||
break; |
||||
case 'S': |
||||
printf("make all windows smaller\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int w, h; |
||||
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); |
||||
ecore_evas_resize(ee, w - 10, h - 10); |
||||
} |
||||
break; |
||||
case 'B': |
||||
printf("make all windows bigger\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
{ |
||||
int w, h; |
||||
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); |
||||
ecore_evas_resize(ee, w + 10, h + 10); |
||||
} |
||||
break; |
||||
case 'm': |
||||
printf("make all windows unmaximized\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_maximized_set(ee, EINA_FALSE); |
||||
break; |
||||
case 'M': |
||||
printf("make all windows maximized\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_maximized_set(ee, EINA_TRUE); |
||||
break; |
||||
case 'i': |
||||
printf("make all windows uniconified\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_iconified_set(ee, EINA_FALSE); |
||||
break; |
||||
case 'I': |
||||
printf("make all windows iconified\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_iconified_set(ee, EINA_TRUE); |
||||
break; |
||||
case 'f': |
||||
printf("make all windows unfullscreen\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_fullscreen_set(ee, EINA_FALSE); |
||||
break; |
||||
case 'F': |
||||
printf("make all windows fullscreen\n"); |
||||
EINA_LIST_FOREACH(ecore_evas_ews_children_get(), l, ee) |
||||
ecore_evas_fullscreen_set(ee, EINA_TRUE); |
||||
break; |
||||
case 'q': |
||||
printf("quit\n"); |
||||
ecore_main_loop_quit(); |
||||
break; |
||||
default: |
||||
if (!isspace(c)) |
||||
printf("Unknown command: %c\n", c); |
||||
} |
||||
return ECORE_CALLBACK_RENEW; |
||||
} |
||||
|
||||
static void |
||||
_on_delete(Ecore_Evas *ee) |
||||
{ |
||||
free(ecore_evas_data_get(ee, "key")); |
||||
ecore_main_loop_quit(); |
||||
} |
||||
|
||||
int |
||||
main(void) |
||||
{ |
||||
Ecore_Evas *ee; |
||||
Evas *canvas; |
||||
Evas_Object *bg; |
||||
|
||||
if (ecore_evas_init() <= 0) |
||||
return 1; |
||||
|
||||
optional_ews_setup(); |
||||
optional_ews_window_manager_setup(); |
||||
|
||||
/* everything should look similar to ecore_evas_basic_example */ |
||||
ee = ecore_evas_ews_new(0, 0, 200, 200); |
||||
ecore_evas_title_set(ee, "Ecore Evas EWS Example"); |
||||
ecore_evas_show(ee); |
||||
|
||||
ecore_evas_data_set(ee, "key", strdup("hello")); |
||||
ecore_evas_callback_delete_request_set(ee, _on_delete); |
||||
|
||||
printf("Using %s engine!\n", ecore_evas_engine_name_get(ee)); |
||||
|
||||
canvas = ecore_evas_get(ee); |
||||
if(ecore_evas_ecore_evas_get(canvas) == ee) |
||||
printf("Everything is sane!\n"); |
||||
|
||||
bg = evas_object_rectangle_add(canvas); |
||||
evas_object_color_set(bg, 0, 0, 255, 255); |
||||
evas_object_resize(bg, 200, 200); |
||||
evas_object_show(bg); |
||||
ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE); |
||||
|
||||
/* moving the window should move it in the screen */ |
||||
ecore_evas_move(ee, 50, 50); |
||||
|
||||
ecore_main_fd_handler_add(STDIN_FILENO, |
||||
ECORE_FD_READ | ECORE_FD_ERROR, |
||||
_stdin_cb, |
||||
NULL, NULL, NULL); |
||||
|
||||
ecore_main_loop_begin(); |
||||
|
||||
ecore_evas_free(ee); |
||||
ecore_evas_shutdown(); |
||||
|
||||
return 0; |
||||
} |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue