summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-12-05 20:41:33 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-14 18:17:28 -0200
commitdd51a3f976d467de4e622cc7fd5ca9c32a409e73 (patch)
tree4c77f877c1b12cbc7c093685e52a927297de72f8
parent7ff5ee43e01eff8bd42065a2a68ef7be5706b893 (diff)
downloadefl-dd51a3f976d467de4e622cc7fd5ca9c32a409e73.tar.gz
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.
-rw-r--r--src/examples/edje/.gitignore1
-rw-r--r--src/examples/edje/Makefile.am5
-rw-r--r--src/examples/edje/dynamic_multiseat.edc279
-rw-r--r--src/examples/edje/edje-dynamic-multiseat.c136
4 files changed, 420 insertions, 1 deletions
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 <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Edje.h>
+
+#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;
+}