mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Refactoring, cleanup...
This commit is contained in:
parent
096fc9ca22
commit
cb57f095d0
@ -144,7 +144,7 @@ Desktop::Desktop() : DESKTOP_WINDOW(0, 0, 100, 100, "") {
|
|||||||
#ifdef USE_EDELIB_WINDOW
|
#ifdef USE_EDELIB_WINDOW
|
||||||
window_id(EDE_DESKTOP_UID);
|
window_id(EDE_DESKTOP_UID);
|
||||||
foreign_callback(settings_changed_cb);
|
foreign_callback(settings_changed_cb);
|
||||||
/* DESKTOP_WINDOW::single_buffer(true); */
|
/* DESKTOP_WINDOW::single_bufer(true); */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
selbox = new SelectionOverlay;
|
selbox = new SelectionOverlay;
|
||||||
@ -225,8 +225,6 @@ void Desktop::init_internals(void) {
|
|||||||
/*
|
/*
|
||||||
* For watching Trash, we will check Trash/files only with create/delete flags and
|
* For watching Trash, we will check Trash/files only with create/delete flags and
|
||||||
* in callback will be checked if directory is empty (trash empty) or not (trash full).
|
* in callback will be checked if directory is empty (trash empty) or not (trash full).
|
||||||
*
|
|
||||||
* FIXME: at startup it should be checked is Trash empty and update icons for that
|
|
||||||
*/
|
*/
|
||||||
p = edelib::user_data_dir();
|
p = edelib::user_data_dir();
|
||||||
trash_path = edelib::build_filename(p.c_str(), "Trash/files");
|
trash_path = edelib::build_filename(p.c_str(), "Trash/files");
|
||||||
@ -236,6 +234,9 @@ void Desktop::init_internals(void) {
|
|||||||
E_WARNING(E_STRLOC ": Unable to watch %s\n", trash_path.c_str());
|
E_WARNING(E_STRLOC ": Unable to watch %s\n", trash_path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* draw appropriate trash icon */
|
||||||
|
update_trash_icons();
|
||||||
|
|
||||||
edelib::DirWatch::callback(dir_watch_cb);
|
edelib::DirWatch::callback(dir_watch_cb);
|
||||||
running = true;
|
running = true;
|
||||||
}
|
}
|
||||||
@ -357,6 +358,84 @@ void Desktop::load_icons(const char* path) {
|
|||||||
add_icon_by_path((*it).c_str(), conf_ptr);
|
add_icon_by_path((*it).c_str(), conf_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Desktop::save_icons_positions(void) {
|
||||||
|
edelib::Resource conf;
|
||||||
|
char* icon_base;
|
||||||
|
DesktopIconListIter it = icons.begin(), it_end = icons.end();
|
||||||
|
|
||||||
|
for(; it != it_end; ++it) {
|
||||||
|
if((*it)->path().empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
icon_base = get_basename((*it)->path().c_str());
|
||||||
|
conf.set(icon_base, "X", (*it)->x());
|
||||||
|
conf.set(icon_base, "Y", (*it)->y());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!conf.save(ICONS_CONFIG_NAME))
|
||||||
|
E_WARNING(E_STRLOC ": Unable to store icons positions\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Desktop::read_desktop_file(const char* path, IconSettings& is) {
|
||||||
|
E_ASSERT(path != NULL);
|
||||||
|
|
||||||
|
if(!edelib::file_exists(path)) {
|
||||||
|
E_DEBUG(E_STRLOC ": %s don't exists\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
edelib::DesktopFile dconf;
|
||||||
|
if(!dconf.load(path)) {
|
||||||
|
E_WARNING(E_STRLOC ": Can't read %s (%s)\n", path, dconf.strerror());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
int bufsz = sizeof(buf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for 'EmptyIcon' key since via it is determined is icon trash type or not
|
||||||
|
* (in case of trash, 'Icon' key is used for full trash).
|
||||||
|
*
|
||||||
|
* FIXME: any other way to check for trash icons ???
|
||||||
|
*/
|
||||||
|
if(dconf.get("Desktop Entry", "EmptyIcon", buf, bufsz)) {
|
||||||
|
is.type = ICON_TRASH;
|
||||||
|
is.icon = buf;
|
||||||
|
} else
|
||||||
|
is.type = ICON_NORMAL;
|
||||||
|
|
||||||
|
if(!dconf.icon(buf, bufsz)) {
|
||||||
|
E_WARNING(E_STRLOC ": No Icon key, balling out\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is.type == ICON_TRASH)
|
||||||
|
is.icon2 = buf;
|
||||||
|
else
|
||||||
|
is.icon = buf;
|
||||||
|
|
||||||
|
edelib::DesktopFileType dtype = dconf.type();
|
||||||
|
if(dtype == edelib::DESK_FILE_TYPE_LINK) {
|
||||||
|
is.cmd_is_url = true;
|
||||||
|
dconf.url(buf, bufsz);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
is.cmd_is_url = false;
|
||||||
|
dconf.exec(buf, bufsz);
|
||||||
|
}
|
||||||
|
|
||||||
|
is.cmd = buf;
|
||||||
|
|
||||||
|
if(!dconf.name(buf, bufsz)) {
|
||||||
|
E_DEBUG(E_STRLOC ": No Name key\n");
|
||||||
|
is.name = "(none)";
|
||||||
|
} else
|
||||||
|
is.name = buf;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Desktop::add_icon_by_path(const char* path, edelib::Resource* conf) {
|
bool Desktop::add_icon_by_path(const char* path, edelib::Resource* conf) {
|
||||||
E_ASSERT(path != NULL);
|
E_ASSERT(path != NULL);
|
||||||
|
|
||||||
@ -420,126 +499,60 @@ bool Desktop::add_icon_by_path(const char* path, edelib::Resource* conf) {
|
|||||||
return can_add;
|
return can_add;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Desktop::save_icons_positions(void) {
|
DesktopIcon* Desktop::find_icon_by_path(const char* path, DesktopIconListIter* ret) {
|
||||||
edelib::Resource conf;
|
|
||||||
char* icon_base;
|
|
||||||
DesktopIconListIter it = icons.begin(), it_end = icons.end();
|
|
||||||
|
|
||||||
for(; it != it_end; ++it) {
|
|
||||||
if((*it)->path().empty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
icon_base = get_basename((*it)->path().c_str());
|
|
||||||
conf.set(icon_base, "X", (*it)->x());
|
|
||||||
conf.set(icon_base, "Y", (*it)->y());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!conf.save(ICONS_CONFIG_NAME))
|
|
||||||
E_WARNING(E_STRLOC ": Unable to store icons positions\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
DesktopIcon* Desktop::find_icon_by_path(const char* path) {
|
|
||||||
E_ASSERT(path != NULL);
|
E_ASSERT(path != NULL);
|
||||||
|
|
||||||
if(icons.empty())
|
if(icons.empty())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
DesktopIconListIter it, it_end;
|
DesktopIconListIter it, it_end;
|
||||||
|
|
||||||
for(it = icons.begin(), it_end = icons.end(); it != it_end; ++it) {
|
for(it = icons.begin(), it_end = icons.end(); it != it_end; ++it) {
|
||||||
if((*it)->path() == path)
|
if((*it)->path() == path) {
|
||||||
|
/* store iterator */
|
||||||
|
if(ret)
|
||||||
|
*ret = it;
|
||||||
|
|
||||||
|
/* return iterator value */
|
||||||
return (*it);
|
return (*it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Desktop::remove_icon_by_path(const char* path) {
|
bool Desktop::remove_icon_by_path(const char* path) {
|
||||||
E_ASSERT(path != NULL);
|
DesktopIconListIter pos;
|
||||||
|
DesktopIcon* ic = find_icon_by_path(path, &pos);
|
||||||
|
|
||||||
if(icons.empty())
|
if(!ic) {
|
||||||
return false;
|
E_DEBUG(">>> Didn't find %s\n", path);
|
||||||
|
|
||||||
DesktopIconListIter it, it_end;
|
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
for(it = icons.begin(), it_end = icons.end(); it != it_end; ++it) {
|
|
||||||
if((*it)->path() == path) {
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(found) {
|
|
||||||
DesktopIcon* ic = (*it);
|
|
||||||
icons.erase(it);
|
|
||||||
/* Fl_Group::remove() does not delete child, just pops it out */
|
|
||||||
remove(ic);
|
|
||||||
delete ic;
|
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Desktop::read_desktop_file(const char* path, IconSettings& is) {
|
|
||||||
E_ASSERT(path != NULL);
|
|
||||||
|
|
||||||
if(!edelib::file_exists(path)) {
|
|
||||||
E_DEBUG(E_STRLOC ": %s don't exists\n");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
edelib::DesktopFile dconf;
|
icons.erase(pos);
|
||||||
if(!dconf.load(path)) {
|
|
||||||
E_WARNING(E_STRLOC ": Can't read %s (%s)\n", path, dconf.strerror());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
char buff[128];
|
/* Fl_Group::remove() does not delete child, just pops it out */
|
||||||
int buffsz = sizeof(buff);
|
remove(ic);
|
||||||
|
delete ic;
|
||||||
/*
|
|
||||||
* Check for 'EmptyIcon' key since via it is determined is icon trash type or not
|
|
||||||
* (in case of trash, 'Icon' key is used for full trash).
|
|
||||||
*
|
|
||||||
* FIXME: any other way to check for trash icons ???
|
|
||||||
*/
|
|
||||||
if(dconf.get("Desktop Entry", "EmptyIcon", buff, buffsz)) {
|
|
||||||
is.type = ICON_TRASH;
|
|
||||||
is.icon = buff;
|
|
||||||
} else
|
|
||||||
is.type = ICON_NORMAL;
|
|
||||||
|
|
||||||
if(!dconf.icon(buff, buffsz)) {
|
|
||||||
E_WARNING(E_STRLOC ": No Icon key, balling out\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is.type == ICON_TRASH)
|
|
||||||
is.icon2 = buff;
|
|
||||||
else
|
|
||||||
is.icon = buff;
|
|
||||||
|
|
||||||
edelib::DesktopFileType dtype = dconf.type();
|
|
||||||
if(dtype == edelib::DESK_FILE_TYPE_LINK) {
|
|
||||||
is.cmd_is_url = true;
|
|
||||||
dconf.url(buff, buffsz);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
is.cmd_is_url = false;
|
|
||||||
dconf.exec(buff, buffsz);
|
|
||||||
}
|
|
||||||
|
|
||||||
is.cmd = buff;
|
|
||||||
|
|
||||||
if(!dconf.name(buff, buffsz)) {
|
|
||||||
E_DEBUG(E_STRLOC ": No Name key\n");
|
|
||||||
is.name = "(none)";
|
|
||||||
} else
|
|
||||||
is.name = buff;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Desktop::update_trash_icons(void) {
|
||||||
|
bool is_empty = edelib::dir_empty(trash_path.c_str());
|
||||||
|
DesktopIconListIter it = icons.begin(), it_end = icons.end();
|
||||||
|
|
||||||
|
for(; it != it_end; ++it) {
|
||||||
|
if((*it)->icon_type() == ICON_TRASH) {
|
||||||
|
if(is_empty)
|
||||||
|
(*it)->use_icon1();
|
||||||
|
else
|
||||||
|
(*it)->use_icon2();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Desktop::add_icon(DesktopIcon* ic) {
|
void Desktop::add_icon(DesktopIcon* ic) {
|
||||||
E_ASSERT(ic != NULL);
|
E_ASSERT(ic != NULL);
|
||||||
|
|
||||||
@ -639,10 +652,9 @@ void Desktop::move_selection(int x, int y, bool apply) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tries to figure out icon below mouse. It is alternative to
|
* Tries to figure out icon below mouse. It is alternative to Fl::belowmouse() since with this we hunt
|
||||||
* Fl::belowmouse() since with this we hunt only icons, not other
|
* only icons, not other childs (wallpaper, menu), which can be returned by Fl::belowmouse() and bad
|
||||||
* childs (wallpaper, menu), which can be returned by Fl::belowmouse()
|
* things be hapened.
|
||||||
* and bad things be hapened.
|
|
||||||
*/
|
*/
|
||||||
DesktopIcon* Desktop::below_mouse(int px, int py) {
|
DesktopIcon* Desktop::below_mouse(int px, int py) {
|
||||||
DesktopIcon* ic = NULL;
|
DesktopIcon* ic = NULL;
|
||||||
@ -726,7 +738,7 @@ void Desktop::notify_desktop_changed(void) {
|
|||||||
|
|
||||||
if(dbus) {
|
if(dbus) {
|
||||||
edelib::EdbusMessage msg;
|
edelib::EdbusMessage msg;
|
||||||
// send org.equinoxproject.Desktop.DesktopChanged(int32, string) signal
|
/* send org.equinoxproject.Desktop.DesktopChanged(int32, string) signal */
|
||||||
msg.create_signal(EDE_DESKTOP_OBJECT, EDE_DESKTOP_INTERFACE, "DesktopChanged");
|
msg.create_signal(EDE_DESKTOP_OBJECT, EDE_DESKTOP_INTERFACE, "DesktopChanged");
|
||||||
msg << num << names[num];
|
msg << num << names[num];
|
||||||
dbus->send(msg);
|
dbus->send(msg);
|
||||||
@ -791,22 +803,23 @@ void Desktop::dnd_drop_source(const char* src, int src_len, int x, int y) {
|
|||||||
edelib::DesktopFile dfile;
|
edelib::DesktopFile dfile;
|
||||||
|
|
||||||
if(dfile.load(path.c_str())) {
|
if(dfile.load(path.c_str())) {
|
||||||
char buff[256];
|
char buf[256];
|
||||||
|
|
||||||
if(dfile.type() == edelib::DESK_FILE_TYPE_LINK) {
|
if(dfile.type() == edelib::DESK_FILE_TYPE_LINK) {
|
||||||
dfile.url(buff, 256);
|
dfile.url(buf, 256);
|
||||||
is.cmd_is_url = true;
|
is.cmd_is_url = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dfile.exec(buff, 256);
|
dfile.exec(buf, 256);
|
||||||
is.cmd_is_url = false;
|
is.cmd_is_url = false;
|
||||||
}
|
}
|
||||||
is.cmd = buff;
|
is.cmd = buf;
|
||||||
is.type = ICON_NORMAL;
|
is.type = ICON_NORMAL;
|
||||||
|
|
||||||
dfile.name(buff, 256);
|
dfile.name(buf, 256);
|
||||||
is.name = buff;
|
is.name = buf;
|
||||||
dfile.icon(buff, 256);
|
dfile.icon(buf, 256);
|
||||||
is.icon = buff;
|
is.icon = buf;
|
||||||
|
|
||||||
is_read = true;
|
is_read = true;
|
||||||
}
|
}
|
||||||
@ -882,34 +895,20 @@ void Desktop::dir_watch(const char* dir, const char* changed, int flags) {
|
|||||||
if(!do_dirwatch || !changed || flags == edelib::DW_REPORT_NONE)
|
if(!do_dirwatch || !changed || flags == edelib::DW_REPORT_NONE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// skip temporary files
|
/* skip temporary files */
|
||||||
if(is_temp_filename(changed))
|
if(is_temp_filename(changed))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(trash_path == dir) {
|
if(trash_path == dir) {
|
||||||
bool is_empty = edelib::dir_empty(trash_path.c_str());
|
update_trash_icons();
|
||||||
|
|
||||||
DesktopIconListIter it, it_end;
|
|
||||||
for(it = icons.begin(), it_end = icons.end(); it != it_end; ++it) {
|
|
||||||
if((*it)->icon_type() == ICON_TRASH) {
|
|
||||||
if(is_empty)
|
|
||||||
(*it)->use_icon1();
|
|
||||||
else
|
|
||||||
(*it)->use_icon2();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
E_DEBUG(E_STRLOC ": event on trash dir %s\n", dir);
|
E_DEBUG(E_STRLOC ": event on trash dir %s\n", dir);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(1);
|
|
||||||
|
|
||||||
if(flags == edelib::DW_REPORT_CREATE) {
|
if(flags == edelib::DW_REPORT_CREATE) {
|
||||||
E_DEBUG(E_STRLOC ": adding %s\n", changed);
|
E_DEBUG(E_STRLOC ": adding %s\n", changed);
|
||||||
|
|
||||||
if(find_icon_by_path(changed)) {
|
if(find_icon_by_path(changed, 0)) {
|
||||||
E_DEBUG(E_STRLOC ": %s already registered; skipping...\n", changed);
|
E_DEBUG(E_STRLOC ": %s already registered; skipping...\n", changed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,15 @@
|
|||||||
#define EDAMAGE_CHILD_LABEL 0x10
|
#define EDAMAGE_CHILD_LABEL 0x10
|
||||||
#define EDAMAGE_OVERLAY 0x20
|
#define EDAMAGE_OVERLAY 0x20
|
||||||
|
|
||||||
|
#define ICON_NORMAL 1 // .desktop file
|
||||||
|
#define ICON_TRASH 2 // trash.desktop (specific since have two icons for empty/full)
|
||||||
|
#define ICON_FILE 3 // real file
|
||||||
|
#define ICON_SYMLINK 4 // symbolic link
|
||||||
|
|
||||||
|
#define ICON_FACE_ONE 1 // use icon
|
||||||
|
#define ICON_FACE_TWO 2 // use icon2
|
||||||
|
|
||||||
|
|
||||||
struct GlobalIconSettings {
|
struct GlobalIconSettings {
|
||||||
int label_background;
|
int label_background;
|
||||||
int label_foreground;
|
int label_foreground;
|
||||||
@ -42,14 +51,6 @@ struct GlobalIconSettings {
|
|||||||
bool same_size;
|
bool same_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ICON_NORMAL 1 // .desktop file
|
|
||||||
#define ICON_TRASH 2 // trash.desktop (specific since have two icons for empty/full)
|
|
||||||
#define ICON_FILE 3 // real file
|
|
||||||
#define ICON_SYMLINK 4 // symbolic link
|
|
||||||
|
|
||||||
#define ICON_FACE_ONE 1 // use icon
|
|
||||||
#define ICON_FACE_TWO 2 // use icon2
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Settings representing related to icon on desktop. To complicate our lives
|
* Settings representing related to icon on desktop. To complicate our lives
|
||||||
* (and to, at least, simplify code) it can be:
|
* (and to, at least, simplify code) it can be:
|
||||||
@ -70,7 +71,7 @@ struct IconSettings {
|
|||||||
edelib::String full_path; // for tracking changes
|
edelib::String full_path; // for tracking changes
|
||||||
};
|
};
|
||||||
|
|
||||||
// Selection overlay
|
/* selection overlay */
|
||||||
struct SelectionOverlay {
|
struct SelectionOverlay {
|
||||||
int x, y, w, h;
|
int x, y, w, h;
|
||||||
bool show;
|
bool show;
|
||||||
@ -80,9 +81,10 @@ class Wallpaper;
|
|||||||
class DesktopIcon;
|
class DesktopIcon;
|
||||||
class Fl_Menu_Button;
|
class Fl_Menu_Button;
|
||||||
|
|
||||||
typedef edelib::list<DesktopIcon*> DesktopIconList;
|
typedef edelib::list<DesktopIcon*> DesktopIconList;
|
||||||
typedef edelib::list<DesktopIcon*>::iterator DesktopIconListIter;
|
typedef edelib::list<DesktopIcon*>::iterator DesktopIconListIter;
|
||||||
typedef edelib::list<edelib::String> StringList;
|
|
||||||
|
typedef edelib::list<edelib::String> StringList;
|
||||||
typedef edelib::list<edelib::String>::iterator StringListIter;
|
typedef edelib::list<edelib::String>::iterator StringListIter;
|
||||||
|
|
||||||
#ifdef USE_EDELIB_WINDOW
|
#ifdef USE_EDELIB_WINDOW
|
||||||
@ -119,10 +121,12 @@ private:
|
|||||||
bool read_desktop_file(const char* path, IconSettings& is);
|
bool read_desktop_file(const char* path, IconSettings& is);
|
||||||
|
|
||||||
void add_icon(DesktopIcon* ic);
|
void add_icon(DesktopIcon* ic);
|
||||||
|
|
||||||
bool add_icon_by_path(const char* path, edelib::Resource* conf);
|
bool add_icon_by_path(const char* path, edelib::Resource* conf);
|
||||||
DesktopIcon* find_icon_by_path(const char* path);
|
DesktopIcon* find_icon_by_path(const char* path, DesktopIconListIter* pos);
|
||||||
bool remove_icon_by_path(const char* path);
|
bool remove_icon_by_path(const char* path);
|
||||||
bool update_icon_by_path(const char* path);
|
|
||||||
|
void update_trash_icons(void);
|
||||||
|
|
||||||
void unfocus_all(void);
|
void unfocus_all(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user