summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--packaging/ico-uxf-weston-plugin.changes30
-rw-r--r--packaging/ico-uxf-weston-plugin.spec5
-rw-r--r--protocol/ico_ivi_shell.xml10
-rw-r--r--protocol/ico_window_mgr.xml6
-rw-r--r--src/config-parser.c389
-rw-r--r--src/config-parser.h73
-rw-r--r--src/ico_ivi_common.c4
-rw-r--r--src/ico_ivi_shell.c134
-rw-r--r--src/ico_ivi_shell.h1
-rw-r--r--src/ico_window_mgr.c103
-rw-r--r--weston.ini23
12 files changed, 546 insertions, 234 deletions
diff --git a/configure.ac b/configure.ac
index 6111c5b..f4c05be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
AC_PREREQ([2.68])
AC_INIT([ico-uxf-weston-plugin],
- [0.4.91],
+ [0.5.02],
[https://BUG-REPORT-ADDRESS])
AC_CONFIG_HEADERS([config.h])
diff --git a/packaging/ico-uxf-weston-plugin.changes b/packaging/ico-uxf-weston-plugin.changes
index 8818c05..3afb44b 100644
--- a/packaging/ico-uxf-weston-plugin.changes
+++ b/packaging/ico-uxf-weston-plugin.changes
@@ -1,15 +1,21 @@
-* Mon May 13 2013 Shibata Makoto <shibata@mac.tec.toyota.co.jp> submit/2.0alpha-wayland/20130426.191944@273da16
-- Bug Fix.
-- I547bb4cd:Removed generated Makefile.
-- I7206280c:Port ico-uxf-weston-plugin to use Weston 1.0.6 plugin API.
-- I9154214b:Corrected packaging of lib*.so file. It belongs in the -devel package.
-- I281e9214:Do not hardcode package header install path. Use pkginclude_HEADERS instead.
-- I982a05ec:Removed checks for unused programs(C++ conpiler and sed).
-- I3292b6c1:Removed log files, and add .gitignore file to prevent re-commit.
-- I770d797c:Removed generated source dependency files.
-- I33ca73c9:No longer need to set dist-check configure flags.
-- I27ba7db2:Added Weston config-parser.c again until Weston SDK exports config functions.
-
+* Wed May 15 2013 Shibata Makoto <shibata@mac.tec.toyota.co.jp>
+- 0.5.02 release
+- Fix for TIVI-803 - Enable new UI in wayland build
+- Fix for TIVI-826 - weston-plugin should NOT create /root/
+- Fix for TIVI-827 - Create symbolic link for /etc/rc.d/init.d/ico_weston to /etc/rc.d/rc3.d/.
+- Fix for TIVI-829 - [WLD] Text input box fails to switch to Edit mode(via touch screen)
+* Tue May 14 2013 Ossama Othman <ossama.othman@intel.com>
+- Port to new Weston config parser. Install Weston config in /etc/xdg/weston.
+* Mon May 06 2013 Ossama Othman <ossama.othman@intel.com>
+- Removed generated source dependency files.
+- Removed checks for unused programs (C++ compiler and sed).
+- Removed log files, and add .gitignore file to prevent re-commit.
+- Do not hardcode package header install path. Use pkginclude_HEADERS instead.
+- Corrected packaging of lib*.so file. It belongs in the -devel package.
+- No longer need to set dist-check configure flags.
+- Port ico-uxf-weston-plugin to use Weston 1.0.6 plugin API.
+- Removed generated Makefile.
+- Added Weston config-parser.c again until Weston SDK exports config functions.
* Fri Apr 26 2013 Shibata Makoto <shibata@mac.tec.toyota.co.jp> 3224fe9
- Import initial.
diff --git a/packaging/ico-uxf-weston-plugin.spec b/packaging/ico-uxf-weston-plugin.spec
index 4e37e7f..12850b5 100644
--- a/packaging/ico-uxf-weston-plugin.spec
+++ b/packaging/ico-uxf-weston-plugin.spec
@@ -15,6 +15,7 @@ BuildRequires: pkgconfig(elementary)
BuildRequires: pkgconfig(ecore-wayland)
BuildRequires: aul-devel
BuildRequires: ecore-devel
+BuildRequires: weston-devel
Requires: weston >= 1.0.6
%description
@@ -45,8 +46,8 @@ rm -rf %{buildroot}
# configurations
%define weston_conf %{_sysconfdir}/xdg/weston
-mkdir -p %{buildroot}%{weston_conf}
-install -m 0644 weston.ini.ico %{buildroot}%{weston_conf}/weston.ini
+mkdir -p %{buildroot}%{weston_conf} > /dev/null 2>&1
+install -m 0644 weston.ini %{buildroot}%{weston_conf}
install -m 0644 weston_ivi_plugin.ini %{buildroot}%{weston_conf}
%files
diff --git a/protocol/ico_ivi_shell.xml b/protocol/ico_ivi_shell.xml
index 5acafa2..7efa339 100644
--- a/protocol/ico_ivi_shell.xml
+++ b/protocol/ico_ivi_shell.xml
@@ -7,6 +7,16 @@
background, panels and locking surfaces.
</description>
+ <enum name="active">
+ <description summary="active window kind">
+ Select active target(pointer/keyboard).
+ </description>
+ <entry name="none" value="0" summary="no_active_window"/>
+ <entry name="pointer" value="1" summary="wl_pointer"/>
+ <entry name="keyboard" value="2" summary="wl_keyboard"/>
+ <entry name="selected" value="4" summary="selected_window_by_operation"/>
+ </enum>
+
<!-- We'll fold most of wl_shell into this interface and then
they'll share the configure event. -->
<event name="configure">
diff --git a/protocol/ico_window_mgr.xml b/protocol/ico_window_mgr.xml
index ea413ab..fc565b6 100644
--- a/protocol/ico_window_mgr.xml
+++ b/protocol/ico_window_mgr.xml
@@ -40,6 +40,7 @@
<request name="set_active">
<arg name="surfaceid" type="uint"/>
+ <arg name="target" type="uint"/>
</request>
<request name="set_layer_visible">
@@ -80,11 +81,6 @@
<arg name="active" type="uint"/>
</event>
- <enum name="active">
- <entry name="inactive" value="0"/>
- <entry name="active" value="1"/>
- <entry name="select" value="2"/>
- </enum>
</interface>
</protocol>
diff --git a/src/config-parser.c b/src/config-parser.c
index 261c425..d291ac6 100644
--- a/src/config-parser.c
+++ b/src/config-parser.c
@@ -32,192 +32,235 @@
#include <fcntl.h>
#include <unistd.h>
+#if 1 /* Build in old Weston(1.0.6) */
+#include "config-parser.h"
+#else /* Build on new Weston */
#include <weston/config-parser.h>
+#endif
static int
handle_key(const struct config_key *key, const char *value)
{
- char *end, *s;
- int i, len;
- unsigned int ui;
-
- switch (key->type) {
- case CONFIG_KEY_INTEGER:
- i = strtol(value, &end, 0);
- if (*end != '\n') {
- fprintf(stderr, "invalid integer: %s\n", value);
- return -1;
- }
- *(int *)key->data = i;
- return 0;
-
- case CONFIG_KEY_UNSIGNED_INTEGER:
- ui = strtoul(value, &end, 0);
- if (*end != '\n') {
- fprintf(stderr, "invalid integer: %s\n", value);
- return -1;
- }
- *(unsigned int *)key->data = ui;
- return 0;
-
- case CONFIG_KEY_STRING:
- len = strlen(value);
- while (len > 0 && isspace(value[len - 1]))
- len--;
- s = malloc(len + 1);
- if (s == NULL)
- return -1;
- memcpy(s, value, len);
- s[len] = '\0';
- *(char **)key->data = s;
- return 0;
-
- case CONFIG_KEY_BOOLEAN:
- if (strcmp(value, "false\n") == 0)
- *(int *)key->data = 0;
- else if (strcmp(value, "true\n") == 0)
- *(int *)key->data = 1;
- else {
- fprintf(stderr, "invalid bool: %s\n", value);
- return -1;
- }
- return 0;
-
- default:
- assert(0);
- break;
- }
-
- return -1;
+ char *end, *s;
+ int i, len;
+ unsigned int ui;
+
+ switch (key->type) {
+ case CONFIG_KEY_INTEGER:
+ i = strtol(value, &end, 0);
+ if (*end != '\n') {
+ fprintf(stderr, "invalid integer: %s\n", value);
+ return -1;
+ }
+ *(int *)key->data = i;
+ return 0;
+
+ case CONFIG_KEY_UNSIGNED_INTEGER:
+ ui = strtoul(value, &end, 0);
+ if (*end != '\n') {
+ fprintf(stderr, "invalid integer: %s\n", value);
+ return -1;
+ }
+ *(unsigned int *)key->data = ui;
+ return 0;
+
+ case CONFIG_KEY_STRING:
+ len = strlen(value);
+ while (len > 0 && isspace(value[len - 1]))
+ len--;
+ s = malloc(len + 1);
+ if (s == NULL)
+ return -1;
+ memcpy(s, value, len);
+ s[len] = '\0';
+ *(char **)key->data = s;
+ return 0;
+
+ case CONFIG_KEY_BOOLEAN:
+ if (strcmp(value, "false\n") == 0)
+ *(int *)key->data = 0;
+ else if (strcmp(value, "true\n") == 0)
+ *(int *)key->data = 1;
+ else {
+ fprintf(stderr, "invalid bool: %s\n", value);
+ return -1;
+ }
+ return 0;
+
+ default:
+ assert(0);
+ break;
+ }
+
+ return -1;
}
int
parse_config_file(int fd,
- const struct config_section *sections, int num_sections,
- void *data)
+ const struct config_section *sections, int num_sections,
+ void *data)
{
- FILE *fp;
- char line[512], *p;
- const struct config_section *current = NULL;
- int i;
-
- if (fd == -1)
- return -1;
-
- fp = fdopen(dup(fd), "r");
- if (fp == NULL) {
- perror("couldn't open config file");
- return -1;
- }
-
- rewind(fp);
-
- while (fgets(line, sizeof line, fp)) {
- if (line[0] == '#' || line[0] == '\n') {
- continue;
- } if (line[0] == '[') {
- p = strchr(&line[1], ']');
- if (!p || p[1] != '\n') {
- fprintf(stderr, "malformed "
- "section header: %s\n", line);
- fclose(fp);
- return -1;
- }
- if (current && current->done)
- current->done(data);
- p[0] = '\0';
- for (i = 0; i < num_sections; i++) {
- if (strcmp(sections[i].name, &line[1]) == 0) {
- current = &sections[i];
- break;
- }
- }
- if (i == num_sections)
- current = NULL;
- } else if (p = strchr(line, '='), p != NULL) {
- if (current == NULL)
- continue;
- p[0] = '\0';
- for (i = 0; i < current->num_keys; i++) {
- if (strcmp(current->keys[i].name, line) == 0) {
- if (handle_key(&current->keys[i], &p[1]) < 0) {
- fclose(fp);
- return -1;
- }
- break;
- }
- }
- } else {
- fprintf(stderr, "malformed config line: %s\n", line);
- fclose(fp);
- return -1;
- }
- }
-
- if (current && current->done)
- current->done(data);
-
- fclose(fp);
-
- return 0;
+ FILE *fp;
+ char line[512], *p;
+ const struct config_section *current = NULL;
+ int i;
+
+ if (fd == -1)
+ return -1;
+ fp = fdopen(dup(fd), "r");
+ if (fp == NULL) {
+ perror("couldn't open config flle");
+ return -1;
+ }
+
+ rewind(fp);
+
+ while (fgets(line, sizeof line, fp)) {
+ if (line[0] == '#' || line[0] == '\n') {
+ continue;
+ } if (line[0] == '[') {
+ p = strchr(&line[1], ']');
+ if (!p || p[1] != '\n') {
+ fprintf(stderr, "malformed "
+ "section header: %s\n", line);
+ fclose(fp);
+ return -1;
+ }
+ if (current && current->done)
+ current->done(data);
+ p[0] = '\0';
+ for (i = 0; i < num_sections; i++) {
+ if (strcmp(sections[i].name, &line[1]) == 0) {
+ current = &sections[i];
+ break;
+ }
+ }
+ if (i == num_sections)
+ current = NULL;
+ } else if (p = strchr(line, '='), p != NULL) {
+ if (current == NULL)
+ continue;
+ p[0] = '\0';
+ for (i = 0; i < current->num_keys; i++) {
+ if (strcmp(current->keys[i].name, line) == 0) {
+ if (handle_key(&current->keys[i], &p[1]) < 0) {
+ fclose(fp);
+ return -1;
+ }
+ break;
+ }
+ }
+ } else {
+ fprintf(stderr, "malformed config line: %s\n", line);
+ fclose(fp);
+ return -1;
+ }
+ }
+
+ if (current && current->done)
+ current->done(data);
+
+ fclose(fp);
+
+ return 0;
}
+#if 0
+char *
+config_file_path(const char *name)
+{
+ const char dotconf[] = "/.config/";
+ const char *config_dir;
+ const char *home_dir;
+ char *path;
+ size_t size;
+
+ config_dir = getenv("XDG_CONFIG_HOME");
+ if (!config_dir) {
+ home_dir = getenv("HOME");
+ if (!home_dir) {
+ fprintf(stderr, "HOME is not set, using cwd.\n");
+ return strdup(name);
+ }
+
+ size = strlen(home_dir) + sizeof dotconf + strlen(name);
+ path = malloc(size);
+ if (!path)
+ return NULL;
+
+ snprintf(path, size, "%s%s%s", home_dir, dotconf, name);
+ return path;
+ }
+
+ size = strlen(config_dir) + 1 + strlen(name) + 1;
+ path = malloc(size);
+ if (!path)
+ return NULL;
+
+ snprintf(path, size, "%s/%s", config_dir, name);
+ return path;
+}
+#endif
+
int
open_config_file(const char *name)
{
- const char *config_dir = getenv("XDG_CONFIG_HOME");
- const char *home_dir = getenv("HOME");
- const char *config_dirs = getenv("XDG_CONFIG_DIRS");
- char path[PATH_MAX];
- const char *p, *next;
- int fd;
-
- /* Precedence is given to config files in the home directory,
- * and then to directories listed in XDG_CONFIG_DIRS and
- * finally to the current working directory. */
-
- /* $XDG_CONFIG_HOME */
- if (config_dir) {
- snprintf(path, sizeof path, "%s/%s", config_dir, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
- if (fd >= 0)
- return fd;
- }
-
- /* $HOME/.config */
- if (home_dir) {
- snprintf(path, sizeof path, "%s/.config/%s", home_dir, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
- if (fd >= 0)
- return fd;
- }
-
- /* For each $XDG_CONFIG_DIRS: weston/<config_file> */
- if (!config_dirs)
- config_dirs = "/etc/xdg"; /* See XDG base dir spec. */
-
- for (p = config_dirs; *p != '\0'; p = next) {
- next = strchrnul(p, ':');
- snprintf(path, sizeof path,
- "%.*s/weston/%s", (int)(next - p), p, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
- if (fd >= 0)
- return fd;
-
- if (*next == ':')
- next++;
- }
-
- /* Current working directory. */
- snprintf(path, sizeof path, "./%s", name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
-
- if (fd >= 0)
- fprintf(stderr,
- "using config in current working directory: %s\n",
- path);
- else
- fprintf(stderr, "config file \"%s\" not found.\n", name);
-
- return fd;
+ const char *config_dir = getenv("XDG_CONFIG_HOME");
+ const char *home_dir = getenv("HOME");
+ const char *config_dirs = getenv("XDG_CONFIG_DIRS");
+ char path[PATH_MAX];
+ const char *p, *next;
+ int fd;
+
+ /* Precedence is given to config files in the home directory,
+ * and then to directories listed in XDG_CONFIG_DIRS and
+ * finally to the current working directory. */
+
+ /* $XDG_CONFIG_HOME */
+ if (config_dir) {
+ snprintf(path, sizeof path, "%s/%s", config_dir, name);
+ fd = open(path, O_RDONLY | O_CLOEXEC);
+ if (fd >= 0)
+ return fd;
+ }
+
+ /* $HOME/.config */
+ if (home_dir) {
+ snprintf(path, sizeof path, "%s/.config/%s", home_dir, name);
+ fd = open(path, O_RDONLY | O_CLOEXEC);
+ if (fd >= 0)
+ return fd;
+ if (fd >= 0)
+ return fd;
+ }
+
+ /* For each $XDG_CONFIG_DIRS: weston/<config_file> */
+ if (!config_dirs)
+ config_dirs = "/etc/xdg"; /* See XDG base dir spec. */
+
+ for (p = config_dirs; *p != '\0'; p = next) {
+ next = strchrnul(p, ':');
+ snprintf(path, sizeof path,
+ "%.*s/weston/%s", (int)(next - p), p, name);
+ fd = open(path, O_RDONLY | O_CLOEXEC);
+ if (fd >= 0)
+ return fd;
+
+ if (*next == ':')
+ next++;
+ }
+
+ /* Current working directory. */
+ snprintf(path, sizeof path, "./%s", name);
+ fd = open(path, O_RDONLY | O_CLOEXEC);
+
+ if (fd >= 0)
+ fprintf(stderr,
+ "using config in current working directory: %s\n",
+ path);
+ else
+ fprintf(stderr, "config file \"%s\" not found.\n", name);
+
+ return fd;
}
+
diff --git a/src/config-parser.h b/src/config-parser.h
new file mode 100644
index 0000000..456b9a7
--- /dev/null
+++ b/src/config-parser.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright © 2008 Kristian Høgsberg
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef CONFIGPARSER_H
+#define CONFIGPARSER_H
+
+enum config_key_type {
+ CONFIG_KEY_INTEGER, /* typeof data = int */
+ CONFIG_KEY_UNSIGNED_INTEGER, /* typeof data = unsigned int */
+ CONFIG_KEY_STRING, /* typeof data = char* */
+ CONFIG_KEY_BOOLEAN /* typeof data = int */
+};
+
+struct config_key {
+ const char *name;
+ enum config_key_type type;
+ void *data;
+};
+
+struct config_section {
+ const char *name;
+ const struct config_key *keys;
+ int num_keys;
+ void (*done)(void *data);
+};
+
+int
+parse_config_file(int fd,
+ const struct config_section *sections, int num_sections,
+ void *data);
+
+int
+open_config_file(const char *name);
+
+enum weston_option_type {
+ WESTON_OPTION_INTEGER,
+ WESTON_OPTION_UNSIGNED_INTEGER,
+ WESTON_OPTION_STRING,
+ WESTON_OPTION_BOOLEAN
+};
+
+struct weston_option {
+ enum weston_option_type type;
+ const char *name;
+ int short_name;
+ void *data;
+};
+
+int
+parse_options(const struct weston_option *options,
+ int count, int argc, char *argv[]);
+
+#endif /* CONFIGPARSER_H */
+
diff --git a/src/ico_ivi_common.c b/src/ico_ivi_common.c
index 5245b04..9f12614 100644
--- a/src/ico_ivi_common.c
+++ b/src/ico_ivi_common.c
@@ -307,7 +307,7 @@ ico_ivi_dispname_2_node(const char *dispname)
WL_EXPORT int
module_init(struct weston_compositor *ec)
{
- int config_fd;
+ int config_fd;
uifw_info("ico_ivi_common: Enter(module_init)");
@@ -315,7 +315,7 @@ module_init(struct weston_compositor *ec)
config_fd = open_config_file(ICO_IVI_PLUGIN_CONFIG);
parse_config_file(config_fd, conf_debug, ARRAY_LENGTH(conf_debug), NULL);
close(config_fd);
-
+
uifw_info("ico_ivi_common: option flag=0x%08x debug=%d",
ico_option_flag(), ico_ivi_debuglevel());
diff --git a/src/ico_ivi_shell.c b/src/ico_ivi_shell.c
index 5e69387..735a53b 100644
--- a/src/ico_ivi_shell.c
+++ b/src/ico_ivi_shell.c
@@ -72,7 +72,10 @@ struct ivi_shell {
struct ivi_layer_list ivi_layer; /* Layer list */
enum animation_type win_animation_type; /* Default animetion */
int win_visible_on_create; /* Visible on create surface */
- struct shell_surface *active_shsurf; /* Active shell surface */
+ struct shell_surface *active_pointer_shsurf;
+ /* Pointer active shell surface */
+ struct shell_surface *active_keyboard_shsurf;
+ /* Keyboard active shell surface*/
};
/* Surface type */
@@ -1017,7 +1020,7 @@ shell_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy)
type_changed = 1;
}
- if (! weston_surface_is_mapped(es)) {
+ if (! weston_surface_is_mapped(es)) {
if ((es->geometry.width > 0) && (es->geometry.height >0)) {
uifw_trace("shell_surface_configure: map Surface size(sx/sy=%d/%d w/h=%d/%d)",
sx, sy, es->buffer->width, es->buffer->height);
@@ -1301,6 +1304,102 @@ ivi_shell_restack_ivi_layer(struct ivi_shell *shell, struct shell_surface *shsur
/*--------------------------------------------------------------------------*/
/**
+ * @brief ivi_shell_set_active: surface active control
+ *
+ * @param[in] shsurf shell surface(if NULL, no active surface)
+ * @param[in] target target device
+ * @return none
+ */
+/*--------------------------------------------------------------------------*/
+WL_EXPORT void
+ivi_shell_set_active(struct shell_surface *shsurf, const int target)
+{
+ struct ivi_shell *shell;
+ struct weston_seat *seat;
+ struct weston_surface *surface;
+ int object = target;
+ wl_fixed_t sx, sy;
+
+ uifw_trace("ivi_shell_set_active: Enter(%08x,%x)", (int)shsurf, target);
+
+ if (shsurf) {
+ shell = shell_surface_get_shell(shsurf);
+ surface = shsurf->surface;
+ if (object == 0) {
+ surface = NULL;
+ if (shell->active_pointer_shsurf == shsurf) {
+ object |= ICO_IVI_SHELL_ACTIVE_POINTER;
+ }
+ if (shell->active_keyboard_shsurf == shsurf) {
+ object |= ICO_IVI_SHELL_ACTIVE_KEYBOARD;
+ }
+ }
+ else {
+ if (object & ICO_IVI_SHELL_ACTIVE_POINTER) {
+ shell->active_pointer_shsurf = shsurf;
+ }
+ if (object & ICO_IVI_SHELL_ACTIVE_KEYBOARD) {
+ shell->active_keyboard_shsurf = shsurf;
+ }
+ }
+ }
+ else {
+ shell = default_shell;
+ surface = NULL;
+ if (target == 0) {
+ object = ICO_IVI_SHELL_ACTIVE_POINTER|ICO_IVI_SHELL_ACTIVE_KEYBOARD;
+ }
+ if (object & ICO_IVI_SHELL_ACTIVE_POINTER) {
+ shell->active_pointer_shsurf = NULL;
+ }
+ if (object & ICO_IVI_SHELL_ACTIVE_KEYBOARD) {
+ shell->active_keyboard_shsurf = NULL;
+ }
+ }
+
+ wl_list_for_each(seat, &shell->compositor->seat_list, link) {
+ if ((object & ICO_IVI_SHELL_ACTIVE_POINTER) && (seat->seat.pointer)) {
+ if (surface) {
+ uifw_trace("ivi_shell_set_active: pointer set surface(%08x=>%08x)",
+ (int)seat->seat.pointer->focus, (int)&surface->surface);
+ if (seat->seat.pointer->focus != &surface->surface) {
+ weston_surface_from_global_fixed(surface,
+ seat->seat.pointer->x,
+ seat->seat.pointer->y,
+ &sx, &sy);
+ wl_pointer_set_focus(seat->seat.pointer, &surface->surface, sx, sy);
+ }
+ }
+ else {
+ uifw_trace("ivi_shell_set_active: pointer reset surface(%08x)",
+ (int)seat->seat.pointer->focus);
+ wl_pointer_set_focus(seat->seat.pointer, NULL,
+ wl_fixed_from_int(0), wl_fixed_from_int(0));
+ }
+ }
+ if ((object & ICO_IVI_SHELL_ACTIVE_KEYBOARD) && (seat->has_keyboard)) {
+ if (surface) {
+ uifw_trace("ivi_shell_set_active: keyboard set surface(%08x=>%08x)",
+ (int)seat->seat.keyboard->focus, (int)&surface->surface);
+ if (seat->seat.keyboard->focus != &surface->surface) {
+ wl_keyboard_set_focus(seat->seat.keyboard, &surface->surface);
+ }
+ }
+ else {
+ uifw_trace("ivi_shell_set_active: keyboard reset surface(%08x)",
+ (int)seat->seat.keyboard);
+ wl_keyboard_set_focus(seat->seat.keyboard, NULL);
+ }
+ }
+ else {
+ uifw_trace("ivi_shell_set_active: seat[%08x] has no keyboard", (int)seat);
+ }
+ }
+ uifw_trace("ivi_shell_set_active: Leave(%08x)", (int)shsurf);
+}
+
+/*--------------------------------------------------------------------------*/
+/**
* @brief click_to_activate_binding: clieck and select surface
*
* @param[in] seat clicked target seat
@@ -1330,9 +1429,8 @@ click_to_activate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
uifw_trace("click_to_activate_binding: Surface[%08x] is not visible",
(int)shsurf);
}
- else if (shell_hook_select) {
- if (shell->active_shsurf != shsurf) {
- shell->active_shsurf = shsurf;
+ else if (shell->active_pointer_shsurf != shsurf) {
+ if (shell_hook_select) {
/* surface select hook routine */
uifw_trace("click_to_activate_binding: call ivi_shell_hook_select[%08x]",
(int)shsurf);
@@ -1340,12 +1438,15 @@ click_to_activate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
uifw_trace("click_to_activate_binding: ret ivi_shell_hook_select")
}
else {
- uifw_trace("click_to_activate_binding: ShellSurface[%08x] already active",
- (int)shsurf);
+ ivi_shell_set_active(shsurf,
+ ICO_IVI_SHELL_ACTIVE_POINTER |
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD);
+ uifw_trace("click_to_activate_binding: no hook[%08x]", (int)shsurf);
}
}
else {
- uifw_trace("click_to_activate_binding: no hook[%08x]", (int)shsurf);
+ uifw_trace("click_to_activate_binding: ShellSurface[%08x] already active",
+ (int)shsurf);
}
}
}
@@ -1353,7 +1454,6 @@ click_to_activate_binding(struct wl_seat *seat, uint32_t time, uint32_t button,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_visible: surface visible control
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] visible visibility(1=visible/0=unvisible)
@@ -1394,7 +1494,6 @@ ivi_shell_set_visible(struct shell_surface *shsurf, const int visible)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_is_visible: get surface visibility
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @return visibility
@@ -1411,7 +1510,6 @@ ivi_shell_is_visible(struct shell_surface *shsurf)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_layer: set(or change) surface layer
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] layer layer id
@@ -1487,7 +1585,6 @@ ivi_shell_set_layer(struct shell_surface *shsurf, const int layer)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_raise: surface stack control
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] raise raise/lower(1=raise/0=lower)
@@ -1521,7 +1618,6 @@ ivi_shell_set_raise(struct shell_surface *shsurf, const int raise)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_toplevel: set surface type toplevel
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @return none
@@ -1537,7 +1633,6 @@ ivi_shell_set_toplevel(struct shell_surface *shsurf)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_surface_type: set surface type
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @return none
@@ -1553,7 +1648,6 @@ ivi_shell_set_surface_type(struct shell_surface *shsurf)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_send_configure: send surface resize event
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] id client object id(unused)
@@ -1578,7 +1672,6 @@ ivi_shell_send_configure(struct shell_surface *shsurf, const int id,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_positionsize: set surface position and size
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] x surface upper-left X position on screen
@@ -1603,7 +1696,6 @@ ivi_shell_set_positionsize(struct shell_surface *shsurf,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_set_layer_visible: layer visible control
- * API for other weston plugin
*
* @param[in] layer layer id
* @param[in] visible visibility(1=visible/0=unvisible)
@@ -1692,7 +1784,6 @@ ivi_shell_set_layer_visible(const int layer, const int visible)
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_surface_configure: surface change
- * API for other weston plugin
*
* @param[in] shsurf shell surface
* @param[in] x surface upper-left X position on screen
@@ -1735,7 +1826,6 @@ ivi_shell_surface_configure(struct shell_surface *shsurf, const int x,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_bind: regist hook function for shell bind
- * API for other weston plugin
*
* @param[in] hook_bind hook function(if NULL, reset hook function)
* @return none
@@ -1751,7 +1841,6 @@ ivi_shell_hook_bind(void (*hook_bind)(struct wl_client *client))
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_unbind: regist hook function for shell unbind
- * API for other weston plugin
*
* @param[in] hook_unbind hook function(if NULL, reset hook function)
* @return none
@@ -1767,7 +1856,6 @@ ivi_shell_hook_unbind(void (*hook_unbind)(struct wl_client *client))
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_create: regist hook function for create shell surface
- * API for other weston plugin
*
* @param[in] hook_create hook function(if NULL, reset hook function)
* @return none
@@ -1785,7 +1873,6 @@ ivi_shell_hook_create(void (*hook_create)(struct wl_client *client,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_destroy: regist hook function for destroy shell surface
- * API for other weston plugin
*
* @param[in] hook_destroy hook function(if NULL, reset hook function)
* @return none
@@ -1801,7 +1888,6 @@ ivi_shell_hook_destroy(void (*hook_destroy)(struct weston_surface *surface))
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_map: regist hook function for map shell surface
- * API for other weston plugin
*
* @param[in] hook_map hook function(if NULL, reset hook function)
* @return none
@@ -1818,7 +1904,6 @@ ivi_shell_hook_map(void (*hook_map)(struct weston_surface *surface,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_change: regist hook function for change shell surface
- * API for other weston plugin
*
* @param[in] hook_change hook function(if NULL, reset hook function)
* @return none
@@ -1835,7 +1920,6 @@ ivi_shell_hook_change(void (*hook_change)(struct weston_surface *surface,
/*--------------------------------------------------------------------------*/
/**
* @brief ivi_shell_hook_select: regist hook function for select(active) shell surface
- * API for other weston plugin
*
* @param[in] hook_select hook function(if NULL, reset hook function)
* @return none
diff --git a/src/ico_ivi_shell.h b/src/ico_ivi_shell.h
index 2a0d9da..eaad346 100644
--- a/src/ico_ivi_shell.h
+++ b/src/ico_ivi_shell.h
@@ -49,6 +49,7 @@ void ivi_shell_set_positionsize(struct shell_surface *shsurf, const int x,
void ivi_shell_set_layer_visible(const int layer, const int visible);
void ivi_shell_surface_configure(struct shell_surface *shsurf, const int x,
const int y, const int width, const int height);
+void ivi_shell_set_active(struct shell_surface *shsurf, const int target);
/* Prototypr for hook routine */
void ivi_shell_hook_bind(void (*hook_bind)(struct wl_client *client));
diff --git a/src/ico_window_mgr.c b/src/ico_window_mgr.c
index 4a2b155..3c2d14e 100644
--- a/src/ico_window_mgr.c
+++ b/src/ico_window_mgr.c
@@ -103,7 +103,8 @@ struct ico_win_mgr {
struct wl_list manager_list; /* Manager(ex.HomeScreen) list */
int num_manager; /* Number of managers */
struct wl_list surface_list; /* Surface list */
- struct uifw_win_surface *active_surface;/* Active Surface */
+ struct uifw_win_surface *active_pointer_surface; /* Active Pointer Surface */
+ struct uifw_win_surface *active_keyboard_surface; /* Active Keyboard Surface */
struct uifw_win_surface *idhash[UIFW_HASH]; /* UIFW SerfaceID */
struct uifw_win_surface *wshash[UIFW_HASH]; /* Weston Surface */
@@ -164,7 +165,7 @@ static void uifw_set_transition(struct wl_client *client, struct wl_resource *re
uint32_t surfaceid, int32_t transition);
/* set active surface (form HomeScreen) */
static void uifw_set_active(struct wl_client *client, struct wl_resource *resource,
- uint32_t surfaceid);
+ uint32_t surfaceid, uint32_t target);
/* layer visibility control */
static void uifw_set_layer_visible(struct wl_client *client, struct wl_resource *resource,
int32_t layer, int32_t visible);
@@ -1101,32 +1102,106 @@ uifw_set_transition(struct wl_client *client, struct wl_resource *resource,
* @param[in] client Weyland client
* @param[in] resource resource of request
* @param[in] surfaceid UIFW surface id
+ * @param[in] target target device
* @return none
*/
/*--------------------------------------------------------------------------*/
static void
-uifw_set_active(struct wl_client *client, struct wl_resource *resource, uint32_t surfaceid)
+uifw_set_active(struct wl_client *client, struct wl_resource *resource,
+ uint32_t surfaceid, uint32_t target)
{
- struct uifw_win_surface* usurf = find_uifw_win_surface_by_id(surfaceid);
+ struct uifw_win_surface* usurf;
- uifw_trace("uifw_set_active: Enter(surf=%08x)", surfaceid);
+ uifw_trace("uifw_set_active: Enter(surf=%08x,target=%x)", surfaceid, target);
+ if ((surfaceid > 0) &&
+ ((target & (ICO_IVI_SHELL_ACTIVE_POINTER|ICO_IVI_SHELL_ACTIVE_KEYBOARD)) != 0)) {
+ usurf = find_uifw_win_surface_by_id(surfaceid);
+ }
+ else {
+ usurf = NULL;
+ }
if (usurf) {
- if (usurf != _ico_win_mgr->active_surface) {
- if (_ico_win_mgr->active_surface) {
+ switch (target & (ICO_IVI_SHELL_ACTIVE_POINTER|ICO_IVI_SHELL_ACTIVE_KEYBOARD)) {
+ case ICO_IVI_SHELL_ACTIVE_POINTER:
+ if (usurf != _ico_win_mgr->active_pointer_surface) {
+ if (_ico_win_mgr->active_pointer_surface) {
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ _ico_win_mgr->active_pointer_surface->id, NULL,
+ (_ico_win_mgr->active_keyboard_surface ==
+ _ico_win_mgr->active_pointer_surface) ?
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD :
+ ICO_IVI_SHELL_ACTIVE_NONE,
+ 0,0,0,0,0);
+ }
+ _ico_win_mgr->active_pointer_surface = usurf;
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ surfaceid, NULL,
+ ICO_IVI_SHELL_ACTIVE_POINTER |
+ (_ico_win_mgr->active_keyboard_surface == usurf) ?
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD : 0,
+ 0,0,0,0,0);
+ ivi_shell_set_active(usurf->shsurf, ICO_IVI_SHELL_ACTIVE_POINTER);
+ }
+ break;
+ case ICO_IVI_SHELL_ACTIVE_KEYBOARD:
+ if (usurf != _ico_win_mgr->active_keyboard_surface) {
+ if (_ico_win_mgr->active_keyboard_surface) {
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ _ico_win_mgr->active_keyboard_surface->id, NULL,
+ (_ico_win_mgr->active_keyboard_surface ==
+ _ico_win_mgr->active_pointer_surface) ?
+ ICO_IVI_SHELL_ACTIVE_POINTER :
+ ICO_IVI_SHELL_ACTIVE_NONE,
+ 0,0,0,0,0);
+ }
+ _ico_win_mgr->active_keyboard_surface = usurf;
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ surfaceid, NULL,
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD |
+ (_ico_win_mgr->active_pointer_surface == usurf) ?
+ ICO_IVI_SHELL_ACTIVE_POINTER : 0,
+ 0,0,0,0,0);
+ ivi_shell_set_active(usurf->shsurf, ICO_IVI_SHELL_ACTIVE_KEYBOARD);
+ }
+ break;
+ default:
+ if ((usurf != _ico_win_mgr->active_pointer_surface) ||
+ (usurf != _ico_win_mgr->active_keyboard_surface)) {
+ if (_ico_win_mgr->active_pointer_surface) {
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ _ico_win_mgr->active_pointer_surface->id,
+ NULL, ICO_IVI_SHELL_ACTIVE_NONE,
+ 0,0,0,0,0);
+ if (_ico_win_mgr->active_keyboard_surface ==
+ _ico_win_mgr->active_pointer_surface) {
+ _ico_win_mgr->active_keyboard_surface = NULL;
+ }
+ }
+ if (_ico_win_mgr->active_keyboard_surface) {
+ ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
+ _ico_win_mgr->active_keyboard_surface->id,
+ NULL, ICO_IVI_SHELL_ACTIVE_NONE,
+ 0,0,0,0,0);
+ }
+ _ico_win_mgr->active_pointer_surface = usurf;
+ _ico_win_mgr->active_keyboard_surface = usurf;
ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
- surfaceid, NULL, ICO_WINDOW_MGR_ACTIVE_INACTIVE,
+ surfaceid, NULL,
+ ICO_IVI_SHELL_ACTIVE_POINTER |
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD,
0,0,0,0,0);
+ ivi_shell_set_active(usurf->shsurf,
+ ICO_IVI_SHELL_ACTIVE_POINTER |
+ ICO_IVI_SHELL_ACTIVE_KEYBOARD);
}
- _ico_win_mgr->active_surface = usurf;
- ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
- surfaceid, NULL, ICO_WINDOW_MGR_ACTIVE_ACTIVE,
- 0,0,0,0,0);
+ break;
}
uifw_trace("uifw_set_active: Leave(Change Active)");
}
else {
- uifw_trace("uifw_set_active: Leave(Surface(%08x) Not exist)", surfaceid);
+ ivi_shell_set_active(NULL, target);
+ uifw_trace("uifw_set_active: Leave(Reset active surface)");
}
}
@@ -1258,7 +1333,7 @@ win_mgr_surface_select(struct weston_surface *surface)
/* send active event to manager */
ico_win_mgr_send_to_mgr(ICO_WINDOW_MGR_WINDOW_ACTIVE,
- usurf->id, NULL, ICO_WINDOW_MGR_ACTIVE_SELECT, 0,0,0,0,0);
+ usurf->id, NULL, ICO_IVI_SHELL_ACTIVE_SELECTED, 0,0,0,0,0);
uifw_trace("win_mgr_surface_select: Leave(OK)");
}
diff --git a/weston.ini b/weston.ini
new file mode 100644
index 0000000..3ed96fa
--- /dev/null
+++ b/weston.ini
@@ -0,0 +1,23 @@
+[core]
+modules=ico_plugin_loader.so
+
+[output]
+name=HDMI3
+#mode=1680x945
+mode=173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
+#transform=90
+
+#[output]
+#name=LVDS1
+#mode=1680x1050
+#transform=90
+
+[output]
+name=VGA1
+#mode=173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
+#transform=90
+
+#[output]
+#name=X1
+#mode=1024x768
+#transform=flipped-270