bdilly pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f34220f0890f5107a330addfc06bbe02c313602a

commit f34220f0890f5107a330addfc06bbe02c313602a
Author: Bruno Dilly <[email protected]>
Date:   Mon Dec 5 20:41:33 2016 -0200

    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(-)

diff --git a/src/examples/edje/.gitignore b/src/examples/edje/.gitignore
index a10bdf9..0c3b2c2 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 6198ccf..afa1528 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 0000000..d512f03
--- /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 0000000..37bde33
--- /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;
+}

-- 


Reply via email to