From f34220f0890f5107a330addfc06bbe02c313602a Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Mon, 5 Dec 2016 20:41:33 -0200 Subject: [PATCH] examples/edje: add dynamic seats example It's an example of how themes can be implemented even if the number of seats using the UI is unknown, and how it can be done using scripts or C code. --- src/examples/edje/.gitignore | 1 + src/examples/edje/Makefile.am | 5 +- src/examples/edje/dynamic_multiseat.edc | 279 +++++++++++++++++++++ src/examples/edje/edje-dynamic-multiseat.c | 136 ++++++++++ 4 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 src/examples/edje/dynamic_multiseat.edc create mode 100644 src/examples/edje/edje-dynamic-multiseat.c 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; +}