forked from enlightenment/efl
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:
parent
c6399665dd
commit
f34220f089
|
@ -9,6 +9,7 @@
|
|||
/edje-codegen-example
|
||||
/edje-color-class
|
||||
/edje-drag
|
||||
/edje-dynamic-multiseat
|
||||
/edje-edit-part-box
|
||||
/edje-entry
|
||||
/edje-multiseat
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue