edje: accept optional seat parameter on FOCUS_OBJECT
authorBruno Dilly <bdilly@profusion.mobi>
Fri, 2 Dec 2016 19:50:43 +0000 (17:50 -0200)
committerBruno Dilly <bdilly@profusion.mobi>
Mon, 19 Dec 2016 16:58:35 +0000 (14:58 -0200)
If not provided, FOCUS_OBJECT action will keep acting
over default seat.

Also include a usage on edje-multiseat test
(actually no example was exercising this action).

src/bin/edje/edje_cc_handlers.c
src/examples/edje/edje-multiseat.c
src/examples/edje/multiseat.edc
src/lib/edje/edje_program.c

index 1d4b30b..9428e45 100644 (file)
@@ -14094,7 +14094,7 @@ st_collections_group_programs_program_in(void)
         @li DRAG_VAL_STEP 1.0 0.0
         @li DRAG_VAL_PAGE 0.0 0.0
         @li FOCUS_SET ("seat")
-        @li FOCUS_OBJECT
+        @li FOCUS_OBJECT ("seat")
         @li PARAM_COPY "src_part" "src_param" "dst_part" "dst_param"
         @li PARAM_SET "part" "param" "value"
         @li PLAY_SAMPLE "sample name" speed (channel)
@@ -14111,7 +14111,7 @@ st_collections_group_programs_program_in(void)
         @li PHYSICS_ROT_SET 0.707 0 0 0.707
 
         Only one action can be specified per program.
-        
+
         PLAY_SAMPLE (optional) channel can be one of:
         @li EFFECT/FX
         @li BACKGROUND/BG
@@ -14169,9 +14169,10 @@ st_collections_group_programs_program_action(void)
        else
          ep->value = parse_float_range(2, 0.0, 1.0);
      }
-   else if (ep->action == EDJE_ACTION_TYPE_FOCUS_SET)
+   else if ((ep->action == EDJE_ACTION_TYPE_FOCUS_SET) ||
+            (ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT))
      {
-       if (get_arg_count() == 1)
+        if (get_arg_count() == 1)
           ep->seat = NULL;
         else
           ep->seat = parse_str(1);
@@ -14317,7 +14318,6 @@ st_collections_group_programs_program_action(void)
         * completeness */
        break;
       case EDJE_ACTION_TYPE_ACTION_STOP:
-      case EDJE_ACTION_TYPE_FOCUS_OBJECT:
       case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
       case EDJE_ACTION_TYPE_PHYSICS_STOP:
         check_arg_count(1);
@@ -14342,6 +14342,7 @@ st_collections_group_programs_program_action(void)
         check_min_arg_count(2);
         break;
       case EDJE_ACTION_TYPE_FOCUS_SET:
+      case EDJE_ACTION_TYPE_FOCUS_OBJECT:
         check_min_arg_count(1);
         break;
       default:
index 4fbc77c..6207244 100644 (file)
@@ -54,6 +54,52 @@ _on_canvas_resize(Ecore_Evas *ee)
 }
 
 static void
+_on_rect_focus_in(void *data, const Efl_Event *event)
+{
+   Evas_Object *rect, *edje_obj;
+   Efl_Input_Device *seat;
+   Eina_Stringshare *name;
+   Efl_Input_Focus *ev;
+
+   edje_obj = data;
+   rect = event->object;
+   ev = event->info;
+   seat = efl_input_device_get(ev);
+   name = edje_obj_seat_name_get(edje_obj, seat);
+
+   printf("Seat %s (%s) focused the rect object\n",
+          efl_input_device_name_get(seat), name);
+
+   if (!strcmp(name, "seat1"))
+     evas_object_color_set(rect, 200, 0, 0, 255);
+   else if (!strcmp(name, "seat2"))
+     evas_object_color_set(rect, 0, 200, 0, 255);
+   else
+     printf("Unexpected seat %s - no color change\n", name);
+}
+
+static void
+_on_rect_focus_out(void *data, const Efl_Event *event)
+{
+   Evas_Object *rect, *edje_obj;
+   Efl_Input_Device *seat;
+   Eina_Stringshare *name;
+   Efl_Input_Focus *ev;
+
+   edje_obj = data;
+   rect = event->object;
+   ev = event->info;
+   seat = efl_input_device_get(ev);
+   name = edje_obj_seat_name_get(edje_obj, seat);
+
+   printf("Seat %s (%s) unfocused the rect object\n",
+          efl_input_device_name_get(seat), name);
+   evas_object_color_set(rect, 200, 200, 200, 255);
+
+   efl_canvas_object_seat_focus_add(edje_obj, seat);
+}
+
+static void
 _on_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o, void *event_info)
 {
    Evas_Event_Key_Down *ev = event_info;
@@ -127,7 +173,7 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
 {
    const char *edje_file = PACKAGE_DATA_DIR"/multiseat.edj";
    const Eina_List *devices, *l;
-   Evas_Object *edje_obj, *bg;
+   Evas_Object *edje_obj, *bg, *rect;
    Efl_Input_Device *dev;
    Ecore_Evas *ee;
    Evas *evas;
@@ -174,6 +220,14 @@ main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
    edje_object_part_text_cursor_end_set(edje_obj, "example/text2",
                                         EDJE_CURSOR_MAIN);
 
+   rect = evas_object_rectangle_add(evas);
+   evas_object_color_set(rect, 200, 200, 200, 255);
+   edje_object_part_swallow(edje_obj, "example/swallow", rect);
+   efl_event_callback_add(rect, EFL_EVENT_FOCUS_IN,
+                          _on_rect_focus_in, edje_obj);
+   efl_event_callback_add(rect, EFL_EVENT_FOCUS_OUT,
+                          _on_rect_focus_out, edje_obj);
+
    devices = evas_device_list(evas, NULL);
    EINA_LIST_FOREACH(devices, l, dev)
      {
index aa16309..ce1779b 100644 (file)
@@ -247,7 +247,7 @@ collections {
             mouse_events: 1;
             description {
                state: "default" 0.0;
-               rel1.relative: 0.3 0.65;
+               rel1.relative: 0.45 0.65;
                rel2.relative: 0.9 0.9;
                color: 200 200 200 255;
             }
@@ -305,7 +305,7 @@ collections {
                rel2.to: "button_left_over";
                text {
                   text: "Seat 1 over";
-                  size: 12;
+                  size: 10;
                   font: "sans";
                   min: 1 1;
                }
@@ -346,7 +346,7 @@ collections {
                rel2.to: "button_left_focus";
                text {
                   text: "Seat 1 focus";
-                  size: 12;
+                  size: 10;
                   font: "sans";
                   min: 1 1;
                }
@@ -387,7 +387,7 @@ collections {
                rel2.to: "button_right_over";
                text {
                   text: "Seat 2 over";
-                  size: 12;
+                  size: 10;
                   font: "sans";
                   min: 1 1;
                }
@@ -428,12 +428,34 @@ collections {
                rel2.to: "button_right_focus";
                text {
                   text: "Seat 2 focus";
-                  size: 12;
+                  size: 10;
                   font: "sans";
                   min: 1 1;
                }
             }
          }
+
+         part {
+            name: "unfocus_area";
+            type: RECT;
+            mouse_events: 1;
+            repeat_events: 1;
+            description {
+               state: "default" 0.0;
+               color: 255 255 255 0;
+            }
+         }
+
+         part {
+            name: "example/swallow";
+            type: SWALLOW;
+            mouse_events: 1;
+            description {
+               state: "default" 0.0;
+               rel1.relative: 0.3 0.65;
+               rel2.relative: 0.4 0.9;
+            }
+         }
       }
 
       programs {
@@ -668,6 +690,36 @@ collections {
             action: STATE_SET "default" 0.0;
             target: "example/knob2";
          }
+
+         program {
+            name: "rect,focus,s1";
+            signal: "mouse,clicked,1,seat1";
+            source: "example/swallow";
+            action: FOCUS_OBJECT "seat1";
+            target: "example/swallow";
+         }
+
+         program {
+            name: "rect,unfocus,s1";
+            signal: "mouse,clicked,1,seat1";
+            source: "unfocus_area";
+            action: FOCUS_OBJECT "seat1";
+         }
+
+         program {
+            name: "rect,focus,s2";
+            signal: "mouse,clicked,1,seat2";
+            source: "example/swallow";
+            action: FOCUS_OBJECT "seat2";
+            target: "example/swallow";
+         }
+
+         program {
+            name: "rect,unfocus,s2";
+            signal: "mouse,clicked,1,seat2";
+            source: "unfocus_area";
+            action: FOCUS_OBJECT "seat2";
+         }
       }
    }
 
index 3cc0d2d..a2df439 100644 (file)
@@ -1032,11 +1032,29 @@ low_mem_current:
       break;
 
       case EDJE_ACTION_TYPE_FOCUS_OBJECT:
+      {
+         Efl_Input_Device *seat = NULL;
+
+         if (pr->seat)
+           {
+              Eina_Stringshare *seat_name;
+
+              seat_name = eina_stringshare_add(pr->seat);
+              seat = _edje_seat_get(ed, seat_name);
+              eina_stringshare_del(seat_name);
+           }
+         if (!seat)
+           {
+              Evas *e;
+
+              e = evas_object_evas_get(ed->obj);
+              seat = evas_canvas_default_device_get(e, EFL_INPUT_DEVICE_CLASS_SEAT);
+           }
         if (!pr->targets)
           {
              Evas_Object *focused;
 
-             focused = evas_focus_get(evas_object_evas_get(ed->obj));
+             focused = evas_seat_focus_get(evas_object_evas_get(ed->obj), seat);
              if (focused)
                {
                   unsigned int i;
@@ -1050,7 +1068,7 @@ low_mem_current:
                             (rp->typedata.swallow)) &&
                            (rp->typedata.swallow->swallowed_object == focused))
                          {
-                            evas_object_focus_set(focused, EINA_FALSE);
+                            evas_object_seat_focus_del(focused, seat);
                             break;
                          }
                     }
@@ -1067,11 +1085,13 @@ low_mem_current:
                            ((rp->type == EDJE_RP_TYPE_SWALLOW) &&
                             (rp->typedata.swallow)) &&
                            (rp->typedata.swallow->swallowed_object))
-                         evas_object_focus_set(rp->typedata.swallow->swallowed_object, EINA_TRUE);
+                         evas_object_seat_focus_add(
+                            rp->typedata.swallow->swallowed_object, seat);
                     }
                }
           }
-        break;
+      }
+      break;
 
       case EDJE_ACTION_TYPE_SOUND_SAMPLE:
         if (_edje_block_break(ed))