2006-08-20 22:43:09 +04:00
|
|
|
/*
|
|
|
|
* $Id$
|
|
|
|
*
|
2007-05-22 18:53:17 +04:00
|
|
|
* Eiconman, desktop and icon manager
|
2006-08-20 22:43:09 +04:00
|
|
|
* Part of Equinox Desktop Environment (EDE).
|
2007-05-22 18:53:17 +04:00
|
|
|
* Copyright (c) 2000-2007 EDE Authors.
|
2006-08-20 22:43:09 +04:00
|
|
|
*
|
2007-05-22 18:53:17 +04:00
|
|
|
* This program is licensed under terms of the
|
|
|
|
* GNU General Public License version 2 or newer.
|
2006-08-20 22:43:09 +04:00
|
|
|
* See COPYING for details.
|
|
|
|
*/
|
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
#ifndef __EICONMAN_H__
|
|
|
|
#define __EICONMAN_H__
|
2006-08-20 22:43:09 +04:00
|
|
|
|
2007-11-06 17:33:19 +03:00
|
|
|
#ifdef USE_EDELIB_WINDOW
|
|
|
|
#include <edelib/Window.h>
|
|
|
|
#else
|
2008-09-15 15:00:23 +04:00
|
|
|
#include <FL/Fl_Window.H>
|
|
|
|
#include <FL/Fl_Double_Window.H>
|
2007-11-06 17:33:19 +03:00
|
|
|
#endif
|
|
|
|
|
2008-09-15 15:00:23 +04:00
|
|
|
#include <FL/Fl_Image.H>
|
2007-06-18 18:18:35 +04:00
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
#include <edelib/String.h>
|
2008-08-07 18:22:05 +04:00
|
|
|
#include <edelib/Resource.h>
|
2007-09-03 16:26:58 +04:00
|
|
|
#include <edelib/List.h>
|
2008-04-07 19:35:02 +04:00
|
|
|
#include <edelib/EdbusConnection.h>
|
2006-08-20 22:43:09 +04:00
|
|
|
|
2007-06-26 20:33:25 +04:00
|
|
|
#define EDAMAGE_CHILD_LABEL 0x10
|
|
|
|
#define EDAMAGE_OVERLAY 0x20
|
2007-06-18 18:18:35 +04:00
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
struct DesktopSettings {
|
2007-05-24 16:53:03 +04:00
|
|
|
int color; // background color
|
|
|
|
bool wp_use; // use wallpaper or not
|
2007-05-22 18:53:17 +04:00
|
|
|
};
|
2006-08-20 22:43:09 +04:00
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
struct GlobalIconSettings {
|
|
|
|
int label_background;
|
|
|
|
int label_foreground;
|
|
|
|
int label_fontsize;
|
|
|
|
int label_maxwidth;
|
|
|
|
bool label_transparent;
|
|
|
|
bool label_draw;
|
|
|
|
bool one_click_exec;
|
2007-06-18 18:18:35 +04:00
|
|
|
bool auto_arrange;
|
2007-05-22 18:53:17 +04:00
|
|
|
bool same_size;
|
2006-08-20 22:43:09 +04:00
|
|
|
};
|
|
|
|
|
2007-05-25 21:45:17 +04:00
|
|
|
#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
|
|
|
|
|
2007-11-28 15:42:52 +03:00
|
|
|
#define ICON_FACE_ONE 1 // use icon
|
|
|
|
#define ICON_FACE_TWO 2 // use icon2
|
|
|
|
|
2007-05-25 21:45:17 +04:00
|
|
|
/*
|
|
|
|
* Settings representing related to icon on desktop. To complicate our lives
|
|
|
|
* (and to, at least, simplify code) it can be:
|
|
|
|
* - .desktop file content (normal or trash like)
|
|
|
|
* - real file copied/moved inside ~/Desktop directory
|
|
|
|
* - symlink in ~/Desktop directory pointing to the real file
|
|
|
|
*/
|
2007-05-22 18:53:17 +04:00
|
|
|
struct IconSettings {
|
2007-06-18 18:18:35 +04:00
|
|
|
int x, y;
|
|
|
|
int type; // ICON_NORMAL, ICON_TRASH,...
|
2007-05-25 21:45:17 +04:00
|
|
|
bool cmd_is_url; // interpret cmd as url, like system:/,trash:/,$HOME
|
2007-05-22 18:53:17 +04:00
|
|
|
|
|
|
|
edelib::String name;
|
|
|
|
edelib::String cmd;
|
|
|
|
edelib::String icon;
|
2007-05-25 21:45:17 +04:00
|
|
|
edelib::String icon2; // for stateable icons, like trash (empty/full)
|
|
|
|
edelib::String key_name; // name used as key when storing positions
|
2007-07-02 14:28:18 +04:00
|
|
|
edelib::String full_path; // for tracking changes
|
2007-05-22 18:53:17 +04:00
|
|
|
};
|
|
|
|
|
2007-06-25 13:20:49 +04:00
|
|
|
// Selection overlay
|
|
|
|
struct SelectionOverlay {
|
|
|
|
int x, y, w, h;
|
|
|
|
bool show;
|
|
|
|
};
|
|
|
|
|
2007-06-18 18:18:35 +04:00
|
|
|
class Wallpaper;
|
2007-05-22 18:53:17 +04:00
|
|
|
class DesktopIcon;
|
2007-07-02 14:28:18 +04:00
|
|
|
class Fl_Menu_Button;
|
|
|
|
|
2007-09-03 16:26:58 +04:00
|
|
|
typedef edelib::list<DesktopIcon*> DesktopIconList;
|
|
|
|
typedef edelib::list<DesktopIcon*>::iterator DesktopIconListIter;
|
2007-11-06 17:33:19 +03:00
|
|
|
typedef edelib::list<edelib::String> StringList;
|
|
|
|
typedef edelib::list<edelib::String>::iterator StringListIter;
|
2007-05-24 16:53:03 +04:00
|
|
|
|
2007-11-06 17:33:19 +03:00
|
|
|
#ifdef USE_EDELIB_WINDOW
|
|
|
|
#define DESKTOP_WINDOW edelib::Window
|
|
|
|
#else
|
|
|
|
#define DESKTOP_WINDOW Fl_Window
|
|
|
|
#endif
|
2007-06-25 13:20:49 +04:00
|
|
|
|
|
|
|
class Desktop : public DESKTOP_WINDOW {
|
2007-05-22 18:53:17 +04:00
|
|
|
private:
|
2007-05-24 16:53:03 +04:00
|
|
|
static Desktop* pinstance;
|
|
|
|
|
2007-06-18 18:18:35 +04:00
|
|
|
int selection_x, selection_y;
|
2007-05-22 18:53:17 +04:00
|
|
|
bool moving;
|
2007-09-03 16:26:58 +04:00
|
|
|
bool do_dirwatch;
|
2007-05-22 18:53:17 +04:00
|
|
|
|
2007-06-25 13:20:49 +04:00
|
|
|
SelectionOverlay* selbox;
|
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
GlobalIconSettings gisett;
|
2007-05-24 16:53:03 +04:00
|
|
|
DesktopSettings* dsett;
|
|
|
|
|
2008-04-07 19:35:02 +04:00
|
|
|
Fl_Menu_Button* dmenu;
|
|
|
|
Wallpaper* wallpaper;
|
|
|
|
edelib::EdbusConnection* dbus;
|
2007-06-18 18:18:35 +04:00
|
|
|
|
2007-05-24 16:53:03 +04:00
|
|
|
DesktopIconList icons;
|
|
|
|
DesktopIconList selectionbuff;
|
2007-05-22 18:53:17 +04:00
|
|
|
|
2007-11-28 15:42:52 +03:00
|
|
|
edelib::String trash_path;
|
|
|
|
|
2007-06-29 15:22:29 +04:00
|
|
|
void init_internals(void);
|
|
|
|
|
2007-11-06 17:33:19 +03:00
|
|
|
void load_icons(const char* path);
|
2008-08-10 21:49:38 +04:00
|
|
|
void save_icons_positions(void);
|
2007-05-25 21:45:17 +04:00
|
|
|
bool read_desktop_file(const char* path, IconSettings& is);
|
2007-05-22 18:53:17 +04:00
|
|
|
|
|
|
|
void add_icon(DesktopIcon* ic);
|
2008-08-10 21:49:38 +04:00
|
|
|
bool add_icon_by_path(const char* path, edelib::Resource* conf);
|
|
|
|
DesktopIcon* find_icon_by_path(const char* path);
|
|
|
|
bool remove_icon_by_path(const char* path);
|
|
|
|
bool update_icon_by_path(const char* path);
|
2007-06-18 18:18:35 +04:00
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
void unfocus_all(void);
|
|
|
|
|
2007-07-02 14:28:18 +04:00
|
|
|
void select(DesktopIcon* ic, bool do_redraw = true);
|
2007-05-22 18:53:17 +04:00
|
|
|
void select_only(DesktopIcon* ic);
|
|
|
|
bool in_selection(const DesktopIcon* ic);
|
|
|
|
void move_selection(int x, int y, bool apply);
|
|
|
|
|
2007-06-25 13:20:49 +04:00
|
|
|
void select_in_area(void);
|
|
|
|
|
2008-08-10 21:49:38 +04:00
|
|
|
void dnd_drop_source(const char* src, int src_len, int x, int y);
|
2007-06-23 15:31:36 +04:00
|
|
|
|
2007-07-02 14:28:18 +04:00
|
|
|
DesktopIcon* below_mouse(int px, int py);
|
2007-05-23 16:43:50 +04:00
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
public:
|
2007-06-18 18:18:35 +04:00
|
|
|
Desktop();
|
|
|
|
~Desktop();
|
|
|
|
|
|
|
|
virtual void show(void);
|
|
|
|
virtual void hide(void);
|
2007-06-25 13:20:49 +04:00
|
|
|
virtual void draw(void);
|
2007-06-18 18:18:35 +04:00
|
|
|
virtual int handle(int event);
|
|
|
|
|
2007-05-24 16:53:03 +04:00
|
|
|
static void init(void);
|
|
|
|
static void shutdown(void);
|
|
|
|
static Desktop* instance(void);
|
|
|
|
|
2007-05-22 18:53:17 +04:00
|
|
|
void read_config(void);
|
2007-05-24 16:53:03 +04:00
|
|
|
|
2007-06-18 18:18:35 +04:00
|
|
|
void update_workarea(void);
|
2007-07-02 14:28:18 +04:00
|
|
|
void area(int& X, int& Y, int& W, int& H) { X = x(); Y = y(); W = w(); H = h(); }
|
|
|
|
|
2007-06-18 18:18:35 +04:00
|
|
|
void set_bg_color(int c, bool do_redraw = true);
|
2007-05-24 16:53:03 +04:00
|
|
|
|
2007-06-19 13:59:15 +04:00
|
|
|
void notify_desktop_changed(void);
|
2007-09-03 16:26:58 +04:00
|
|
|
|
|
|
|
void dir_watch(const char* dir, const char* changed, int flags);
|
|
|
|
void dir_watch_on(void) { do_dirwatch = true; }
|
|
|
|
void dir_watch_off(void) { do_dirwatch = false; }
|
2007-11-06 17:33:19 +03:00
|
|
|
|
|
|
|
void execute(const char* cmd);
|
2007-05-22 18:53:17 +04:00
|
|
|
};
|
2006-08-20 22:43:09 +04:00
|
|
|
|
|
|
|
#endif
|