* play with this unless u want to help with it. NOT COMPLETE! BEWARE!
*/
+typedef enum
+{
+ E_FWIN_EXEC_NONE,
+ E_FWIN_EXEC_DIRECT,
+ E_FWIN_EXEC_SH,
+ E_FWIN_EXEC_TERMINAL_DIRECT,
+ E_FWIN_EXEC_TERMINAL_SH,
+ E_FWIN_EXEC_DESKTOP
+} E_Fwin_Exec_Type;
+
/* local subsystem functions */
static void _e_fwin_free(E_Fwin *fwin);
static void _e_fwin_cb_delete(E_Win *win);
static void _e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info);
static void _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_fwin_cb_menu_extend_start(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info);
-static void _e_fwin_cb_menu_open(void *data, E_Menu *m);
-static void _e_fwin_cb_menu_open_with(void *data, E_Menu *m);
+static void _e_fwin_cb_menu_open(void *data, E_Menu *m, E_Menu_Item *mi);
+static void _e_fwin_cb_menu_open_with(void *data, E_Menu *m, E_Menu_Item *mi);
static void _e_fwin_cb_ilist_change(void *data);
static void _e_fwin_cb_ilist_selected(void *data, Evas_Object *obj, void *event_info);
static void _e_fwin_cb_close(void *data, E_Dialog *dia);
static void _e_fwin_cb_dialog_free(void *obj);
static Evas_Bool _e_fwin_cb_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata);
+static E_Fwin_Exec_Type _e_fwin_file_is_exec(E_Fm2_Icon_Info *ici);
+static void _e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext);
static void _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always);
/* local subsystem globals */
fwin->win->data = fwin;
/* fm issues: */
- /* FIXME: "select" of a file opens that file based on mimetype etc. */
/* FIXME: if file executable - run it */
o = edje_object_add(e_win_evas_get(fwin->win));
}
static void
-_e_fwin_cb_menu_open(void *data, E_Menu *m)
+_e_fwin_cb_menu_open(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Fwin *fwin;
Evas_List *selected;
}
static void
-_e_fwin_cb_menu_open_with(void *data, E_Menu *m)
+_e_fwin_cb_menu_open_with(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Fwin *fwin;
Evas_List *selected;
ecore_list_set_free_cb(files, free);
for (l = selected; l; l = l->next)
{
+ E_Fwin_Exec_Type ext;
+
ici = l->data;
/* this snprintf is silly - but it's here in case i really do
* need to provide full paths (seems silly since we chdir
* into the dir)
*/
buf[0] = 0;
- if (!((ici->link) && (ici->mount)))
+ ext = _e_fwin_file_is_exec(ici);
+ if (ext != E_FWIN_EXEC_NONE)
+ _e_fwin_file_exec(fad->fwin, ici, ext);
+ else
{
- if (ici->link)
+ if (!((ici->link) && (ici->mount)))
{
- if (!S_ISDIR(ici->statinfo.st_mode))
- snprintf(buf, sizeof(buf), "%s", ici->file);
- }
- else
- {
- if (!S_ISDIR(ici->statinfo.st_mode))
- snprintf(buf, sizeof(buf), "%s", ici->file);
+ if (ici->link)
+ {
+ if (!S_ISDIR(ici->statinfo.st_mode))
+ snprintf(buf, sizeof(buf), "%s", ici->file);
+ }
+ else
+ {
+ if (!S_ISDIR(ici->statinfo.st_mode))
+ snprintf(buf, sizeof(buf), "%s", ici->file);
+ }
}
}
if (buf[0] != 0)
return 1;
}
+static E_Fwin_Exec_Type
+_e_fwin_file_is_exec(E_Fm2_Icon_Info *ici)
+{
+ /* special file or dir - can't exec anyway */
+ if ((S_ISDIR(ici->statinfo.st_mode)) ||
+ (S_ISCHR(ici->statinfo.st_mode)) ||
+ (S_ISBLK(ici->statinfo.st_mode)) ||
+ (S_ISFIFO(ici->statinfo.st_mode)) ||
+ (S_ISSOCK(ici->statinfo.st_mode)))
+ return E_FWIN_EXEC_NONE;
+ /* it is executable */
+ if ((ici->statinfo.st_mode & S_IXOTH) ||
+ ((getgid() == ici->statinfo.st_gid) &&
+ (ici->statinfo.st_mode & S_IXGRP)) ||
+ ((getuid() == ici->statinfo.st_uid) &&
+ (ici->statinfo.st_mode & S_IXUSR)))
+ {
+ /* no mimetype */
+ if (!ici->mime)
+ {
+ return E_FWIN_EXEC_DIRECT;
+ }
+ /* mimetype */
+ else
+ {
+ /* FIXME: - this could be config */
+ if (!strcmp(ici->mime, "application/x-desktop"))
+ {
+ return E_FWIN_EXEC_DESKTOP;
+ }
+ else if ((!strcmp(ici->mime, "application/x-sh")) ||
+ (!strcmp(ici->mime, "application/x-shellscript")) ||
+ (!strcmp(ici->mime, "application/x-csh")) ||
+ (!strcmp(ici->mime, "application/x-perl")) ||
+ (!strcmp(ici->mime, "application/x-shar")) ||
+ (!strcmp(ici->mime, "text/x-csh")) ||
+ (!strcmp(ici->mime, "text/x-python")) ||
+ (!strcmp(ici->mime, "text/x-sh"))
+ )
+ {
+ return E_FWIN_EXEC_DIRECT;
+ }
+ }
+ }
+ else
+ {
+ /* mimetype */
+ if (ici->mime)
+ {
+ /* FIXME: - this could be config */
+ if (!strcmp(ici->mime, "application/x-desktop"))
+ {
+ return E_FWIN_EXEC_DESKTOP;
+ }
+ else if ((!strcmp(ici->mime, "application/x-sh")) ||
+ (!strcmp(ici->mime, "application/x-shellscript")) ||
+ (!strcmp(ici->mime, "text/x-sh"))
+ )
+ {
+ return E_FWIN_EXEC_SH;
+ }
+ }
+ }
+ return E_FWIN_EXEC_NONE;
+}
+
+static void
+_e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext)
+{
+ /* FIXME: execute file ici with either a temrinal, the shell, or directly
+ * or open the .desktop and exec it */
+}
+
static void
_e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always)
{
ici = l->data;
if (!((ici->link) && (ici->mount)))
{
- if (ici->link)
- {
- if (!S_ISDIR(ici->statinfo.st_mode))
- mimes = evas_hash_direct_add(mimes, e_fm_mime_filename_get(ici->link), (void *)1);
- }
- else
+ if (_e_fwin_file_is_exec(ici) == E_FWIN_EXEC_NONE)
{
- snprintf(buf, sizeof(buf), "%s/%s",
- e_fm2_real_path_get(fwin->fm_obj), ici->file);
- if (!S_ISDIR(ici->statinfo.st_mode))
- mimes = evas_hash_direct_add(mimes, ici->mime, (void *)1);
+ if (ici->link)
+ {
+ if (!S_ISDIR(ici->statinfo.st_mode))
+ mimes = evas_hash_direct_add(mimes, e_fm_mime_filename_get(ici->link), (void *)1);
+ }
+ else
+ {
+ snprintf(buf, sizeof(buf), "%s/%s",
+ e_fm2_real_path_get(fwin->fm_obj), ici->file);
+ if (!S_ISDIR(ici->statinfo.st_mode))
+ mimes = evas_hash_direct_add(mimes, ici->mime, (void *)1);
+ }
}
}
}
/* 2. for each mimetype list apps that handle it */
- evas_hash_foreach(mimes, _e_fwin_cb_hash_foreach, &mlist);
- evas_hash_free(mimes);
+ if (mimes)
+ {
+ evas_hash_foreach(mimes, _e_fwin_cb_hash_foreach, &mlist);
+ evas_hash_free(mimes);
+ }
/* 3. add apps to a list so its a unique app list */
apps = NULL;
if (mlist)
for (l = files; l; l = l->next)
{
ici = l->data;
- ecore_list_append(files_list, strdup(ici->file));
+ if (_e_fwin_file_is_exec(ici) == E_FWIN_EXEC_NONE)
+ ecore_list_append(files_list, strdup(ici->file));
+ }
+ for (l = files; l; l = l->next)
+ {
+ E_Fwin_Exec_Type ext;
+
+ ici = l->data;
+ ext = _e_fwin_file_is_exec(ici);
+ if (ext != E_FWIN_EXEC_NONE)
+ _e_fwin_file_exec(fwin, ici, ext);
}
cmds = ecore_desktop_get_command(a->desktop, files_list, 1);
if (cmds)
ecore_list_destroy(files_list);
if (apps) evas_list_free(apps);
+ evas_list_free(mlist);
chdir(pcwd);
- evas_list_free(mlist);
return;
}
}