Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends

NotifyArea Struct Reference

tray notification area aka "tray" More...

#include <traynotify.h>

Inheritance diagram for NotifyArea:
Inheritance graph
[legend]
Collaboration diagram for NotifyArea:
Collaboration graph
[legend]

List of all members.

Public Types

typedef Window super

Public Member Functions

 NotifyArea (HWND hwnd)
 ~NotifyArea ()
LRESULT ProcessTrayNotification (int notify_code, NOTIFYICONDATA *pnid)

Static Public Member Functions

static HWND Create (HWND hwndParent)

Protected Member Functions

LRESULT Init (LPCREATESTRUCT pcs)
LRESULT WndProc (UINT nmsg, WPARAM wparam, LPARAM lparam)
int Command (int id, int code)
int Notify (int id, NMHDR *pnmh)
void UpdateIcons ()
void Paint ()
void Refresh (bool do_refresh=false)
void CancelModes ()
NotifyIconSet::iterator IconHitTest (const POINT &pos)
 search for a icon at a given client coordinate position
bool DetermineHideState (NotifyInfo &entry)
void read_config ()
void write_config ()
void show_clock (bool flag)

Protected Attributes

WindowHandle _hwndClock
int _clock_width
ToolTip _tooltip
NotifyHook _hook
bool _show_hidden
bool _hide_inactive
bool _show_button
NotifyIconCfgList _cfg
map< HWND, String_window_modules
NotifyIconMap _icon_map
NotifyIconSet _sorted_icons
int _next_idx
size_t _last_icon_count

Friends

struct TrayNotifyDlg

Detailed Description

tray notification area aka "tray"

Definition at line 130 of file traynotify.h.


Member Typedef Documentation

Definition at line 132 of file traynotify.h.


Constructor & Destructor Documentation

NotifyArea::NotifyArea ( HWND  hwnd )

Definition at line 209 of file traynotify.cpp.

References _clock_width, _hide_inactive, _last_icon_count, _next_idx, _show_button, and _show_hidden.

 :  super(hwnd),
    _tooltip(hwnd)
{
    _next_idx = 0;
    _clock_width = 0;
    _last_icon_count = 0;
    _show_hidden = false;
    _hide_inactive = true;
    _show_button = true;
}
NotifyArea::~NotifyArea (  )

Definition at line 221 of file traynotify.cpp.

References WindowHandle::_hwnd, and write_config().

{
    KillTimer(_hwnd, 0);

    write_config();
}

Here is the call graph for this function:


Member Function Documentation

void NotifyArea::CancelModes (  ) [protected]

Reimplemented from Window.

Definition at line 579 of file traynotify.cpp.

References _sorted_icons.

Referenced by WndProc().

{
    PostMessage(HWND_BROADCAST, WM_CANCELMODE, 0, 0);

    for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it)
        PostMessage(it->_hWnd, WM_CANCELMODE, 0, 0);
}

Here is the caller graph for this function:

int NotifyArea::Command ( int  id,
int  code 
) [protected, virtual]

Reimplemented from Window.

Definition at line 518 of file traynotify.cpp.

References WindowHandle::_hwnd, _show_button, _show_hidden, Dialog::DoModal(), ID_CONFIG_NOTIFYAREA, ID_CONFIG_TIME, ID_SHOW_HIDDEN_ICONS, ID_SHOW_ICON_BUTTON, IDD_NOTIFYAREA, launch_cpanel(), Window::SendParent(), TEXT, UpdateIcons(), and WINDOW_CREATOR.

{
    switch(id) {
      case ID_SHOW_HIDDEN_ICONS:
        _show_hidden = !_show_hidden;
        UpdateIcons();
        break;

      case ID_SHOW_ICON_BUTTON:
        _show_button = !_show_button;
        UpdateIcons();
        break;

      case ID_CONFIG_NOTIFYAREA:
        Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), GetParent(_hwnd));
        break;

      case ID_CONFIG_TIME:
        launch_cpanel(_hwnd, TEXT("timedate.cpl"));
        break;

      default:
        SendParent(WM_COMMAND, MAKELONG(id,code), 0);
    }

    return 0;
}

Here is the call graph for this function:

HWND NotifyArea::Create ( HWND  hwndParent ) [static]

Definition at line 374 of file traynotify.cpp.

References CLASSNAME_TRAYNOTIFY, NOTIFYAREA_WIDTH_DEF, TITLE_TRAYNOTIFY, and WINDOW_CREATOR.

Referenced by show_clock().

{
    static BtnWindowClass wcTrayNotify(CLASSNAME_TRAYNOTIFY, CS_DBLCLKS);

    ClientRect clnt(hwndParent);

    return Window::Create(WINDOW_CREATOR(NotifyArea), WS_EX_STATICEDGE,
                            wcTrayNotify, TITLE_TRAYNOTIFY, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
                            clnt.right-(NOTIFYAREA_WIDTH_DEF+1), 1, NOTIFYAREA_WIDTH_DEF, clnt.bottom-2, hwndParent);
}

Here is the caller graph for this function:

bool NotifyArea::DetermineHideState ( NotifyInfo entry ) [protected]

Referenced by ProcessTrayNotification(), and Refresh().

Here is the caller graph for this function:

NotifyIconSet::iterator NotifyArea::IconHitTest ( const POINT &  pos ) [protected]

search for a icon at a given client coordinate position

Definition at line 802 of file traynotify.cpp.

References _show_button, _sorted_icons, NOTIFYICON_DIST, NOTIFYICON_SIZE, NOTIFYICON_X, and NOTIFYICON_Y.

Referenced by Notify(), and WndProc().

{
    if (pos.y<NOTIFYICON_Y || pos.y>=NOTIFYICON_Y+NOTIFYICON_SIZE)
        return _sorted_icons.end();

    NotifyIconSet::iterator it = _sorted_icons.begin();

    int x = NOTIFYICON_X;

    if (_show_button)
        x += NOTIFYICON_DIST;

    for(; it!=_sorted_icons.end(); ++it) {
        //NotifyInfo& entry = const_cast<NotifyInfo&>(*it); // Why does GCC 3.3 need this additional const_cast ?!

        if (pos.x>=x && pos.x<x+NOTIFYICON_SIZE)
            break;

        x += NOTIFYICON_DIST;
    }

    return it;
}

Here is the caller graph for this function:

LRESULT NotifyArea::Init ( LPCREATESTRUCT  pcs ) [protected, virtual]

Reimplemented from Window.

Definition at line 362 of file traynotify.cpp.

References WindowHandle::_hwnd, Window::Init(), and read_config().

{
    if (super::Init(pcs))
        return 1;

    read_config();

    SetTimer(_hwnd, 0, 1000, NULL);

    return 0;
}

Here is the call graph for this function:

int NotifyArea::Notify ( int  id,
NMHDR *  pnmh 
) [protected, virtual]

Reimplemented from Window.

Definition at line 546 of file traynotify.cpp.

References WindowHandle::_hwnd, _show_button, _show_hidden, _sorted_icons, NotifyIconConfig::_tipText, IconHitTest(), IDS_HIDE_ICONS, IDS_SHOW_HIDDEN_ICONS, NOTIFYICON_SIZE, NOTIFYICON_X, NOTIFYICON_Y, ScreenToClient(), and String::str().

{
    if (pnmh->code == TTN_GETDISPINFO) {
        LPNMTTDISPINFO pdi = (LPNMTTDISPINFO)pnmh;

        Point pt(GetMessagePos());
        ScreenToClient(_hwnd, &pt);

        if (_show_button &&
            pt.x>=NOTIFYICON_X && pt.x<NOTIFYICON_X+NOTIFYICON_SIZE &&
            pt.y>=NOTIFYICON_Y && pt.y<NOTIFYICON_Y+NOTIFYICON_SIZE)
        {
            static ResString sShowIcons(IDS_SHOW_HIDDEN_ICONS);
            static ResString sHideIcons(IDS_HIDE_ICONS);

            pdi->lpszText = (_show_hidden? sHideIcons: sShowIcons).str();
        } else {
            NotifyIconSet::iterator found = IconHitTest(pt);

            if (found != _sorted_icons.end()) {
                NotifyInfo& entry = const_cast<NotifyInfo&>(*found);    // Why does GCC 3.3 need this additional const_cast ?!

                 // enable multiline tooltips (break at CR/LF and for very long one-line strings)
                SendMessage(pnmh->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 400);

                pdi->lpszText = entry._tipText.str();
            }
        }
    }

    return 0;
}

Here is the call graph for this function:

void NotifyArea::Paint (  ) [protected]

Definition at line 710 of file traynotify.cpp.

References WindowHandle::_hwnd, _show_button, _show_hidden, _sorted_icons, IDI_NOTIFY_L, IDI_NOTIFY_R, NOTIFYICON_DIST, NOTIFYICON_SIZE, NOTIFYICON_X, and NOTIFYICON_Y.

Referenced by WndProc().

{
    BufferedPaintCanvas canvas(_hwnd);

     // first fill with the background color
    FillRect(canvas, &canvas.rcPaint, GetSysColorBrush(COLOR_BTNFACE));

     // draw icons
    int x = NOTIFYICON_X;
    int y = NOTIFYICON_Y;

    if (_show_button) {
        static SmallIcon leftArrowIcon(IDI_NOTIFY_L);
        static SmallIcon rightArrowIcon(IDI_NOTIFY_R);

        DrawIconEx(canvas, x, y, _show_hidden?rightArrowIcon:leftArrowIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);
        x += NOTIFYICON_DIST;
    }

#ifndef _NO_ALPHABLEND
    MemCanvas mem_dc;
    SelectedBitmap bmp(mem_dc, CreateCompatibleBitmap(canvas, NOTIFYICON_SIZE, NOTIFYICON_SIZE));
    RECT rect = {0, 0, NOTIFYICON_SIZE, NOTIFYICON_SIZE};
    BLENDFUNCTION blend = {AC_SRC_OVER, 0, 128, 0}; // 50 % visible
#endif

    for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) {
#ifndef _NO_ALPHABLEND
        if (it->_dwState & NIS_HIDDEN) {
            FillRect(mem_dc, &rect, GetSysColorBrush(COLOR_BTNFACE));
            DrawIconEx(mem_dc, 0, 0, it->_hIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);
            AlphaBlend(canvas, x, y, NOTIFYICON_SIZE, NOTIFYICON_SIZE, mem_dc, 0, 0, NOTIFYICON_SIZE, NOTIFYICON_SIZE, blend);
        } else
#endif
            DrawIconEx(canvas, x, y, it->_hIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);

        x += NOTIFYICON_DIST;
    }
}

Here is the caller graph for this function:

LRESULT NotifyArea::ProcessTrayNotification ( int  notify_code,
NOTIFYICONDATA *  pnid 
)

Todo:
This is a fix for Windows Task Manager.
Todo:
call only if really changes occurred

Definition at line 587 of file traynotify.cpp.

References NotifyInfo::_dwState, WindowHandle::_hwnd, _icon_map, NotifyInfo::_idx, NotifyIconConfig::_mode, _next_idx, DetermineHideState(), NotifyInfo::modify(), NIM_HIDE, and UpdateIcons().

{
    switch(notify_code) {
      case NIM_ADD:
      case NIM_MODIFY:
        if ((int)pnid->uID >= 0) {  ///@todo This is a fix for Windows Task Manager.
            NotifyInfo& entry = _icon_map[pnid];

             // a new entry?
            if (entry._idx == -1)
                entry._idx = ++_next_idx;
        /* equivalent code using iterator::find();
            NotifyIconMap::iterator found = _icon_map.find(pnid);
            NotifyInfo* pentry;
             // a new entry?
            if (found == _icon_map.end()) {
                pentry = &_icon_map[pnid];
                pentry->_idx = ++_next_idx;
            } else {
                pentry = &found->second;
            }
            NotifyInfo& entry = *pentry;
        */
            bool changes = entry.modify(pnid);

#if NOTIFYICON_VERSION>=3   // as of 21.08.2003 missing in MinGW headers
            if (DetermineHideState(entry) && entry._mode==NIM_HIDE) {
                entry._dwState |= NIS_HIDDEN;
                changes = true;
            }
#endif

            if (changes)
                UpdateIcons();  ///@todo call only if really changes occurred

            return TRUE;
        }
        break;

      case NIM_DELETE: {
        NotifyIconMap::iterator found = _icon_map.find(pnid);

        if (found != _icon_map.end()) {
            if (found->second._hIcon)
                DestroyIcon(found->second._hIcon);
            _icon_map.erase(found);
            UpdateIcons();
            return TRUE;
        }
        break;}

#if NOTIFYICON_VERSION>=3   // as of 21.08.2003 missing in MinGW headers
      case NIM_SETFOCUS:
        SetForegroundWindow(_hwnd);
        return TRUE;

      case NIM_SETVERSION:
        NotifyIconMap::iterator found = _icon_map.find(pnid);

        if (found != _icon_map.end()) {
            found->second._version = pnid->UNION_MEMBER(uVersion);
            return TRUE;
        } else
            return FALSE;
#endif
    }

    return FALSE;
}

Here is the call graph for this function:

void NotifyArea::read_config (  ) [protected]

Todo:
read default setting from registry
Todo:
read default setting from registry

Definition at line 248 of file traynotify.cpp.

References _cfg, _hide_inactive, NotifyIconConfig::_mode, NotifyIconConfig::_modulePath, NotifyIconConfig::_name, _show_button, _show_hidden, NotifyIconConfig::_tipText, NotifyIconConfig::_windowTitle, XMLStorage::XMLPos::back(), XMLStorage::XMLChildrenFilter::begin(), XMLStorage::XMLChildrenFilter::end(), g_Globals, XMLStorage::XMLNode::get(), ExplorerGlobals::get_cfg(), XMLStorage::XMLPos::go_down(), NIM_HIDE, NIM_SHOW, and show_clock().

Referenced by Init(), and WndProc().

{
    bool clock_visible = true;

     // read notification icon settings from XML configuration
    XMLPos cfg_pos = g_Globals.get_cfg();

#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
    if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK))
#endif
    {
        if (cfg_pos.go_down("desktopbar")) {
            clock_visible = XMLBoolRef(XMLPos(cfg_pos,"options"), "show-clock", !get_hide_clock_from_registry());
            cfg_pos.back();
        }
    }

    if (cfg_pos.go_down("notify-icons")) {
        XMLPos options(cfg_pos, "options");

        _hide_inactive = XMLBool(options, "hide-inactive", true);   ///@todo read default setting from registry
        _show_hidden = XMLBool(options, "show-hidden", false);  ///@todo read default setting from registry
        _show_button = XMLBool(options, "show-button", true);

        XMLChildrenFilter icons(cfg_pos, "icon");

        for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) {
            const XMLNode& node = **it;

            NotifyIconConfig cfg;

            cfg._name = node.get("name").c_str();
            cfg._tipText = node.get("text").c_str();
            cfg._windowTitle = node.get("window").c_str();
            cfg._modulePath = node.get("module").c_str();
            const string& mode = node.get("show");

            if (mode == "show")
                cfg._mode = NIM_SHOW;
            else if (mode == "hide")
                cfg._mode = NIM_HIDE;
            else //if (mode == "auto")
                cfg._mode = NIM_HIDE;

            _cfg.push_back(cfg);
        }

        cfg_pos.back();
    }

    show_clock(clock_visible);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void NotifyArea::Refresh ( bool  do_refresh = false ) [protected]

Definition at line 750 of file traynotify.cpp.

References NotifyInfo::_dwState, _hide_inactive, NotifyIconIndex::_hWnd, _icon_map, NotifyInfo::_lastChange, NotifyIconConfig::_mode, _sorted_icons, DetermineHideState(), ICON_AUTOHIDE_SECONDS, NIM_AUTO, NIM_HIDE, NIM_SHOW, and UpdateIcons().

Referenced by WndProc().

{
     // Look for task icons without valid owner window.
     // This is an extended feature missing in MS Windows.
    for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) {
        const NotifyInfo& entry = *it;

        if (!IsWindow(entry._hWnd))
            if (_icon_map.erase(entry)) // delete icons without valid owner window
                ++update;
    }

    DWORD now = GetTickCount();

     // handle icon hiding
    for(NotifyIconMap::iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) {
        NotifyInfo& entry = it->second;

        DetermineHideState(entry);

        switch(entry._mode) {
          case NIM_HIDE:
            if (!(entry._dwState & NIS_HIDDEN)) {
                entry._dwState |= NIS_HIDDEN;
                ++update;
            }
            break;

          case NIM_SHOW:
            if (entry._dwState&NIS_HIDDEN) {
                entry._dwState &= ~NIS_HIDDEN;
                ++update;
            }
            break;

          case NIM_AUTO:
             // automatically hide icons after long periods of inactivity
            if (_hide_inactive)
                if (!(entry._dwState & NIS_HIDDEN))
                    if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) {
                        entry._dwState |= NIS_HIDDEN;
                        ++update;
                    }
            break;
        }
    }

    if (update)
        UpdateIcons();
}

Here is the call graph for this function:

Here is the caller graph for this function:

void NotifyArea::show_clock ( bool  flag ) [protected]

Definition at line 339 of file traynotify.cpp.

References _clock_width, WindowHandle::_hwnd, _hwndClock, Create(), and PM_RESIZE_CHILDREN.

Referenced by read_config().

{
    bool vis = _hwndClock!=0;

    if (vis != flag) {
        if (flag) {
             // create clock window
            _hwndClock = ClockWindow::Create(_hwnd);

            if (_hwndClock) {
                ClientRect clock_size(_hwndClock);
                _clock_width = clock_size.right;
            }
        } else {
            DestroyWindow(_hwndClock);
            _hwndClock = 0;
            _clock_width = 0;
        }

        SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void NotifyArea::UpdateIcons (  ) [protected]

Definition at line 657 of file traynotify.cpp.

References NotifyInfo::_dwState, WindowHandle::_hwnd, _icon_map, _last_icon_count, _show_button, _show_hidden, _sorted_icons, _tooltip, ToolTip::add(), NOTIFYICON_DIST, NOTIFYICON_SIZE, NOTIFYICON_X, NOTIFYICON_Y, PM_RESIZE_CHILDREN, and ToolTip::remove().

Referenced by Command(), ProcessTrayNotification(), Refresh(), and WndProc().

{
    _sorted_icons.clear();

     // sort icon infos by display index
    for(NotifyIconMap::const_iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) {
        const NotifyInfo& entry = it->second;

#ifdef NIF_STATE    // as of 21.08.2003 missing in MinGW headers
        if (_show_hidden || !(entry._dwState & NIS_HIDDEN))
#endif
            _sorted_icons.insert(entry);
    }

     // sync tooltip areas to current icon number
    if (_sorted_icons.size() != _last_icon_count) {
        RECT rect = {NOTIFYICON_X, NOTIFYICON_Y, NOTIFYICON_X+NOTIFYICON_SIZE, NOTIFYICON_Y+NOTIFYICON_SIZE};

        size_t tt_idx = 0;

        if (_show_button) {
            _tooltip.add(_hwnd, tt_idx++, rect);

            rect.left += NOTIFYICON_DIST;
            rect.right += NOTIFYICON_DIST;
        }

        size_t icon_cnt = _sorted_icons.size();
        while(tt_idx < icon_cnt) {
            _tooltip.add(_hwnd, tt_idx++, rect);

            rect.left += NOTIFYICON_DIST;
            rect.right += NOTIFYICON_DIST;
        }

        while(tt_idx < _last_icon_count)
            _tooltip.remove(_hwnd, tt_idx++);

        _last_icon_count = _sorted_icons.size();
    }

    SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);

    InvalidateRect(_hwnd, NULL, FALSE); // refresh icon display
    UpdateWindow(_hwnd);
}

Here is the call graph for this function:

Here is the caller graph for this function:

LRESULT NotifyArea::WndProc ( UINT  nmsg,
WPARAM  wparam,
LPARAM  lparam 
) [protected, virtual]

Reimplemented from Window.

Definition at line 385 of file traynotify.cpp.

References _clock_width, _hook, NotifyIconIndex::_hWnd, WindowHandle::_hwnd, _hwndClock, _icon_map, _show_button, _show_hidden, _sorted_icons, NotifyInfo::_uCallbackMessage, NotifyIconIndex::_uID, _window_modules, CancelModes(), GET_WINDOW, HWND, IconHitTest(), ID_SHOW_HIDDEN_ICONS, ID_SHOW_ICON_BUTTON, IDM_NOTIFYAREA, NotifyHook::ModulePathCopyData(), NOTIFYAREA_SPACE, NOTIFYICON_DIST, NOTIFYICON_SIZE, NOTIFYICON_X, NOTIFYICON_Y, Paint(), PM_GET_WIDTH, PM_REFRESH, PM_REFRESH_CONFIG, read_config(), Refresh(), ScreenToClient(), TEXT, ClockWindow::TimerTick(), PopupMenu::TrackPopupMenu(), UpdateIcons(), and Window::WndProc().

{
    switch(nmsg) {
      case WM_PAINT:
        Paint();
        break;

      case WM_TIMER: {
        Refresh();

        ClockWindow* clock_window = GET_WINDOW(ClockWindow, _hwndClock);

        if (clock_window)
            clock_window->TimerTick();
        break;}

      case PM_REFRESH:
        Refresh(true);
        break;

      case WM_SIZE: {
        int cx = LOWORD(lparam);
        SetWindowPos(_hwndClock, 0, cx-_clock_width, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
        break;}

      case PM_GET_WIDTH: {
        int w = _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width;
        if (_show_button)
            w += NOTIFYICON_DIST;
        return w;}

      case PM_REFRESH_CONFIG:
        read_config();
        break;

      case WM_CONTEXTMENU: {
        Point pt(lparam);
        POINTS p;
        p.x = (SHORT) pt.x;
        p.y = (SHORT) pt.y;
        ScreenToClient(_hwnd, &pt);

        if (IconHitTest(pt) == _sorted_icons.end()) { // display menu only when no icon clicked
            PopupMenu menu(IDM_NOTIFYAREA);
            SetMenuDefaultItem(menu, 0, MF_BYPOSITION);
            CheckMenuItem(menu, ID_SHOW_HIDDEN_ICONS, MF_BYCOMMAND|(_show_hidden?MF_CHECKED:MF_UNCHECKED));
            CheckMenuItem(menu, ID_SHOW_ICON_BUTTON, MF_BYCOMMAND|(_show_button?MF_CHECKED:MF_UNCHECKED));
            menu.TrackPopupMenu(_hwnd, p);
        }
        break;}

      case WM_COPYDATA: {   // receive NotifyHook answers
        String path;
        HWND hwnd;

        if (_hook.ModulePathCopyData(lparam, &hwnd, path))
            _window_modules[hwnd] = path;
        break;}

      default:
        if (nmsg>=WM_MOUSEFIRST && nmsg<=WM_MOUSELAST) {
             // close startup menu and other popup menus
             // This functionality is missing in MS Windows.
            if (nmsg==WM_LBUTTONDOWN || nmsg==WM_MBUTTONDOWN || nmsg==WM_RBUTTONDOWN
#ifdef WM_XBUTTONDOWN
                || nmsg==WM_XBUTTONDOWN
#endif
                )

                CancelModes();

            Point pt(lparam);
            NotifyIconSet::const_iterator found = IconHitTest(pt);

            if (found != _sorted_icons.end()) {
                const NotifyInfo& entry = const_cast<NotifyInfo&>(*found);  // Why does GCC 3.3 need this additional const_cast ?!

                 // set activation time stamp
                if (nmsg == WM_LBUTTONDOWN ||   // Some programs need PostMessage() instead of SendMessage().
                    nmsg == WM_MBUTTONDOWN ||   // So call SendMessage() only for BUTTONUP and BLCLK messages
#ifdef WM_XBUTTONDOWN
                    nmsg == WM_XBUTTONDOWN ||
#endif
                    nmsg == WM_RBUTTONDOWN) {
                    _icon_map[entry]._lastChange = GetTickCount();
                }

                 // Notify the message if the owner is still alive
                if (IsWindow(entry._hWnd)) {
                    if (nmsg == WM_MOUSEMOVE ||     // avoid to call blocking SendMessage() for merely moving the mouse over icons
                        nmsg == WM_LBUTTONDOWN ||   // Some programs need PostMessage() instead of SendMessage().
                        nmsg == WM_MBUTTONDOWN ||   // So call SendMessage() only for BUTTONUP and BLCLK messages
#ifdef WM_XBUTTONDOWN
                        nmsg == WM_XBUTTONDOWN ||
#endif
                        nmsg == WM_RBUTTONDOWN)
                        PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
                    else {
                         // allow SetForegroundWindow() in client process
                        DWORD pid;

                        if (GetWindowThreadProcessId(entry._hWnd, &pid)) {
                             // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98
                            static DynamicFct<BOOL(WINAPI*)(DWORD)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow");

                            if (AllowSetForegroundWindow)
                                (*AllowSetForegroundWindow)(pid);
                        }

                         // use PostMessage() for notifcation icons of Shell Service Objects in the own process
                        if (pid == GetCurrentProcessId())
                            PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
                        else
                            SendMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
                    }
                }
                else if (_icon_map.erase(entry))    // delete icons without valid owner window
                    UpdateIcons();
            } else
                 // handle clicks on notification area button "show hidden icons"
                if (_show_button)
                    if (nmsg == WM_LBUTTONDOWN)
                        if (pt.x>=NOTIFYICON_X && pt.x<NOTIFYICON_X+NOTIFYICON_SIZE &&
                            pt.y>=NOTIFYICON_Y && pt.y<NOTIFYICON_Y+NOTIFYICON_SIZE)
                            PostMessage(_hwnd, WM_COMMAND, MAKEWPARAM(ID_SHOW_HIDDEN_ICONS,0), 0);
        }

        return super::WndProc(nmsg, wparam, lparam);
    }

    return 0;
}

Here is the call graph for this function:

void NotifyArea::write_config (  ) [protected]

Definition at line 301 of file traynotify.cpp.

References _cfg, _hide_inactive, _hwndClock, NotifyIconConfig::_mode, NotifyIconConfig::_modulePath, NotifyIconConfig::_name, _show_button, _show_hidden, NotifyIconConfig::_tipText, NotifyIconConfig::_windowTitle, XMLStorage::XMLPos::back(), NotifyIconConfig::create_name(), g_Globals, ExplorerGlobals::get_cfg(), XMLStorage::XMLPos::smart_create(), and string_from_mode().

Referenced by ~NotifyArea().

{
     // write notification icon settings to XML configuration file
    XMLPos cfg_pos = g_Globals.get_cfg();

    cfg_pos.smart_create("desktopbar");
    XMLBoolRef boolRef(XMLPos(cfg_pos,"options"), "show-clock");
    boolRef = _hwndClock!=0;
    cfg_pos.back();

    cfg_pos.smart_create("notify-icons");

    XMLPos options(cfg_pos, "options");
    XMLBoolRef(options, "hide-inactive") = _hide_inactive;
    XMLBoolRef(options, "show-hidden") = _show_hidden;
    XMLBoolRef(options, "show-button") = _show_button;

    for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) {
        NotifyIconConfig& cfg = *it;

         // search for the corresponding node using the original name
        cfg_pos.smart_create("icon", "name", cfg._name);

         // refresh unique name
        cfg.create_name();

        cfg_pos["name"] = cfg._name.c_str();
        cfg_pos["text"] = cfg._tipText.c_str();
        cfg_pos["window"] = cfg._windowTitle.c_str();
        cfg_pos["module"] = cfg._modulePath.c_str();
        cfg_pos["show"] = string_from_mode(cfg._mode).c_str();

        cfg_pos.back();
    }

    cfg_pos.back(); // smart_create
}

Here is the call graph for this function:

Here is the caller graph for this function:


Friends And Related Function Documentation

friend struct TrayNotifyDlg [friend]

Definition at line 168 of file traynotify.h.


Member Data Documentation

int NotifyArea::_clock_width [protected]

Definition at line 143 of file traynotify.h.

Referenced by NotifyArea(), show_clock(), and WndProc().

bool NotifyArea::_hide_inactive [protected]

Definition at line 149 of file traynotify.h.

Referenced by NotifyArea(), read_config(), Refresh(), and write_config().

Definition at line 146 of file traynotify.h.

Referenced by WndProc().

Definition at line 142 of file traynotify.h.

Referenced by show_clock(), WndProc(), and write_config().

size_t NotifyArea::_last_icon_count [protected]

Definition at line 177 of file traynotify.h.

Referenced by NotifyArea(), and UpdateIcons().

int NotifyArea::_next_idx [protected]

Definition at line 176 of file traynotify.h.

Referenced by NotifyArea(), and ProcessTrayNotification().

bool NotifyArea::_show_button [protected]
bool NotifyArea::_show_hidden [protected]

Definition at line 175 of file traynotify.h.

Referenced by CancelModes(), IconHitTest(), Notify(), Paint(), Refresh(), UpdateIcons(), and WndProc().

Definition at line 145 of file traynotify.h.

Referenced by UpdateIcons().

Definition at line 172 of file traynotify.h.

Referenced by WndProc().


The documentation for this struct was generated from the following files:

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage