viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

buffer_callback.c (18739B)


      1 
      2 #include <Elementary.h>
      3 #include <EWebKit2.h>
      4 
      5 #include "viking_state.h"
      6 #include "viking.h"
      7 #include "buffer_callback.h"
      8 
      9 
     10 typedef struct {
     11 	Evas_Object *popup;
     12 	Ewk_Auth_Request *request;
     13 	Evas_Object *username_entry;
     14 	Evas_Object *password_entry;
     15 } AuthData;
     16 
     17 static void
     18 on_ok_clicked(void *user_data, Evas_Object *obj, void *event_info)
     19 {
     20 	Eina_Bool *confirmed = (Eina_Bool *)user_data;
     21 	*confirmed = EINA_TRUE;
     22 
     23 	ecore_main_loop_quit();
     24 }
     25 
     26 static void
     27 quit_event_loop(void *user_data, Evas_Object *obj, void *event_info)
     28 {
     29 	ecore_main_loop_quit();
     30 }
     31 
     32 void
     33 on_javascript_alert(Ewk_View_Smart_Data *smartData, const char *message)
     34 {
     35 	// Browser_Window *window = browser_view_find(smartData->self);
     36 	Evas_Object *win = smartData->self;
     37 
     38 	Evas_Object *alert_popup = elm_popup_add(win);
     39 	evas_object_size_hint_weight_set(alert_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     40 	elm_object_text_set(alert_popup, message);
     41 	elm_object_part_text_set(alert_popup, "title,text", "Alert");
     42 
     43 	/* Popup buttons */
     44 	Evas_Object *button = elm_button_add(alert_popup);
     45 	elm_object_text_set(button, "OK");
     46 	elm_object_part_content_set(alert_popup, "button1", button);
     47 	evas_object_smart_callback_add(button, "clicked", quit_event_loop, NULL);
     48 	elm_object_focus_set(button, EINA_TRUE);
     49 	evas_object_show(alert_popup);
     50 
     51 	/* Make modal */
     52 	ecore_main_loop_begin();
     53 
     54 	evas_object_del(alert_popup);
     55 }
     56 
     57 Eina_Bool
     58 on_javascript_confirm(Ewk_View_Smart_Data *smartData, const char *message)
     59 {
     60 	// Browser_Window *window = browser_view_find(smartData->self);
     61 	Evas_Object *win = smartData->self;
     62 
     63 	Eina_Bool ok = EINA_FALSE;
     64 
     65 	Evas_Object *confirm_popup = elm_popup_add(win);
     66 	evas_object_size_hint_weight_set(confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     67 	elm_object_text_set(confirm_popup, message);
     68 	elm_object_part_text_set(confirm_popup, "title,text", "Confirmation");
     69 
     70 	/* Popup buttons */
     71 	Evas_Object *cancel_button = elm_button_add(confirm_popup);
     72 	elm_object_text_set(cancel_button, "Cancel");
     73 	elm_object_part_content_set(confirm_popup, "button1", cancel_button);
     74 	evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL);
     75 	Evas_Object *ok_button = elm_button_add(confirm_popup);
     76 	elm_object_text_set(ok_button, "OK");
     77 	elm_object_part_content_set(confirm_popup, "button2", ok_button);
     78 	evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok);
     79 	elm_object_focus_set(ok_button, EINA_TRUE);
     80 	evas_object_show(confirm_popup);
     81 
     82 	/* Make modal */
     83 	ecore_main_loop_begin();
     84 
     85 	evas_object_del(confirm_popup);
     86 
     87 	return ok;
     88 }
     89 
     90 const char *
     91 on_javascript_prompt(Ewk_View_Smart_Data *smartData, const char *message, const char *default_value)
     92 {
     93 	// Browser_Window *window = browser_view_find(smartData->self);
     94 	Evas_Object *win = smartData->self;
     95 
     96 	Eina_Bool ok = EINA_FALSE;
     97 
     98 	Evas_Object *prompt_popup = elm_popup_add(win);
     99 	evas_object_size_hint_weight_set(prompt_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    100 	elm_object_part_text_set(prompt_popup, "title,text", "Prompt");
    101 
    102 	/* Popup Content */
    103 	Evas_Object *box = elm_box_add(win);
    104 	elm_box_padding_set(box, 0, 4);
    105 	evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    106 	evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
    107 	evas_object_show(box);
    108 
    109 	Evas_Object *prompt = elm_label_add(win);
    110 	elm_object_text_set(prompt, message);
    111 	evas_object_size_hint_weight_set(prompt, EVAS_HINT_EXPAND, 0.0);
    112 	evas_object_size_hint_align_set(prompt, EVAS_HINT_FILL, 0.5);
    113 	elm_box_pack_end(box, prompt);
    114 	evas_object_show(prompt);
    115 
    116 	Evas_Object *entry = elm_entry_add(win);
    117 	elm_entry_scrollable_set(entry, EINA_TRUE);
    118 	elm_entry_single_line_set(entry, EINA_TRUE);
    119 	elm_entry_text_style_user_push(entry, "DEFAULT='font_size=18'");
    120 	elm_entry_entry_set(entry, default_value ? default_value : "");
    121 	elm_entry_select_all(entry);
    122 	evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
    123 	evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
    124 	elm_box_pack_end(box, entry);
    125 	elm_object_focus_set(entry, EINA_TRUE);
    126 	evas_object_show(entry);
    127 
    128 	elm_object_content_set(prompt_popup, box);
    129 
    130 	/* Popup buttons */
    131 	Evas_Object *cancel_button = elm_button_add(prompt_popup);
    132 	elm_object_text_set(cancel_button, "Cancel");
    133 	elm_object_part_content_set(prompt_popup, "button1", cancel_button);
    134 	evas_object_smart_callback_add(cancel_button, "clicked", quit_event_loop, NULL);
    135 	Evas_Object *ok_button = elm_button_add(prompt_popup);
    136 	elm_object_text_set(ok_button, "OK");
    137 	elm_object_part_content_set(prompt_popup, "button2", ok_button);
    138 	evas_object_smart_callback_add(ok_button, "clicked", on_ok_clicked, &ok);
    139 	evas_object_show(prompt_popup);
    140 
    141 	/* Make modal */
    142 	ecore_main_loop_begin();
    143 
    144 	/* The return string need to be stringshared */
    145 	const char *prompt_text = ok ? eina_stringshare_add(elm_entry_entry_get(entry)) : NULL;
    146 	evas_object_del(prompt_popup);
    147 
    148 	return prompt_text;
    149 }
    150 
    151 Eina_Bool
    152 on_window_geometry_get(Ewk_View_Smart_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *width, Evas_Coord *height)
    153 {
    154 	// Browser_Window *window = browser_view_find(sd->self);
    155 	Evas_Object *win = sd->self;
    156 
    157 	evas_object_geometry_get(win, x, y, width, height);
    158 
    159 	return EINA_TRUE;
    160 }
    161 
    162 Eina_Bool
    163 on_window_geometry_set(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord width, Evas_Coord height)
    164 {
    165 	// Browser_Window *window = browser_view_find(sd->self);
    166 	Evas_Object *win = sd->self;
    167 
    168 	evas_object_move(win, x, y);
    169 	evas_object_resize(win, width, height);
    170 
    171 	return EINA_TRUE;
    172 }
    173 
    174 #if 0
    175 typedef struct {
    176 	Evas_Object *webview;
    177 	Evas_Object *permission_popup;
    178 } PermissionData;
    179 
    180 	static void
    181 on_fullscreen_accept(void *user_data, Evas_Object *obj, void *event_info)
    182 {
    183 	PermissionData *permission_data = (PermissionData *)user_data;
    184 
    185 	evas_object_del(permission_data->permission_popup);
    186 	free(permission_data);
    187 }
    188 
    189 	static void
    190 on_fullscreen_deny(void *user_data, Evas_Object *obj, void *event_info)
    191 {
    192 	PermissionData *permission_data = (PermissionData *)user_data;
    193 
    194 	ewk_view_fullscreen_exit(permission_data->webview);
    195 	evas_object_del(permission_data->permission_popup);
    196 	free(permission_data);
    197 }
    198 
    199 static Eina_Bool on_fullscreen_enter(Ewk_View_Smart_Data *sd, Ewk_Security_Origin *origin)
    200 {
    201 	// Browser_Window *window = browser_view_find(sd->self);
    202 	Evas_Object *win = sd->self;
    203 
    204 	/* Go fullscreen */
    205 	elm_win_fullscreen_set(win, EINA_TRUE);
    206 
    207 	/* Show user popup */
    208 	Evas_Object *permission_popup = elm_popup_add(win);
    209 	evas_object_size_hint_weight_set(permission_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    210 
    211 	Eina_Strbuf *message = eina_strbuf_new();
    212 	eina_strbuf_append_printf(message, "%s is now fullscreen.<br>Press ESC at any time to exit fullscreen.<br>Allow fullscreen?", ewk_security_origin_host_get(origin));
    213 	elm_object_text_set(permission_popup, eina_strbuf_string_get(message));
    214 	eina_strbuf_free(message);
    215 	elm_object_part_text_set(permission_popup, "title,text", "Fullscreen Permission");
    216 
    217 	/* Popup buttons */
    218 	PermissionData *permission_data = (PermissionData *)malloc(sizeof(PermissionData));
    219 	permission_data->webview = window->webview;
    220 	permission_data->permission_popup = permission_popup;
    221 	Evas_Object *accept_button = elm_button_add(permission_popup);
    222 	elm_object_text_set(accept_button, "Accept");
    223 	elm_object_part_content_set(permission_popup, "button1", accept_button);
    224 	evas_object_smart_callback_add(accept_button, "clicked", on_fullscreen_accept, permission_data);
    225 
    226 	Evas_Object *deny_button = elm_button_add(permission_popup);
    227 	elm_object_text_set(deny_button, "Deny");
    228 	elm_object_part_content_set(permission_popup, "button2", deny_button);
    229 	evas_object_smart_callback_add(deny_button, "clicked", on_fullscreen_deny, permission_data);
    230 
    231 	evas_object_show(permission_popup);
    232 
    233 	return EINA_TRUE;
    234 }
    235 
    236 static Eina_Bool on_fullscreen_exit(Ewk_View_Smart_Data *sd)
    237 {
    238 	// Browser_Window *window = browser_view_find(sd->self);
    239 	Evas_Object *win = sd->self;
    240 
    241 	elm_win_fullscreen_set(win, EINA_FALSE);
    242 
    243 	return EINA_TRUE;
    244 }
    245 #endif
    246 
    247 void
    248 webprocess_crashed_cb(void *data, Evas_Object *obj, void *event_info)
    249 {
    250 	Window_Data *wd = data;
    251 	// Eina_Bool *handled = event_info;
    252 
    253 	const char script[] = "\
    254 		var txtNode = document.createTextNode(\"Helllllllllllllllllloooooooooo\");\
    255 		document.appendChild(txtNode);";
    256 
    257 	ewk_view_script_execute(wd->cur_buf->view, script, NULL, NULL);
    258 	/* *handled = EINA_TRUE; try this in callback maybe? */
    259 }
    260 
    261 static void
    262 auth_popup_close(AuthData *auth_data)
    263 {
    264     ewk_object_unref(auth_data->request);
    265     evas_object_del(auth_data->popup);
    266     free(auth_data);
    267 }
    268 
    269 static void
    270 on_auth_cancel(void *user_data, Evas_Object *obj, void *event_info)
    271 {
    272     AuthData *auth_data = (AuthData *)user_data;
    273 
    274     ewk_auth_request_cancel(auth_data->request);
    275 
    276     auth_popup_close(auth_data);
    277 }
    278 
    279 static void
    280 on_auth_ok(void *user_data, Evas_Object *obj, void *event_info)
    281 {
    282     AuthData *auth_data = (AuthData *)user_data;
    283 
    284     const char *username = elm_entry_entry_get(auth_data->username_entry);
    285     const char *password = elm_entry_entry_get(auth_data->password_entry);
    286     ewk_auth_request_authenticate(auth_data->request, username, password);
    287 
    288     auth_popup_close(auth_data);
    289 }
    290 
    291 void
    292 on_authentication_request(void *user_data, Evas_Object *obj, void *event_info)
    293 {
    294 //	Browser_Window *window = (Browser_Window *)user_data;
    295 	Window_Data *wd = user_data;
    296 	Ewk_Auth_Request *request = ewk_object_ref((Ewk_Auth_Request *)event_info);
    297 
    298 	AuthData *auth_data = (AuthData *)malloc(sizeof(AuthData));
    299 	auth_data->request = request;
    300 
    301 	Evas_Object *auth_popup = elm_popup_add(wd->win);
    302 	auth_data->popup = auth_popup;
    303 	evas_object_size_hint_weight_set(auth_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    304 	elm_object_part_text_set(auth_popup, "title,text", "Authentication Required");
    305 
    306 	/* Popup Content */
    307 	Evas_Object *vbox = elm_box_add(auth_popup);
    308 	elm_box_padding_set(vbox, 0, 4);
    309 	evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    310 	evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
    311 	elm_object_content_set(auth_popup, vbox);
    312 	evas_object_show(vbox);
    313 
    314 	/* Authentication message */
    315 	Evas_Object *label = elm_label_add(auth_popup);
    316 	elm_label_line_wrap_set(label, ELM_WRAP_WORD);
    317 	Eina_Strbuf *auth_text = eina_strbuf_new();
    318 	const char* host = ewk_auth_request_host_get(request);
    319 	const char* realm = ewk_auth_request_realm_get(request);
    320 	eina_strbuf_append_printf(auth_text, "A username and password are being requested by %s. The site says: \"%s\"", host, realm ? realm : "");
    321 	elm_object_text_set(label, eina_strbuf_string_get(auth_text));
    322 	eina_strbuf_free(auth_text);
    323 	evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    324 	evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
    325 	elm_box_pack_end(vbox, label);
    326 	evas_object_show(label);
    327 
    328 	/* Credential table */
    329 	Evas_Object *table = elm_table_add(auth_popup);
    330 	elm_table_padding_set(table, 2, 2);
    331 	elm_table_homogeneous_set(table, EINA_TRUE);
    332 	evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    333 	evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
    334 	elm_box_pack_end(vbox, table);
    335 	evas_object_show(table);
    336 
    337 	/* Username row */
    338 	Evas_Object *username_label = elm_label_add(auth_popup);
    339 	elm_object_text_set(username_label, "Username:");
    340 	evas_object_size_hint_weight_set(username_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    341 	evas_object_size_hint_align_set(username_label, 1, EVAS_HINT_FILL);
    342 	elm_table_pack(table, username_label, 0, 0, 1, 1);
    343 	evas_object_show(username_label);
    344 
    345 	Evas_Object *username_entry = elm_entry_add(auth_popup);
    346 	auth_data->username_entry = username_entry;
    347 	elm_entry_scrollable_set(username_entry, EINA_TRUE);
    348 	elm_entry_single_line_set(username_entry, EINA_TRUE);
    349 	elm_entry_text_style_user_push(username_entry, "DEFAULT='font_size=18'");
    350 	const char *suggested_username = ewk_auth_request_suggested_username_get(request);
    351 	elm_entry_entry_set(username_entry, suggested_username ? suggested_username : "");
    352 	evas_object_size_hint_weight_set(username_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    353 	evas_object_size_hint_align_set(username_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
    354 	elm_table_pack(table, username_entry, 1, 0, 2, 1);
    355 	elm_object_focus_set(username_entry, EINA_TRUE);
    356 	evas_object_show(username_entry);
    357 
    358 	/* Password row */
    359 	Evas_Object *password_label = elm_label_add(auth_popup);
    360 	elm_object_text_set(password_label, "Password:");
    361 	evas_object_size_hint_weight_set(password_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    362 	evas_object_size_hint_align_set(password_label, 1, EVAS_HINT_FILL);
    363 	elm_table_pack(table, password_label, 0, 1, 1, 1);
    364 	evas_object_show(password_label);
    365 
    366 	Evas_Object *password_entry = elm_entry_add(auth_popup);
    367 	auth_data->password_entry = password_entry;
    368 	elm_entry_scrollable_set(password_entry, EINA_TRUE);
    369 	elm_entry_single_line_set(password_entry, EINA_TRUE);
    370 	elm_entry_password_set(password_entry, EINA_TRUE);
    371 	elm_entry_text_style_user_push(password_entry, "DEFAULT='font_size=18'");
    372 	evas_object_size_hint_weight_set(password_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    373 	evas_object_size_hint_align_set(password_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
    374 	elm_table_pack(table, password_entry, 1, 1, 2, 1);
    375 	evas_object_show(password_entry);
    376 
    377 	/* Popup buttons */
    378 	Evas_Object *cancel_button = elm_button_add(auth_popup);
    379 	elm_object_text_set(cancel_button, "Cancel");
    380 	elm_object_part_content_set(auth_popup, "button1", cancel_button);
    381 	evas_object_smart_callback_add(cancel_button, "clicked", on_auth_cancel, auth_data);
    382 	Evas_Object *ok_button = elm_button_add(auth_popup);
    383 	elm_object_text_set(ok_button, "OK");
    384 	elm_object_part_content_set(auth_popup, "button2", ok_button);
    385 	evas_object_smart_callback_add(ok_button, "clicked", on_auth_ok, auth_data);
    386 	evas_object_show(auth_popup);
    387 }
    388 
    389 void
    390 on_tooltip_text_set(void *user_data, Evas_Object *obj, void *event_info)
    391 {
    392 	Window_Data *wd = user_data;
    393 	const char* message = (const char*)event_info;
    394 
    395 	elm_object_tooltip_text_set(wd->cur_buf->view, message);
    396 	elm_object_tooltip_show(wd->cur_buf->view);
    397 }
    398 
    399 void
    400 on_tooltip_text_unset(void *user_data, Evas_Object *obj, void *event_info)
    401 {
    402 	Window_Data *wd = user_data;
    403 
    404 	elm_object_tooltip_unset(wd->cur_buf->view);
    405 }
    406 
    407 typedef struct {
    408 	Evas_Object *parent;
    409 	Evas_Object *window;
    410 	Ewk_File_Chooser_Request *request;
    411 } FileSelectorData;
    412 
    413 static void on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event);
    414 
    415 static void close_file_picker(FileSelectorData* fs_data)
    416 {
    417 	evas_object_event_callback_del(fs_data->parent, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion);
    418 	evas_object_del(fs_data->window);
    419 	ewk_object_unref(fs_data->request);
    420 	free(fs_data);
    421 }
    422 
    423 static void
    424 on_filepicker_parent_deletion(void *user_data, Evas *evas, Evas_Object *window, void *event)
    425 {
    426 	close_file_picker((FileSelectorData *)user_data);
    427 }
    428 
    429 static void
    430 on_filepicker_deletion(void *user_data, Evas_Object *window, void *event_info)
    431 {
    432 	close_file_picker((FileSelectorData *)user_data);
    433 }
    434 
    435 static void
    436 on_fileselector_done(void *user_data, Evas_Object *file_selector, void *event_info)
    437 {
    438 	FileSelectorData *fs_data = (FileSelectorData *)user_data;
    439 
    440 	const char *selected = (const char *)event_info;
    441 	if (selected && *selected)
    442 		ewk_file_chooser_request_file_choose(fs_data->request, selected);
    443 
    444 	close_file_picker(fs_data);
    445 }
    446 
    447 void
    448 on_file_chooser_request(void *user_data, Evas_Object *webview, void *event_info)
    449 {
    450 	// Browser_Window *app_data = (Browser_Window *)user_data;
    451 	Window_Data *wd = user_data;
    452 	Ewk_File_Chooser_Request *request = (Ewk_File_Chooser_Request *)event_info;
    453 
    454 	// Show basic file picker which does not currently support multiple files
    455 	// or MIME type filtering.
    456 	Evas_Object *window = elm_win_add(wd->win, "file-picker-window", ELM_WIN_DIALOG_BASIC);
    457 	elm_win_title_set(window, "File picker");
    458 	elm_win_modal_set(window, EINA_TRUE);
    459 
    460 	FileSelectorData* fs_data = (FileSelectorData*)malloc(sizeof(FileSelectorData));
    461 	fs_data->parent = wd->win;
    462 	fs_data->window = window;
    463 	fs_data->request = ewk_object_ref(request);
    464 	evas_object_smart_callback_add(window, "delete,request", on_filepicker_deletion, fs_data);
    465 	evas_object_event_callback_add(wd->win, EVAS_CALLBACK_DEL, on_filepicker_parent_deletion, fs_data);
    466 
    467 	Evas_Object *file_selector = elm_fileselector_add(window);
    468 	const char *home_path = getenv("HOME");
    469 	elm_fileselector_path_set(file_selector, home_path ? home_path : "/home");
    470 	evas_object_size_hint_weight_set(file_selector, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    471 	elm_win_resize_object_add(window, file_selector);
    472 	evas_object_show(file_selector);
    473 
    474 	evas_object_smart_callback_add(file_selector, "done", on_fileselector_done, fs_data);
    475 
    476 	evas_object_resize(window, 400, 400);
    477 	elm_win_center(window, EINA_TRUE, EINA_TRUE);
    478 	evas_object_show(window);
    479 }
    480 
    481 /*
    482 static void
    483 hoverlink_cb(void *data, Evas_Object *obj, void *event_info)
    484 {
    485 	Buffer_Data *td = data;
    486 	const char *uri = ewk_view_uri_get(td->view);
    487 	// event_info is a char *link[2] where the first string contains the URL
    488 	// and the second the title of the link
    489 	char **link = event_info;
    490 	// char *markup;
    491 
    492 	memset(td->window->rememberedURI, 0, 1024);
    493 	if (link && link[0]) {
    494 		// markup = g_markup_printf_escaped("<span font=\"%s\">Link: %s</span>", statusfont, link[0]);
    495 		// markup = strdup_printf("<font=Monospace font_size=10 color=#FF0>%s", link[0]);
    496 		// gtk_label_set_markup(GTK_LABEL(td->app->status_url), markup);
    497 		// elm_object_text_set(td->app->status_url, markup);
    498 		update_url(link[0], td->window);
    499 		strcpy(td->window->rememberedURI, link[0]);
    500 		// free(markup);
    501 	} else
    502 		update_url(uri, td->window);
    503 }
    504 
    505 static void
    506 hoverlink_out_cb(void *data, Evas_Object *obj, void *event_info)
    507 {
    508 	Buffer_Data *td = data;
    509 	update_url(ewk_view_uri_get(td->view), td->window);
    510 }
    511 
    512 static void
    513 inputmethod_changed_cb(void *data, Evas_Object *obj, void *event_info)
    514 {
    515 	const char *value = NULL;
    516 	Eina_Bool *enabled = event_info;
    517 	Buffer_Data *bd = data;
    518 	Window_Data *wd = bd->window;
    519 	// Evas_Object *frame = ewk_view_frame_main_get(bd->view);
    520 
    521 	printf("inputmethod_changed()\n");
    522 
    523 	if (wd->mode == ModeNormal && enabled) {
    524 		Arg a = { .i = ModeInsert };
    525 		set(&a, wd);
    526 		wd->manual_focus = TRUE;
    527 	} else if (wd->mode == ModeInsert && !enabled) {
    528 		Arg a = { .i = ModeNormal };
    529 		set(&a, wd);
    530 	} else {
    531 		// char *value = NULL, *message = NULL;
    532 		// jsapi_evaluate_script("window.getSelection().focusNode", &value, &message, ad);
    533 		// value = ewk_frame_script_execute(frame, "window.getSelection().focusNode");
    534 		if (value && !strcmp(value, "[object HTMLFormElement]")) {
    535 			Arg a = { .i = ModeInsert, .s = NULL };
    536 			set(&a, wd);
    537 			wd->manual_focus = TRUE;
    538 		}
    539 		// free(value);
    540 		eina_stringshare_del(value);
    541 		// free(message);
    542 	}
    543 }
    544 */
    545