diff --git a/src/e.h b/src/e.h index 9280a15cb..5fa720007 100644 --- a/src/e.h +++ b/src/e.h @@ -332,6 +332,12 @@ struct _E_View } arrange; } options; + struct { + struct { + int left, right, top, bottom; + } inset, icon, spacing; + } spacing; + Evas evas; struct { Window base; diff --git a/src/icons.c b/src/icons.c index 59e8e16ce..5cd2a46a5 100644 --- a/src/icons.c +++ b/src/icons.c @@ -31,8 +31,28 @@ static void e_icon_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { E_Icon *icon; + Ev_Mouse_Down *ev; + Eevent *event; + event = e_view_get_current_event(); + ev = event->event; icon = _data; + if (ev->triple_click) + { + printf("triple\n"); + } + else if (ev->double_click) + { + printf("double\n"); + } + else + { + printf("up\n"); + } + if (icon->current.state.selected) + icon->current.state.selected = 0; + else + icon->current.state.selected = 1; icon->current.state.clicked = 1; icon->changed = 1; icon->view->changed = 1; @@ -42,13 +62,13 @@ static void e_icon_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { E_Icon *icon; + Ev_Mouse_Up *ev; + Eevent *event; + event = e_view_get_current_event(); + ev = event->event; icon = _data; icon->current.state.clicked = 0; - if (icon->current.state.selected) - icon->current.state.selected = 0; - else - icon->current.state.selected = 1; icon->changed = 1; icon->view->changed = 1; } @@ -80,6 +100,84 @@ e_icon_new(void) return icon; } +void +e_icon_apply_mime(E_Icon *icon, char *mime) +{ + char m1[4096], m2[4096], *p; + + strcpy(m1, mime); + p = strchr(m1, '/'); + if (p) *p = 0; + p = strchr(mime, '/'); + if (p) strcpy(m2, &(p[1])); + else m2[0] = 0; + IF_FREE(icon->info.mime.base); + IF_FREE(icon->info.mime.type); + icon->info.mime.base = strdup(m1); + icon->info.mime.type = strdup(m2); +} + +void +e_icon_get_icon(E_Icon *icon) +{ + char m1[4096], m2[4096], *p; + int found = 0; + + /* errr.. hmm do something useful if its a symlink */ + if (icon->info.link) + { + } + sprintf(m1, "%s/data/icons/%s/%s.db",PACKAGE_DATA_DIR, + icon->info.mime.base, + icon->info.mime.type); + if (e_file_exists(m1)) found = 1; + if (!found) + { + strcpy(m2, icon->info.mime.type); + p = strrchr(m2, '-'); + while (p) + { + p[0] = 0; + sprintf(m1, "%s/data/icons/%s/%s.db",PACKAGE_DATA_DIR, + icon->info.mime.base, m2); + if (e_file_exists(m1)) + { + found = 1; + break; + } + p = strrchr(m2, '-'); + } + } + if (!found) + { + sprintf(m1, "%s/data/icons/%s/default.db",PACKAGE_DATA_DIR, + icon->info.mime.base); + if (e_file_exists(m1)) found = 1; + } + if (!found) + { + sprintf(m1, "%s/data/icons/unknown/unknown.db",PACKAGE_DATA_DIR); + if (e_file_exists(m1)) found = 1; + } + if (!found) + { + sprintf(m1, "%s/data/icons/unknown/default.db",PACKAGE_DATA_DIR); + found = 1; + } + printf("%s/%s: %s\n", icon->info.mime.base, icon->info.mime.type, m1); + IF_FREE(icon->info.icon.normal); + IF_FREE(icon->info.icon.selected); + IF_FREE(icon->info.icon.clicked); + sprintf(m2, "%s:/icon/normal", m1); + icon->info.icon.normal = strdup(m2); + sprintf(m2, "%s:/icon/selected", m1); + icon->info.icon.selected = strdup(m2); + sprintf(m2, "%s:/icon/clicked", m1); + icon->info.icon.clicked = strdup(m2); + icon->changed = 1; + icon->view->changed = 1; +} + void e_icon_place_grid(E_Icon *icon) { @@ -88,16 +186,46 @@ e_icon_place_grid(E_Icon *icon) if (icon->view->options.arrange.grid.dir == 0) /* h */ { int gw; + int iw, ih; + iw = icon->current.w + + icon->view->spacing.icon.left + + icon->view->spacing.icon.right + + icon->view->spacing.spacing.left + + icon->view->spacing.spacing.right; + ih = icon->current.h + + icon->view->spacing.icon.top + + icon->view->spacing.icon.bottom + + icon->view->spacing.spacing.top + + icon->view->spacing.spacing.bottom; if (icon->view->options.arrange.grid.w > 0) - gw = icon->view->size.w / icon->view->options.arrange.grid.w; + gw = (icon->view->size.w - + icon->view->spacing.inset.left - + icon->view->spacing.inset.right) / + icon->view->options.arrange.grid.w; else gw = 1; y = icon->view->options.arrange.grid.next_pos / gw; x = icon->view->options.arrange.grid.next_pos - (y * gw); x *= icon->view->options.arrange.grid.w; y *= icon->view->options.arrange.grid.h; - x += (icon->view->options.arrange.grid.w - icon->current.w) / 2; - y += (icon->view->options.arrange.grid.h - icon->current.h); + x += (icon->view->options.arrange.grid.w - + icon->view->spacing.icon.left - + icon->view->spacing.icon.right - + icon->view->spacing.spacing.left - + icon->view->spacing.spacing.right - + icon->current.w) / 2; + y += (icon->view->options.arrange.grid.h - + icon->view->spacing.icon.top - + icon->view->spacing.icon.bottom - + icon->view->spacing.spacing.top - + icon->view->spacing.spacing.bottom - + icon->current.h); + x -= icon->view->viewport.x; + y -= icon->view->viewport.y; + x += icon->view->spacing.inset.left; + y += icon->view->spacing.inset.top; + x += icon->view->spacing.icon.left + icon->view->spacing.spacing.left; + y += icon->view->spacing.icon.top + icon->view->spacing.spacing.top; e_icon_set_xy(icon, x, y); icon->view->options.arrange.grid.next_pos++; } @@ -124,15 +252,27 @@ e_icon_pre_show(E_Icon *icon) { if (icon->view->options.arrange.method == 0) /* grid */ { - /* need to redo whole grid... */ - if ((icon->current.w > icon->view->options.arrange.grid.w) || - (icon->current.h > icon->view->options.arrange.grid.h)) + int iw, ih; + + iw = icon->current.w + + icon->view->spacing.icon.left + + icon->view->spacing.icon.right + + icon->view->spacing.spacing.left + + icon->view->spacing.spacing.right; + ih = icon->current.h + + icon->view->spacing.icon.top + + icon->view->spacing.icon.bottom + + icon->view->spacing.spacing.top + + icon->view->spacing.spacing.bottom; + /* need to redo whole grid... ??? */ + if ((iw > icon->view->options.arrange.grid.w) || + (ih > icon->view->options.arrange.grid.h)) { Evas_List l; icon->view->options.arrange.grid.next_pos = 0; - icon->view->options.arrange.grid.w = icon->current.w; - icon->view->options.arrange.grid.h = icon->current.h; + icon->view->options.arrange.grid.w = iw; + icon->view->options.arrange.grid.h = ih; for (l = icon->view->icons; l; l = l->next) { E_Icon *ic; diff --git a/src/view.c b/src/view.c index f7b567329..2f85000db 100644 --- a/src/view.c +++ b/src/view.c @@ -359,6 +359,12 @@ e_window_expose(Eevent * ev) } } +Eevent * +e_view_get_current_event(void) +{ + return current_ev; +} + int e_view_filter_file(E_View *v, char *file) { @@ -559,7 +565,7 @@ e_view_handle_fs(EfsdEvent *ev) break; case EFSD_CMD_CHMOD: break; - case EFSD_CMD_GETMIME: + case EFSD_CMD_GETFILE: /* printf("Getmime event %i\n", ev->efsd_reply_event.command.efsd_file_cmd.id); */ if (ev->efsd_reply_event.status == SUCCESS) @@ -569,76 +575,10 @@ e_view_handle_fs(EfsdEvent *ev) icon = e_view_find_icon_by_path(ev->efsd_reply_event.command.efsd_file_cmd.file); if (icon) { - char m1[4096], m2[4096], *p; - /* figure out icons to use */ - strcpy(m1, (char*)ev->efsd_reply_event.data); - p = strchr(m1, '/'); - if (p) *p = 0; - p = strchr((char*)ev->efsd_reply_event.data, '/'); - if (p) strcpy(m2, &(p[1])); - else m2[0] = 0; - icon->info.mime.base = strdup(m1); - icon->info.mime.type = strdup(m2); - - printf("%s: %s/%s\n", icon->file, icon->info.mime.base, icon->info.mime.type); - sprintf(m1, "%s/data/icons/%s/%s.db",PACKAGE_DATA_DIR, - icon->info.mime.base, - icon->info.mime.type); - if (!e_file_exists(m1)) - { - int found; - - printf("fallback 0\n"); - strcpy(m2, icon->info.mime.type); - p = strrchr(m2, '-'); - found = 0; - while (p) - { - p[0] = 0; - sprintf(m1, "%s/data/icons/%s/%s.db",PACKAGE_DATA_DIR, - icon->info.mime.base, m2); - printf("try %s\n", m1); - if (e_file_exists(m1)) - { - found = 1; - break; - } - p = strrchr(m2, '-'); - } - if (!found) - { - printf("fallback 1\n"); - sprintf(m1, "%s/data/icons/%s/default.db",PACKAGE_DATA_DIR, - icon->info.mime.base); - if (!e_file_exists(m1)) - { - printf("fallback 2\n"); - sprintf(m1, "%s/data/icons/unknown/unknown.db",PACKAGE_DATA_DIR); - if (!e_file_exists(m1)) - { - printf("fallback 3\n"); - sprintf(m1, "%s/data/icons/unknown/default.db",PACKAGE_DATA_DIR); - } - } - } - } - IF_FREE(icon->info.icon.normal); - IF_FREE(icon->info.icon.selected); - IF_FREE(icon->info.icon.clicked); - sprintf(m2, "%s:/icon/normal", m1); - icon->info.icon.normal = strdup(m2); - sprintf(m2, "%s:/icon/selected", m1); - icon->info.icon.selected = strdup(m2); - sprintf(m2, "%s:/icon/clicked", m1); - icon->info.icon.clicked = strdup(m2); - if (icon->info.link) - { -/* icon->info.icon.normal = strdup(PACKAGE_DATA_DIR"/data/icons/file/default.db:/icon/normal"); - icon->info.icon.selected = strdup(PACKAGE_DATA_DIR"/data/icons/file/default.db:/icon/selected"); - icon->info.icon.clicked = strdup(PACKAGE_DATA_DIR"/data/icons/file/default.db:/icon/clicked"); -*/ } - e_icon_pre_show(icon); + e_icon_apply_mime(icon, (char*)ev->efsd_reply_event.data); + e_icon_get_icon(icon); + e_icon_pre_show(icon); } } break; @@ -677,7 +617,8 @@ e_view_handle_fs(EfsdEvent *ev) icon->info.link_get_id = efsd_readlink(e_fs_get_connection(), f); } - icon->info.is_exe = e_file_can_exec(st); + if ((!icon->info.link_get_id) && (!icon->info.is_dir)) + icon->info.is_exe = e_file_can_exec(st); icon->changed = 1; icon->view->changed = 1; /* if (!icon->info.link_get_id) @@ -789,6 +730,30 @@ e_view_new(void) v->options.back_pixmap = 0; #endif #endif + { + Ebits_Object obj; + int pl, pr, pt, pb; + + pl = pr = pt = pb = 0; + v->spacing.inset.left = 2; + v->spacing.inset.right = 2; + v->spacing.inset.top = 2; + v->spacing.inset.bottom = 2; + obj = ebits_load(PACKAGE_DATA_DIR"/data/config/appearance/default/selections/file.bits.db"); + if (obj) + { + ebits_get_insets(obj, &pl, &pr, &pt, &pb); + ebits_free(obj); + } + v->spacing.icon.left = pl; + v->spacing.icon.right = pr; + v->spacing.icon.top = pt; + v->spacing.icon.bottom = pb; + v->spacing.spacing.left = 1; + v->spacing.spacing.right = 1; + v->spacing.spacing.top = 1; + v->spacing.spacing.bottom = 1; + } views = evas_list_append(views, v); /* @@ -824,7 +789,7 @@ e_view_set_dir(E_View *v, char *dir) /* v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir); */ v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir, 2, efsd_op_get_stat(), - efsd_op_get_mimetype()); + efsd_op_get_filetype()); v->is_listing = 1; v->changed = 1; } @@ -834,6 +799,8 @@ e_view_scroll(E_View *v, int dx, int dy) { Evas_List l; + v->viewport.x -= dx; + v->viewport.y -= dy; for (l = v->icons; l; l = l->next) { E_Icon *icon; @@ -846,6 +813,12 @@ e_view_scroll(E_View *v, int dx, int dy) v->changed = 1; } +void +e_view_scroll_to(E_View *v, int x, int y) +{ + e_view_scroll(v, v->viewport.x - x, v->viewport.y - y); +} + void e_view_add_icon(E_View *v, E_Icon *icon) {