/* * Copyright 2003, 2004 Martin Fuchs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // // Explorer clone // // globals.h // // Martin Fuchs, 23.07.2003 // #include "utility/xmlstorage.h" using namespace XMLStorage; #include "taskbar/favorites.h" /// management of file types struct FileTypeInfo { String _classname; String _displayname; bool _neverShowExt; }; struct FileTypeManager : public map { typedef map super; const FileTypeInfo& operator[](String ext); static bool is_exe_file(LPCTSTR ext); LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false); }; enum ICON_TYPE { IT_STATIC, IT_CACHED, IT_DYNAMIC, IT_SYSCACHE }; enum ICON_ID { ICID_UNKNOWN, ICID_NONE, ICID_FOLDER, //ICID_DOCUMENT, ICID_APP, ICID_EXPLORER, ICID_CONFIG, ICID_DOCUMENTS, ICID_FAVORITES, ICID_INFO, ICID_APPS, ICID_SEARCH, ICID_ACTION, ICID_SEARCH_DOC, ICID_PRINTER, ICID_NETWORK, ICID_COMPUTER, ICID_LOGOFF, ICID_SHUTDOWN, ICID_RESTART, ICID_BOOKMARK, ICID_MINIMIZE, ICID_CONTROLPAN, ICID_DESKSETTING, ICID_NETCONNS, ICID_ADMIN, ICID_RECENT, ICID_DYNAMIC }; struct Icon { Icon(); Icon(ICON_ID id, UINT nid); Icon(ICON_ID id, UINT nid, int icon_size); Icon(ICON_TYPE itype, int id, HICON hIcon); Icon(ICON_TYPE itype, int id, int sys_idx); operator ICON_ID() const {return _id;} void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const; HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const; int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const; int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;} HICON get_hicon() const {return _itype!=IT_SYSCACHE? _hicon: 0;} ICON_TYPE get_icontype() const { return _itype; } bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;} protected: ICON_ID _id; ICON_TYPE _itype; HICON _hicon; int _sys_idx; }; struct SysCacheIcon : public Icon { SysCacheIcon(int id, int sys_idx) : Icon(IT_SYSCACHE, id, sys_idx) {} }; struct IconCache { IconCache() : _himlSys_small(0) {} virtual ~IconCache(); void init(); const Icon& extract(LPCTSTR path, ICONCACHE_FLAGS flags=ICF_NORMAL); const Icon& extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); const Icon& extract(LPCITEMIDLIST pidl, ICONCACHE_FLAGS flags=ICF_NORMAL); const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC); const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/); const Icon& get_icon(int icon_id); HIMAGELIST get_sys_imagelist() const {return _himlSys_small;} void free_icon(int icon_id); protected: static int s_next_id; typedef map IconMap; IconMap _icons; typedef pair CacheKey; typedef map PathCacheMap; PathCacheMap _pathCache; typedef pair > IdxCacheKey; typedef map IdxCacheMap; IdxCacheMap _idxCache; typedef pair PidlCacheKey; typedef map PidlCacheMap; PidlCacheMap _pidlcache; HIMAGELIST _himlSys_small; }; #define ICON_SIZE_SMALL 16 // GetSystemMetrics(SM_CXSMICON) #define ICON_SIZE_MIDDLE 24 // special size for start menu root icons #define ICON_SIZE_LARGE 32 // GetSystemMetrics(SM_CXICON) #define STARTMENUROOT_ICON_SIZE ICON_SIZE_MIDDLE // ICON_SIZE_LARGE #define ICON_SIZE_FROM_ICF(flags) (flags&ICF_LARGE? ICON_SIZE_LARGE: flags&ICF_MIDDLE? ICON_SIZE_MIDDLE: ICON_SIZE_SMALL) #define ICF_FROM_ICON_SIZE(size) (size>=ICON_SIZE_LARGE? ICF_LARGE: size>=ICON_SIZE_MIDDLE? ICF_MIDDLE: (ICONCACHE_FLAGS)0) /// create a bitmap from an icon extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/); /// add icon with alpha channel to imagelist using the specified background color extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); /// retrieve icon from window extern HICON get_window_icon_small(HWND hwnd); extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); /// desktop management #ifdef _USE_HDESK typedef auto_ptr DesktopThreadPtr; struct Desktop { HDESK _hdesktop; // HWINSTA _hwinsta; DesktopThreadPtr _pThread; WindowHandle _hwndDesktop; Desktop(HDESK hdesktop=0/*, HWINSTA hwinsta=0*/); ~Desktop(); }; typedef auto_ptr DesktopPtr; typedef DesktopPtr DesktopRef; /// Thread class for additional desktops struct DesktopThread : public Thread { DesktopThread(Desktop& desktop) : _desktop(desktop) { } int Run(); protected: Desktop& _desktop; }; #else typedef pair MinimizeStruct; struct Desktop { set _windows; WindowHandle _hwndForeground; list _minimized; }; typedef Desktop DesktopRef; #endif #define DESKTOP_COUNT 4 struct Desktops : public vector { Desktops(); ~Desktops(); void init(); void SwitchToDesktop(int idx); void ToggleMinimize(); #ifdef _USE_HDESK DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];} #endif int _current_desktop; }; /// structure containing global variables of Explorer extern struct ExplorerGlobals { ExplorerGlobals(); void init(HINSTANCE hInstance); void read_persistent(); void write_persistent(); XMLPos get_cfg(); XMLPos get_cfg(const char* path); HINSTANCE _hInstance; UINT _cfStrFName; #ifndef ROSSHELL ATOM _hframeClass; HWND _hMainWnd; bool _desktop_mode; bool _prescan_nodes; #endif FILE* _log; #ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) DWORD(STDAPICALLTYPE* _SHRestricted)(RESTRICTIONS); #endif FileTypeManager _ftype_mgr; IconCache _icon_cache; HWND _hwndDesktopBar; HWND _hwndShellView; HWND _hwndDesktop; Desktops _desktops; XMLDoc _cfg; String _cfg_dir; String _cfg_path; Favorites _favorites; String _favorites_path; } g_Globals; /// convenient loading of string resources struct ResString : public String { ResString(UINT nid); }; /// convenient loading of standard (32x32) icon resources struct ResIcon { ResIcon(UINT nid); operator HICON() const {return _hicon;} protected: HICON _hicon; }; /// convenient loading of small (16x16) icon resources struct SmallIcon { SmallIcon(UINT nid); operator HICON() const {return _hicon;} protected: HICON _hicon; }; /// convenient loading of icon resources with specified sizes struct ResIconEx { ResIconEx(UINT nid, int w, int h); operator HICON() const {return _hicon;} protected: HICON _hicon; }; /// set big and small icons out of the resources for a window extern void SetWindowIcon(HWND hwnd, UINT nid); /// convenient loading of bitmap resources struct ResBitmap { ResBitmap(UINT nid); ~ResBitmap() {DeleteObject(_hBmp);} operator HBITMAP() const {return _hBmp;} protected: HBITMAP _hBmp; };