examples/edje: add dynamic seats example
authorBruno Dilly <bdilly@profusion.mobi>
Mon, 5 Dec 2016 22:41:33 +0000 (20:41 -0200)
committerBruno Dilly <bdilly@profusion.mobi>
Mon, 19 Dec 2016 16:58:35 +0000 (14:58 -0200)
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
src/examples/edje/Makefile.am
src/examples/edje/dynamic_multiseat.edc [new file with mode: 0644]
src/examples/edje/edje-dynamic-multiseat.c [new file with mode: 0644]

index a10bdf906198d135d09c70bb92b17a1161fc80d9..0c3b2c21c8981ed0fc776d3eba1088e1a847a24c 100644 (file)
@@ -9,6 +9,7 @@
 /edje-codegen-example
 /edje-color-class
 /edje-drag
+/edje-dynamic-multiseat
 /edje-edit-part-box
 /edje-entry
 /edje-multiseat
index 6198ccf1259068d0e50bc8c5b0a8bf39213fb6ea..afa1528221b44537ed794dcac6260d117199bce8 100644 (file)
@@ -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 (file)
index 0000000..d512f03
--- /dev/null
@@ -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 (file)
index 0000000..37bde33
--- /dev/null
@@ -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;
+}