summaryrefslogtreecommitdiff
path: root/src/modules/elementary
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-03-23 12:56:14 -0700
committerCedric BAIL <cedric@osg.samsung.com>2016-03-23 13:24:41 -0700
commitc2a1c49ab2042f559b28e840e54feb8494888e0e (patch)
treec6eb110b7c479499854eede9d0c3ab0a80c9a11a /src/modules/elementary
parent9340855597e7e465435c69b6278650346688da14 (diff)
downloadefl-c2a1c49ab2042f559b28e840e54feb8494888e0e.tar.gz
elementary: move all legacy files to their expected new location.
Diffstat (limited to 'src/modules/elementary')
-rw-r--r--src/modules/elementary/Makefile.am10
-rw-r--r--src/modules/elementary/access_output/Makefile.am22
-rw-r--r--src/modules/elementary/access_output/mod.c137
-rw-r--r--src/modules/elementary/datetime_input_ctxpopup/Makefile.am23
-rw-r--r--src/modules/elementary/datetime_input_ctxpopup/datetime_input_ctxpopup.c398
-rw-r--r--src/modules/elementary/prefs/Makefile.am56
-rw-r--r--src/modules/elementary/prefs/elm_button.c72
-rw-r--r--src/modules/elementary/prefs/elm_check.c99
-rw-r--r--src/modules/elementary/prefs/elm_datetime.c100
-rw-r--r--src/modules/elementary/prefs/elm_entry.c283
-rw-r--r--src/modules/elementary/prefs/elm_horizontal_box.c99
-rw-r--r--src/modules/elementary/prefs/elm_horizontal_frame.c118
-rw-r--r--src/modules/elementary/prefs/elm_label.c37
-rw-r--r--src/modules/elementary/prefs/elm_prefs_swallow.edc15
-rw-r--r--src/modules/elementary/prefs/elm_separator.c59
-rw-r--r--src/modules/elementary/prefs/elm_slider.c124
-rw-r--r--src/modules/elementary/prefs/elm_spinner.c124
-rw-r--r--src/modules/elementary/prefs/elm_swallow.c63
-rw-r--r--src/modules/elementary/prefs/elm_vertical_box.c99
-rw-r--r--src/modules/elementary/prefs/elm_vertical_frame.c117
-rw-r--r--src/modules/elementary/prefs/item_widgets.inc9
-rw-r--r--src/modules/elementary/prefs/page_widgets.inc4
-rw-r--r--src/modules/elementary/prefs/prefs_iface.c287
-rw-r--r--src/modules/elementary/prefs/private.h127
-rw-r--r--src/modules/elementary/test_entry/Makefile.am22
-rw-r--r--src/modules/elementary/test_entry/mod.c51
-rw-r--r--src/modules/elementary/test_map/Makefile.am22
-rw-r--r--src/modules/elementary/test_map/mod.c103
-rw-r--r--src/modules/elementary/web/Makefile.am6
-rw-r--r--src/modules/elementary/web/none/.gitignore1
-rw-r--r--src/modules/elementary/web/none/Makefile.am40
-rw-r--r--src/modules/elementary/web/none/elm_web_none.c359
-rw-r--r--src/modules/elementary/web/none/elm_web_none.eo51
-rw-r--r--src/modules/elementary/web/webkit2/.gitignore1
-rw-r--r--src/modules/elementary/web/webkit2/Makefile.am42
-rw-r--r--src/modules/elementary/web/webkit2/elm_web_webkit2.c1157
-rw-r--r--src/modules/elementary/web/webkit2/elm_web_webkit2.eo53
37 files changed, 4390 insertions, 0 deletions
diff --git a/src/modules/elementary/Makefile.am b/src/modules/elementary/Makefile.am
new file mode 100644
index 0000000000..8ad4392dbd
--- /dev/null
+++ b/src/modules/elementary/Makefile.am
@@ -0,0 +1,10 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = \
+prefs \
+test_entry \
+test_map \
+access_output \
+datetime_input_ctxpopup \
+web
diff --git a/src/modules/elementary/access_output/Makefile.am b/src/modules/elementary/access_output/Makefile.am
new file mode 100644
index 0000000000..941348ea35
--- /dev/null
+++ b/src/modules/elementary/access_output/Makefile.am
@@ -0,0 +1,22 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/access_output/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = mod.c
+
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
+module_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/elementary/access_output/mod.c b/src/modules/elementary/access_output/mod.c
new file mode 100644
index 0000000000..0dff159885
--- /dev/null
+++ b/src/modules/elementary/access_output/mod.c
@@ -0,0 +1,137 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+
+/* to enable this module
+export ELM_MODULES="access_output>access/api"
+export ELM_ACCESS_MODE=1
+ */
+
+static void (*cb_func) (void *data);
+static void *cb_data;
+static Ecore_Exe *espeak = NULL;
+static Ecore_Event_Handler *exe_exit_handler = NULL;
+static char *tmpf = NULL;
+static int tmpfd = -1;
+
+static Eina_Bool
+_exe_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+{
+ Ecore_Exe_Event_Del *ev = event;
+
+ if ((espeak) && (ev->exe == espeak))
+ {
+ if (tmpf)
+ {
+ unlink(tmpf);
+ free(tmpf);
+ tmpf = NULL;
+ close(tmpfd);
+ }
+ espeak = NULL;
+ if (cb_func) cb_func(cb_data);
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+ exe_exit_handler =
+ ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
+ _exe_del, NULL);
+ return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+ if (exe_exit_handler)
+ {
+ ecore_event_handler_del(exe_exit_handler);
+ exe_exit_handler = NULL;
+ }
+ return 1; // succeed always
+}
+
+// module fucns for the specific module type
+EAPI void
+out_read(const char *txt)
+{
+ if (!tmpf)
+ {
+ char buf[PATH_MAX];
+ mode_t cur_umask;
+
+ snprintf(buf, sizeof(buf), "/tmp/.elm-speak-XXXXXX");
+ cur_umask = umask(S_IRWXO | S_IRWXG);
+ tmpfd = mkstemp(buf);
+ umask(cur_umask);
+ if (tmpfd >= 0) tmpf = strdup(buf);
+ else return;
+ }
+ if (write(tmpfd, txt, strlen(txt)) < 0) perror("write to tmpfile (espeak)");
+}
+
+EAPI void
+out_read_done(void)
+{
+ char buf[PATH_MAX];
+
+ if (espeak)
+ {
+ ecore_exe_interrupt(espeak);
+ espeak = NULL;
+ }
+ if (tmpf)
+ {
+ // FIXME: espeak supporets -v XX for voice locale. should provide this
+ // based on actual lang/locale
+ close(tmpfd);
+ snprintf(buf, sizeof(buf), "espeak -p 2 -s 120 -k 10 -m -f %s", tmpf);
+ espeak = ecore_exe_pipe_run(buf,
+ ECORE_EXE_NOT_LEADER,
+ NULL);
+ }
+}
+
+EAPI void
+out_cancel(void)
+{
+ if (espeak)
+ {
+ ecore_exe_interrupt(espeak);
+ espeak = NULL;
+ }
+ if (tmpf)
+ {
+ unlink(tmpf);
+ free(tmpf);
+ tmpf = NULL;
+ close(tmpfd);
+ }
+}
+
+EAPI void
+out_done_callback_set(void (*func) (void *data), const void *data)
+{
+ cb_func = func;
+ cb_data = (void *)data;
+}
+
+static Eina_Bool
+_module_init(void)
+{
+ return EINA_TRUE;
+}
+
+static void
+_module_shutdown(void)
+{
+}
+
+EINA_MODULE_INIT(_module_init);
+EINA_MODULE_SHUTDOWN(_module_shutdown);
diff --git a/src/modules/elementary/datetime_input_ctxpopup/Makefile.am b/src/modules/elementary/datetime_input_ctxpopup/Makefile.am
new file mode 100644
index 0000000000..3f1350eb08
--- /dev/null
+++ b/src/modules/elementary/datetime_input_ctxpopup/Makefile.am
@@ -0,0 +1,23 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/datetime_input_ctxpopup/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = datetime_input_ctxpopup.c
+
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/elementary/datetime_input_ctxpopup/datetime_input_ctxpopup.c b/src/modules/elementary/datetime_input_ctxpopup/datetime_input_ctxpopup.c
new file mode 100644
index 0000000000..198f095a28
--- /dev/null
+++ b/src/modules/elementary/datetime_input_ctxpopup/datetime_input_ctxpopup.c
@@ -0,0 +1,398 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+#include "elm_widget.h"
+#include "elm_widget_datetime.h"
+
+#define DATETIME_FIELD_COUNT 6
+#define FIELD_FORMAT_LEN 3
+#define DISKSELECTOR_MIN_ITEMS 4
+#define BUFF_SIZE 1024
+
+typedef struct _Ctxpopup_Module_Data Ctxpopup_Module_Data;
+typedef struct _DiskItem_Data DiskItem_Data;
+
+struct _Ctxpopup_Module_Data
+{
+ Elm_Datetime_Module_Data mod_data;
+ Evas_Object *ctxpopup;
+};
+
+struct _DiskItem_Data
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ Elm_Datetime_Field_Type sel_field_type;
+ unsigned int sel_field_value;
+};
+
+static void
+_diskselector_item_free_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ free(data);
+}
+
+static Eina_Bool
+_ctxpopup_dismissed_cb(void *data, const Eo_Event *event)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ ctx_mod = (Ctxpopup_Module_Data *)data;
+ evas_object_del(event->obj);
+ ctx_mod->ctxpopup = NULL;
+
+ return EINA_TRUE;
+}
+
+static void
+_datetime_resize_cb(void *data, Evas *e EINA_UNUSED,Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+
+ ctx_mod = (Ctxpopup_Module_Data *)data;
+ if (!ctx_mod || !ctx_mod->ctxpopup) return;
+
+ evas_object_hide(ctx_mod->ctxpopup);
+}
+
+static void
+_datetime_move_cb(void *data, Evas *e EINA_UNUSED,Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+
+ ctx_mod = (Ctxpopup_Module_Data *)data;
+ if (!ctx_mod || !ctx_mod->ctxpopup) return;
+
+ evas_object_hide(ctx_mod->ctxpopup);
+}
+
+static void
+_field_value_set(struct tm *tim, Elm_Datetime_Field_Type field_type, int val)
+{
+ if (field_type >= (DATETIME_FIELD_COUNT - 1)) return;
+
+ int *timearr[]= { &tim->tm_year, &tim->tm_mon, &tim->tm_mday, &tim->tm_hour, &tim->tm_min };
+ *timearr[field_type] = val;
+}
+
+static int
+_field_value_get(struct tm *tim, Elm_Datetime_Field_Type field_type)
+{
+ if (field_type >= (DATETIME_FIELD_COUNT - 1)) return -1;
+
+ int *timearr[]= { &tim->tm_year, &tim->tm_mon, &tim->tm_mday, &tim->tm_hour, &tim->tm_min };
+ return (*timearr[field_type]);
+}
+
+static Eina_Bool
+_diskselector_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ DiskItem_Data *disk_data;
+ struct tm curr_time;
+ const char *fmt;
+
+ disk_data = (DiskItem_Data *)elm_object_item_data_get(event->event_info);
+ if (!disk_data || !(disk_data->ctx_mod)) return EINA_FALSE;
+
+ elm_datetime_value_get(disk_data->ctx_mod->mod_data.base, &curr_time);
+ fmt = disk_data->ctx_mod->mod_data.field_format_get(disk_data->ctx_mod->mod_data.base, disk_data->sel_field_type);
+ if ((disk_data->sel_field_type == ELM_DATETIME_HOUR) && ((!strncmp(fmt, "%I", FIELD_FORMAT_LEN)) ||
+ (!strncmp(fmt, "%l", FIELD_FORMAT_LEN))) && (curr_time.tm_hour >= 12))
+ disk_data->sel_field_value += 12;
+ _field_value_set(&curr_time, disk_data->sel_field_type, disk_data->sel_field_value);
+ elm_datetime_value_set(disk_data->ctx_mod->mod_data.base, &curr_time);
+ evas_object_hide(disk_data->ctx_mod->ctxpopup);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_ampm_clicked_cb(void *data, const Eo_Event *event EINA_UNUSED)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ struct tm curr_time;
+
+ ctx_mod = (Ctxpopup_Module_Data *)data;
+ if (!ctx_mod) return EINA_FALSE;
+
+ elm_datetime_value_get(ctx_mod->mod_data.base, &curr_time);
+ if (curr_time.tm_hour >= 12) curr_time.tm_hour -= 12;
+ else curr_time.tm_hour += 12;
+ elm_datetime_value_set(ctx_mod->mod_data.base, &curr_time);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_field_clicked_cb(void *data, const Eo_Event *event)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ Evas_Object *diskselector;
+ Elm_Object_Item *item;
+ DiskItem_Data *disk_data;
+ Elm_Datetime_Field_Type field_type;
+ time_t t;
+ struct tm time1;
+ char buf[BUFF_SIZE], label[BUFF_SIZE];
+ const char *fmt;
+ int idx, min, max, val;
+ unsigned int display_item_num, text_len = 0;
+ Evas_Coord x = 0, y = 0, w = 0, h = 0, width;
+
+ ctx_mod = (Ctxpopup_Module_Data *)data;
+ if (!ctx_mod) return EINA_FALSE;
+
+ snprintf(buf, sizeof(buf), "datetime/%s", elm_object_style_get(event->obj));
+
+ ctx_mod->ctxpopup = elm_ctxpopup_add(event->obj);
+ elm_object_style_set(ctx_mod->ctxpopup, buf);
+ elm_ctxpopup_horizontal_set(ctx_mod->ctxpopup, EINA_TRUE);
+ evas_object_size_hint_weight_set(ctx_mod->ctxpopup, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ctx_mod->ctxpopup, EVAS_HINT_FILL, 0.5);
+ eo_event_callback_add
+ (ctx_mod->ctxpopup, ELM_CTXPOPUP_EVENT_DISMISSED, _ctxpopup_dismissed_cb, ctx_mod);
+ elm_ctxpopup_hover_parent_set(ctx_mod->ctxpopup, elm_widget_top_get(event->obj));
+
+ diskselector = elm_diskselector_add(elm_widget_top_get(ctx_mod->mod_data.base));
+ eo_event_callback_add
+ (diskselector, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _diskselector_cb, NULL);
+ elm_object_style_set(diskselector, buf);
+ elm_object_content_set(ctx_mod->ctxpopup, diskselector);
+
+ t = time(NULL);
+ localtime_r(&t, &time1);
+
+ field_type = (Elm_Datetime_Field_Type )evas_object_data_get(event->obj, "_field_type");
+ fmt = ctx_mod->mod_data.field_format_get(ctx_mod->mod_data.base, field_type);
+ elm_datetime_value_get(ctx_mod->mod_data.base, &time1);
+ val = _field_value_get(&time1, field_type);
+ ctx_mod->mod_data.field_limit_get(ctx_mod->mod_data.base, field_type, &min, &max);
+
+ time1.tm_mday = 1; // To avoid month wrapping, set the first day of the month to start with.
+
+ if ((field_type == ELM_DATETIME_HOUR) && ((!strncmp(fmt, "%I", FIELD_FORMAT_LEN)) ||
+ (!strncmp(fmt, "%l", FIELD_FORMAT_LEN))))
+ {
+ if (max >= 12) max -= 12;
+ if (val >= 12) val -= 12;
+ if (min >= 12) min -= 12;
+ }
+ for (idx = min; idx <= max; idx++)
+ {
+ _field_value_set(&time1, field_type, idx);
+ strftime(label, BUFF_SIZE, fmt, &time1);
+ if (strlen(label) > text_len) text_len = strlen(label);
+ if (idx == val)
+ {
+ item = elm_diskselector_item_append(diskselector, label, NULL, NULL, NULL);
+ elm_diskselector_item_selected_set(item, EINA_TRUE);
+ }
+ else
+ {
+ disk_data = (DiskItem_Data *) malloc (sizeof(DiskItem_Data));
+ disk_data->ctx_mod = ctx_mod;
+ disk_data->sel_field_type = field_type;
+ disk_data->sel_field_value = idx;
+ item = elm_diskselector_item_append(diskselector, label, NULL, NULL, disk_data);
+ elm_object_item_del_cb_set(item, _diskselector_item_free_cb);
+ }
+ }
+ elm_diskselector_side_text_max_length_set(diskselector, text_len);
+
+ evas_object_geometry_get(event->obj, &x, &y, &w, &h);
+ evas_object_geometry_get(elm_widget_top_get(ctx_mod->mod_data.base), NULL, NULL, &width, NULL);
+ evas_object_size_hint_min_set(ctx_mod->ctxpopup, width, -1);
+ display_item_num = width / (w + elm_config_finger_size_get());
+ // always display even number of items to avoid autoselection
+ if (display_item_num % 2) display_item_num -= 1;
+ if (display_item_num < DISKSELECTOR_MIN_ITEMS)
+ display_item_num = DISKSELECTOR_MIN_ITEMS;
+ elm_diskselector_display_item_num_set(diskselector, display_item_num);
+ elm_diskselector_round_enabled_set(diskselector, EINA_TRUE);
+
+ elm_ctxpopup_direction_priority_set(ctx_mod->ctxpopup, ELM_CTXPOPUP_DIRECTION_DOWN,
+ ELM_CTXPOPUP_DIRECTION_UP, -1, -1);
+ evas_object_move(ctx_mod->ctxpopup, (x+w/2), (y+h));
+
+ // if the direction of Ctxpopup is upwards, move it to the top of datetime
+ if (elm_ctxpopup_direction_get(ctx_mod->ctxpopup) == ELM_CTXPOPUP_DIRECTION_UP)
+ {
+ elm_ctxpopup_direction_priority_set(ctx_mod->ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+ ELM_CTXPOPUP_DIRECTION_DOWN, -1, -1);
+ evas_object_move(ctx_mod->ctxpopup, (x + w / 2), y);
+ }
+ evas_object_show(ctx_mod->ctxpopup);
+ return EINA_TRUE;
+}
+
+static void
+_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
+{
+ const char* type = NULL;
+
+ switch (field_type)
+ {
+ case ELM_DATETIME_YEAR:
+ type = "datetime field, year";
+ break;
+
+ case ELM_DATETIME_MONTH:
+ type = "datetime field, month";
+ break;
+
+ case ELM_DATETIME_DATE:
+ type = "datetime field, date";
+ break;
+
+ case ELM_DATETIME_HOUR:
+ type = "datetime field, hour";
+ break;
+
+ case ELM_DATETIME_MINUTE:
+ type = "datetime field, minute";
+ break;
+
+ case ELM_DATETIME_AMPM:
+ type = "datetime field, AM PM";
+ break;
+
+ default:
+ break;
+ }
+
+ _elm_access_text_set
+ (_elm_access_info_get(obj), ELM_ACCESS_TYPE, type);
+ _elm_access_callback_set
+ (_elm_access_info_get(obj), ELM_ACCESS_STATE, NULL, NULL);
+}
+
+// module funcs for the specific module type
+EAPI void
+field_value_display(Elm_Datetime_Module_Data *module_data, Evas_Object *obj)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ Elm_Datetime_Field_Type field_type;
+ struct tm tim;
+ char buf[BUFF_SIZE];
+ const char *fmt;
+
+ ctx_mod = (Ctxpopup_Module_Data *)module_data;
+ if (!ctx_mod || !obj) return;
+
+ elm_datetime_value_get(ctx_mod->mod_data.base, &tim);
+ field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
+ fmt = ctx_mod->mod_data.field_format_get(ctx_mod->mod_data.base, field_type);
+ buf[0] = 0;
+ strftime(buf, sizeof(buf), fmt, &tim);
+ if ((!buf[0]) && ((!strcmp(fmt, "%p")) || (!strcmp(fmt, "%P"))))
+ {
+ // yes BUFF_SIZE is more than 2 bytes!
+ if (tim.tm_hour < 12) strcpy(buf, "AM");
+ else strcpy(buf, "PM");
+ }
+ elm_object_text_set(obj, buf);
+}
+
+EAPI Evas_Object *
+field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type field_type)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ Evas_Object *field_obj;
+
+ ctx_mod = (Ctxpopup_Module_Data *)module_data;
+ if (!ctx_mod) return NULL;
+
+ if (field_type == ELM_DATETIME_AMPM)
+ {
+ field_obj = elm_button_add(ctx_mod->mod_data.base);
+ eo_event_callback_add
+ (field_obj, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _ampm_clicked_cb, ctx_mod);
+ }
+ else
+ {
+ field_obj = elm_entry_add(ctx_mod->mod_data.base);
+ elm_entry_single_line_set(field_obj, EINA_TRUE);
+ elm_entry_editable_set(field_obj, EINA_FALSE);
+ elm_entry_input_panel_enabled_set(field_obj, EINA_FALSE);
+ elm_entry_context_menu_disabled_set(field_obj, EINA_TRUE);
+ eo_event_callback_add
+ (field_obj, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _field_clicked_cb, ctx_mod);
+ }
+ evas_object_data_set(field_obj, "_field_type", (void *)field_type);
+
+ // ACCESS
+ _access_set(field_obj, field_type);
+
+ return field_obj;
+}
+
+EAPI Elm_Datetime_Module_Data *
+obj_hook(Evas_Object *obj)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+ ctx_mod = calloc(1, sizeof(Ctxpopup_Module_Data));
+ if (!ctx_mod) return NULL;
+
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
+ _datetime_resize_cb, ctx_mod);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
+ _datetime_move_cb, ctx_mod);
+
+ return ((Elm_Datetime_Module_Data*)ctx_mod);
+}
+
+EAPI void
+obj_unhook(Elm_Datetime_Module_Data *module_data)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+
+ ctx_mod = (Ctxpopup_Module_Data *)module_data;
+ if (!ctx_mod) return;
+
+ if (ctx_mod->ctxpopup)
+ evas_object_del(ctx_mod->ctxpopup);
+
+ free(ctx_mod);
+ ctx_mod = NULL;
+}
+
+EAPI void
+obj_hide(Elm_Datetime_Module_Data *module_data)
+{
+ Ctxpopup_Module_Data *ctx_mod;
+
+ ctx_mod = (Ctxpopup_Module_Data *)module_data;
+ if (!ctx_mod) return;
+
+ if (ctx_mod->ctxpopup)
+ evas_object_hide(ctx_mod->ctxpopup);
+}
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}
+
+static Eina_Bool
+_module_init(void)
+{
+ return EINA_TRUE;
+}
+
+static void
+_module_shutdown(void)
+{
+}
+
+EINA_MODULE_INIT(_module_init);
+EINA_MODULE_SHUTDOWN(_module_shutdown);
diff --git a/src/modules/elementary/prefs/Makefile.am b/src/modules/elementary/prefs/Makefile.am
new file mode 100644
index 0000000000..d7280cb137
--- /dev/null
+++ b/src/modules/elementary/prefs/Makefile.am
@@ -0,0 +1,56 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+include ../../../Makefile_Elm_Helpers.am
+
+EXTRA_DIST = \
+elm_prefs_swallow.edc
+
+filesdir = $(pkglibdir)/modules/prefs/$(MODULE_ARCH)
+files_DATA = elm_prefs_swallow.edj
+
+elm_prefs_swallow.edj: Makefile elm_prefs_swallow.edc
+ $(AM_V_EDJ)$(EDJE_CC) $(EDJE_CC_FLAGS) \
+ $(top_srcdir)/src/modules/prefs/elm_prefs_swallow.edc \
+ $(top_builddir)/src/modules/prefs/elm_prefs_swallow.edj
+
+AM_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DLOCALE_DIR=\"$(localedir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/prefs/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = \
+private.h \
+item_widgets.inc \
+page_widgets.inc \
+prefs_iface.c \
+elm_button.c \
+elm_check.c \
+elm_datetime.c \
+elm_entry.c \
+elm_label.c \
+elm_separator.c \
+elm_slider.c \
+elm_spinner.c \
+elm_swallow.c \
+elm_vertical_box.c \
+elm_horizontal_box.c \
+elm_vertical_frame.c \
+elm_horizontal_frame.c
+
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -no-undefined -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+clean-local:
+ rm -f *.edj
diff --git a/src/modules/elementary/prefs/elm_button.c b/src/modules/elementary/prefs/elm_button.c
new file mode 100644
index 0000000000..4cccfb181a
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_button.c
@@ -0,0 +1,72 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_ACTION,
+ ELM_PREFS_TYPE_RESET,
+ ELM_PREFS_TYPE_SAVE,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+elm_prefs_button_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec EINA_UNUSED,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_button_add(prefs);
+
+ eo_event_callback_add
+ (obj, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _item_changed_cb, cb);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_button_label_set(Evas_Object *obj,
+ const char *label)
+{
+ return elm_layout_text_set(obj, NULL, label);
+}
+
+static Eina_Bool
+elm_prefs_button_icon_set(Evas_Object *obj,
+ const char *icon)
+{
+ Evas_Object *ic = elm_icon_add(obj);
+ Eina_Bool ret;
+
+ if (!elm_icon_standard_set(ic, icon)) goto err;
+
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ ret = elm_layout_content_set(obj, "icon", ic);
+ if (!ret) goto err;
+
+ return ret;
+
+err:
+ evas_object_del(ic);
+ return EINA_FALSE;
+}
+
+PREFS_ITEM_WIDGET_ADD(button,
+ supported_types,
+ NULL,
+ NULL,
+ NULL,
+ elm_prefs_button_label_set,
+ elm_prefs_button_icon_set,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_check.c b/src/modules/elementary/prefs/elm_check.c
new file mode 100644
index 0000000000..2b02d0dde3
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_check.c
@@ -0,0 +1,99 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_BOOL,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+elm_prefs_check_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_check_add(prefs);
+
+ eo_event_callback_add
+ (obj, ELM_CHECK_EVENT_CHANGED, _item_changed_cb, cb);
+ elm_check_state_set(obj, spec.b.def);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_check_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Eina_Bool val;
+
+ if (eina_value_type_get(value) != EINA_VALUE_TYPE_UCHAR) return EINA_FALSE;
+
+ eina_value_get(value, &val);
+ elm_check_state_set(obj, val);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_check_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Eina_Bool val;
+
+ val = elm_check_state_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_UCHAR)) return EINA_FALSE;
+ if (!eina_value_set(value, val)) return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_check_label_set(Evas_Object *obj,
+ const char *label)
+{
+ return elm_layout_text_set(obj, NULL, label);
+}
+
+static Eina_Bool
+elm_prefs_check_icon_set(Evas_Object *obj,
+ const char *icon)
+{
+ Evas_Object *ic = elm_icon_add(obj);
+ Eina_Bool ret;
+
+ if (!elm_icon_standard_set(ic, icon)) goto err;
+
+ elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE);
+
+ ret = elm_layout_content_set(obj, "icon", ic);
+ if (!ret) goto err;
+
+ return ret;
+
+err:
+ evas_object_del(ic);
+ return EINA_FALSE;
+}
+
+PREFS_ITEM_WIDGET_ADD(check,
+ supported_types,
+ elm_prefs_check_value_set,
+ elm_prefs_check_value_get,
+ NULL,
+ elm_prefs_check_label_set,
+ elm_prefs_check_icon_set,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_datetime.c b/src/modules/elementary/prefs/elm_datetime.c
new file mode 100644
index 0000000000..86b4729d68
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_datetime.c
@@ -0,0 +1,100 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_DATE,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+elm_prefs_datetime_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_datetime_add(prefs);
+ struct tm t;
+
+ memset(&t, 0, sizeof t);
+
+ elm_datetime_field_visible_set(obj, ELM_DATETIME_HOUR, EINA_FALSE);
+ elm_datetime_field_visible_set(obj, ELM_DATETIME_MINUTE, EINA_FALSE);
+ elm_datetime_field_visible_set(obj, ELM_DATETIME_AMPM, EINA_FALSE);
+
+ eo_event_callback_add
+ (obj, ELM_DATETIME_EVENT_CHANGED, _item_changed_cb, cb);
+
+ t.tm_year = spec.d.min.y - 1900;
+ t.tm_mon = spec.d.min.m - 1;
+ t.tm_mday = spec.d.min.d;
+
+ elm_datetime_value_min_set(obj, &t);
+
+ t.tm_year = spec.d.max.y - 1900;
+ t.tm_mon = spec.d.max.m - 1;
+ t.tm_mday = spec.d.max.d;
+
+ elm_datetime_value_max_set(obj, &t);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_datetime_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ struct timeval val;
+ struct tm *t;
+ time_t gmt;
+
+ if (eina_value_type_get(value) != EINA_VALUE_TYPE_TIMEVAL)
+ return EINA_FALSE;
+
+ eina_value_get(value, &val);
+ gmt = val.tv_sec;
+ t = gmtime(&gmt);
+
+ if (elm_datetime_value_set(obj, t)) return EINA_TRUE;
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+elm_prefs_datetime_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ struct timeval val;
+ struct tm t;
+
+ memset(&val, 0, sizeof val);
+
+ if (!elm_datetime_value_get(obj, &t)) return EINA_FALSE;
+
+ val.tv_sec = mktime(&t);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_TIMEVAL)) return EINA_FALSE;
+ if (!eina_value_set(value, val)) return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(datetime,
+ supported_types,
+ elm_prefs_datetime_value_set,
+ elm_prefs_datetime_value_get,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_entry.c b/src/modules/elementary/prefs/elm_entry.c
new file mode 100644
index 0000000000..9bd0dcc57a
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_entry.c
@@ -0,0 +1,283 @@
+#include "private.h"
+#include "elm_widget.h"
+#include <sys/types.h>
+#include <regex.h>
+
+#define BLINK_INTERVAL 0.1
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_TEXT,
+ ELM_PREFS_TYPE_TEXTAREA,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_color_change_do(void *data)
+{
+ Evas_Object *obj = data;
+ int color;
+
+ color = (int)(uintptr_t)evas_object_data_get(obj, "current_color");
+ switch (color)
+ {
+ case 0:
+ evas_object_data_set(obj, "current_color", (void *)1);
+ evas_object_color_set(obj, 255, 0, 0, 255); /* 1st red */
+ goto renew;
+
+ case 1:
+ evas_object_data_set(obj, "current_color", (void *)2);
+ evas_object_color_set(obj, 255, 255, 255, 255); /* 2nd white */
+ goto renew;
+
+ case 2:
+ evas_object_data_set(obj, "current_color", (void *)3);
+ evas_object_color_set(obj, 255, 0, 0, 255); /* 2nd red */
+ goto renew;
+
+ case 3:
+ default:
+ evas_object_data_set(obj, "current_color", (void *)0);
+ evas_object_color_set(obj, 255, 255, 255, 255); /* back to white */
+ goto end;
+ }
+
+renew:
+ return ECORE_CALLBACK_RENEW;
+
+end:
+ evas_object_data_del(obj, "timer");
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+elm_prefs_entry_value_validate(Evas_Object *obj)
+{
+ Ecore_Timer *timer;
+ const char *val;
+ regex_t *regex;
+ size_t min;
+
+ val = elm_entry_entry_get(obj);
+ if (!val) return EINA_FALSE;
+
+ regex = evas_object_data_get(obj, "accept_regex");
+ if (regex)
+ {
+ if (regexec(regex, val, 0, NULL, 0)) goto mismatch;
+ }
+
+ regex = evas_object_data_get(obj, "deny_regex");
+ if (regex)
+ {
+ /* we want tokens *out* of the deny language */
+ if (!regexec(regex, val, 0, NULL, 0)) goto mismatch;
+ }
+
+ min = (size_t) evas_object_data_get(obj, "min_size");
+ if (min)
+ {
+ if (strlen(val) < min) goto mismatch;
+ }
+
+ return EINA_TRUE;
+
+mismatch:
+ evas_object_color_set(obj, 255, 0, 0, 255);
+
+ timer = evas_object_data_get(obj, "timer");
+ if (timer) ecore_timer_del(timer);
+
+ evas_object_data_set
+ (obj, "timer", ecore_timer_add(BLINK_INTERVAL, _color_change_do, obj));
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static void
+_entry_del_cb(void *data EINA_UNUSED,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ regex_t *regex;
+ Ecore_Timer *timer;
+
+ regex = evas_object_data_del(obj, "accept_regex");
+ if (regex) regfree(regex);
+
+ regex = evas_object_data_del(obj, "deny_regex");
+ if (regex) regfree(regex);
+
+ timer = evas_object_data_del(obj, "timer");
+ if (timer) ecore_timer_del(timer);
+
+ evas_object_data_del(obj, "min_size");
+}
+
+static Evas_Object *
+elm_prefs_entry_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Spec spec,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_entry_add(prefs);
+ regex_t *regex = NULL;
+ char buf[256];
+
+ Elm_Entry_Filter_Limit_Size limit = {
+ .max_char_count = spec.s.length.max
+ };
+
+ evas_object_data_set(obj, "prefs_type", (void *)type);
+
+ /* FIXME: have this warning animation on the theme, later */
+
+ /* 0: orig. white; 1: 1st red; 2: 2nd white; 3: 2o red */
+ evas_object_data_set(obj, "current_color", 0);
+
+ /* FIXME: is it worth to ERR with the item's name, too, here? */
+
+ eo_event_callback_add
+ (obj, ELM_ENTRY_EVENT_ACTIVATED, _item_changed_cb, cb);
+ eo_event_callback_add
+ (obj, ELM_WIDGET_EVENT_UNFOCUSED, _item_changed_cb, cb);
+ if (spec.s.accept)
+ {
+ int ret;
+
+ regex = calloc(1, sizeof(regex_t));
+ ret = regcomp(regex, spec.s.accept, REG_EXTENDED | REG_NOSUB);
+
+ if (ret)
+ {
+ regerror(ret, regex, buf, sizeof(buf));
+ regfree(regex);
+ ERR("bad regular expression (%s) on item's 'accept' tag (%s)."
+ " Because of that, the 'accept' tag will be dropped for the "
+ "item.", spec.s.accept, buf);
+ }
+ else
+ evas_object_data_set(obj, "accept_regex", regex);
+ }
+
+ if (spec.s.deny)
+ {
+ int ret;
+
+ regex = calloc(1, sizeof(regex_t));
+ ret = regcomp(regex, spec.s.deny, REG_EXTENDED | REG_NOSUB);
+
+ if (ret)
+ {
+ regerror(ret, regex, buf, sizeof(buf));
+ regfree(regex);
+ ERR("bad regular expression (%s) on item's 'deny' tag (%s)."
+ " Because of that, the 'deny' tag will be dropped for the "
+ "item.", spec.s.deny, buf);
+ }
+ else
+ evas_object_data_set(obj, "deny_regex", regex);
+ }
+
+ if (spec.s.length.min) /* zero makes no sense */
+ {
+ size_t min = (size_t) spec.s.length.min;
+ evas_object_data_set(obj, "min_size", (void *) min);
+ }
+
+ evas_object_event_callback_add
+ (obj, EVAS_CALLBACK_DEL, _entry_del_cb, NULL);
+
+ elm_entry_scrollable_set(obj, EINA_TRUE);
+
+ if (type == ELM_PREFS_TYPE_TEXT)
+ elm_entry_single_line_set(obj, EINA_TRUE);
+
+ elm_entry_markup_filter_append(obj, elm_entry_filter_limit_size, &limit);
+ elm_layout_text_set(obj, NULL, spec.s.placeholder);
+
+ regfree(regex);
+ return obj;
+}
+
+/* already expects an EINA_VALUE_TYPE_STRINGSHARE one */
+static Eina_Bool
+elm_prefs_entry_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ const char *val;
+
+ eina_value_get(value, &val);
+
+ return elm_layout_text_set(obj, NULL, val);
+}
+
+static Eina_Bool
+elm_prefs_entry_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ const char *val;
+
+ val = elm_layout_text_get(obj, NULL);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_STRINGSHARE))
+ return EINA_FALSE;
+ if (!eina_value_set(value, val)) return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_entry_icon_set(Evas_Object *obj,
+ const char *icon)
+{
+ Evas_Object *ic = elm_icon_add(obj);
+
+ elm_icon_standard_set(ic, icon);
+
+ return elm_layout_content_set(obj, "icon", ic);
+}
+
+static Eina_Bool
+elm_prefs_entry_editable_set(Evas_Object *obj,
+ Eina_Bool editable)
+{
+ elm_entry_editable_set(obj, editable);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_entry_editable_get(Evas_Object *obj)
+{
+ return elm_entry_editable_get(obj);
+}
+
+static Eina_Bool
+elm_prefs_entry_expand_want(Evas_Object *obj EINA_UNUSED)
+{
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(entry,
+ supported_types,
+ elm_prefs_entry_value_set,
+ elm_prefs_entry_value_get,
+ elm_prefs_entry_value_validate,
+ NULL,
+ elm_prefs_entry_icon_set,
+ elm_prefs_entry_editable_set,
+ elm_prefs_entry_editable_get,
+ elm_prefs_entry_expand_want);
diff --git a/src/modules/elementary/prefs/elm_horizontal_box.c b/src/modules/elementary/prefs/elm_horizontal_box.c
new file mode 100644
index 0000000000..5bf58b4f20
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_horizontal_box.c
@@ -0,0 +1,99 @@
+#include "private.h"
+
+static Evas_Object *
+elm_prefs_horizontal_box_add(const Elm_Prefs_Page_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs)
+{
+ Evas_Object *obj = elm_box_add(prefs);
+
+ elm_box_horizontal_set(obj, EINA_TRUE);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_box_item_pack(Evas_Object *obj,
+ Evas_Object *it,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack(it, obj, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_box_item_unpack(Evas_Object *obj,
+ Evas_Object *it)
+{
+ /* back to defaults */
+ evas_object_size_hint_align_set(it, 0.5, 0.5);
+ evas_object_size_hint_weight_set(it, 0.0, 0.0);
+
+ elm_prefs_page_common_unpack(it, obj);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_box_item_pack_before(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_before,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack_before(it, it_before, obj, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_box_item_pack_after(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_after,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack_after(it, it_after, obj, iface);
+
+ return EINA_TRUE;
+}
+
+PREFS_PAGE_WIDGET_ADD(horizontal_box,
+ NULL,
+ NULL,
+ NULL,
+ elm_prefs_horizontal_box_item_pack,
+ elm_prefs_horizontal_box_item_unpack,
+ elm_prefs_horizontal_box_item_pack_before,
+ elm_prefs_horizontal_box_item_pack_after);
diff --git a/src/modules/elementary/prefs/elm_horizontal_frame.c b/src/modules/elementary/prefs/elm_horizontal_frame.c
new file mode 100644
index 0000000000..b848e3dea1
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_horizontal_frame.c
@@ -0,0 +1,118 @@
+#include "private.h"
+
+static Evas_Object *
+elm_prefs_horizontal_frame_add(const Elm_Prefs_Page_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs)
+{
+ Evas_Object *bx, *obj = elm_frame_add(prefs);
+
+ bx = elm_box_add(obj);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_box_horizontal_set(bx, EINA_TRUE);
+
+ elm_layout_content_set(obj, NULL, bx);
+
+ evas_object_data_set(obj, "bx_container", bx);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_frame_title_set(Evas_Object *obj,
+ const char *title)
+{
+ elm_layout_text_set(obj, NULL, title);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_frame_item_pack(Evas_Object *obj,
+ Evas_Object *it,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack(it, bx, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_frame_item_unpack(Evas_Object *obj,
+ Evas_Object *it)
+{
+ Evas_Object *bx = evas_object_data_get(obj, "bx_container");
+
+ /* back to defaults */
+ evas_object_size_hint_align_set(it, 0.5, 0.5);
+ evas_object_size_hint_weight_set(it, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_prefs_page_common_unpack(it, bx);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_frame_item_pack_before(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_before,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack_before(it, it_before, bx, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_horizontal_frame_item_pack_after(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_after,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_FALSE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 1.0, 0.5);
+
+ elm_prefs_horizontal_page_common_pack_after(it, it_after, bx, iface);
+
+ return EINA_TRUE;
+}
+
+PREFS_PAGE_WIDGET_ADD(horizontal_frame,
+ elm_prefs_horizontal_frame_title_set,
+ NULL,
+ NULL,
+ elm_prefs_horizontal_frame_item_pack,
+ elm_prefs_horizontal_frame_item_unpack,
+ elm_prefs_horizontal_frame_item_pack_before,
+ elm_prefs_horizontal_frame_item_pack_after);
diff --git a/src/modules/elementary/prefs/elm_label.c b/src/modules/elementary/prefs/elm_label.c
new file mode 100644
index 0000000000..8ea7e66a9e
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_label.c
@@ -0,0 +1,37 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_LABEL,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Evas_Object *
+elm_prefs_label_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec EINA_UNUSED,
+ Elm_Prefs_Item_Changed_Cb it_changed_cb EINA_UNUSED)
+{
+ Evas_Object *obj = elm_label_add(prefs);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_label_label_set(Evas_Object *obj,
+ const char *label)
+{
+ return elm_layout_text_set(obj, NULL, label);
+}
+
+PREFS_ITEM_WIDGET_ADD(label,
+ supported_types,
+ NULL,
+ NULL,
+ NULL,
+ elm_prefs_label_label_set,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_prefs_swallow.edc b/src/modules/elementary/prefs/elm_prefs_swallow.edc
new file mode 100644
index 0000000000..730d0c1777
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_prefs_swallow.edc
@@ -0,0 +1,15 @@
+collections {
+ group {
+ name: "elm_prefs_swallow";
+
+ parts {
+ part {
+ name: "content";
+ type: SWALLOW;
+
+ description {
+ }
+ }
+ }
+ }
+}
diff --git a/src/modules/elementary/prefs/elm_separator.c b/src/modules/elementary/prefs/elm_separator.c
new file mode 100644
index 0000000000..1d72a4b6a0
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_separator.c
@@ -0,0 +1,59 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_SEPARATOR,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Evas_Object *
+elm_prefs_separator_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec EINA_UNUSED,
+ Elm_Prefs_Item_Changed_Cb cb EINA_UNUSED)
+{
+ Evas_Object *obj = elm_separator_add(prefs);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_separator_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Eina_Bool val;
+
+ if (eina_value_type_get(value) != EINA_VALUE_TYPE_UCHAR)
+ return EINA_FALSE;
+
+ eina_value_get(value, &val);
+ elm_separator_horizontal_set(obj, val);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_separator_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Eina_Bool val = elm_separator_horizontal_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_UCHAR))
+ return EINA_FALSE;
+
+ if (!eina_value_set(value, val)) return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(separator,
+ supported_types,
+ elm_prefs_separator_value_set,
+ elm_prefs_separator_value_get,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_slider.c b/src/modules/elementary/prefs/elm_slider.c
new file mode 100644
index 0000000000..e03a1e1646
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_slider.c
@@ -0,0 +1,124 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_INT,
+ ELM_PREFS_TYPE_FLOAT,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+elm_prefs_slider_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Spec spec,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_slider_add(prefs);
+
+ evas_object_data_set(obj, "prefs_type", (void *)type);
+
+ eo_event_callback_add
+ (obj, ELM_SLIDER_EVENT_CHANGED, _item_changed_cb, cb);
+ if (type == ELM_PREFS_TYPE_INT)
+ {
+ elm_slider_unit_format_set(obj, "%1.0f");
+ elm_slider_indicator_format_set(obj, "%1.0f");
+ elm_slider_min_max_set(obj, spec.i.min, spec.i.max);
+ elm_slider_value_set(obj, spec.i.def);
+ }
+ else if (type == ELM_PREFS_TYPE_FLOAT)
+ {
+ elm_slider_unit_format_set(obj, "%1.2f");
+ elm_slider_indicator_format_set(obj, "%1.2f");
+ elm_slider_min_max_set(obj, spec.f.min, spec.f.max);
+ elm_slider_value_set(obj, spec.f.def);
+ }
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_slider_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ union
+ {
+ int i;
+ float f;
+ } val;
+
+ Elm_Prefs_Item_Type pt =
+ (Elm_Prefs_Item_Type)evas_object_data_get(obj, "prefs_type");
+
+ const Eina_Value_Type *vt = eina_value_type_get(value);
+ if (!vt) return EINA_FALSE;
+
+ if ((pt == ELM_PREFS_TYPE_INT) && (vt == EINA_VALUE_TYPE_INT))
+ {
+ eina_value_get(value, &(val.i));
+ elm_slider_value_set(obj, val.i);
+ }
+ else if ((pt == ELM_PREFS_TYPE_FLOAT) && (vt == EINA_VALUE_TYPE_FLOAT))
+ {
+ eina_value_get(value, &(val.f));
+ elm_slider_value_set(obj, val.f);
+ }
+ else
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_slider_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ union
+ {
+ int i;
+ float f;
+ } val;
+
+ Elm_Prefs_Item_Type pt =
+ (Elm_Prefs_Item_Type)evas_object_data_get(obj, "prefs_type");
+
+ if (pt == ELM_PREFS_TYPE_INT)
+ {
+ val.i = elm_slider_value_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_INT)) return EINA_FALSE;
+ if (!eina_value_set(value, val.i)) return EINA_FALSE;
+ }
+ else if (pt == ELM_PREFS_TYPE_FLOAT)
+ {
+ val.f = elm_slider_value_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_FLOAT)) return EINA_FALSE;
+ if (!eina_value_set(value, val.f)) return EINA_FALSE;
+ }
+ else
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(slider,
+ supported_types,
+ elm_prefs_slider_value_set,
+ elm_prefs_slider_value_get,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_spinner.c b/src/modules/elementary/prefs/elm_spinner.c
new file mode 100644
index 0000000000..51903fed90
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_spinner.c
@@ -0,0 +1,124 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_INT,
+ ELM_PREFS_TYPE_FLOAT,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Eina_Bool
+_item_changed_cb(void *data, const Eo_Event *event)
+{
+ Elm_Prefs_Item_Changed_Cb prefs_it_changed_cb = data;
+
+ prefs_it_changed_cb(event->obj);
+ return EINA_TRUE;
+}
+
+static Evas_Object *
+elm_prefs_spinner_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Spec spec,
+ Elm_Prefs_Item_Changed_Cb cb)
+{
+ Evas_Object *obj = elm_spinner_add(prefs);
+
+ evas_object_data_set(obj, "prefs_type", (void *)type);
+
+ eo_event_callback_add
+ (obj, ELM_SPINNER_EVENT_CHANGED, _item_changed_cb, cb);
+
+ if (type == ELM_PREFS_TYPE_INT)
+ {
+ elm_spinner_step_set(obj, 1.0);
+ elm_spinner_min_max_set(obj, spec.i.min, spec.i.max);
+ elm_spinner_value_set(obj, spec.i.def);
+ }
+ else if (type == ELM_PREFS_TYPE_FLOAT)
+ {
+ elm_spinner_label_format_set(obj, "%1.2f");
+ elm_spinner_step_set(obj, 0.1);
+ elm_spinner_min_max_set(obj, spec.f.min, spec.f.max);
+ elm_spinner_value_set(obj, spec.f.def);
+ }
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_spinner_value_set(Evas_Object *obj,
+ Eina_Value *value)
+{
+ union
+ {
+ int i;
+ float f;
+ } val;
+
+ Elm_Prefs_Item_Type pt =
+ (Elm_Prefs_Item_Type) evas_object_data_get(obj, "prefs_type");
+
+ const Eina_Value_Type *vt = eina_value_type_get(value);
+ if (!vt) return EINA_FALSE;
+
+ if ((pt == ELM_PREFS_TYPE_INT) && (vt == EINA_VALUE_TYPE_INT))
+ {
+ eina_value_get(value, &(val.i));
+ elm_spinner_value_set(obj, val.i);
+ }
+ else if ((pt == ELM_PREFS_TYPE_FLOAT) && (vt == EINA_VALUE_TYPE_FLOAT))
+ {
+ eina_value_get(value, &(val.f));
+ elm_spinner_value_set(obj, val.f);
+ }
+ else
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_spinner_value_get(Evas_Object *obj,
+ Eina_Value *value)
+{
+ union
+ {
+ int i;
+ float f;
+ } val;
+
+ Elm_Prefs_Item_Type pt =
+ (Elm_Prefs_Item_Type) evas_object_data_get(obj, "prefs_type");
+
+ if (pt == ELM_PREFS_TYPE_INT)
+ {
+ val.i = elm_spinner_value_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_INT)) return EINA_FALSE;
+ if (!eina_value_set(value, val.i)) return EINA_FALSE;
+ }
+ else if (pt == ELM_PREFS_TYPE_FLOAT)
+ {
+ val.f = elm_spinner_value_get(obj);
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_FLOAT)) return EINA_FALSE;
+ if (!eina_value_set(value, val.f)) return EINA_FALSE;
+ }
+ else
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(spinner,
+ supported_types,
+ elm_prefs_spinner_value_set,
+ elm_prefs_spinner_value_get,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_swallow.c b/src/modules/elementary/prefs/elm_swallow.c
new file mode 100644
index 0000000000..e5ea11d624
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_swallow.c
@@ -0,0 +1,63 @@
+#include "private.h"
+
+static Elm_Prefs_Item_Type supported_types[] =
+{
+ ELM_PREFS_TYPE_SWALLOW,
+ ELM_PREFS_TYPE_UNKNOWN
+};
+
+static Evas_Object *
+elm_prefs_swallow_add(const Elm_Prefs_Item_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs,
+ const Elm_Prefs_Item_Type type EINA_UNUSED,
+ const Elm_Prefs_Item_Spec spec EINA_UNUSED,
+ Elm_Prefs_Item_Changed_Cb cb EINA_UNUSED)
+{
+ Evas_Object *obj = elm_layout_add(prefs);
+ char layout_edj[PATH_MAX];
+
+ snprintf(layout_edj, sizeof(layout_edj), "%s/elementary/modules/prefs/%s/elm_prefs_swallow.edj", elm_app_lib_dir_get(), MODULE_ARCH);
+
+ elm_layout_file_set(obj, layout_edj, "elm_prefs_swallow");
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_swallow_swallow(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Evas_Object *subobj;
+
+ if (eina_value_type_get(value) != EINA_VALUE_TYPE_UINT64 ||
+ !eina_value_get(value, &subobj))
+ return EINA_FALSE;
+
+ elm_layout_content_set(obj, "content", subobj);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_swallow_unswallow(Evas_Object *obj,
+ Eina_Value *value)
+{
+ Evas_Object *subobj = elm_layout_content_unset(obj, "content");
+
+ if (!eina_value_setup(value, EINA_VALUE_TYPE_UINT64) ||
+ !eina_value_set(value, subobj))
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+PREFS_ITEM_WIDGET_ADD(swallow,
+ supported_types,
+ elm_prefs_swallow_swallow,
+ elm_prefs_swallow_unswallow,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
diff --git a/src/modules/elementary/prefs/elm_vertical_box.c b/src/modules/elementary/prefs/elm_vertical_box.c
new file mode 100644
index 0000000000..c7ffa0854a
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_vertical_box.c
@@ -0,0 +1,99 @@
+#include "private.h"
+
+static Evas_Object *
+elm_prefs_vertical_box_add(const Elm_Prefs_Page_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs)
+{
+ Evas_Object *obj = elm_box_add(prefs);
+
+ elm_box_horizontal_set(obj, EINA_FALSE);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_vertical_box_item_pack(Evas_Object *obj,
+ Evas_Object *it,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack(it, obj, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_box_item_unpack(Evas_Object *obj,
+ Evas_Object *it)
+{
+ /* back to defaults */
+ evas_object_size_hint_align_set(it, 0.5, 0.5);
+ evas_object_size_hint_weight_set(it, 0.0, 0.0);
+
+ elm_prefs_page_common_unpack(it, obj);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_box_item_pack_before(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_before,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack_before(it, it_before, obj, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_box_item_pack_after(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_after,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l;
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack_after(it, it_after, obj, iface);
+
+ return EINA_TRUE;
+}
+
+PREFS_PAGE_WIDGET_ADD(vertical_box,
+ NULL,
+ NULL,
+ NULL,
+ elm_prefs_vertical_box_item_pack,
+ elm_prefs_vertical_box_item_unpack,
+ elm_prefs_vertical_box_item_pack_before,
+ elm_prefs_vertical_box_item_pack_after);
diff --git a/src/modules/elementary/prefs/elm_vertical_frame.c b/src/modules/elementary/prefs/elm_vertical_frame.c
new file mode 100644
index 0000000000..0df2a4a685
--- /dev/null
+++ b/src/modules/elementary/prefs/elm_vertical_frame.c
@@ -0,0 +1,117 @@
+#include "private.h"
+
+static Evas_Object *
+elm_prefs_vertical_frame_add(const Elm_Prefs_Page_Iface *iface EINA_UNUSED,
+ Evas_Object *prefs)
+{
+ Evas_Object *bx, *obj = elm_frame_add(prefs);
+
+ bx = elm_box_add(obj);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_layout_content_set(obj, NULL, bx);
+
+ evas_object_data_set(obj, "bx_container", bx);
+
+ return obj;
+}
+
+static Eina_Bool
+elm_prefs_vertical_frame_title_set(Evas_Object *obj,
+ const char *title)
+{
+ elm_layout_text_set(obj, NULL, title);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_frame_item_pack(Evas_Object *obj,
+ Evas_Object *it,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack(it, bx, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_frame_item_unpack(Evas_Object *obj,
+ Evas_Object *it)
+{
+ Evas_Object *bx = evas_object_data_get(obj, "bx_container");
+
+ /* back to defaults */
+ evas_object_size_hint_align_set(it, 0.5, 0.5);
+ evas_object_size_hint_weight_set(it, 0.0, 0.0);
+
+ elm_prefs_page_common_unpack(it, bx);
+
+ return EINA_TRUE;
+}
+
+
+static Eina_Bool
+elm_prefs_vertical_frame_item_pack_before(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_before,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack_before(it, it_before, bx, iface);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+elm_prefs_vertical_frame_item_pack_after(Evas_Object *obj,
+ Evas_Object *it,
+ Evas_Object *it_after,
+ const Elm_Prefs_Item_Type type,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *bx = evas_object_data_get(obj, "bx_container");
+
+ if ((type == ELM_PREFS_TYPE_SEPARATOR) &&
+ (!elm_prefs_page_item_value_set(it, iface, EINA_TRUE)))
+ return EINA_FALSE;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l)
+ evas_object_size_hint_align_set(l, 0.0, 1.0);
+
+ elm_prefs_vertical_page_common_pack_after(it, it_after, bx, iface);
+
+ return EINA_TRUE;
+}
+
+PREFS_PAGE_WIDGET_ADD(vertical_frame,
+ elm_prefs_vertical_frame_title_set,
+ NULL,
+ NULL,
+ elm_prefs_vertical_frame_item_pack,
+ elm_prefs_vertical_frame_item_unpack,
+ elm_prefs_vertical_frame_item_pack_before,
+ elm_prefs_vertical_frame_item_pack_after);
diff --git a/src/modules/elementary/prefs/item_widgets.inc b/src/modules/elementary/prefs/item_widgets.inc
new file mode 100644
index 0000000000..1c0ce66239
--- /dev/null
+++ b/src/modules/elementary/prefs/item_widgets.inc
@@ -0,0 +1,9 @@
+PREFS_ADD(button)
+PREFS_ADD(check)
+PREFS_ADD(datetime)
+PREFS_ADD(entry)
+PREFS_ADD(label)
+PREFS_ADD(separator)
+PREFS_ADD(slider)
+PREFS_ADD(spinner)
+PREFS_ADD(swallow)
diff --git a/src/modules/elementary/prefs/page_widgets.inc b/src/modules/elementary/prefs/page_widgets.inc
new file mode 100644
index 0000000000..2bf3c1cbbb
--- /dev/null
+++ b/src/modules/elementary/prefs/page_widgets.inc
@@ -0,0 +1,4 @@
+PREFS_ADD(vertical_box)
+PREFS_ADD(horizontal_box)
+PREFS_ADD(vertical_frame)
+PREFS_ADD(horizontal_frame)
diff --git a/src/modules/elementary/prefs/prefs_iface.c b/src/modules/elementary/prefs/prefs_iface.c
new file mode 100644
index 0000000000..1150fcbd2f
--- /dev/null
+++ b/src/modules/elementary/prefs/prefs_iface.c
@@ -0,0 +1,287 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include "Elementary.h"
+#include "private.h"
+
+/* including declaration of each prefs item implementation iface struct */
+#define PREFS_ADD(w_name) \
+ extern const Elm_Prefs_Item_Iface prefs_##w_name##_impl;
+
+#include "item_widgets.inc"
+
+#undef PREFS_ADD
+
+int _elm_prefs_log_dom = -1;
+
+/* now building on array of those, to be put on a hash for lookup */
+static Elm_Prefs_Item_Iface_Info _elm_prefs_item_widgets[] =
+{
+#define PREFS_ADD(w_name) \
+ {"elm/" #w_name, &prefs_##w_name##_impl},
+
+#include "item_widgets.inc"
+
+#undef PREFS_ADD
+ {NULL, NULL}
+};
+
+/* including declaration of each prefs page implementation iface struct */
+#define PREFS_ADD(w_name) \
+ extern const Elm_Prefs_Page_Iface prefs_##w_name##_impl;
+
+#include "page_widgets.inc"
+
+#undef PREFS_ADD
+
+/* now building on array of those, to be put on a hash for lookup */
+static Elm_Prefs_Page_Iface_Info _elm_prefs_page_widgets[] =
+{
+#define PREFS_ADD(w_name) \
+ {"elm/" #w_name, &prefs_##w_name##_impl},
+
+#include "page_widgets.inc"
+
+#undef PREFS_ADD
+ {NULL, NULL}
+};
+
+Eina_Bool
+elm_prefs_page_item_value_set(Evas_Object *it,
+ const Elm_Prefs_Item_Iface *iface,
+ Eina_Bool val)
+{
+ Eina_Value value;
+
+ if (!iface->value_set) return EINA_FALSE;
+
+ if ((!eina_value_setup(&value, EINA_VALUE_TYPE_UCHAR)) ||
+ (!eina_value_set(&value, val)))
+ return EINA_FALSE;
+
+ return iface->value_set(it, &value);
+}
+
+static Evas_Object *
+_elm_prefs_page_box_add(Evas_Object *obj,
+ Evas_Object *it)
+{
+ Evas_Object *sbx;
+ double align_x, align_y;
+
+ evas_object_size_hint_align_get(it, &align_x, &align_y);
+
+ sbx = elm_box_add(obj);
+ elm_box_horizontal_set(sbx, EINA_TRUE);
+ evas_object_size_hint_weight_set(sbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sbx, align_x, align_y);
+ evas_object_data_set(obj, "sub_box", sbx);
+ evas_object_show(sbx);
+
+ return sbx;
+}
+
+static void
+_elm_prefs_page_item_hints_set(Evas_Object *it,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ if (iface && iface->expand_want && iface->expand_want(it))
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ evas_object_size_hint_weight_set(it, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+}
+
+static void
+_elm_prefs_page_pack_setup(Evas_Object *it,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *i, *sbx;
+
+ _elm_prefs_page_item_hints_set(it, iface);
+
+ l = evas_object_data_get(it, "label_widget");
+ i = evas_object_data_get(it, "icon_widget");
+ if (i)
+ {
+ sbx = _elm_prefs_page_box_add(obj, it);
+ elm_box_pack_end(obj, sbx);
+
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_align_set(i, 0.0, EVAS_HINT_FILL);
+ elm_box_pack_end(sbx, i);
+ elm_box_pack_end(sbx, it);
+
+ if (l) elm_box_pack_before(obj, l, sbx);
+ }
+ else
+ {
+ elm_box_pack_end(obj, it);
+ if (l) elm_box_pack_before(obj, l, it);
+ }
+}
+
+static void
+_elm_prefs_page_pack_before_setup(Evas_Object *it,
+ Evas_Object *it_before,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *i, *sbx;
+
+ _elm_prefs_page_item_hints_set(it, iface);
+
+ l = evas_object_data_get(it, "label_widget");
+ i = evas_object_data_get(it, "icon_widget");
+ if (i)
+ {
+ sbx = _elm_prefs_page_box_add(obj, it);
+ elm_box_pack_before(obj, sbx, it_before);
+
+ evas_object_size_hint_align_set(i, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(sbx, i);
+ elm_box_pack_end(sbx, it);
+
+ if (l) elm_box_pack_before(obj, l, sbx);
+ }
+ else
+ {
+ elm_box_pack_before(obj, it, it_before);
+ if (l) elm_box_pack_before(obj, l, it);
+ }
+}
+
+static void
+_elm_prefs_page_pack_after_setup(Evas_Object *it,
+ Evas_Object *it_after,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ Evas_Object *l, *i, *sbx;
+
+ _elm_prefs_page_item_hints_set(it, iface);
+
+ l = evas_object_data_get(it, "label_widget");
+ i = evas_object_data_get(it, "icon_widget");
+ if (i)
+ {
+ sbx = _elm_prefs_page_box_add(obj, it);
+ elm_box_pack_after(obj, sbx, it_after);
+
+ evas_object_size_hint_align_set(i, EVAS_HINT_FILL, 0.5);
+ elm_box_pack_end(sbx, i);
+ elm_box_pack_end(sbx, it);
+
+ if (l) elm_box_pack_before(obj, l, sbx);
+ }
+ else
+ {
+ elm_box_pack_after(obj, it, it_after);
+ if (l) elm_box_pack_before(obj, l, it);
+ }
+}
+
+void
+elm_prefs_horizontal_page_common_pack(Evas_Object *it,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, 0.5, EVAS_HINT_FILL);
+ _elm_prefs_page_pack_setup(it, obj, iface);
+}
+
+void
+elm_prefs_horizontal_page_common_pack_before(Evas_Object *it,
+ Evas_Object *it_before,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, 0.5, EVAS_HINT_FILL);
+ _elm_prefs_page_pack_before_setup(it, it_before, obj, iface);
+}
+
+void
+elm_prefs_horizontal_page_common_pack_after(Evas_Object *it,
+ Evas_Object *it_after,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, 0.5, EVAS_HINT_FILL);
+ _elm_prefs_page_pack_after_setup(it, it_after, obj, iface);
+}
+
+void
+elm_prefs_vertical_page_common_pack(Evas_Object *it,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, 0.5);
+ _elm_prefs_page_pack_setup(it, obj, iface);
+}
+
+void
+elm_prefs_vertical_page_common_pack_before(Evas_Object *it,
+ Evas_Object *it_before,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, 0.5);
+ _elm_prefs_page_pack_before_setup(it, it_before, obj, iface);
+}
+
+void
+elm_prefs_vertical_page_common_pack_after(Evas_Object *it,
+ Evas_Object *it_after,
+ Evas_Object *obj,
+ const Elm_Prefs_Item_Iface *iface)
+{
+ evas_object_size_hint_align_set(it, EVAS_HINT_FILL, 0.5);
+ _elm_prefs_page_pack_after_setup(it, it_after, obj, iface);
+}
+
+void
+elm_prefs_page_common_unpack(Evas_Object *it,
+ Evas_Object *obj)
+{
+ Evas_Object *l, *i, *sbx;
+
+ l = evas_object_data_get(it, "label_widget");
+ if (l) elm_box_unpack(obj, l);
+
+ sbx = evas_object_data_get(it, "sub_box");
+ i = evas_object_data_get(it, "icon_widget");
+
+ if (i && sbx)
+ {
+ elm_box_unpack_all(sbx);
+ elm_box_unpack(obj, sbx);
+ evas_object_del(sbx);
+ }
+ else
+ elm_box_unpack(obj, it);
+}
+
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+ _elm_prefs_log_dom = eina_log_domain_register
+ ("elm-prefs", EINA_COLOR_YELLOW);
+
+ elm_prefs_item_iface_register(_elm_prefs_item_widgets);
+ elm_prefs_page_iface_register(_elm_prefs_page_widgets);
+
+ return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+ elm_prefs_item_iface_unregister(_elm_prefs_item_widgets);
+ elm_prefs_page_iface_unregister(_elm_prefs_page_widgets);
+
+ if (_elm_prefs_log_dom >= 0) eina_log_domain_unregister(_elm_prefs_log_dom);
+ _elm_prefs_log_dom = -1;
+
+ return 1; // succeed always
+}
diff --git a/src/modules/elementary/prefs/private.h b/src/modules/elementary/prefs/private.h
new file mode 100644
index 0000000000..f65370bedf
--- /dev/null
+++ b/src/modules/elementary/prefs/private.h
@@ -0,0 +1,127 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+#include "Elementary.h"
+
+#undef CRI
+#undef ERR
+#undef WRN
+#undef INF
+#undef DBG
+
+#define CRI(...) EINA_LOG_DOM_CRIT(_elm_prefs_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR (_elm_prefs_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_elm_prefs_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_elm_prefs_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG (_elm_prefs_log_dom, __VA_ARGS__)
+
+extern int _elm_prefs_log_dom;
+
+#define PREFS_ITEM_WIDGET_ADD(_w_name, \
+ _types, \
+ _value_set_fn, \
+ _value_get_fn, \
+ _value_validate_fn, \
+ _label_set_fn, \
+ _icon_set_fn, \
+ _editable_set_fn, \
+ _editable_get_fn, \
+ _expand_want_fn) \
+ static Evas_Object * \
+ _prefs_##_w_name##_add(const Elm_Prefs_Item_Iface * iface, \
+ Evas_Object * prefs, \
+ const Elm_Prefs_Item_Type type, \
+ const Elm_Prefs_Item_Spec spec, \
+ Elm_Prefs_Item_Changed_Cb it_changed_cb) \
+ { \
+ Evas_Object *obj = \
+ elm_prefs_##_w_name##_add(iface, prefs, type, spec, it_changed_cb); \
+ if (!obj) return NULL; \
+ if (!elm_prefs_item_widget_common_add(prefs, obj)) \
+ { \
+ evas_object_del(obj); \
+ return NULL; \
+ } \
+ \
+ return obj; \
+ } \
+ \
+ const Elm_Prefs_Item_Iface prefs_##_w_name##_impl = \
+ { \
+ .abi_version = ELM_PREFS_ITEM_IFACE_ABI_VERSION, \
+ .add = _prefs_##_w_name##_add, \
+ .types = _types, \
+ .value_set = _value_set_fn, \
+ .value_get = _value_get_fn, \
+ .value_validate = _value_validate_fn, \
+ .label_set = _label_set_fn, \
+ .icon_set = _icon_set_fn, \
+ .editable_set = _editable_set_fn, \
+ .editable_get = _editable_get_fn, \
+ .expand_want = _expand_want_fn \
+ }
+
+#define PREFS_PAGE_WIDGET_ADD(_w_name, \
+ _title_set_fn, \
+ _sub_title_set_fn, \
+ _icon_set_fn, \
+ _item_pack_fn, \
+ _item_unpack_fn, \
+ _item_pack_before_fn, \
+ _item_pack_after_fn) \
+ static Evas_Object * \
+ _prefs_##_w_name##_add(const Elm_Prefs_Page_Iface * iface, \
+ Evas_Object * prefs) \
+ { \
+ Evas_Object *obj = \
+ elm_prefs_##_w_name##_add(iface, prefs); \
+ if (!obj) return NULL; \
+ if (!elm_prefs_page_widget_common_add(prefs, obj)) \
+ { \
+ evas_object_del(obj); \
+ return NULL; \
+ } \
+ \
+ return obj; \
+ } \
+ \
+ const Elm_Prefs_Page_Iface prefs_##_w_name##_impl = \
+ { \
+ .abi_version = ELM_PREFS_PAGE_IFACE_ABI_VERSION, \
+ .add = _prefs_##_w_name##_add, \
+ .title_set = _title_set_fn, \
+ .sub_title_set = _sub_title_set_fn, \
+ .icon_set = _icon_set_fn, \
+ .item_pack = _item_pack_fn, \
+ .item_unpack = _item_unpack_fn, \
+ .item_pack_before = _item_pack_before_fn, \
+ .item_pack_after = _item_pack_after_fn \
+ }
+
+Eina_Bool elm_prefs_page_item_value_set(Evas_Object *it,
+ const Elm_Prefs_Item_Iface *iface,
+ Eina_Bool val);
+void elm_prefs_horizontal_page_common_pack(Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_horizontal_page_common_pack_before(Evas_Object *,
+ Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_horizontal_page_common_pack_after(Evas_Object *,
+ Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_vertical_page_common_pack(Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_vertical_page_common_pack_before(Evas_Object *,
+ Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_vertical_page_common_pack_after(Evas_Object *,
+ Evas_Object *,
+ Evas_Object *,
+ const Elm_Prefs_Item_Iface *);
+void elm_prefs_page_common_unpack(Evas_Object *,
+ Evas_Object *);
diff --git a/src/modules/elementary/test_entry/Makefile.am b/src/modules/elementary/test_entry/Makefile.am
new file mode 100644
index 0000000000..a791506efa
--- /dev/null
+++ b/src/modules/elementary/test_entry/Makefile.am
@@ -0,0 +1,22 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/test_entry/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = mod.c
+
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
+module_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/elementary/test_entry/mod.c b/src/modules/elementary/test_entry/mod.c
new file mode 100644
index 0000000000..d2d5171af2
--- /dev/null
+++ b/src/modules/elementary/test_entry/mod.c
@@ -0,0 +1,51 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}
+
+// module fucns for the specific module type
+EAPI void
+obj_hook(Evas_Object *obj)
+{
+ printf("hook: %p\n", obj);
+}
+
+EAPI void
+obj_unhook(Evas_Object *obj)
+{
+ printf("unhook: %p\n", obj);
+}
+
+EAPI void
+obj_longpress(Evas_Object *obj)
+{
+ printf("longpress: %p\n", obj);
+}
+
+static Eina_Bool
+_module_init(void)
+{
+ return EINA_TRUE;
+}
+
+static void
+_module_shutdown(void)
+{
+}
+
+EINA_MODULE_INIT(_module_init);
+EINA_MODULE_SHUTDOWN(_module_shutdown);
diff --git a/src/modules/elementary/test_map/Makefile.am b/src/modules/elementary/test_map/Makefile.am
new file mode 100644
index 0000000000..14e7cc2747
--- /dev/null
+++ b/src/modules/elementary/test_map/Makefile.am
@@ -0,0 +1,22 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/test_map/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = mod.c
+
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
+module_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/elementary/test_map/mod.c b/src/modules/elementary/test_map/mod.c
new file mode 100644
index 0000000000..df300f7ffe
--- /dev/null
+++ b/src/modules/elementary/test_map/mod.c
@@ -0,0 +1,103 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include "Elementary.h"
+#include "elm_widget_map.h"
+#include <Eina.h>
+
+EAPI Eina_Stringshare *
+map_module_source_name_get(void)
+{
+ return eina_stringshare_add("test_map");
+}
+
+EAPI int
+map_module_tile_zoom_min_get(void)
+{
+ return 0;
+}
+
+EAPI int
+map_module_tile_zoom_max_get(void)
+{
+ return 18;
+}
+
+EAPI char *
+map_module_tile_url_get(Evas_Object *obj EINA_UNUSED, int x, int y, int zoom)
+{
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "http://tile.openstreetmap.org/%d/%d/%d.png",
+ zoom, x, y);
+ return strdup(buf);
+}
+
+EAPI char *
+map_module_route_source_get(void)
+{
+ return NULL;
+}
+
+EAPI void
+map_module_route_source_parse(Elm_Map_Route *r EINA_UNUSED)
+{
+ return;
+}
+
+EAPI char *
+map_module_route_url_get(Evas_Object *obj EINA_UNUSED, const char *type_name EINA_UNUSED, int method EINA_UNUSED, double flon EINA_UNUSED, double flat EINA_UNUSED, double tlon EINA_UNUSED, double tlat EINA_UNUSED)
+{
+ return strdup("");
+}
+
+EAPI char *
+map_module_name_url_get(Evas_Object *obj EINA_UNUSED, int method EINA_UNUSED, const char *name EINA_UNUSED, double lon EINA_UNUSED, double lat EINA_UNUSED)
+{
+ return strdup("");
+}
+
+EAPI void
+map_module_name_source_parse(Elm_Map_Name *n EINA_UNUSED)
+{
+ return;
+}
+
+EAPI void
+map_module_name_list_source_parse(Elm_Map_Name_List *nl EINA_UNUSED)
+{
+ return;
+}
+
+EAPI Eina_Bool
+map_module_tile_geo_to_coord(const Evas_Object *obj EINA_UNUSED, int zoom EINA_UNUSED, double lon EINA_UNUSED, double lat EINA_UNUSED, int size EINA_UNUSED, int *x EINA_UNUSED, int *y EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+map_module_tile_coord_to_geo(const Evas_Object *obj EINA_UNUSED, int zoom EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int size EINA_UNUSED, double *lon EINA_UNUSED, double *lat EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EAPI double
+map_module_tile_scale_get(const Evas_Object *obj EINA_UNUSED, double lon EINA_UNUSED, double lat EINA_UNUSED, int zoom EINA_UNUSED)
+{
+ return 0;
+}
+
+static Eina_Bool
+_module_init(void)
+{
+ return EINA_TRUE;
+}
+
+static void
+_module_shutdown(void)
+{
+}
+
+EINA_MODULE_INIT(_module_init);
+EINA_MODULE_SHUTDOWN(_module_shutdown);
+
diff --git a/src/modules/elementary/web/Makefile.am b/src/modules/elementary/web/Makefile.am
new file mode 100644
index 0000000000..9b7287b741
--- /dev/null
+++ b/src/modules/elementary/web/Makefile.am
@@ -0,0 +1,6 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+MAINTAINERCLEANFILES = Makefile.in
+
+SUBDIRS = \
+none \
+webkit2
diff --git a/src/modules/elementary/web/none/.gitignore b/src/modules/elementary/web/none/.gitignore
new file mode 100644
index 0000000000..2ed3a40b69
--- /dev/null
+++ b/src/modules/elementary/web/none/.gitignore
@@ -0,0 +1 @@
+*.eo.*
diff --git a/src/modules/elementary/web/none/Makefile.am b/src/modules/elementary/web/none/Makefile.am
new file mode 100644
index 0000000000..f3a0f11dd1
--- /dev/null
+++ b/src/modules/elementary/web/none/Makefile.am
@@ -0,0 +1,40 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+MAINTAINERCLEANFILES = Makefile.in
+
+CLEANFILES =
+
+EOLIAN_FLAGS = @DEPS_EOLIAN_FLAGS@ \
+ -I$(top_srcdir)/src/lib
+
+include $(top_srcdir)/Makefile_Eolian_Helper.am
+
+AM_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-DMODULES_PATH=\"$(pkglibdir)/modules\" \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/imported \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DLOCALE_DIR=\"$(localedir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DICON_DIR=\"$(datadir)/icons\" \
+-DELM_TOP_BUILD_DIR=\"$(top_builddir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+
+pkgdir = $(pkglibdir)/modules/web/none/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+BUILT_SOURCES = elm_web_none.eo.h elm_web_none.eo.c
+
+module_la_SOURCES = elm_web_none.c elm_web_none.eo.h
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la
+module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
+module_la_LIBTOOLFLAGS = --tag=disable-static
+
+EXTRA_DIST = elm_web_none.eo
+
+
diff --git a/src/modules/elementary/web/none/elm_web_none.c b/src/modules/elementary/web/none/elm_web_none.c
new file mode 100644
index 0000000000..e98cfe8771
--- /dev/null
+++ b/src/modules/elementary/web/none/elm_web_none.c
@@ -0,0 +1,359 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
+
+#include <Elementary.h>
+
+#include "elm_priv.h"
+#include "elm_widget_web.h"
+#include "elm_web_none.eo.h"
+
+#define MY_CLASS ELM_WEB_CLASS
+
+#define MY_CLASS_NAME "Elm_Web_None"
+
+typedef struct _Elm_Web_None_Data Elm_Web_None_Data;
+struct _Elm_Web_None_Data
+{
+};
+
+static int _none_log_dom = -1;
+
+#undef CRI
+#undef ERR
+#undef WRN
+#undef INF
+#undef DBG
+#define CRI(...) EINA_LOG_DOM_CRIT(_none_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_none_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_none_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_none_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_none_log_dom, __VA_ARGS__)
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_tab_propagate_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_tab_propagate_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Eina_Bool propagate EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_evas_object_smart_add(Eo *obj, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ Evas_Object *resize_obj;
+
+ resize_obj = elm_label_add(obj);
+ elm_object_text_set(resize_obj, "WebKit not supported!");
+ elm_widget_resize_object_set(obj, resize_obj, EINA_TRUE);
+
+ evas_obj_smart_add(eo_super(obj, MY_CLASS));
+ elm_widget_sub_object_parent_add(obj);
+}
+
+EOLIAN static Evas_Object*
+_elm_web_none_elm_web_webkit_view_get(Eo *obj, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ (void)obj;
+ ERR("Elementary not compiled with EWebKit support.");
+ return NULL;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_window_create_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Elm_Web_Window_Open func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_dialog_alert_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Elm_Web_Dialog_Alert func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_dialog_confirm_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Elm_Web_Dialog_Confirm func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_dialog_prompt_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Elm_Web_Dialog_Prompt func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_dialog_file_selector_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, Elm_Web_Dialog_File_Selector func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_console_message_hook_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, Elm_Web_Console_Message func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_useragent_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, const char *user_agent EINA_UNUSED)
+{
+}
+
+EOLIAN static const char*
+_elm_web_none_elm_web_useragent_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_url_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, const char *url EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static const char*
+_elm_web_none_elm_web_url_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_html_string_load(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, const char *html EINA_UNUSED, const char *base_url EINA_UNUSED, const char *unreachable_url EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static const char*
+_elm_web_none_elm_web_title_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_bg_color_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int r EINA_UNUSED, int g EINA_UNUSED, int b EINA_UNUSED, int a EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_bg_color_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int *r, int *g, int *b, int *a)
+{
+ if (r) *r = 0;
+ if (g) *g = 0;
+ if (b) *b = 0;
+ if (a) *a = 0;
+}
+
+EOLIAN static const char*
+_elm_web_none_elm_web_selection_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_popup_selected_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int idx EINA_UNUSED)
+{
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_popup_destroy(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_text_search(const Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, const char *string EINA_UNUSED, Eina_Bool case_sensitive EINA_UNUSED, Eina_Bool forward EINA_UNUSED, Eina_Bool wrap EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static unsigned int
+_elm_web_none_elm_web_text_matches_mark(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, const char *string EINA_UNUSED, Eina_Bool case_sensitive EINA_UNUSED, Eina_Bool highlight EINA_UNUSED, unsigned int limit EINA_UNUSED)
+{
+ return 0;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_text_matches_unmark_all(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_text_matches_highlight_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, Eina_Bool highlight EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_text_matches_highlight_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static double
+_elm_web_none_elm_web_load_progress_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return -1.0;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_stop(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_reload(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_reload_full(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_back(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_forward(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_navigate(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int steps EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_back_possible_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_forward_possible_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_navigate_possible_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int steps EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_history_enabled_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_history_enabled_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, Eina_Bool enable EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_zoom_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, double zoom EINA_UNUSED)
+{
+}
+
+EOLIAN static double
+_elm_web_none_elm_web_zoom_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return -1;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_zoom_mode_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, Elm_Web_Zoom_Mode mode EINA_UNUSED)
+{
+}
+
+EOLIAN static Elm_Web_Zoom_Mode
+_elm_web_none_elm_web_zoom_mode_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED)
+{
+ return ELM_WEB_ZOOM_MODE_LAST;
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_region_show(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_region_bring_in(Eo *obj EINA_UNUSED, Elm_Web_None_Data *_pd EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_none_elm_web_inwin_mode_set(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED, Eina_Bool value EINA_UNUSED)
+{
+}
+
+EOLIAN static Eina_Bool
+_elm_web_none_elm_web_inwin_mode_get(Eo *obj EINA_UNUSED, Elm_Web_None_Data *sd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EAPI void
+ewm_window_features_ref(Elm_Web_Window_Features *wf EINA_UNUSED)
+{
+}
+
+EAPI void
+ewm_window_features_unref(Elm_Web_Window_Features *wf EINA_UNUSED)
+{
+}
+
+EAPI Eina_Bool
+ewm_window_features_property_get(const Elm_Web_Window_Features *wf EINA_UNUSED,
+ Elm_Web_Window_Feature_Flag flag EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EAPI void
+ewm_window_features_region_get(const Elm_Web_Window_Features *wf EINA_UNUSED,
+ Evas_Coord *x,
+ Evas_Coord *y,
+ Evas_Coord *w,
+ Evas_Coord *h)
+{
+ if (x) *x = 0;
+ if (y) *y = 0;
+ if (w) *w = 0;
+ if (h) *h = 0;
+}
+
+EAPI void
+ewm_unneed_web(void)
+{
+}
+
+EAPI Eina_Bool
+ewm_need_web(void)
+{
+ if (_none_log_dom == -1)
+ _none_log_dom = eina_log_domain_register("elm_none", EINA_COLOR_LIGHTBLUE);
+ return EINA_TRUE;
+}
+
+EAPI const Eo_Class *
+ewm_class_get(void)
+{
+ return elm_web_none_class_get();
+}
+
+#undef ELM_WEB_CLASS
+#define ELM_WEB_CLASS elm_web_class_get()
+
+#include "elm_web_none.eo.c"
diff --git a/src/modules/elementary/web/none/elm_web_none.eo b/src/modules/elementary/web/none/elm_web_none.eo
new file mode 100644
index 0000000000..6fc7c9b508
--- /dev/null
+++ b/src/modules/elementary/web/none/elm_web_none.eo
@@ -0,0 +1,51 @@
+class Elm.Web.None (Elm.Web)
+{
+ implements {
+ Evas.Object_Smart.add;
+ Elm.Web.tab_propagate.get;
+ Elm.Web.tab_propagate.set;
+ Elm.Web.webkit_view.get;
+ Elm.Web.window_create_hook.set;
+ Elm.Web.dialog_alert_hook.set;
+ Elm.Web.dialog_confirm_hook.set;
+ Elm.Web.dialog_prompt_hook.set;
+ Elm.Web.dialog_file_selector_hook.set;
+ Elm.Web.console_message_hook.set;
+ Elm.Web.useragent.set;
+ Elm.Web.useragent.get;
+ Elm.Web.url.set;
+ Elm.Web.url.get;
+ Elm.Web.html_string_load;
+ Elm.Web.title.get;
+ Elm.Web.bg_color.set;
+ Elm.Web.bg_color.get;
+ Elm.Web.selection.get;
+ Elm.Web.popup_selected.set;
+ Elm.Web.popup_destroy;
+ Elm.Web.text_search;
+ Elm.Web.text_matches_mark;
+ Elm.Web.text_matches_unmark_all;
+ Elm.Web.text_matches_highlight.set;
+ Elm.Web.text_matches_highlight.get;
+ Elm.Web.load_progress.get;
+ Elm.Web.stop;
+ Elm.Web.reload;
+ Elm.Web.reload_full;
+ Elm.Web.back;
+ Elm.Web.forward;
+ Elm.Web.navigate;
+ Elm.Web.back_possible.get;
+ Elm.Web.forward_possible.get;
+ Elm.Web.navigate_possible_get;
+ Elm.Web.history_enabled.get;
+ Elm.Web.history_enabled.set;
+ Elm.Web.zoom.set;
+ Elm.Web.zoom.get;
+ Elm.Web.zoom_mode.set;
+ Elm.Web.zoom_mode.get;
+ Elm.Web.region_show;
+ Elm.Web.region_bring_in;
+ Elm.Web.inwin_mode.set;
+ Elm.Web.inwin_mode.get;
+ }
+}
diff --git a/src/modules/elementary/web/webkit2/.gitignore b/src/modules/elementary/web/webkit2/.gitignore
new file mode 100644
index 0000000000..2ed3a40b69
--- /dev/null
+++ b/src/modules/elementary/web/webkit2/.gitignore
@@ -0,0 +1 @@
+*.eo.*
diff --git a/src/modules/elementary/web/webkit2/Makefile.am b/src/modules/elementary/web/webkit2/Makefile.am
new file mode 100644
index 0000000000..d34cdcd94a
--- /dev/null
+++ b/src/modules/elementary/web/webkit2/Makefile.am
@@ -0,0 +1,42 @@
+AUTOMAKE_OPTIONS = 1.4 foreign
+MAINTAINERCLEANFILES = Makefile.in
+
+CLEANFILES =
+
+EOLIAN_FLAGS = @DEPS_EOLIAN_FLAGS@ \
+ -I$(top_srcdir)/src/lib
+
+include $(top_srcdir)/Makefile_Eolian_Helper.am
+
+AM_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-DMODULES_PATH=\"$(pkglibdir)/modules\" \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/imported \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DLOCALE_DIR=\"$(localedir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DICON_DIR=\"$(datadir)/icons\" \
+-DELM_TOP_BUILD_DIR=\"$(top_builddir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@ \
+@EWEBKIT2_CFLAGS@
+
+if HAVE_EWEBKIT2
+pkgdir = $(pkglibdir)/modules/web/webkit2/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+BUILT_SOURCES = elm_web_webkit2.eo.h elm_web_webkit2.eo.c
+
+module_la_SOURCES = elm_web_webkit2.c elm_web_webkit2.eo.h
+module_la_LIBADD = @ELEMENTARY_LIBS@ $(top_builddir)/src/lib/libelementary.la @EWEBKIT2_LIBS@
+module_la_LDFLAGS = -module @EFL_LTMODULE_FLAGS@
+module_la_LIBTOOLFLAGS = --tag=disable-static
+endif
+
+EXTRA_DIST = elm_web_webkit2.eo
+
diff --git a/src/modules/elementary/web/webkit2/elm_web_webkit2.c b/src/modules/elementary/web/webkit2/elm_web_webkit2.c
new file mode 100644
index 0000000000..3c898343fc
--- /dev/null
+++ b/src/modules/elementary/web/webkit2/elm_web_webkit2.c
@@ -0,0 +1,1157 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
+
+#include <Elementary.h>
+
+#include "elm_priv.h"
+#include "elm_widget_web.h"
+#include "elm_web_webkit2.eo.h"
+
+#include <EWebKit2.h>
+
+#define MY_CLASS ELM_WEB_WEBKIT2_CLASS
+
+#define MY_CLASS_NAME "Elm_Web_Webkit2"
+
+#define ELM_WEB_WEBKIT2_DATA_GET(o, sd) \
+ Elm_Web_Webkit2_Data * sd = eo_data_scope_get(o, ELM_WEB_WEBKIT2_CLASS)
+
+#define ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN(o, ptr) \
+ ELM_WEB_WEBKIT2_DATA_GET(o, ptr); \
+ if (EINA_UNLIKELY(!ptr)) \
+ { \
+ CRI("No widget data for object %p (%s)", \
+ o, evas_object_type_get(o)); \
+ return; \
+ }
+
+#define ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
+ ELM_WEB_WEBKIT2_DATA_GET(o, ptr); \
+ if (EINA_UNLIKELY(!ptr)) \
+ { \
+ CRI("No widget data for object %p (%s)", \
+ o, evas_object_type_get(o)); \
+ return val; \
+ }
+
+#define ELM_WEB_WEBKIT2_CHECK(obj) \
+ if (EINA_UNLIKELY(!eo_isa((obj), ELM_WEB_WEBKIT2_CLASS))) \
+ return
+
+typedef struct _Elm_Web_Webkit2_Data Elm_Web_Webkit2_Data;
+struct _Elm_Web_Webkit2_Data
+{
+ struct
+ {
+ Elm_Web_Window_Open window_create;
+ void *window_create_data;
+ Elm_Web_Dialog_Alert alert;
+ void *alert_data;
+ Elm_Web_Dialog_Confirm confirm;
+ void *confirm_data;
+ Elm_Web_Dialog_Prompt prompt;
+ void *prompt_data;
+ Elm_Web_Dialog_File_Selector file_selector;
+ void *file_selector_data;
+ Elm_Web_Console_Message console_message;
+ void *console_message_data;
+ } hook;
+
+ Elm_Win_Keyboard_Mode input_method;
+
+ struct
+ {
+ Elm_Web_Zoom_Mode mode;
+ float current;
+ float min, max;
+ Eina_Bool no_anim;
+ Ecore_Timer *timer;
+ } zoom;
+
+ struct
+ {
+ struct
+ {
+ int x, y;
+ } start, end;
+ Ecore_Animator *animator;
+ } bring_in;
+
+ Eina_Bool tab_propagate : 1;
+ Eina_Bool inwin_mode : 1;
+};
+
+typedef struct _View_Smart_Data View_Smart_Data;
+struct _View_Smart_Data
+{
+ Ewk_View_Smart_Data base;
+ struct
+ {
+ Evas_Event_Mouse_Down event;
+ Evas_Coord x, y;
+ unsigned int move_count;
+ Ecore_Timer *longpress_timer;
+ Ecore_Animator *pan_anim;
+ } mouse;
+};
+
+enum Dialog_Type
+{
+ DIALOG_ALERT,
+ DIALOG_CONFIRM,
+ DIALOG_PROMPT,
+ DIALOG_FILE_SELECTOR
+};
+
+typedef struct _Dialog_Data Dialog_Data;
+struct _Dialog_Data
+{
+ enum Dialog_Type type;
+
+ Evas_Object *dialog;
+ Evas_Object *box;
+ Evas_Object *bt_ok, *bt_cancel;
+ Evas_Object *entry;
+ Evas_Object *file_sel;
+
+ Eina_Bool *response;
+ const char **entry_value;
+ Eina_List **selected_files;
+};
+
+static Ewk_View_Smart_Class _ewk_view_parent_sc =
+ EWK_VIEW_SMART_CLASS_INIT_NULL;
+
+static int _webkit2_log_dom = -1;
+
+#undef CRI
+#undef ERR
+#undef WRN
+#undef INF
+#undef DBG
+#define CRI(...) EINA_LOG_DOM_CRIT(_webkit2_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_webkit2_log_dom, __VA_ARGS__)
+#define WRN(...) EINA_LOG_DOM_WARN(_webkit2_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_webkit2_log_dom, __VA_ARGS__)
+#define DBG(...) EINA_LOG_DOM_DBG(_webkit2_log_dom, __VA_ARGS__)
+
+static void
+_view_smart_add(Evas_Object *obj)
+{
+ View_Smart_Data *sd;
+
+ sd = calloc(1, sizeof(View_Smart_Data));
+ evas_object_smart_data_set(obj, sd);
+
+ _ewk_view_parent_sc.sc.add(obj);
+}
+
+static void
+_view_smart_del(Evas_Object *obj)
+{
+ _ewk_view_parent_sc.sc.del(obj);
+}
+
+static Evas_Object *
+_view_smart_window_create(Ewk_View_Smart_Data *vsd,
+ const Ewk_Window_Features *window_features)
+{
+ Evas_Object *new;
+ Evas_Object *obj = evas_object_smart_parent_get(vsd->self);
+
+ ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN_VAL(obj, sd, NULL);
+
+ if (!sd->hook.window_create) return NULL;
+
+ new = sd->hook.window_create
+ (sd->hook.window_create_data, obj, EINA_TRUE,
+ (const Elm_Web_Window_Features *)window_features);
+ if (new) return elm_web_webkit_view_get(new);
+
+ return NULL;
+}
+
+static void
+_view_smart_window_close(Ewk_View_Smart_Data *sd)
+{
+ Evas_Object *obj = evas_object_smart_parent_get(sd->self);
+
+ ELM_WEB_WEBKIT2_CHECK(obj);
+
+ eo_event_callback_call(obj, ELM_WEB_EVENT_WINDOWS_CLOSE_REQUEST, NULL);
+}
+
+static void
+_popup_item_selected(void *data,
+ Evas_Object *obj,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
+ const Eina_List *itr, *list = elm_list_items_get(obj);
+ Ewk_Popup_Menu *menu = data;
+ int i = 0;
+ void *d;
+
+ EINA_LIST_FOREACH(list, itr, d)
+ {
+ if (d == list_it)
+ break;
+
+ i++;
+ }
+
+ ewk_popup_menu_selected_index_set(menu, i);
+ ewk_popup_menu_close(menu);
+
+ evas_object_del(evas_object_data_get(obj, "_notify"));
+}
+
+static Eina_Bool
+_popup_dismiss_cb(void *data, const Eo_Event *event)
+{
+ ewk_popup_menu_close(data);
+ evas_object_del(event->obj);
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_view_smart_popup_menu_show(Ewk_View_Smart_Data *sd,
+ Eina_Rectangle r,
+ Ewk_Text_Direction dir EINA_UNUSED,
+ double scale EINA_UNUSED,
+ Ewk_Popup_Menu *menu)
+{
+ Evas_Object *notify, *list, *grid, *win;
+ const Eina_List* items = ewk_popup_menu_items_get(menu);
+ Evas_Object *obj = evas_object_smart_parent_get(sd->self);
+ int h, ww, wh;
+
+ Elm_Object_Item *lit;
+ Eina_Bool disabled;
+ const char *txt;
+ Ewk_Popup_Menu_Item *it;
+ const Eina_List *itr;
+
+ Evas_Object *popup = evas_object_data_get(sd->self, "_select_popup");
+ if (popup) evas_object_del(popup);
+
+ win = elm_widget_top_get(obj);
+
+ notify = elm_notify_add(win);
+ elm_notify_allow_events_set(notify, EINA_FALSE);
+ elm_notify_align_set(notify, 0.5, 1.0);
+
+ list = elm_list_add(notify);
+ evas_object_data_set(list, "_notify", notify);
+ elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE);
+ elm_list_mode_set(list, ELM_LIST_EXPAND);
+ evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(list);
+
+ EINA_LIST_FOREACH(items, itr, it)
+ {
+ switch (ewk_popup_menu_item_type_get(it))
+ {
+ case EWK_POPUP_MENU_SEPARATOR:
+ // TODO:
+ break;
+ case EWK_POPUP_MENU_ITEM:
+ txt = ewk_popup_menu_item_text_get(it);
+ if (ewk_popup_menu_item_is_label_get(it))
+ {
+ lit = elm_list_item_append(list, txt, NULL, NULL, NULL, NULL);
+ disabled = EINA_TRUE;
+ }
+ else
+ {
+ lit = elm_list_item_append(list, txt, NULL, NULL, _popup_item_selected, menu);
+ disabled = !ewk_popup_menu_item_enabled_get(it);
+ }
+
+ elm_object_item_disabled_set(lit, disabled);
+ break;
+ default:
+ break;
+ }
+ }
+ elm_list_go(list);
+
+ grid = elm_grid_add(win);
+ elm_grid_size_set(grid, 1, 1);
+ elm_grid_pack(grid, list, 0, 0, 1, 1);
+ evas_object_geometry_get(win, NULL, NULL, &ww, &wh);
+
+ //FIXME: it should be the real height of items in the list.
+ h = r.h * eina_list_count(items);
+ evas_object_size_hint_min_set(grid, ww, h < wh / 2 ? h : wh / 2);
+ elm_object_content_set(notify, grid);
+ evas_object_show(grid);
+
+ evas_object_show(notify);
+
+ evas_object_data_set(sd->self, "_select_popup", notify);
+
+ eo_event_callback_add
+ (notify, ELM_NOTIFY_EVENT_BLOCK_CLICKED, _popup_dismiss_cb, menu);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_view_smart_popup_menu_hide(Ewk_View_Smart_Data *sd)
+{
+ Evas_Object *popup = evas_object_data_get(sd->self, "_select_popup");
+ if (!popup) return EINA_FALSE;
+
+ evas_object_del(popup);
+ evas_object_data_del(sd->self, "_select_popup");
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_fullscreen_accept(void *data, const Eo_Event *event EINA_UNUSED)
+{
+ Evas_Object *ewk = data;
+ evas_object_del(evas_object_data_get(ewk, "_fullscreen_permission_popup"));
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_fullscreen_deny(void *data, const Eo_Event *event EINA_UNUSED)
+{
+ Evas_Object *ewk = data;
+ ewk_view_fullscreen_exit(ewk);
+ evas_object_del(evas_object_data_get(ewk, "_fullscreen_permission_popup"));
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_view_smart_fullscreen_enter(Ewk_View_Smart_Data *sd, Ewk_Security_Origin *origin)
+{
+ Evas_Object *btn, *popup, *top;
+ const char *host;
+ char buffer[2048];
+
+ Evas_Object *obj = evas_object_smart_parent_get(sd->self);
+
+ ELM_WEB_WEBKIT2_CHECK(obj) EINA_FALSE;
+
+ top = elm_widget_top_get(obj);
+ elm_win_fullscreen_set(top, EINA_TRUE);
+
+ popup = elm_popup_add(top);
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ host = ewk_security_origin_host_get(origin);
+ snprintf(buffer, sizeof(buffer), "%s is now fullscreen.<br>Press ESC at any time to exit fullscreen,<br>Allow fullscreen?<br>", host);
+ elm_object_text_set(popup, buffer);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Accept");
+ elm_object_part_content_set(popup, "button1", btn);
+ eo_event_callback_add
+ (btn, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _fullscreen_accept, sd->self);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, "Deny");
+ elm_object_part_content_set(popup, "button2", btn);
+ eo_event_callback_add
+ (btn, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _fullscreen_deny, sd->self);
+
+ evas_object_data_set(sd->self, "_fullscreen_permission_popup", popup);
+ evas_object_show(popup);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_view_smart_fullscreen_exit(Ewk_View_Smart_Data *sd)
+{
+ Evas_Object *obj = evas_object_smart_parent_get(sd->self);
+
+ ELM_WEB_WEBKIT2_CHECK(obj) EINA_FALSE;
+
+ Evas_Object *top = elm_widget_top_get(obj);
+ elm_win_fullscreen_set(top, EINA_FALSE);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool
+_bt_close(void *data, const Eo_Event *event)
+{
+ Dialog_Data *d = data;
+
+ if (d->type == DIALOG_ALERT) goto end;
+
+ *d->response = (event->obj == d->bt_ok);
+ if (d->type == DIALOG_CONFIRM) goto end;
+
+ if (d->type == DIALOG_PROMPT)
+ *d->entry_value = strdup(elm_entry_entry_get(d->entry));
+
+end:
+ evas_object_del(d->dialog);
+ free(d);
+
+ return EINA_TRUE;
+}
+
+static Dialog_Data *
+_dialog_new(Evas_Object *web, Eina_Bool inwin_mode)
+{
+ Dialog_Data *d;
+
+ d = calloc(1, sizeof(Dialog_Data));
+ if (!d) return NULL;
+
+ if (!web || inwin_mode)
+ {
+ Evas_Object *bg;
+
+ d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC);
+ eo_event_callback_add
+ (d->dialog, ELM_WIN_EVENT_DELETE_REQUEST, _bt_close, d);
+
+ bg = elm_bg_add(d->dialog);
+ evas_object_size_hint_weight_set
+ (bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(d->dialog, bg);
+ evas_object_show(bg);
+
+ d->box = elm_box_add(d->dialog);
+ evas_object_size_hint_weight_set
+ (d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(d->dialog, d->box);
+ evas_object_show(d->box);
+ }
+ else
+ {
+ Evas_Object *win = elm_widget_top_get(web);
+
+ d->dialog = elm_win_inwin_add(win);
+ elm_object_style_set(d->dialog, "minimal");
+ evas_object_size_hint_weight_set
+ (d->dialog, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ d->box = elm_box_add(win);
+ evas_object_size_hint_weight_set
+ (d->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_inwin_content_set(d->dialog, d->box);
+ evas_object_show(d->box);
+ }
+
+ return d;
+}
+
+static void
+_dialog_ok_cancel_buttons_add(Dialog_Data *dialog_data)
+{
+ Evas_Object *bx, *bt;
+ bx = elm_box_add(dialog_data->box);
+ elm_box_horizontal_set(bx, EINA_TRUE);
+ elm_box_pack_end(dialog_data->box, bx);
+ evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bx);
+
+ dialog_data->bt_cancel = bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Cancel");
+ elm_box_pack_end(bx, bt);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ eo_event_callback_add
+ (bt, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _bt_close, dialog_data);
+ evas_object_show(bt);
+
+ dialog_data->bt_ok = bt = elm_button_add(bx);
+ elm_object_text_set(bt, "Ok");
+ elm_box_pack_end(bx, bt);
+ evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ eo_event_callback_add
+ (bt, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _bt_close, dialog_data);
+ evas_object_show(bt);
+}
+
+static void
+_dialog_del_cb(void *data EINA_UNUSED,
+ Evas *e EINA_UNUSED,
+ Evas_Object *obj EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ ecore_main_loop_quit();
+}
+
+static void
+_exec_dialog(Evas_Object *dialog)
+{
+ evas_object_event_callback_add
+ (dialog, EVAS_CALLBACK_DEL, _dialog_del_cb, NULL);
+ ecore_main_loop_begin();
+}
+
+static void
+_view_smart_run_javascript_alert(Ewk_View_Smart_Data *vsd, const char *message)
+{
+ Evas_Object *obj = evas_object_smart_parent_get(vsd->self);
+ Evas_Object *dialog = NULL;
+
+ ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN(obj, sd);
+
+ if (sd->hook.alert)
+ dialog = sd->hook.alert(sd->hook.alert_data, obj, message);
+ else
+ {
+ Evas_Object *lb;
+ Dialog_Data *dialog_data = _dialog_new(obj, sd->inwin_mode);
+ dialog_data->type = DIALOG_ALERT;
+ dialog = dialog_data->dialog;
+
+ lb = elm_label_add(dialog_data->box);
+ elm_object_text_set(lb, message);
+ elm_box_pack_end(dialog_data->box, lb);
+ evas_object_show(lb);
+
+ dialog_data->bt_ok = elm_button_add(dialog_data->box);
+ elm_object_text_set(dialog_data->bt_ok, "Close");
+ elm_box_pack_end(dialog_data->box, dialog_data->bt_ok);
+ evas_object_size_hint_align_set
+ (dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ eo_event_callback_add
+ (dialog_data->bt_ok, EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _bt_close, dialog_data);
+ evas_object_show(dialog_data->bt_ok);
+
+ evas_object_show(dialog);
+ }
+
+ if (dialog) _exec_dialog(dialog);
+}
+
+static Eina_Bool
+_view_smart_run_javascript_confirm(Ewk_View_Smart_Data *vsd, const char *message)
+{
+ Evas_Object *obj = evas_object_smart_parent_get(vsd->self);
+ Eina_Bool response = EINA_FALSE;
+ Evas_Object *dialog = NULL;
+
+ ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE);
+
+ if (sd->hook.confirm)
+ dialog = sd->hook.confirm(sd->hook.confirm_data, obj, message, &response);
+ else
+ {
+ Evas_Object *lb;
+ Dialog_Data *dialog_data = _dialog_new(obj, sd->inwin_mode);
+ dialog_data->type = DIALOG_CONFIRM;
+ dialog_data->response = &response;
+ dialog = dialog_data->dialog;
+
+ lb = elm_label_add(dialog_data->box);
+ elm_object_text_set(lb, message);
+ elm_box_pack_end(dialog_data->box, lb);
+ evas_object_show(lb);
+
+ _dialog_ok_cancel_buttons_add(dialog_data);
+
+ evas_object_show(dialog);
+ }
+
+ if (dialog) _exec_dialog(dialog);
+
+ return response;
+}
+
+static const char *
+_view_smart_run_javascript_prompt(Ewk_View_Smart_Data *vsd, const char *message, const char *default_value)
+{
+ Evas_Object *obj = evas_object_smart_parent_get(vsd->self);
+ Eina_Bool response = EINA_FALSE;
+ Evas_Object *dialog = NULL;
+ char *value = NULL;
+ const char *ret;
+
+ ELM_WEB_WEBKIT2_DATA_GET_OR_RETURN_VAL(obj, sd, EINA_FALSE);
+
+ if (sd->hook.prompt)
+ dialog = sd->hook.prompt(sd->hook.prompt_data, obj, message, default_value, (const char**)&value, &response);
+ else
+ {
+ Evas_Object *lb, *entry;
+ Dialog_Data *dialog_data = _dialog_new(obj, sd->inwin_mode);
+ dialog_data->type = DIALOG_PROMPT;
+ dialog_data->response = &response;
+ dialog_data->entry_value = (const char**)&value;
+ dialog = dialog_data->dialog;
+
+ lb = elm_label_add(dialog_data->box);
+ elm_object_text_set(lb, message);
+ elm_box_pack_end(dialog_data->box, lb);
+ evas_object_show(lb);
+
+ dialog_data->entry = entry = elm_entry_add(dialog_data->box);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_entry_set(entry, default_value);
+ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_pack_end(dialog_data->box, entry);
+ evas_object_show(entry);
+
+ _dialog_ok_cancel_buttons_add(dialog_data);
+
+ evas_object_show(dialog);
+ }
+
+ if (dialog) _exec_dialog(dialog);
+
+ if (!value) return NULL;
+
+ ret = eina_stringshare_add(value);
+ free(value);
+ return ret;
+}
+
+/**
+ * Creates a new view object given the parent.
+ *
+ * @param parent object to use as parent.
+ *
+ * @return newly added Evas_Object or @c NULL on errors.
+ */
+Evas_Object *
+_view_add(Evas_Object *parent)
+{
+ Evas *canvas = evas_object_evas_get(parent);
+ static Evas_Smart *smart = NULL;
+ Evas_Object *view;
+
+ if (!smart)
+ {
+ static Ewk_View_Smart_Class api =
+ EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
+
+ ewk_view_smart_class_set(&api);
+ ewk_view_smart_class_set(&_ewk_view_parent_sc);
+
+ // TODO: check every api method and provide overrides with hooks!
+ // TODO: hooks should provide extension points
+ // TODO: extension should have some kind of "default implementation",
+ // TODO: that can be replaced or controlled by hooks.
+ // TODO: ie: run_javascript_alert() should present an elm_win
+ // TODO: by default, but user could override it to show as inwin.
+ api.sc.add = _view_smart_add;
+ api.sc.del = _view_smart_del;
+ api.window_create = _view_smart_window_create;
+ api.window_close = _view_smart_window_close;
+ api.popup_menu_show = _view_smart_popup_menu_show;
+ api.popup_menu_hide = _view_smart_popup_menu_hide;
+ api.fullscreen_enter = _view_smart_fullscreen_enter;
+ api.fullscreen_exit = _view_smart_fullscreen_exit;
+ api.run_javascript_alert = _view_smart_run_javascript_alert;
+ api.run_javascript_confirm = _view_smart_run_javascript_confirm;
+ api.run_javascript_prompt = _view_smart_run_javascript_prompt;
+
+ smart = evas_smart_class_new(&api.sc);
+ if (!smart)
+ {
+ CRI("Could not create smart class");
+ return NULL;
+ }
+ }
+
+ view = ewk_view_smart_add(canvas, smart, ewk_context_default_get(), ewk_page_group_create(0));
+ if (!view)
+ {
+ ERR("Could not create smart object object for view");
+ return NULL;
+ }
+
+ return view;
+}
+
+static Eina_Bool
+_view_smart_url_changed_cb(void *data, const Eo_Event *event)
+{
+ eo_event_callback_call(data, ELM_WEB_EVENT_URI_CHANGED, event->event_info);
+ eo_event_callback_call(data, ELM_WEB_EVENT_URL_CHANGED, event->event_info);
+
+ return EINA_TRUE;
+}
+
+static void
+_view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
+{
+ eo_event_callback_add
+ (view, ELM_WEB_EVENT_URL_CHANGED, _view_smart_url_changed_cb, parent);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_widget_on_focus(Eo *obj, Elm_Web_Webkit2_Data *sd, Elm_Object_Item *item EINA_UNUSED)
+{
+ Evas_Object *top;
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_TRUE);
+ Eina_Bool int_ret = EINA_FALSE;
+
+ int_ret = elm_obj_widget_on_focus(eo_super(obj, MY_CLASS), NULL);
+ if (!int_ret) return EINA_TRUE;
+
+ top = elm_widget_top_get(obj);
+
+ if (elm_object_focus_get(obj))
+ {
+ evas_object_focus_set(wd->resize_obj, EINA_TRUE);
+ if (top) elm_win_keyboard_mode_set(top, sd->input_method);
+ }
+ else
+ {
+ evas_object_focus_set(wd->resize_obj, EINA_FALSE);
+ if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
+ }
+ return EINA_TRUE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_tab_propagate_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd)
+{
+ return sd->tab_propagate;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_tab_propagate_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Eina_Bool propagate)
+{
+ sd->tab_propagate = propagate;
+}
+
+EOLIAN static void
+_elm_web_webkit2_evas_object_smart_add(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ Evas_Object *resize_obj;
+
+ resize_obj = _view_add(obj);
+ elm_widget_resize_object_set(obj, resize_obj, EINA_TRUE);
+
+ evas_obj_smart_add(eo_super(obj, MY_CLASS));
+ elm_widget_sub_object_parent_add(obj);
+
+ //TODO: need a way to change theme
+ ewk_view_theme_set(resize_obj, WEBKIT_DATADIR "/themes/default.edj");
+
+ _view_smart_callback_proxy(resize_obj, obj);
+ elm_widget_can_focus_set(obj, EINA_TRUE);
+}
+
+EOLIAN static void
+_elm_web_webkit2_evas_object_smart_del(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ evas_obj_smart_del(eo_super(obj, MY_CLASS));
+}
+
+EOLIAN static Evas_Object*
+_elm_web_webkit2_elm_web_webkit_view_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+ return wd->resize_obj;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_window_create_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Elm_Web_Window_Open func, void *data)
+{
+ sd->hook.window_create = func;
+ sd->hook.window_create_data = data;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_dialog_alert_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Elm_Web_Dialog_Alert func, void *data)
+{
+ sd->hook.alert = func;
+ sd->hook.alert_data = data;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_dialog_confirm_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Elm_Web_Dialog_Confirm func, void *data)
+{
+ sd->hook.confirm = func;
+ sd->hook.confirm_data = data;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_dialog_prompt_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Elm_Web_Dialog_Prompt func, void *data)
+{
+ sd->hook.prompt = func;
+ sd->hook.prompt_data = data;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_dialog_file_selector_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, Elm_Web_Dialog_File_Selector func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_console_message_hook_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, Elm_Web_Console_Message func EINA_UNUSED, void *data EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_useragent_set(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, const char *user_agent)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ ewk_view_user_agent_set(wd->resize_obj, user_agent);
+}
+
+EOLIAN static const char*
+_elm_web_webkit2_elm_web_useragent_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+
+ return ewk_view_user_agent_get(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_url_set(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, const char *url)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+ return ewk_view_url_set(wd->resize_obj, url);
+}
+
+EOLIAN static const char*
+_elm_web_webkit2_elm_web_url_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+ return ewk_view_url_get(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_html_string_load(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, const char *html, const char *base_url, const char *unreachable_url)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_html_string_load(wd->resize_obj,
+ html, base_url, unreachable_url);
+}
+
+EOLIAN static const char*
+_elm_web_webkit2_elm_web_title_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+ return ewk_view_title_get(wd->resize_obj);
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_bg_color_set(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int r, int g, int b, int a)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ ewk_view_bg_color_set(wd->resize_obj, r, g, b, a);
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_bg_color_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int *r, int *g, int *b, int *a)
+{
+ if (r) *r = 0;
+ if (g) *g = 0;
+ if (b) *b = 0;
+ if (a) *a = 0;
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ ewk_view_bg_color_get(wd->resize_obj, r, g, b, a);
+}
+
+EOLIAN static const char*
+_elm_web_webkit2_elm_web_selection_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_popup_selected_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int idx EINA_UNUSED)
+{
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_popup_destroy(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_text_search(const Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, const char *string EINA_UNUSED, Eina_Bool case_sensitive EINA_UNUSED, Eina_Bool forward EINA_UNUSED, Eina_Bool wrap EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static unsigned int
+_elm_web_webkit2_elm_web_text_matches_mark(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, const char *string EINA_UNUSED, Eina_Bool case_sensitive EINA_UNUSED, Eina_Bool highlight EINA_UNUSED, unsigned int limit EINA_UNUSED)
+{
+ return 0;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_text_matches_unmark_all(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_text_matches_highlight_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, Eina_Bool highlight EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_text_matches_highlight_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static double
+_elm_web_webkit2_elm_web_load_progress_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, -1.0);
+
+ return ewk_view_load_progress_get(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_stop(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_stop(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_reload(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_reload(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_reload_full(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_reload_bypass_cache(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_back(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_back(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_forward(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_forward(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_navigate(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int steps)
+{
+ Ewk_Back_Forward_List *history;
+ Ewk_Back_Forward_List_Item *item = NULL;
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ history = ewk_view_back_forward_list_get(wd->resize_obj);
+ if (history)
+ {
+ item = ewk_back_forward_list_item_at_index_get(history, steps);
+ if (item) return ewk_view_navigate_to(wd->resize_obj, item);
+ }
+
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_back_possible_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_back_possible(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_forward_possible_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ return ewk_view_forward_possible(wd->resize_obj);
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_navigate_possible_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int steps)
+{
+ Ewk_Back_Forward_List *history;
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
+
+ history = ewk_view_back_forward_list_get(wd->resize_obj);
+ if (history && ewk_back_forward_list_item_at_index_get(history, steps))
+ return EINA_TRUE;
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_history_enabled_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_history_enabled_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, Eina_Bool enable EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_zoom_set(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, double zoom)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ ewk_view_page_zoom_set(wd->resize_obj, zoom);
+}
+
+EOLIAN static double
+_elm_web_webkit2_elm_web_zoom_get(Eo *obj, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, -1);
+
+ return ewk_view_page_zoom_get(wd->resize_obj);
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_zoom_mode_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, Elm_Web_Zoom_Mode mode EINA_UNUSED)
+{
+}
+
+EOLIAN static Elm_Web_Zoom_Mode
+_elm_web_webkit2_elm_web_zoom_mode_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED)
+{
+ return ELM_WEB_ZOOM_MODE_LAST;
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_region_show(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_region_bring_in(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *_pd EINA_UNUSED, int x EINA_UNUSED, int y EINA_UNUSED, int w EINA_UNUSED, int h EINA_UNUSED)
+{
+}
+
+EOLIAN static void
+_elm_web_webkit2_elm_web_inwin_mode_set(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd, Eina_Bool value)
+{
+ sd->inwin_mode = value;
+}
+
+EOLIAN static Eina_Bool
+_elm_web_webkit2_elm_web_inwin_mode_get(Eo *obj EINA_UNUSED, Elm_Web_Webkit2_Data *sd)
+{
+ return sd->inwin_mode;
+}
+
+EAPI void
+ewm_web_window_features_ref(Elm_Web_Window_Features *wf)
+{
+ ewk_object_ref((Ewk_Object *)wf);
+}
+
+EAPI void
+ewm_web_window_features_unref(Elm_Web_Window_Features *wf)
+{
+ ewk_object_unref((Ewk_Object *)wf);
+}
+
+EAPI Eina_Bool
+ewm_web_window_features_property_get(const Elm_Web_Window_Features *wf,
+ Elm_Web_Window_Feature_Flag flag)
+{
+ const Ewk_Window_Features *ewf = (const Ewk_Window_Features *)wf;
+ switch (flag)
+ {
+ case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
+ return ewk_window_features_toolbar_visible_get(ewf);
+
+ case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
+ return ewk_window_features_statusbar_visible_get(ewf);
+
+ case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
+ return ewk_window_features_scrollbars_visible_get(ewf);
+
+ case ELM_WEB_WINDOW_FEATURE_MENUBAR:
+ return ewk_window_features_menubar_visible_get(ewf);
+
+ case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
+ return ewk_window_features_locationbar_visible_get(ewf);
+
+ case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
+ return ewk_window_features_fullscreen_get(ewf);
+ }
+
+ return EINA_FALSE;
+}
+
+EAPI void
+ewm_web_window_features_region_get(const Elm_Web_Window_Features *wf,
+ Evas_Coord *x,
+ Evas_Coord *y,
+ Evas_Coord *w,
+ Evas_Coord *h)
+{
+ ewk_window_features_geometry_get
+ ((const Ewk_Window_Features *)wf, x, y, w, h);
+}
+
+static Eina_Bool _elm_need_web = EINA_FALSE;
+
+EAPI void
+ewm_unneed_web(void)
+{
+ if (!_elm_need_web) return;
+ _elm_need_web = EINA_FALSE;
+ ewk_shutdown();
+}
+
+EAPI Eina_Bool
+ewm_need_web(void)
+{
+ if (_elm_need_web) return EINA_TRUE;
+ _elm_need_web = EINA_TRUE;
+ ewk_init();
+
+ if (_webkit2_log_dom == -1)
+ _webkit2_log_dom = eina_log_domain_register("elm_webkit2", EINA_COLOR_LIGHTBLUE);
+ return EINA_TRUE;
+}
+
+EAPI const Eo_Class *
+ewm_class_get(void)
+{
+ return elm_web_webkit2_class_get();
+}
+
+#undef ELM_WEB_CLASS
+#define ELM_WEB_CLASS elm_web_class_get()
+
+#include "elm_web_webkit2.eo.c"
diff --git a/src/modules/elementary/web/webkit2/elm_web_webkit2.eo b/src/modules/elementary/web/webkit2/elm_web_webkit2.eo
new file mode 100644
index 0000000000..a0dad4a83a
--- /dev/null
+++ b/src/modules/elementary/web/webkit2/elm_web_webkit2.eo
@@ -0,0 +1,53 @@
+class Elm.Web.Webkit2 (Elm.Web)
+{
+ implements {
+ Evas.Object_Smart.add;
+ Evas.Object_Smart.del;
+ Elm.Widget.on_focus;
+ Elm.Web.tab_propagate.get;
+ Elm.Web.tab_propagate.set;
+ Elm.Web.webkit_view.get;
+ Elm.Web.window_create_hook.set;
+ Elm.Web.dialog_alert_hook.set;
+ Elm.Web.dialog_confirm_hook.set;
+ Elm.Web.dialog_prompt_hook.set;
+ Elm.Web.dialog_file_selector_hook.set;
+ Elm.Web.console_message_hook.set;
+ Elm.Web.useragent.set;
+ Elm.Web.useragent.get;
+ Elm.Web.url.set;
+ Elm.Web.url.get;
+ Elm.Web.html_string_load;
+ Elm.Web.title.get;
+ Elm.Web.bg_color.set;
+ Elm.Web.bg_color.get;
+ Elm.Web.selection.get;
+ Elm.Web.popup_selected.set;
+ Elm.Web.popup_destroy;
+ Elm.Web.text_search;
+ Elm.Web.text_matches_mark;
+ Elm.Web.text_matches_unmark_all;
+ Elm.Web.text_matches_highlight.set;
+ Elm.Web.text_matches_highlight.get;
+ Elm.Web.load_progress.get;
+ Elm.Web.stop;
+ Elm.Web.reload;
+ Elm.Web.reload_full;
+ Elm.Web.back;
+ Elm.Web.forward;
+ Elm.Web.navigate;
+ Elm.Web.back_possible.get;
+ Elm.Web.forward_possible.get;
+ Elm.Web.navigate_possible_get;
+ Elm.Web.history_enabled.get;
+ Elm.Web.history_enabled.set;
+ Elm.Web.zoom.set;
+ Elm.Web.zoom.get;
+ Elm.Web.zoom_mode.set;
+ Elm.Web.zoom_mode.get;
+ Elm.Web.region_show;
+ Elm.Web.region_bring_in;
+ Elm.Web.inwin_mode.set;
+ Elm.Web.inwin_mode.get;
+ }
+}