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.
This commit is contained in:
Bruno Dilly 2016-12-05 20:41:33 -02:00
parent c6399665dd
commit f34220f089
4 changed files with 420 additions and 1 deletions

View File

@ -9,6 +9,7 @@
/edje-codegen-example
/edje-color-class
/edje-drag
/edje-dynamic-multiseat
/edje-edit-part-box
/edje-entry
/edje-multiseat

View 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 \

View File

@ -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);
}
}
}
}
}

View File

@ -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;
}