From: Enlightenment S. <no-...@en...> - 2010-03-06 17:00:50
|
Log: Replace a missing GList with Eina_List Be smarter about browsers instead of checking for a browser all the time. New configuration section, Options, where you can choose a browser from the list of detected browsers. Compile regexps only once. Author: rui Date: 2010-03-06 09:00:43 -0800 (Sat, 06 Mar 2010) New Revision: 46912 Modified: trunk/elmdentica/src/elmdentica.c trunk/elmdentica/src/elmdentica.h trunk/elmdentica/src/settings.c trunk/elmdentica/src/twitter.c Modified: trunk/elmdentica/src/elmdentica.c =================================================================== --- trunk/elmdentica/src/elmdentica.c 2010-03-06 16:46:08 UTC (rev 46911) +++ trunk/elmdentica/src/elmdentica.c 2010-03-06 17:00:43 UTC (rev 46912) @@ -76,10 +76,13 @@ time_t now; Eina_Hash * status2user=NULL; + char * reply_id=NULL; - char * url_post = NULL; char * url_friends = NULL; +extern int browser; +extern char * browsers[]; +extern char * browserNames[]; extern xmlSAXHandler friends_saxHandler; @@ -92,6 +95,9 @@ Eet_File *conf = NULL; +GRegex *re_link=NULL, *re_link_content=NULL, *re_amp=NULL; +GError *re_err=NULL; + static int count_accounts(void *notUsed, int argc, char **argv, char **azColName) { int count = atoi(argv[0]); @@ -218,15 +224,14 @@ static void on_repeat(void *data, Evas_Object *obj, void *event_info) { ub_Bubble * status = (ub_Bubble*)data; char * entry_str=NULL, *tmp=NULL; - GRegex * re=NULL; - GError * err=NULL; int res = 0; if(status) { - re = g_regex_new("<a href='(.*?)('>\\[link\\]</a>)", 0, 0, &err); - tmp = g_regex_replace(re, status->message, -1, 0, "\\1", 0, &err); - g_regex_unref(re); + if(!re_link_content) + re_link_content = g_regex_new("<a href='(.*?)('>\\[link\\]</a>)", 0, 0, &re_err); + tmp = g_regex_replace(re_link_content, status->message, -1, 0, "\\1", 0, &re_err); + res = asprintf(&entry_str, "♺ @%s: %s", status->screen_name, tmp); if(res != -1) { elm_entry_entry_set(entry, entry_str); @@ -265,26 +270,17 @@ static void on_open_url(void *data, Evas_Object *obj, void *event_info) { char * url = (char*)data; char * cmd = NULL; - struct stat buf; int sys_result = 0; - if(stat("/usr/bin/ventura", &buf) == 0) { - sys_result = asprintf(&cmd, "/usr/bin/ventura -u %s &", url); - } else if(stat("/usr/bin/woosh", &buf) == 0) { - sys_result = asprintf(&cmd, "/usr/bin/woosh -u %s &", url); - } else if(stat("/usr/bin/midori", &buf) == 0) { - sys_result = asprintf(&cmd, "/usr/bin/midori %s &", url); - } else if(stat("/usr/bin/dillo", &buf) == 0) { - sys_result = asprintf(&cmd, "/usr/bin/dillo %s &", url); - } else if(stat("/usr/bin/xdg-open", &buf) == 0) { - sys_result = asprintf(&cmd, "/usr/bin/xdg-open %s &", url); - } else { - url_win_del(NULL, NULL, NULL); + + url_win_del(NULL, NULL, NULL); + + if (browser < 0) { if(data) free(data); return; } - url_win_del(NULL, NULL, NULL); + sys_result = asprintf(&cmd, browsers[browser], url); if(sys_result != -1) { sys_result = system(cmd); if(sys_result == -1) { @@ -477,8 +473,6 @@ time_t now,status_time,time_delta; char *tmp; char * file_path=NULL, *home=NULL, *timestr = NULL; - GRegex * re=NULL; - GError * err=NULL; /* In this query handler, these are the current fields: argv[0] == id INTEGER @@ -556,14 +550,15 @@ message = elm_anchorblock_add(win); evas_object_size_hint_align_set(message, -1, 1); - re = g_regex_new("&(?!amp;)", 0, 0, &err); - tmp = g_regex_replace(re, status_message, -1, 0, "&", 0, &err); - g_regex_unref(re); + if(!re_amp) + re_amp = g_regex_new("&(?!amp;)", 0, 0, &re_err); - re = g_regex_new("([a-z]+://.*?)(\\s|$)", 0, 0, &err); + tmp = g_regex_replace(re_amp, status_message, -1, 0, "&", 0, &re_err); + + if(!re_link) + re_link = g_regex_new("([a-z]+://.*?)(\\s|$)", 0, 0, &re_err); //status_message = g_regex_replace(re, tmp, -1, 0, "<a href='\\1'>\\1</a>\\2", 0, &err); - status_message = g_regex_replace(re, tmp, -1, 0, "<a href='\\1'>[link]</a>\\2", 0, &err); - g_regex_unref(re); + status_message = g_regex_replace(re_link, tmp, -1, 0, "<a href='\\1'>[link]</a>\\2", 0, &re_err); free(tmp); elm_anchorblock_text_set(message, status_message); @@ -1103,16 +1098,28 @@ else fullscreen=0; free(data); - data=NULL; } toggle_fullscreen(fullscreen); + data = eet_read(conf, "/options/browser", &size); + if(data) { + mm = strtol(data, NULL, 10); + if(mm > INT_MIN && mm < INT_MAX) + browser = (int)mm; + free(data); + } + elm_run(); elm_shutdown(); eet_close(conf); eet_shutdown(); + + g_regex_unref(re_link); + g_regex_unref(re_link_content); + g_regex_unref(re_amp); + xmlCleanupParser(); return 0; Modified: trunk/elmdentica/src/elmdentica.h =================================================================== --- trunk/elmdentica/src/elmdentica.h 2010-03-06 16:46:08 UTC (rev 46911) +++ trunk/elmdentica/src/elmdentica.h 2010-03-06 17:00:43 UTC (rev 46912) @@ -55,7 +55,7 @@ } ub_Bubble; typedef struct _StatusesList { - GList *list; + Eina_List *list; ub_Status *current; TimeLineStates state; char *hash_error; @@ -70,6 +70,12 @@ #define TIMELINE_USER 1 #define TIMELINE_PUBLIC 2 +#define BROWSER_XDG 0 +#define BROWSER_VENTURA 1 +#define BROWSER_MIDORI 2 +#define BROWSER_WOOSH 3 +#define BROWSER_DILLO 4 + void error_win_del(void *data, Evas_Object *zbr, void *event_info); void set_urls(void); Modified: trunk/elmdentica/src/settings.c =================================================================== --- trunk/elmdentica/src/settings.c 2010-03-06 16:46:08 UTC (rev 46911) +++ trunk/elmdentica/src/settings.c 2010-03-06 17:00:43 UTC (rev 46912) @@ -43,7 +43,7 @@ #include "settings.h" #include "elmdentica.h" -Evas_Object *settings_win=NULL, *settings_area=NULL, *account_editor=NULL, *cache_editor=NULL, +Evas_Object *settings_win=NULL, *settings_area=NULL, *account_editor=NULL, *cache_editor=NULL, *options_editor=NULL, *user_data_dialog=NULL, *screen_name_entry=NULL, *password_entry=NULL, *domain_data_dialog=NULL, *apiroot_entry=NULL, *type_entry=NULL, *secure_entry=NULL, *domain_entry=NULL, *base_url_entry=NULL, *enabled_entry=NULL, *receive_entry=NULL, *send_entry=NULL; @@ -59,6 +59,24 @@ int current_account = 0; extern char * url_post; extern char * url_friends; + +int browser=-1; +const char * browserNames[] = { + "XDG Open", + "Ventura", + "Midori", + "Woosh", + "Dillo", + }; +const char * browsers[] = { + "/usr/bin/xdg-open %s &", + "/usr/bin/ventura -u %s &", + "/usr/bin/midori %s &", + "/usr/bin/woosh -u %s &", + "/usr/bin/dillo %s &", + }; +int browsersIndex=4; + extern int debug; extern CURL * user_agent; @@ -619,6 +637,7 @@ if(account_editor) evas_object_del(account_editor); if(cache_editor) evas_object_del(cache_editor); + if(options_editor) evas_object_del(options_editor); account_editor = elm_box_add(settings_area); evas_object_size_hint_weight_set(account_editor, 1, 1); evas_object_size_hint_align_set(account_editor, -1, -1); @@ -821,6 +840,7 @@ if(account_editor) evas_object_del(account_editor); if(cache_editor) evas_object_del(cache_editor); + if(options_editor) evas_object_del(options_editor); cache_editor = elm_table_add(settings_area); evas_object_size_hint_weight_set(cache_editor, 1, 1); @@ -913,6 +933,94 @@ evas_object_show(cache_editor); } +static void settings_choose_browser(void *data, Evas_Object *hoversel, void *event_info) { + int b = (int)(long)data, res=0; + char *tmp; + + switch(b) { + case BROWSER_VENTURA: { browser=b; break; } + case BROWSER_MIDORI: { browser=b; break; } + case BROWSER_WOOSH: { browser=b; break; } + case BROWSER_DILLO: { browser=b; break; } + case BROWSER_XDG: + default: { browser=b; break; } + } + elm_hoversel_label_set(hoversel, browserNames[browser]); + res = asprintf(&tmp, "%d", browser); + if(res != -1) { + eet_write(conf, "/options/browser", tmp, strlen(tmp), 0); + free(tmp); + } +} + +Evas_Object *settings_browser_hoversel(void) { + Evas_Object *hoversel=NULL; + struct stat buf; + int have_browser=0; + + hoversel=elm_hoversel_add(settings_area); + evas_object_size_hint_weight_set(hoversel, 1, 1); + evas_object_size_hint_align_set(hoversel, -1, 0); + + elm_hoversel_hover_begin(hoversel); + if(stat("/usr/bin/xdg-open", &buf) == 0) { + elm_hoversel_item_add(hoversel, browserNames[BROWSER_XDG], NULL, ELM_ICON_NONE, settings_choose_browser, (void*)BROWSER_XDG); + have_browser=1; + } + if(stat("/usr/bin/ventura", &buf) == 0) { + elm_hoversel_item_add(hoversel, browserNames[BROWSER_VENTURA], NULL, ELM_ICON_NONE, settings_choose_browser, (void*)BROWSER_VENTURA); + have_browser=1; + } + if(stat("/usr/bin/woosh", &buf) == 0) { + elm_hoversel_item_add(hoversel, browserNames[BROWSER_WOOSH], NULL, ELM_ICON_NONE, settings_choose_browser, (void*)BROWSER_WOOSH); + have_browser=1; + } + if(stat("/usr/bin/midori", &buf) == 0) { + elm_hoversel_item_add(hoversel, browserNames[BROWSER_MIDORI], NULL, ELM_ICON_NONE, settings_choose_browser, (void*)BROWSER_MIDORI); + have_browser=1; + } + if(stat("/usr/bin/dillo", &buf) == 0) { + elm_hoversel_item_add(hoversel, browserNames[BROWSER_DILLO], NULL, ELM_ICON_NONE, settings_choose_browser, (void*)BROWSER_DILLO); + have_browser=1; + } + elm_hoversel_hover_end(hoversel); + + if(have_browser) { + if(browser >= 0 && browser <= browsersIndex) + elm_hoversel_label_set(hoversel, browserNames[browser]); + else + elm_hoversel_label_set(hoversel, _("Please choose a browser")); + } else + elm_hoversel_label_set(hoversel, _("No supported browser available")); + + evas_object_show(hoversel); + + return(hoversel); +} + +void on_settings_options(void *data, Evas_Object *toolbar, void *event_info) { + Evas_Object *frame=NULL, *hoversel=NULL; + + if(account_editor) evas_object_del(account_editor); + if(cache_editor) evas_object_del(cache_editor); + if(options_editor) evas_object_del(options_editor); + + options_editor = elm_table_add(settings_area); + evas_object_size_hint_weight_set(options_editor, 1, 1); + evas_object_size_hint_align_set(options_editor, -1, 0); + + frame = elm_frame_add(settings_area); + elm_frame_label_set(frame, _("Preferred browser")); + hoversel = settings_browser_hoversel(); + elm_hoversel_hover_parent_set(hoversel, frame); + elm_frame_content_set(frame, hoversel); + elm_table_pack(options_editor, frame, 0, 0, 1, 1); + evas_object_show(frame); + + elm_box_pack_start(settings_area, options_editor); + evas_object_show(options_editor); +} + void on_settings(void *data, Evas_Object *obj, void *event_info) { Evas_Object *bg=NULL, *box=NULL, *toolbar=NULL, *icon=NULL; Elm_Toolbar_Item *item=NULL; @@ -956,6 +1064,11 @@ evas_object_show(icon); elm_toolbar_item_add(toolbar, icon, _("Cache"), on_settings_cache, NULL); + icon = elm_icon_add(settings_win); + elm_icon_standard_set(icon, "apps"); + evas_object_show(icon); + elm_toolbar_item_add(toolbar, icon, _("Options"), on_settings_options, NULL); + elm_box_pack_start(box, toolbar); evas_object_show(toolbar); elm_toolbar_item_select(item); Modified: trunk/elmdentica/src/twitter.c =================================================================== --- trunk/elmdentica/src/twitter.c 2010-03-06 16:46:08 UTC (rev 46911) +++ trunk/elmdentica/src/twitter.c 2010-03-06 17:00:43 UTC (rev 46912) @@ -84,12 +84,14 @@ } } -void messages_insert(int account_id, GList *list, int timeline) { +void messages_insert(int account_id, Eina_List *list, int timeline) { int sqlite_res=0; struct sqlite3_stmt *insert_stmt=NULL; const char *missed=NULL; char *db_err=NULL; char *query=NULL; + Eina_List *l; + void *data; sqlite_res = asprintf(&query, "SELECT max(status_id) FROM messages where account_id = %d and timeline = %d;", account_id, timeline); if(sqlite_res != -1) { @@ -105,8 +107,8 @@ if(sqlite_res != -1) { sqlite_res = sqlite3_prepare_v2(ed_DB, query, 4096, &insert_stmt, &missed); if(sqlite_res == 0) { - list = g_list_reverse(list); - g_list_foreach(list, message_insert, &insert_stmt); + EINA_LIST_REVERSE_FOREACH(list, l, data) + message_insert(data, &insert_stmt); sqlite3_finalize(insert_stmt); } else { fprintf(stderr, "Can't do %s: %d means '%s' was missed in the statement.\n", query, sqlite_res, missed); @@ -330,7 +332,7 @@ free(statuses->current->id_str); statuses->state = FT_STATUS; } else if(strncmp((char*)name, "status", 6) == 0 && strlen((char*)name) == 6) { - statuses->list = g_list_append(statuses->list, (gpointer)statuses->current); + statuses->list = eina_list_append(statuses->list, (void*)statuses->current); statuses->state = FT_NULL; } else if(strncmp((char*)name, "name", 4) == 0) statuses->state = FT_USER; |