1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009, 2010 ProFUSION embedded systems
481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2009, 2010, 2011 Samsung Electronics
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * All rights reserved.
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met:
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer in the
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    documentation and/or other materials provided with the distribution.
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EWebKit.h"
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <ctype.h>
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Ecore.h>
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Ecore_Evas.h>
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Ecore_File.h>
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Ecore_Getopt.h>
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Ecore_X.h>
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Edje.h>
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Evas.h>
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <limits.h>
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <stdio.h>
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <stdlib.h>
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <string.h>
4421939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <sys/stat.h>
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <sys/types.h>
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <unistd.h>
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define DEFAULT_WIDTH      800
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define DEFAULT_HEIGHT     600
50e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#define DEFAULT_ZOOM_INIT  1.0
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define info(format, args...)       \
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    do {                            \
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (verbose)                \
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf(format, ##args); \
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } while (0)
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define MIN_ZOOM_LEVEL 0
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define DEFAULT_ZOOM_LEVEL 5
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define MAX_ZOOM_LEVEL 13
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic int currentZoomLevel = DEFAULT_ZOOM_LEVEL;
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic float currentZoom = 1.0;
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// the zoom values are chosen to be like in Mozilla Firefox 3
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic int zoomLevels[] = {30, 50, 67, 80, 90,
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            100,
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            110, 120, 133, 150, 170, 200, 240, 300};
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic int verbose = 0;
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_List *windows = NULL;
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic char *themePath = NULL;
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic const char *backingStores[] = {
774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    "tiled",
784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    "single",
794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    NULL
804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang};
814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef struct _Window_Properties {
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool toolbarsVisible:1;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool statusbarVisible:1;
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool scrollbarsVisible:1;
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool menubarVisible:1;
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} Window_Properties;
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWindow_Properties windowProperties = { /* Pretend we have them and they are initially visible */
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_TRUE,
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_TRUE,
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_TRUE,
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_TRUE
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic const Ecore_Getopt options = {
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "EWebLauncher",
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "%prog [options] [url]",
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "0.0.1",
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "(C)2008 INdT (The Nokia Technology Institute)\n"
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "(C)2009, 2010 ProFUSION embedded systems\n"
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    "(C)2009, 2010, 2011 Samsung Electronics",
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "GPL",
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "Test Web Browser using the Enlightenment Foundation Libraries of WebKit",
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_TRUE, {
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_STORE_STR
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('e', "engine", "ecore-evas engine to use."),
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_CALLBACK_NOARGS
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('E', "list-engines", "list ecore-evas engines.",
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             ecore_getopt_callback_ecore_evas_list_engines, NULL),
1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ECORE_GETOPT_CHOICE
1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            ('b', "backing-store", "choose backing store to use.", backingStores),
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_STORE_DEF_BOOL
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ('f', "flattening", "frame flattening.", 0),
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ECORE_GETOPT_STORE_DEF_BOOL
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('F', "fullscreen", "fullscreen mode.", 0),
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_CALLBACK_ARGS
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('g', "geometry", "geometry to use in x:y:w:h form.", "X:Y:W:H",
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             ecore_getopt_callback_geometry_parse, NULL),
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_STORE_STR
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('t', "theme", "path to read the theme file from."),
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_STORE_STR
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('U', "user-agent", "custom user agent string to use."),
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_STORE_DEF_BOOL
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('S', "sudo-workaround", "Workaround mode for making Flash work with sudo.", 0),
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_COUNT
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('v', "verbose", "be more verbose."),
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VERSION
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('V', "version"),
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_COPYRIGHT
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('R', "copyright"),
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_LICENSE
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('L', "license"),
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_HELP
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ('h', "help"),
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_SENTINEL
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarketypedef struct _Viewport {
141e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int w;
142e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    int h;
143e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    float initScale;
144e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    float minScale;
145e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    float maxScale;
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    float devicePixelRatio;
147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    Eina_Bool userScalable;
148e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} Viewport;
149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef struct _ELauncher {
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ecore_Evas *ee;
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas *evas;
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *bg;
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *browser;
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *theme;
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *userAgent;
1574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const char *backingStore;
15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned char isFlattening;
159e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    Viewport viewport;
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} ELauncher;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16221939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void browserDestroy(Ecore_Evas *ee);
16321939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void closeWindow(Ecore_Evas *ee);
16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic int browserCreate(const char *url, const char *theme, const char *userAgent, Eina_Rectangle geometry, const char *engine, const char *backingStore, unsigned char isFlattening, unsigned char isFullscreen, const char *databasePath);
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16621939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprint_history(Eina_List *list)
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_List *l;
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void *d;
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!verbose)
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       return;
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    printf("Session history contains:\n");
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_LIST_FOREACH(list, l, d) {
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       Ewk_History_Item *item = (Ewk_History_Item*)d;
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       cairo_surface_t *cs = ewk_history_item_icon_surface_get(item);
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       char buf[PATH_MAX];
1815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke       int s = snprintf(buf, sizeof(buf), "/tmp/favicon-%s.png", ewk_history_item_uri_original_get(item));
1825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke       for (s--; s >= (int)sizeof("/tmp/favicon-"); s--) {
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block           if (!isalnum(buf[s]) && buf[s] != '.')
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               buf[s] = '_';
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       }
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       cs = ewk_history_item_icon_surface_get(item);
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       if (cs && cairo_surface_status(cs) == CAIRO_STATUS_SUCCESS)
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block           cairo_surface_write_to_png(cs, buf);
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       else
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block           buf[0] = '\0';
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       printf("* '%s' title='%s' icon='%s'\n",
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block              ewk_history_item_uri_original_get(item),
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block              ewk_history_item_title_get(item), buf);
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic int
2004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangnearest_zoom_level_get(float factor)
2014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    int i, intFactor = (int)(factor * 100.0);
2034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    for (i = 0; zoomLevels[i] <= intFactor; i++) { }
2044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    printf("factor=%f, intFactor=%d, zoomLevels[%d]=%d, zoomLevels[%d]=%d\n",
2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang           factor, intFactor, i-1, zoomLevels[i-1], i, zoomLevels[i]);
2064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (intFactor - zoomLevels[i-1] < zoomLevels[i] - intFactor)
2074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return i - 1;
2084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return i;
2094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockzoom_level_set(Evas_Object *webview, int level)
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    float factor = ((float) zoomLevels[level]) / 100.0;
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord ox, oy, mx, my, cx, cy;
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_pointer_canvas_xy_get(evas_object_evas_get(webview), &mx, &my);
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_geometry_get(webview, &ox, &oy, NULL, NULL);
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cx = mx - ox;
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cy = my - oy;
2204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_view_zoom_animated_set(webview, factor, 0.5, cx, cy);
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_ecore_evas_resize(Ecore_Evas *ee)
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *webview;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *bg;
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int w, h;
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bg = evas_object_name_find(ecore_evas_get(ee), "bg");
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(bg, 0, 0);
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(bg, w, h);
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    webview = evas_object_name_find(ecore_evas_get(ee), "browser");
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(webview, 10, 10);
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(webview, w - 20, h - 20);
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktitle_set(Ecore_Evas *ee, const char *title, int progress)
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *appname = "EFL Test Launcher";
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *separator = " - ";
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char label[4096];
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int size;
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!title || !strcmp(title, "")) {
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_evas_title_set(ee, appname);
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (progress < 100)
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        size = snprintf(label, sizeof(label), "%s (%d%%)%s%s", title, progress, separator, appname);
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        size = snprintf(label, sizeof(label), "%s %s%s", title, separator, appname);
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (size >= (int)sizeof(label))
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_title_set(ee, label);
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
265e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
266e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * This is en example function to adjust viewport via viewport tag's arguments.
267e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Application can invoke this function in order to adjust viewport tag when it is required.
268e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
269e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic void
270e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeviewport_set()
271e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
272e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ELauncher *app;
273e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app = (ELauncher*) eina_list_data_get(windows);
274e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
275e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ewk_view_fixed_layout_size_set(app->browser, app->viewport.w, app->viewport.h);
276e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ewk_view_zoom_set(app->browser, app->viewport.initScale, 0, 0);
277e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!ewk_view_zoom_range_set(app->browser, app->viewport.minScale, app->viewport.maxScale))
278e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        info(" Fail to set zoom range. minScale = %f, maxScale = %f\n", app->viewport.minScale, app->viewport.maxScale);
279e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ewk_view_user_scalable_set(app->browser, app->viewport.userScalable);
280e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
281e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_title_changed(void *user_data, Evas_Object *webview, void *event_info)
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app = (ELauncher *)user_data;
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *title = (const char *)event_info;
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    title_set(app->ee, title, 100);
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_progress(void *user_data, Evas_Object *webview, void *event_info)
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app = (ELauncher *)user_data;
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double *progress = (double *)event_info;
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    title_set(app->ee, ewk_view_title_get(app->browser), *progress * 100);
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_load_finished(void *user_data, Evas_Object *webview, void *event_info)
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Ewk_Frame_Load_Error *err = (const Ewk_Frame_Load_Error *)event_info;
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!err)
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Succeeded loading page.\n");
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (err->is_cancellation)
308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Load was cancelled.\n");
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Failed loading page: %d %s \"%s\", url=%s\n",
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block             err->code, err->domain, err->description, err->failing_url);
3124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
3134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    currentZoom = ewk_view_zoom_get(webview);
3144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    currentZoomLevel = nearest_zoom_level_get(currentZoom);
3154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    info("WebCore Zoom=%f, currentZoomLevel=%d\n", currentZoom, currentZoomLevel);
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_toolbars_visible_set(void* user_data, Evas_Object* webview, void* event_info)
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (*visible) {
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Toolbars visible changed: show");
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.toolbarsVisible = EINA_TRUE;
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Toolbars visible changed: hide");
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.toolbarsVisible = EINA_FALSE;
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_toolbars_visible_get(void* user_data, Evas_Object* webview, void* event_info)
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *visible = windowProperties.toolbarsVisible;
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_statusbar_visible_set(void* user_data, Evas_Object* webview, void* event_info)
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (*visible) {
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Statusbar visible changed: show");
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.statusbarVisible = EINA_TRUE;
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Statusbar visible changed: hide");
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.statusbarVisible = EINA_FALSE;
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_statusbar_visible_get(void* user_data, Evas_Object* webview, void* event_info)
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *visible = windowProperties.statusbarVisible;
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_scrollbars_visible_set(void* user_data, Evas_Object* webview, void* event_info)
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (*visible) {
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Scrollbars visible changed: show");
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.scrollbarsVisible = EINA_TRUE;
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Scrollbars visible changed: hide");
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.scrollbarsVisible = EINA_FALSE;
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_scrollbars_visible_get(void* user_data, Evas_Object* webview, void* event_info)
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *visible = windowProperties.scrollbarsVisible;
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_menubar_visible_set(void* user_data, Evas_Object* webview, void* event_info)
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (*visible) {
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Menubar visible changed: show");
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.menubarVisible = EINA_TRUE;
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Menubar visible changed: hide");
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windowProperties.menubarVisible = EINA_FALSE;
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_menubar_visible_get(void* user_data, Evas_Object* webview, void* event_info)
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool *visible = (Eina_Bool *)event_info;
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *visible = windowProperties.menubarVisible;
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_tooltip_text_set(void* user_data, Evas_Object* webview, void* event_info)
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *text = (const char *)event_info;
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (text && *text != '\0')
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("%s\n", text);
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4060617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void
4070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenon_inputmethod_changed(void* user_data, Evas_Object* webview, void* event_info)
4080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
4090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    Eina_Bool active = (Eina_Bool)(long)event_info;
4100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    unsigned int imh;
4110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    info("Keyboard changed: %d\n", active);
4120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!active)
4140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
4150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    imh = ewk_view_imh_get(webview);
4170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    info("    Keyboard flags: %#.2x\n", imh);
4180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
4200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
421e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke/**
422e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * "viewport,changed" signal will be always emitted regardless of the viewport existence.
423e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
424e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * If you don't want to process the viewport tag, you can either do nothing in this callback
425e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * or simply ignore the signal in your application.
426e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke *
427e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * More information about this can be found at http://developer.apple.com/safari/library/docum
428e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * entation/appleapplications/reference/safariwebcontent/usingtheviewport/usingtheviewport.html
429e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke */
430e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkestatic void
431e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeon_viewport_changed(void* user_data, Evas_Object* webview, void* event_info)
432e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
433e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    ELauncher *app = (ELauncher *)user_data;
434e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
435a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    float w, h, initScale, minScale, maxScale, devicePixelRatio;
436a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Eina_Bool userScalable;
437e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
438a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ewk_view_viewport_attributes_get(webview, &w, &h, &initScale, &maxScale, &minScale, &devicePixelRatio, &userScalable);
439e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
440e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    /**
441e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke     * If there is no argument in viewport tag, argument's value is -1.
442e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke     */
443e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)w == -1)
444e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        w = DEFAULT_WIDTH;
445e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)h == -1)
446e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        h = DEFAULT_HEIGHT;
447e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)initScale == -1)
448e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        initScale = DEFAULT_ZOOM_INIT; // There's no scale separated from zooming in webkit-efl.
449e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)minScale == -1)
450e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        minScale = ewk_view_zoom_range_min_get(webview);
451e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)maxScale == -1)
452e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        maxScale = ewk_view_zoom_range_max_get(webview);
453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if ((int)devicePixelRatio == -1)
454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        devicePixelRatio = ewk_view_device_pixel_ratio_get(webview);
455e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if ((int)userScalable == -1)
456e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        userScalable = EINA_TRUE;
457e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
458e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app->viewport.w = (int)w;
459e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app->viewport.h = (int)h;
460e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app->viewport.initScale = initScale;
461e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app->viewport.minScale = minScale;
462e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    app->viewport.maxScale = maxScale;
463a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    app->viewport.devicePixelRatio = devicePixelRatio;
464a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    app->viewport.userScalable = userScalable;
465967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    viewport_set();
466e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
467e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
46821939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_mouse_down(void* data, Evas* e, Evas_Object* webview, void* event_info)
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down*) event_info;
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (ev->button == 2)
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_focus_set(webview, !evas_object_focus_get(webview));
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
47621939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_focus_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info("the webview lost keyboard focus\n");
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48221939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_focus_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    info("the webview gained keyboard focus\n");
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48821939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Event_Key_Down *ev = (Evas_Event_Key_Down*) event_info;
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app = data;
4935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    static const char *encodings[] = {
4945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        "ISO-8859-1",
4955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        "UTF-8",
4965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        NULL
4975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    };
4985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    static int currentEncoding = -1;
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!strcmp(ev->key, "Escape")) {
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        closeWindow(app->ee);
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F1")) {
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Back (F1) was pressed\n");
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ewk_view_back_possible(obj)) {
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Ewk_History *history = ewk_view_history_get(obj);
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Eina_List *list = ewk_history_back_list_get(history);
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            print_history(list);
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_history_item_list_free(list);
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_back(obj);
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            info("Back ignored: No back history\n");
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F2")) {
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Forward (F2) was pressed\n");
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ewk_view_forward_possible(obj)) {
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Ewk_History *history = ewk_view_history_get(obj);
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Eina_List *list = ewk_history_forward_list_get(history);
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            print_history(list);
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_history_item_list_free(list);
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_forward(obj);
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            info("Forward ignored: No forward history\n");
5225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    } else if (!strcmp(ev->key, "F3")) {
5235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        currentEncoding++;
5245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        currentEncoding %= (sizeof(encodings) / sizeof(encodings[0]));
5255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        info("Set encoding (F3) pressed. New encoding to %s", encodings[currentEncoding]);
5265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ewk_view_setting_encoding_custom_set(obj, encodings[currentEncoding]);
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F4")) {
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Object *frame = ewk_view_frame_main_get(obj);
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord x, y;
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Ewk_Hit_Test *ht;
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y);
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ht = ewk_frame_hit_test_new(frame, x, y);
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!ht)
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("No hit test returned for point %d,%d\n", x, y);
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else {
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("Hit test for point %d,%d\n"
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  pos=%3d,%3d\n"
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  bounding_box=%d,%d + %dx%d\n"
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  title='%s'\n"
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  alternate_text='%s'\n"
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  frame=%p (%s)\n"
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  link {\n"
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    text='%s'\n"
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    url='%s'\n"
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    title='%s'\n"
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    target frame=%p (%s)\n"
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  }\n"
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  flags {\n"
550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    editable=%hhu\n"
551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "    selected=%hhu\n"
552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   "  }\n",
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   x, y,
554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->x, ht->y,
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->bounding_box.x, ht->bounding_box.y, ht->bounding_box.w, ht->bounding_box.h,
556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->title,
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->alternate_text,
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->frame, evas_object_name_get(ht->frame),
559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->link.text,
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->link.url,
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->link.title,
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->link.target_frame, evas_object_name_get(ht->link.target_frame),
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->flags.editable,
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                   ht->flags.selected);
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_frame_hit_test_free(ht);
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F5")) {
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Reload (F5) was pressed, reloading.\n");
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_reload(obj);
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F6")) {
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Stop (F6) was pressed, stop loading.\n");
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_stop(obj);
57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!strcmp(ev->key, "F12")) {
57581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Eina_Bool status = ewk_view_setting_spatial_navigation_get(obj);
57681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ewk_view_setting_spatial_navigation_set(obj, !status);
57781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        info("Command::keyboard navigation toggle\n");
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F7")) {
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Zoom out (F7) was pressed.\n");
5804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (currentZoomLevel > MIN_ZOOM_LEVEL && zoom_level_set(obj, currentZoomLevel - 1))
5814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            currentZoomLevel--;
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F8")) {
583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Zoom in (F8) was pressed.\n");
5844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (currentZoomLevel < MAX_ZOOM_LEVEL && zoom_level_set(obj, currentZoomLevel + 1))
5854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            currentZoomLevel++;
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F9")) {
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Create new window (F9) was pressed.\n");
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Eina_Rectangle geometry = {0, 0, 0, 0};
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        browserCreate("http://www.google.com",
5904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                       app->theme, app->userAgent, geometry, app-> backingStore,
59181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                       NULL, app->isFlattening, 0, NULL);
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!strcmp(ev->key, "F10")) {
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord x, y, w, h;
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Object *frame = ewk_view_frame_main_get(obj);
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        float zoom = zoomLevels[currentZoomLevel] / 100.0;
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_frame_visible_content_geometry_get(frame, EINA_FALSE, &x, &y, &w, &h);
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        x -= w;
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        y -= h;
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        w *= 4;
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        h *= 4;
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        info("Pre-render %d,%d + %dx%d\n", x, y, w, h);
603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_pre_render_region(obj, x, y, w, h, zoom);
6044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    } else if (!strcmp(ev->key, "F11")) {
6054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        info("Pre-render 1 extra column/row with current zoom");
6064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_view_pre_render_relative_radius(obj, 1);
6074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    } else if (!strcmp(ev->key, "d")) {
6084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        info("Render suspended");
6094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_view_disable_render(obj);
6104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    } else if (!strcmp(ev->key, "e")) {
6114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        info("Render resumed");
6124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_view_enable_render(obj);
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61621939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_browser_del(void *data, Evas *evas, Evas_Object *browser, void *event)
618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app = (ELauncher*) data;
620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_del(app->browser, EVAS_CALLBACK_KEY_DOWN, on_key_down);
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_del(app->browser, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down);
623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_del(app->browser, EVAS_CALLBACK_FOCUS_IN, on_focus_in);
624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_del(app->browser, EVAS_CALLBACK_FOCUS_OUT, on_focus_out);
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_del(app->browser, EVAS_CALLBACK_DEL, on_browser_del);
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62821939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockon_closeWindow(Ecore_Evas *ee)
630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    browserDestroy(ee);
632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
63421939df44de1705786c545cd1bf519d47250322dBen Murdochstatic int
635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockquit(Eina_Bool success, const char *msg)
636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    edje_shutdown();
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_shutdown();
639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (msg)
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        fputs(msg, (success) ? stdout : stderr);
642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (themePath) {
644bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        free(themePath);
645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        themePath = NULL;
646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!success)
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EXIT_FAILURE;
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EXIT_SUCCESS;
652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65421939df44de1705786c545cd1bf519d47250322dBen Murdochstatic int
65581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochbrowserCreate(const char *url, const char *theme, const char *userAgent, Eina_Rectangle geometry, const char *engine, const char *backingStore, unsigned char isFlattening, unsigned char isFullscreen, const char *databasePath)
656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ((geometry.w <= 0) && (geometry.h <= 0)) {
658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        geometry.w = DEFAULT_WIDTH;
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        geometry.h = DEFAULT_HEIGHT;
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app = (ELauncher*) malloc(sizeof(ELauncher));
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!app)
664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return quit(EINA_FALSE, "ERROR: could not create EWebLauncher window\n");
665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    app->ee = ecore_evas_new(engine, 0, 0, geometry.w, geometry.h, NULL);
667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!app->ee)
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return quit(EINA_FALSE, "ERROR: could not construct evas-ecore\n");
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (isFullscreen)
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_evas_fullscreen_set(app->ee, EINA_TRUE);
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_title_set(app->ee, "EFL Test Launcher");
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_callback_resize_set(app->ee, on_ecore_evas_resize);
676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_callback_delete_request_set(app->ee, closeWindow);
677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    app->evas = ecore_evas_get(app->ee);
679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!app->evas)
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return quit(EINA_FALSE, "ERROR: could not get evas from evas-ecore\n");
682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    app->theme = theme;
684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    app->userAgent = userAgent;
6854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    app->backingStore = backingStore;
68681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    app->isFlattening = isFlattening;
687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    app->bg = evas_object_rectangle_add(app->evas);
689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_name_set(app->bg, "bg");
690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_color_set(app->bg, 255, 0, 255, 255);
691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(app->bg, 0, 0);
692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(app->bg, geometry.w, geometry.h);
693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_layer_set(app->bg, EVAS_LAYER_MIN);
694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_show(app->bg);
695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
696cad810f21b803229eb11403f9209855525a25d57Steve Block    if (backingStore && !strcasecmp(backingStore, "tiled")) {
6974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        app->browser = ewk_view_tiled_add(app->evas);
6984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        info("backing store: tiled\n");
699cad810f21b803229eb11403f9209855525a25d57Steve Block    } else {
700cad810f21b803229eb11403f9209855525a25d57Steve Block        app->browser = ewk_view_single_add(app->evas);
701cad810f21b803229eb11403f9209855525a25d57Steve Block        info("backing store: single\n");
7024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
703cad810f21b803229eb11403f9209855525a25d57Steve Block
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_theme_set(app->browser, theme);
705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (userAgent)
706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_setting_user_agent_set(app->browser, userAgent);
707bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ewk_view_setting_local_storage_database_path_set(app->browser, databasePath);
70881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ewk_view_setting_enable_frame_flattening_set(app->browser, isFlattening);
709bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_name_set(app->browser, "browser");
711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "title,changed", on_title_changed, app);
713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "load,progress", on_progress, app);
714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "load,finished", on_load_finished, app);
715e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    evas_object_smart_callback_add(app->browser, "viewport,changed", on_viewport_changed, app);
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "toolbars,visible,set", on_toolbars_visible_set, app);
718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "toolbars,visible,get", on_toolbars_visible_get, app);
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "statusbar,visible,set", on_statusbar_visible_set, app);
720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "statusbar,visible,get", on_statusbar_visible_get, app);
721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "scrollbars,visible,set", on_scrollbars_visible_set, app);
722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "scrollbars,visible,get", on_scrollbars_visible_get, app);
723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "menubar,visible,set", on_menubar_visible_set, app);
724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "menubar,visible,get", on_menubar_visible_get, app);
725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_smart_callback_add(app->browser, "tooltip,text,set", on_tooltip_text_set, app);
7260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    evas_object_smart_callback_add(app->browser, "inputmethod,changed", on_inputmethod_changed, app);
727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*     ewk_callback_resize_requested_add(app->browser, on_resize_requested, app->ee); */
729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add(app->browser, EVAS_CALLBACK_KEY_DOWN, on_key_down, app);
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add(app->browser, EVAS_CALLBACK_MOUSE_DOWN, on_mouse_down, app);
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add(app->browser, EVAS_CALLBACK_FOCUS_IN, on_focus_in, app);
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add(app->browser, EVAS_CALLBACK_FOCUS_OUT, on_focus_out, app);
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add(app->browser, EVAS_CALLBACK_DEL, on_browser_del, app);
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(app->browser, 10, 10);
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(app->browser, geometry.w - 20, geometry.h - 20);
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (url && (url[0] != '\0'))
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_uri_set(app->browser, url);
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
742dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_show(app->browser);
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_show(app->ee);
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
745dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_focus_set(app->browser, EINA_TRUE);
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    windows = eina_list_append(windows, app);
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 1;
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
75221939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
753dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockbrowserDestroy(Ecore_Evas *ee)
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_evas_free(ee);
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!eina_list_count(windows))
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_main_loop_quit();
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
76021939df44de1705786c545cd1bf519d47250322dBen Murdochstatic void
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockcloseWindow(Ecore_Evas *ee)
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
763dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_List *l;
764dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void *app;
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_LIST_FOREACH(windows, l, app)
766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (((ELauncher*) app)->ee == ee)
768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
769dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
770dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    windows = eina_list_remove(windows, app);
771dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    browserDestroy(ee);
772dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    free(app);
773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
775ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic Eina_Bool
776dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmain_signal_exit(void *data, int ev_type, void *ev)
777dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ELauncher *app;
779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    while (windows) {
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        app = (ELauncher*) eina_list_data_get(windows);
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_evas_free(app->ee);
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        windows = eina_list_remove(windows, app);
783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!eina_list_count(windows))
785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_main_loop_quit();
786ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return EINA_TRUE;
787dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
788dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
78921939df44de1705786c545cd1bf519d47250322dBen Murdochstatic char *
790bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenfindThemePath(const char *theme)
79121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
792bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    const char *defaultTheme = DATA_DIR"/default.edj";
793bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    char *rpath;
794bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    struct stat st;
79521939df44de1705786c545cd1bf519d47250322dBen Murdoch
796bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!theme)
797bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        theme = defaultTheme;
798bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
799bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    rpath = realpath(theme, NULL);
800bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!rpath)
801bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return NULL;
802bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
803bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (stat(rpath, &st)) {
804bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        free(rpath);
805bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return NULL;
80621939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
80721939df44de1705786c545cd1bf519d47250322dBen Murdoch
808bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return rpath;
80921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
81021939df44de1705786c545cd1bf519d47250322dBen Murdoch
811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint
812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmain(int argc, char *argv[])
813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const char *default_url = "http://www.google.com/";
815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Rectangle geometry = {0, 0, 0, 0};
817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char *url = NULL;
818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char *userAgent = NULL;
8195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const char *tmp;
8200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    const char *proxyUri;
821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char path[PATH_MAX];
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char *engine = NULL;
824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    char *theme = NULL;
8252bde8e466a4451c7319e3a072d118917957d6554Steve Block    char *backingStore = (char *)backingStores[1];
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned char quitOption = 0;
82881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned char isFlattening = 0;
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned char isFullscreen = 0;
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int args;
831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ecore_Getopt_Value values[] = {
833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_STR(engine),
834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(quitOption),
8354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ECORE_GETOPT_VALUE_STR(backingStore),
83681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ECORE_GETOPT_VALUE_BOOL(isFlattening),
837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(isFullscreen),
838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_PTR_CAST(geometry),
839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_STR(theme),
840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_STR(userAgent),
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_INT(verbose),
842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(quitOption),
843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(quitOption),
844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(quitOption),
845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_BOOL(quitOption),
846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ECORE_GETOPT_VALUE_NONE
847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ecore_evas_init())
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EXIT_FAILURE;
851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!edje_init()) {
853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ecore_evas_shutdown();
854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EXIT_FAILURE;
855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_app_args_set(argc, (const char**) argv);
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    args = ecore_getopt_parse(&options, values, argc, argv);
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (args < 0)
861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       return quit(EINA_FALSE, "ERROR: could not parse options.\n");
862dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
863dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (quitOption)
864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return quit(EINA_TRUE, NULL);
865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (args < argc)
867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        url = argv[args];
868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        url = (char*) default_url;
870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
871bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    themePath = findThemePath(theme);
872bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!themePath)
873bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return quit(EINA_FALSE, "ERROR: could not find theme.\n");
874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
875dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_init();
876dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    tmp = getenv("TMPDIR");
877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!tmp)
878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        tmp = "/tmp";
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    snprintf(path, sizeof(path), "%s/.ewebkit-%u", tmp, getuid());
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_file_mkpath(path);
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_settings_icon_database_path_set(path);
8825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ewk_settings_web_database_path_set(path);
883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    proxyUri = getenv("http_proxy");
8850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (proxyUri)
8860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        ewk_settings_proxy_uri_set(proxyUri);
8870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
88881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    browserCreate(url, themePath, userAgent, geometry, engine, backingStore, isFlattening, isFullscreen, path);
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, &windows);
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ecore_main_loop_begin();
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_shutdown();
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return quit(EINA_TRUE, NULL);
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
897