diff --git a/src/examples/edje/.gitignore b/src/examples/edje/.gitignore index a10bdf9061..0c3b2c21c8 100644 --- a/src/examples/edje/.gitignore +++ b/src/examples/edje/.gitignore @@ -9,6 +9,7 @@ /edje-codegen-example /edje-color-class /edje-drag +/edje-dynamic-multiseat /edje-edit-part-box /edje-entry /edje-multiseat diff --git a/src/examples/edje/Makefile.am b/src/examples/edje/Makefile.am index 6198ccf125..afa1528221 100644 --- a/src/examples/edje/Makefile.am +++ b/src/examples/edje/Makefile.am @@ -23,6 +23,7 @@ box_example.edc \ codegen.edc \ color-class.edc \ drag.edc \ +dynamic_multiseat.edc \ edje-group.edc \ edje-nested.edc \ edje-threshold.edc \ @@ -139,6 +140,7 @@ edje-box2.c \ edje-codegen-example.c \ edje-color-class.c \ edje-drag.c \ +edje-dynamic-multiseat.c \ edje-edit-part-box.c \ edje-entry.c \ edje-multiseat.c \ @@ -212,7 +214,8 @@ edje-box \ edje-box2 \ edje-codegen-example \ edje-color-class \ -edje-drag\ +edje-drag \ +edje-dynamic-multiseat \ edje-edit-part-box \ edje-entry \ edje-multiseat \ diff --git a/src/examples/edje/dynamic_multiseat.edc b/src/examples/edje/dynamic_multiseat.edc new file mode 100644 index 0000000000..d512f03f72 --- /dev/null +++ b/src/examples/edje/dynamic_multiseat.edc @@ -0,0 +1,279 @@ +collections { + + color_classes { + color_class { + name: "button_bg,1"; + color: 200 200 200 255; + } + color_class { + name: "button_bg,2"; + color: 200 200 200 255; + } + color_class { + name: "button_bg,3"; + color: 200 200 200 255; + } + color_class { + name: "button_bg,4"; + color: 200 200 200 255; + } + } + + group { + name: "example/main"; + min: 400 400; + + parts { + part { + name: "bg"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + } + } + + part { + name: "title"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 0 0 0 255; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + to: "bg"; + } + rel2 { + relative: 1.0 0.2; + offset: -1 -1; + to: "bg"; + } + text { + text: "Dynamic Multiseat Example"; + size: 16; + font: "sans"; + min: 1 1; + } + } + } + + part { + name: "buttons"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1.relative: 0.2 0.3; + rel2.relative: 0.8 0.9; + color: 255 255 255 0; + } + } + + part { + name: "button_bg,1"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { + to: "buttons"; + relative: 0.1 0.1; + } + rel2 { + to: "buttons"; + relative: 0.45 0.45; + } + color_class: "button_bg,1"; + } + } + + part { + name: "button1"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to: "button_bg,1"; + offset: 10 10; + } + rel2 { + to: "button_bg,1"; + offset: -11 -11; + } + color: 200 200 200 255; + } + } + + part { + name: "button_bg,2"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { + to: "buttons"; + relative: 0.55 0.1; + } + rel2 { + to: "buttons"; + relative: 0.9 0.45; + } + color_class: "button_bg,2"; + } + } + + part { + name: "button2"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to: "button_bg,2"; + offset: 10 10; + } + rel2 { + to: "button_bg,2"; + offset: -11 -11; + } + color: 200 200 200 255; + } + } + + part { + name: "button_bg,3"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { + to: "buttons"; + relative: 0.1 0.55; + } + rel2 { + to: "buttons"; + relative: 0.45 0.9; + } + color_class: "button_bg,3"; + } + } + + part { + name: "button3"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to: "button_bg,3"; + offset: 10 10; + } + rel2 { + to: "button_bg,3"; + offset: -11 -11; + } + color: 200 200 200 255; + } + } + + part { + name: "button_bg,4"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { + to: "buttons"; + relative: 0.55 0.55; + } + rel2 { + to: "buttons"; + relative: 0.9 0.9; + } + color_class: "button_bg,4"; + } + } + + part { + name: "button4"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to: "button_bg,4"; + offset: 10 10; + } + rel2 { + to: "button_bg,4"; + offset: -11 -11; + } + color: 200 200 200 255; + } + } + } + + script { + public red; + public green; + public blue; + public seat_count; + } + + programs { + program { + name: "seat,added"; + signal: "seat,added,*"; + source: ""; + script { + new seat_name[128]; + new buf[256]; + new r, g, b; + + r = rand() * 255 / 65535; + append_int(red, r); + g = rand() * 255 / 65535; + append_int(green, g); + b = rand() * 255 / 65535; + append_int(blue, b); + + set_int(seat_count, get_int(seat_count) + 1); + + strncpy(seat_name, sig[strlen("seat,added,")], + strchr(sig[strlen("seat,added,")], ",")); + snprintf(buf, 128, "seat,color,%s,r=%i,g=%i,b=%i", seat_name, + r, g, b); + emit(buf, "theme"); + } + } + + program { + name: "button,in"; + signal: "mouse,in,*"; + source: "button_bg,*"; + script { + new idx, r, g, b; + + idx = atoi(sig[strlen("mouse,in,seat")]) - 1; + r = fetch_int(red, idx); + g = fetch_int(green, idx); + b = fetch_int(blue, idx); + + set_color_class(src, r, g, b, 255); + } + } + + program { + name: "button,out"; + signal: "mouse,out,*"; + source: "button_bg,*"; + script { + set_color_class(src, 200, 200, 200, 255); + } + } + } + } +} diff --git a/src/examples/edje/edje-dynamic-multiseat.c b/src/examples/edje/edje-dynamic-multiseat.c new file mode 100644 index 0000000000..37bde33f99 --- /dev/null +++ b/src/examples/edje/edje-dynamic-multiseat.c @@ -0,0 +1,136 @@ +/** + * Edje example demonstrating how to use multiseat features following + * a dynamic approach. + * + * It's an example of how themes can be implemented even if the number + * of seats using the UI is unknown. + * + * You'll need at least one Evas engine built for it (excluding the + * buffer one) that supports multiseat. It may be wayland or + * X11 with VNC support. Using other engines will lead you to a + * situation where all seats are reported as the same one ("default"). + * + * @verbatim + * edje_cc dynamic-multiseat.edc && gcc -o edje-dynamic-multiseat edje-dynamic-multiseat.c `pkg-config --libs --cflags evas ecore ecore-evas edje` + * @endverbatim + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# define EINA_UNUSED +#endif + +#ifndef PACKAGE_DATA_DIR +#define PACKAGE_DATA_DIR "." +#endif + +#include +#include +#include + +#define WIDTH 400 +#define HEIGHT 400 + +static const char *GROUPNAME = "example/main"; +static const char *EDJE_FILE = PACKAGE_DATA_DIR"/dynamic_multiseat.edj"; + +static void +_on_destroy(Ecore_Evas *ee EINA_UNUSED) +{ + ecore_main_loop_quit(); +} + +static void +_on_canvas_resize(Ecore_Evas *ee) +{ + Evas_Object *bg; + Evas_Object *edje_obj; + int w, h; + + bg = ecore_evas_data_get(ee, "background"); + edje_obj = ecore_evas_data_get(ee, "edje_obj"); + + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + evas_object_resize(bg, w, h); + evas_object_resize(edje_obj, w, h); +} + +static void +_edje_seat_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, const char *emission, const char *source EINA_UNUSED) +{ + const char *sig; + + sig = emission + strlen("seat,"); + printf("Device %s\n", sig); +} + +static void +_print_msg_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, const char *emission, const char *source EINA_UNUSED) +{ + printf("Info: %s\n", emission); +} + +int +main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED) +{ + Evas_Object *edje_obj, *bg; + Ecore_Evas *ee; + Evas *evas; + + if (!ecore_evas_init()) + return EXIT_FAILURE; + + if (!edje_init()) + goto shutdown_ecore_evas; + + ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL); + if (!ee) goto shutdown_edje; + + ecore_evas_callback_destroy_set(ee, _on_destroy); + ecore_evas_callback_resize_set(ee, _on_canvas_resize); + ecore_evas_title_set(ee, "Edje Dynamic Multiseat Example"); + + evas = ecore_evas_get(ee); + + bg = evas_object_rectangle_add(evas); + evas_object_color_set(bg, 255, 255, 255, 255); + evas_object_resize(bg, WIDTH, HEIGHT); + evas_object_show(bg); + ecore_evas_data_set(ee, "background", bg); + + edje_obj = edje_object_add(evas); + + if (!edje_object_file_set(edje_obj, EDJE_FILE, GROUPNAME)) + printf("failed to set file %s.\n", EDJE_FILE); + + evas_object_move(edje_obj, 0, 0); + evas_object_resize(edje_obj, WIDTH, HEIGHT); + evas_object_show(edje_obj); + ecore_evas_data_set(ee, "edje_obj", edje_obj); + + edje_object_signal_callback_add(edje_obj, "seat,*", "", + _edje_seat_cb, NULL); + edje_object_signal_callback_add(edje_obj, "*", "theme", + _print_msg_cb, NULL); + + printf("Running example on evas engine %s\n", + ecore_evas_engine_name_get(ee)); + + ecore_evas_show(ee); + + ecore_main_loop_begin(); + + ecore_evas_free(ee); + ecore_evas_shutdown(); + edje_shutdown(); + + return EXIT_SUCCESS; + +shutdown_edje: + edje_shutdown(); +shutdown_ecore_evas: + ecore_evas_shutdown(); + + return EXIT_FAILURE; +}