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

DesktopBar Struct Reference

desktop bar window, also known as "system tray" More...

#include <desktopbar.h>

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

List of all members.

Public Types

typedef OwnerDrawParent< Windowsuper

Public Member Functions

 DesktopBar (HWND hwnd)
 ~DesktopBar ()

Static Public Member Functions

static HWND Create ()

Protected Member Functions

LRESULT Init (LPCREATESTRUCT pcs)
LRESULT WndProc (UINT nmsg, WPARAM wparam, LPARAM lparam)
int Notify (int id, NMHDR *pnmh)
int Command (int id, int code)
void Resize (int cx, int cy)
void ControlResize (WPARAM wparam, LPARAM lparam)
void RegisterHotkeys ()
void ProcessHotKey (int id_hotkey)
void ShowStartMenu ()
LRESULT ProcessCopyData (COPYDATASTRUCT *pcd)

Protected Attributes

RECT _work_area_org
int _taskbar_pos
WindowHandle _hwndTaskBar
WindowHandle _hwndNotify
WindowHandle _hwndQuickLaunch
WindowHandle _hwndrebar
WindowHandle _hwndStartButton
struct StartMenuRoot_startMenuRoot
const UINT WM_TASKBARCREATED

Detailed Description

desktop bar window, also known as "system tray"

Definition at line 68 of file desktopbar.h.


Member Typedef Documentation

Reimplemented from OwnerDrawParent< Window >.

Definition at line 80 of file desktopbar.h.


Constructor & Destructor Documentation

DesktopBar::DesktopBar ( HWND  hwnd )

Definition at line 42 of file desktopbar.cpp.

References _work_area_org, IDI_REACTOS, and SetWindowIcon().

 :  super(hwnd),
#ifdef __REACTOS__
    _trayIcon(hwnd, ID_TRAY_VOLUME)
#else
    WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED))
#endif
{
    SetWindowIcon(hwnd, IDI_REACTOS);

    SystemParametersInfo(SPI_GETWORKAREA, 0, &_work_area_org, 0);
}

Here is the call graph for this function:

DesktopBar::~DesktopBar (  )

Definition at line 55 of file desktopbar.cpp.

References _work_area_org.

{
     // restore work area to the previous size
    SystemParametersInfo(SPI_SETWORKAREA, 0, &_work_area_org, 0);
    PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETWORKAREA, 0);

     // exit application after destroying desktop window
    PostQuitMessage(0);
}

Member Function Documentation

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

Reimplemented from Window.

Definition at line 401 of file desktopbar.cpp.

References ExplorerGlobals::_desktops, WindowHandle::_hwnd, ExplorerGlobals::_hwndDesktop, _hwndQuickLaunch, explorer_about(), explorer_show_frame(), ExplorerPropertySheet(), g_Globals, ID_ABOUT_EXPLORER, ID_DESKTOPBAR_SETTINGS, ID_EXPLORE, ID_MINIMIZE_ALL, ID_SWITCH_DESKTOP_1, ID_TASKMGR, ID_TRAY_VOLUME, ID_VOLUME_PROPERTIES, IDC_START, launch_cpanel(), launch_file(), PM_UPDATE_DESKTOP, ShowStartMenu(), Desktops::SwitchToDesktop(), TEXT, and Desktops::ToggleMinimize().

{
    switch(id) {
      case IDC_START:
        ShowStartMenu();
        break;

      case ID_ABOUT_EXPLORER:
        explorer_about(g_Globals._hwndDesktop);
        break;

      case ID_DESKTOPBAR_SETTINGS:
        ExplorerPropertySheet(g_Globals._hwndDesktop);
        break;

      case ID_MINIMIZE_ALL:
        g_Globals._desktops.ToggleMinimize();
        break;

      case ID_EXPLORE:
        explorer_show_frame(SW_SHOWNORMAL);
        break;

      case ID_TASKMGR:
        launch_file(_hwnd, TEXT("taskmgr.exe"), SW_SHOWNORMAL);
        break;

      case ID_SWITCH_DESKTOP_1:
      case ID_SWITCH_DESKTOP_1+1:
      case ID_SWITCH_DESKTOP_1+2:
      case ID_SWITCH_DESKTOP_1+3: {
        int desktop_idx = id - ID_SWITCH_DESKTOP_1;

        g_Globals._desktops.SwitchToDesktop(desktop_idx);

        if (_hwndQuickLaunch)
            PostMessage(_hwndQuickLaunch, PM_UPDATE_DESKTOP, desktop_idx, 0);
        break;}

#ifdef __REACTOS__
      case ID_TRAY_VOLUME:
        launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL);    // launch volume control application
        break;

      case ID_VOLUME_PROPERTIES:
        launch_cpanel(_hwnd, TEXT("mmsys.cpl"));
        break;
#endif

      default:
        if (_hwndQuickLaunch)
            return SendMessage(_hwndQuickLaunch, WM_COMMAND, MAKEWPARAM(id,code), 0);
        else
            return 1;
    }

    return 0;
}

Here is the call graph for this function:

void DesktopBar::ControlResize ( WPARAM  wparam,
LPARAM  lparam 
) [protected]

Todo:
write code for taskbar being at sides or top.
Todo:
Taskbar is at the top of the screen
Todo:
Taskbar is at the left of the screen
Todo:
Taskbar is at the right of the screen

Definition at line 500 of file desktopbar.cpp.

References DESKTOPBARBAR_HEIGHT.

Referenced by WndProc().

{
    PRECT dragRect = (PRECT) lparam;
    //int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSystemMetrics(SM_CYSCREEN);

    ///@todo write code for taskbar being at sides or top.

    switch(wparam) {
      case WMSZ_BOTTOM: ///@todo Taskbar is at the top of the screen
        break;

      case WMSZ_TOP:    // Taskbar is at the bottom of the screen
        dragRect->top = screenHeight - (((screenHeight - dragRect->top) + DESKTOPBARBAR_HEIGHT/2) / DESKTOPBARBAR_HEIGHT) * DESKTOPBARBAR_HEIGHT;
        if (dragRect->top < screenHeight / 2)
            dragRect->top = screenHeight - (screenHeight/2 / DESKTOPBARBAR_HEIGHT * DESKTOPBARBAR_HEIGHT);
        else if (dragRect->top > screenHeight - 5)
            dragRect->top = screenHeight - 5;
        break;

      case WMSZ_RIGHT:  ///@todo Taskbar is at the left of the screen
        break;

      case WMSZ_LEFT:   ///@todo Taskbar is at the right of the screen
        break;
    }
}

Here is the caller graph for this function:

HWND DesktopBar::Create (  ) [static]

Definition at line 66 of file desktopbar.cpp.

References CLASSNAME_EXPLORERBAR, DESKTOPBARBAR_HEIGHT, TITLE_EXPLORERBAR, and WINDOW_CREATOR.

Referenced by Init().

{
    static BtnWindowClass wcDesktopBar(CLASSNAME_EXPLORERBAR);

    RECT rect;

    rect.left = -2; // hide left border
#ifdef TASKBAR_AT_TOP
    rect.top = -2;  // hide top border
#else
    rect.top = GetSystemMetrics(SM_CYSCREEN) - DESKTOPBARBAR_HEIGHT;
#endif
    rect.right = GetSystemMetrics(SM_CXSCREEN) + 2;
    rect.bottom = rect.top + DESKTOPBARBAR_HEIGHT + 2;

    return Window::Create(WINDOW_CREATOR(DesktopBar), WS_EX_PALETTEWINDOW,
                            wcDesktopBar, TITLE_EXPLORERBAR,
                            WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE,
                            rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 0);
}

Here is the caller graph for this function:

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

Reimplemented from Window.

Definition at line 88 of file desktopbar.cpp.

References ExplorerGlobals::_hInstance, WindowHandle::_hwnd, _hwndNotify, _hwndQuickLaunch, _hwndrebar, StartMenuRoot::_hwndStartButton, _hwndStartButton, _hwndTaskBar, _startMenuRoot, _taskbar_pos, StartMenuRoot::Create(), Create(), g_Globals, GET_WINDOW, HWND, IDC_START, IDS_START, IDW_QUICKLAUNCHBAR, IDW_TASKTOOLBAR, Window::Init(), RBBS_HIDETITLE, REBARBAND_HEIGHT, RegisterHotkeys(), STARTMENUROOT_ICON_SIZE, and WM_TASKBARCREATED.

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

     // create start button
    ResString start_str(IDS_START);
    WindowCanvas canvas(_hwnd);
    RECT rect = {0, 0};
    DrawText(canvas, start_str, -1, &rect, DT_SINGLELINE|DT_CALCRECT);
    int start_btn_width = rect.right+16+8;

    _taskbar_pos = start_btn_width + 6;

     // create "Start" button
    HWND hwndStart = Button(_hwnd, start_str, 1, 1, start_btn_width, REBARBAND_HEIGHT, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW);
    new StartButton(hwndStart);

    /* Save the handle to the window, needed for push-state handling */
    _hwndStartButton = hwndStart;

     // disable double clicks
    SetClassLong(hwndStart, GCL_STYLE, GetClassLong(hwndStart, GCL_STYLE) & ~CS_DBLCLKS);

     // create task bar
    _hwndTaskBar = TaskBar::Create(_hwnd);

#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
    if (!g_Globals._SHRestricted || !SHRestricted(REST_NOTRAYITEMSDISPLAY))
#endif
         // create tray notification area
        _hwndNotify = NotifyArea::Create(_hwnd);


     // notify all top level windows about the successfully created desktop bar
     //@@ Use SendMessage() instead of PostMessage() to avoid problems with delayed created shell service objects?
    PostMessage(HWND_BROADCAST, WM_TASKBARCREATED, 0, 0);


    _hwndQuickLaunch = QuickLaunchBar::Create(_hwnd);

     // create rebar window to manage task and quick launch bar
#ifndef _NO_REBAR
    _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,
                    WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
                    RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE|    //|RBS_REGISTERDROP
                    CCS_NODIVIDER|CCS_NOPARENTALIGN|CCS_TOP,
                    0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0);

    REBARBANDINFO rbBand;

    rbBand.cbSize = sizeof(REBARBANDINFO);
    rbBand.fMask  = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID|RBBIM_IDEALSIZE;
#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004
#define RBBS_HIDETITLE  0x400
#endif
    rbBand.cyChild = REBARBAND_HEIGHT;
    rbBand.cyMaxChild = (ULONG)-1;
    rbBand.cyMinChild = REBARBAND_HEIGHT;
    rbBand.cyIntegral = REBARBAND_HEIGHT + 3;   //@@ OK?
    rbBand.cxMinChild = rbBand.cyIntegral * 3;
    rbBand.fStyle = RBBS_VARIABLEHEIGHT|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;

    TCHAR QuickLaunchBand[] = _T("Quicklaunch");
    rbBand.lpText = QuickLaunchBand;
    rbBand.hwndChild = _hwndQuickLaunch;
    rbBand.cx = 250;
    rbBand.wID = IDW_QUICKLAUNCHBAR;
    SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);

    TCHAR TaskbarBand[] = _T("Taskbar");
    rbBand.lpText = TaskbarBand;
    rbBand.hwndChild = _hwndTaskBar;
    rbBand.cx = 200;    //pcs->cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1);
    rbBand.wID = IDW_TASKTOOLBAR;
    SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
#endif


    RegisterHotkeys();

     // prepare Startmenu, but hide it for now
    _startMenuRoot = GET_WINDOW(StartMenuRoot, StartMenuRoot::Create(_hwnd, STARTMENUROOT_ICON_SIZE));
    _startMenuRoot->_hwndStartButton = _hwndStartButton;

    return 0;
}

Here is the call graph for this function:

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

Reimplemented from Window.

Definition at line 352 of file desktopbar.cpp.

References IDW_TASKTOOLBAR.

{
    if (pnmh->code == RBN_CHILDSIZE) {
        /* align the task bands to the top, so it's in row with the Start button */
        NMREBARCHILDSIZE* childSize = (NMREBARCHILDSIZE*)pnmh;

        if (childSize->wID == IDW_TASKTOOLBAR) {
            int cy = childSize->rcChild.top - childSize->rcBand.top;

            if (cy) {
                childSize->rcChild.bottom -= cy;
                childSize->rcChild.top -= cy;
            }
        }
    }

    return 0;
}
LRESULT DesktopBar::ProcessCopyData ( COPYDATASTRUCT *  pcd ) [protected]

Definition at line 484 of file desktopbar.cpp.

References _hwndNotify, GET_WINDOW, TrayNotifyCDS::nicon_data, and TrayNotifyCDS::notify_code.

Referenced by WndProc().

{
     // Is this a tray notification message?
    if (pcd->dwData == 1) {
        TrayNotifyCDS* ptr = (TrayNotifyCDS*) pcd->lpData;

        NotifyArea* notify_area = GET_WINDOW(NotifyArea, _hwndNotify);

        if (notify_area)
            return notify_area->ProcessTrayNotification(ptr->notify_code, &ptr->nicon_data);
    }

    return FALSE;
}

Here is the caller graph for this function:

void DesktopBar::ProcessHotKey ( int  id_hotkey ) [protected]

Todo:
implement all common hotkeys

Definition at line 250 of file desktopbar.cpp.

References explorer_show_frame().

Referenced by WndProc().

{
    switch(id_hotkey) {
      case 0:   explorer_show_frame(SW_SHOWNORMAL);
        break;

        ///@todo implement all common hotkeys
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void DesktopBar::RegisterHotkeys (  ) [protected]

Todo:
register all common hotkeys

Definition at line 242 of file desktopbar.cpp.

References WindowHandle::_hwnd.

Referenced by Init().

{
     // register hotkey WIN+E opening explorer
    RegisterHotKey(_hwnd, 0, MOD_WIN, 'E');

        ///@todo register all common hotkeys
}

Here is the caller graph for this function:

void DesktopBar::Resize ( int  cx,
int  cy 
) [protected]

Todo:
general children resizing algorithm

Definition at line 371 of file desktopbar.cpp.

References WindowHandle::_hwnd, _hwndNotify, _hwndQuickLaunch, _hwndrebar, _hwndTaskBar, _taskbar_pos, and PM_GET_WIDTH.

Referenced by WndProc().

{
    ///@todo general children resizing algorithm
    int quicklaunch_width = SendMessage(_hwndQuickLaunch, PM_GET_WIDTH, 0, 0);
    int notifyarea_width = SendMessage(_hwndNotify, PM_GET_WIDTH, 0, 0);

    HDWP hdwp = BeginDeferWindowPos(3);

    if (_hwndrebar)
        DeferWindowPos(hdwp, _hwndrebar, 0, _taskbar_pos, 1, cx-_taskbar_pos-(notifyarea_width+1), cy-2, SWP_NOZORDER|SWP_NOACTIVATE);
    else {
        if (_hwndQuickLaunch)
            DeferWindowPos(hdwp, _hwndQuickLaunch, 0, _taskbar_pos, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE);

        if (_hwndTaskBar)
            DeferWindowPos(hdwp, _hwndTaskBar, 0, _taskbar_pos+quicklaunch_width, 0, cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE);
    }

    if (_hwndNotify)
        DeferWindowPos(hdwp, _hwndNotify, 0, cx-(notifyarea_width+1), 1, notifyarea_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE);

    EndDeferWindowPos(hdwp);

    WindowRect rect(_hwnd);
    RECT work_area = {0, 0, GetSystemMetrics(SM_CXSCREEN), rect.top};
    SystemParametersInfo(SPI_SETWORKAREA, 0, &work_area, 0);    // don't use SPIF_SENDCHANGE because then we have to wait for any message being delivered
    PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETWORKAREA, 0);
}

Here is the caller graph for this function:

void DesktopBar::ShowStartMenu (  ) [protected]

Definition at line 461 of file desktopbar.cpp.

References _hwndStartButton, _startMenuRoot, and StartMenuRoot::TrackStartmenu().

Referenced by Command(), and WndProc().

{
    if (_startMenuRoot)
    {
        // set the Button, if not set
        if (!Button_GetState(_hwndStartButton))
            Button_SetState(_hwndStartButton, TRUE);

        _startMenuRoot->TrackStartmenu();

        // StartMenu was closed, release button state
        Button_SetState(_hwndStartButton, false);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Todo:
read desktop bar settings

Reimplemented from OwnerDrawParent< Window >.

Definition at line 261 of file desktopbar.cpp.

References WindowHandle::_hwnd, _hwndNotify, _hwndTaskBar, ControlResize(), HWND, ID_TRAY_VOLUME, IDM_DESKTOPBAR, launch_file(), PM_GET_LAST_ACTIVE, PM_GET_NOTIFYAREA, PM_REFRESH_CONFIG, PM_RESIZE_CHILDREN, ProcessCopyData(), ProcessHotKey(), Resize(), ShowExitWindowsDialog(), ShowStartMenu(), TEXT, PopupMenu::TrackPopupMenu(), and OwnerDrawParent< Window >::WndProc().

{
    switch(nmsg) {
      case WM_NCHITTEST: {
        LRESULT res = super::WndProc(nmsg, wparam, lparam);

        if (res>=HTSIZEFIRST && res<=HTSIZELAST) {
#ifdef TASKBAR_AT_TOP
            if (res == HTBOTTOM)    // enable vertical resizing at the lower border
#else
            if (res == HTTOP)       // enable vertical resizing at the upper border
#endif
                return res;
            else
                return HTCLIENT;    // disable any other resizing
        }
        return res;}

      case WM_SYSCOMMAND:
        if ((wparam&0xFFF0) == SC_SIZE) {
#ifdef TASKBAR_AT_TOP
            if (wparam == SC_SIZE+6)// enable vertical resizing at the lower border
#else
            if (wparam == SC_SIZE+3)// enable vertical resizing at the upper border
#endif
                goto def;
            else
                return 0;           // disable any other resizing
        } else if (wparam == SC_TASKLIST)
            ShowStartMenu();
        goto def;

      case WM_SIZE:
        Resize(LOWORD(lparam), HIWORD(lparam));
        break;

      case WM_SIZING:
        ControlResize(wparam, lparam);
        break;

      case PM_RESIZE_CHILDREN: {
        ClientRect size(_hwnd);
        Resize(size.right, size.bottom);
        break;}

      case WM_CLOSE:
        ShowExitWindowsDialog(_hwnd);
        break;

      case WM_HOTKEY:
        ProcessHotKey(wparam);
        break;

      case WM_COPYDATA:
        return ProcessCopyData((COPYDATASTRUCT*)lparam);

      case WM_CONTEXTMENU: {
        POINTS p;
        p.x = LOWORD(lparam);
        p.y = HIWORD(lparam);
        PopupMenu menu(IDM_DESKTOPBAR);
        SetMenuDefaultItem(menu, 0, MF_BYPOSITION);
        menu.TrackPopupMenu(_hwnd, p);
        break;}

      case PM_GET_LAST_ACTIVE:
        if (_hwndTaskBar)
            return SendMessage(_hwndTaskBar, nmsg, wparam, lparam);
        break;

      case PM_REFRESH_CONFIG:   ///@todo read desktop bar settings
        SendMessage(_hwndNotify, PM_REFRESH_CONFIG, 0, 0);
        break;

      case WM_TIMER:
        if (wparam == ID_TRAY_VOLUME) {
            KillTimer(_hwnd, wparam);
            launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL, TEXT("-t"));    // launch volume control in small mode
        }
        break;

      case PM_GET_NOTIFYAREA:
        return (LRESULT)(HWND)_hwndNotify;

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

    return 0;
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 105 of file desktopbar.h.

Referenced by Init(), ProcessCopyData(), Resize(), and WndProc().

Definition at line 106 of file desktopbar.h.

Referenced by Command(), Init(), and Resize().

Definition at line 107 of file desktopbar.h.

Referenced by Init(), and Resize().

Definition at line 109 of file desktopbar.h.

Referenced by Init(), and ShowStartMenu().

Definition at line 104 of file desktopbar.h.

Referenced by Init(), Resize(), and WndProc().

Definition at line 111 of file desktopbar.h.

Referenced by Init(), and ShowStartMenu().

int DesktopBar::_taskbar_pos [protected]

Definition at line 90 of file desktopbar.h.

Referenced by Init(), and Resize().

RECT DesktopBar::_work_area_org [protected]

Definition at line 89 of file desktopbar.h.

Referenced by DesktopBar(), and ~DesktopBar().

const UINT DesktopBar::WM_TASKBARCREATED [protected]

Definition at line 120 of file desktopbar.h.

Referenced by Init().


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