static void e_gadcon_layout_pack_request_set(Evas_Object *obj, int pos, int size);
static void e_gadcon_layout_pack_options_set(Evas_Object *obj, int pos, int size, int res);
static void e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h);
+static void e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h);
static void e_gadcon_layout_unpack(Evas_Object *obj);
static Evas_Hash *providers = NULL;
E_Config_Gadcon *cf_gc;
E_Config_Gadcon_Client *cf_gcc;
- E_OBJECT_CHECK_RETURN(gc, NULL);
- E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
+ E_OBJECT_CHECK(gc);
+ E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
ok = 0;
e_gadcon_layout_freeze(gc->o_container);
printf("e_config->gadcons = %p\n", e_config->gadcons);
E_Gadcon_Client_Class *cc;
cf_gcc = l->data;
- printf("cf_gcc->name = %s\n", cf_gcc->name);
cc = evas_hash_find(providers, cf_gcc->name);
if (cc)
{
}
}
+EAPI void
+e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone)
+{
+ E_OBJECT_CHECK(gc);
+ E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
+ gc->zone = zone;
+}
+
+EAPI E_Zone *
+e_gadcon_zone_get(E_Gadcon *gc)
+{
+ E_OBJECT_CHECK_RETURN(gc, NULL);
+ E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
+ return gc->zone;
+}
+
+EAPI void
+e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee)
+{
+ E_OBJECT_CHECK(gc);
+ E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
+ gc->ecore_evas = ee;
+}
+
+EAPI int
+e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h)
+{
+ E_OBJECT_CHECK_RETURN(gc, 0);
+ E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, 0);
+ if (!gc->ecore_evas) return 0;
+ ecore_evas_geometry_get(gc->ecore_evas, x, y, w, h);
+ return 1;
+}
+
EAPI E_Gadcon_Client *
e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj)
{
e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h);
}
+EAPI void
+e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h)
+{
+ E_OBJECT_CHECK(gcc);
+ E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
+ e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h);
+}
+
/* local subsystem functions */
static void
_e_gadcon_free(E_Gadcon *gc)
} ask;
int hookp;
struct {
- Evas_Coord w, h;
- } min, max;
+ int w, h;
+ } min, aspect;
Evas_Coord x, y, w, h;
Evas_Object *obj;
unsigned char can_move : 1;
_e_gadcon_layout_smart_reconfigure(bi->sd);
}
+static void
+e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h)
+{
+ E_Gadcon_Layout_Item *bi;
+
+ bi = evas_object_data_get(obj, "e_gadcon_layout_data");
+ if (!bi) return;
+ bi->aspect.w = w;
+ bi->aspect.h = h;
+ _e_gadcon_layout_smart_reconfigure(bi->sd);
+}
+
static void
e_gadcon_layout_unpack(Evas_Object *obj)
{
else
min += bi->min.h;
bi->ask.size2 = bi->ask.size;
+ if ((bi->aspect.w > 0) && (bi->aspect.h > 0))
+ {
+ if (sd->horizontal)
+ {
+ bi->ask.size2 = (h * bi->aspect.w) / bi->aspect.h;
+ }
+ else
+ {
+ bi->ask.size2 = (w * bi->aspect.h) / bi->aspect.w;
+ }
+ }
}
if (sd->horizontal)
{
Evas_Object *o_parent;
char *swallow_name;
} edje;
+ Ecore_Evas *ecore_evas;
+ E_Zone *zone;
E_Gadcon_Orient orient;
EAPI void e_gadcon_edit_end(E_Gadcon *gc);
EAPI void e_gadcon_all_edit_begin(void);
EAPI void e_gadcon_all_edit_end(void);
+EAPI void e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone);
+EAPI E_Zone *e_gadcon_zone_get(E_Gadcon *gc);
+EAPI void e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee);
+EAPI int e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h);
EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj);
EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
+EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
EAPI void e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
EAPI void e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
case E_MENU_POP_DIRECTION_LEFT:
_e_menu_realize(m);
m->cur.x = x - m->cur.w;
- m->cur.y = y ;
+ m->cur.y = y;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
_e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_RIGHT:
break;
case E_MENU_POP_DIRECTION_UP:
_e_menu_realize(m);
- m->cur.x = x + w;
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y - m->cur.h;
_e_menu_activate_last();
break;
case E_MENU_POP_DIRECTION_DOWN:
_e_menu_realize(m);
- m->cur.x = x + w;
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y + h;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
_e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_AUTO:
case E_MENU_POP_DIRECTION_LEFT:
_e_menu_realize(m);
m->cur.x = x - m->cur.w;
- m->cur.y = y ;
+ m->cur.y = y;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_RIGHT:
m->cur.x = x + w;
m->cur.y = y ;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_UP:
_e_menu_realize(m);
- m->cur.x = x + w;
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y - m->cur.h;
+ _e_menu_activate_last();
break;
case E_MENU_POP_DIRECTION_DOWN:
- m->cur.x = x + w;
+ _e_menu_realize(m);
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y + h;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_AUTO:
_e_menu_auto_place(m, x, y, w, h);
case E_MENU_POP_DIRECTION_LEFT:
_e_menu_realize(m);
m->cur.x = x - m->cur.w;
- m->cur.y = y ;
+ m->cur.y = y;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_RIGHT:
m->cur.x = x + w;
m->cur.y = y ;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_UP:
_e_menu_realize(m);
- m->cur.x = x + w;
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y - m->cur.h;
+ _e_menu_activate_last();
break;
case E_MENU_POP_DIRECTION_DOWN:
- m->cur.x = x + w;
+ _e_menu_realize(m);
+ m->cur.x = x;
+ if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+ m->cur.x = x + w - m->cur.w;
m->cur.y = y + h;
+ if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+ m->cur.y = y + h - m->cur.h;
+ _e_menu_activate_first();
break;
case E_MENU_POP_DIRECTION_AUTO:
_e_menu_auto_place(m, x, y, w, h);
snprintf(buf, sizeof(buf), "%i", shelf_id);
shelf_id++;
es->gadcon = e_gadcon_swallowed_new(es->name, buf, es->o_base, "items");
- e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_HORIZ);
+ e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP);
+ e_gadcon_zone_set(es->gadcon, zone);
+ e_gadcon_ecore_evas_set(es->gadcon, es->ee);
shelves = evas_list_append(shelves, es);
-
return es;
}
* another to be the same */
e_gadcon_client_size_request(gcc, 32, 32);
e_gadcon_client_min_size_set(gcc, 16, 16);
+ e_gadcon_client_aspect_set(gcc, 1, 1);
return gcc;
}
if (ev->button == 1)
{
Evas_Coord x, y, w, h;
-
- /* FIXME: need a way of getting screen-relative coords */
+ int cx, cy, cw, ch;
+ E_Zone *zone;
+
evas_object_geometry_get(inst->o_button, &x, &y, &w, &h);
+ e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, &cw, &ch);
+ x += cx;
+ y += cy;
+ zone = e_gadcon_zone_get(inst->gcc->gadcon);
+ if (!zone)
+ zone = e_util_zone_current_get(e_manager_current_get());
+ x -= zone->x;
+ y -= zone->y;
if (!inst->main_menu)
inst->main_menu = e_int_menus_main_new();
if (inst->main_menu)
{
+ int dir;
+
e_menu_post_deactivate_callback_set(inst->main_menu,
_menu_cb_post,
inst);
- /* FIXME: need a way of getting gadcon zone */
+ dir = E_MENU_POP_DIRECTION_AUTO;
+ switch (inst->gcc->gadcon->orient)
+ {
+ case E_GADCON_ORIENT_TOP:
+ dir = E_MENU_POP_DIRECTION_DOWN;
+// these make the menu pop off the panels' edge, not the module's object - not
+// a very generic thing though.
+// y = cy;
+// h = ch;
+ break;
+ case E_GADCON_ORIENT_BOTTOM:
+ dir = E_MENU_POP_DIRECTION_UP;
+// y = cy;
+// h = ch;
+ break;
+ case E_GADCON_ORIENT_LEFT:
+ dir = E_MENU_POP_DIRECTION_RIGHT;
+// x = cx;
+// w = cw;
+ break;
+ case E_GADCON_ORIENT_RIGHT:
+ dir = E_MENU_POP_DIRECTION_LEFT;
+// x = cx;
+// w = cw;
+ break;
+ default:
+ break;
+ }
e_menu_activate_mouse(inst->main_menu,
e_util_zone_current_get(e_manager_current_get()),
x, y, w, h,
- E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
+ dir, ev->timestamp);
edje_object_signal_emit(inst->o_button, "active", "");
evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL);
}