⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desktop.c

📁 在ADS环境下MiniGUI的源码
💻 C
字号:
/* 
** $Id: desktop.c,v 1.74 2004/02/25 02:34:50 weiym Exp $
**
** desktop.c: The Desktop module.
**
** Copyright (C) 2003 Feynman Software.
** Copyright (C) 1999 ~ 2002 Wei Yongming.
**
** Current maintainer: Wei Yongming.
**
** Create date: 1999/04/19
*/

/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

/*
** TODO:
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "cliprect.h"
#include "gal.h"
#include "internals.h"
#include "ctrlclass.h"
#include "menu.h"
#include "timer.h"
#include "misc.h"

/******************************* global data *********************************/
RECT g_rcScr;

pthread_t __mg_desktop, __mg_parsor, __mg_timer;
HWND __mg_capture_wnd;
HWND __mg_ime_wnd;
MSGQUEUE __mg_dsk_msgs;
PMAINWIN __mg_active_mainwnd;
PTRACKMENUINFO __mg_ptmi;

/********************* Window management support *****************************/
static BLOCKHEAP sg_FreeInvRectList;
static BLOCKHEAP sg_FreeClipRectList;
static ZORDERINFO sg_MainWinZOrder;
static ZORDERINFO sg_TopMostWinZOrder;

static HWND sg_hCaretWnd;
static UINT sg_uCaretBTime;

static GCRINFO sg_ScrGCRInfo;

static BOOL InitWndManagementInfo (void)
{
#ifndef _INCORE_RES
    if (!InitMainWinMetrics())
        return FALSE;
#endif

    __mg_capture_wnd = HWND_DESKTOP;
    __mg_active_mainwnd = NULL;

    __mg_ptmi = NULL;

    __mg_ime_wnd = HWND_DESKTOP;
    sg_hCaretWnd = HWND_DESKTOP;

    g_rcScr.left = g_rcScr.top = 0;
    g_rcScr.right = GetGDCapability (HDC_SCREEN, GDCAP_MAXX) + 1;
    g_rcScr.bottom = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) + 1;

    InitClipRgn (&sg_ScrGCRInfo.crgn, &sg_FreeClipRectList);
    SetClipRgn (&sg_ScrGCRInfo.crgn, &g_rcScr);
    pthread_mutex_init (&sg_ScrGCRInfo.lock, NULL);
    sg_ScrGCRInfo.age = 0;

    return TRUE;
}

//#include "sysres.c"

static void InitZOrderInfo (PZORDERINFO pZOrderInfo, HWND hHost);

BOOL InitDesktop (void)
{
    /*
     * Init ZOrderInfo here.
     */
    InitZOrderInfo (&sg_MainWinZOrder, HWND_DESKTOP);
    InitZOrderInfo (&sg_TopMostWinZOrder, HWND_DESKTOP);
    
    /*
     * Init heap of clipping rects.
     */
    InitFreeClipRectList (&sg_FreeClipRectList, SIZE_CLIPRECTHEAP);

    /*
     * Init heap of invalid rects.
     */
    InitFreeClipRectList (&sg_FreeInvRectList, SIZE_INVRECTHEAP);

    /*
     * Load system resource here.
     */
    if (!InitSystemRes ()) {
        fprintf (stderr, "DESKTOP: Can not initialize system resource!\n");
        return FALSE;
    }

    // Init Window Management information.
    if (!InitWndManagementInfo()) {
        fprintf (stderr, "DESKTOP: Can not initialize window management information!\n");
        return FALSE;
    }

    return TRUE;
}

#include "desktop-comm.c"

#ifdef _TRACE_MSG

void* DesktopMain (void* data)
{
    MSG Msg;
    int iRet = 0;

    DesktopWinProc (HWND_DESKTOP, MSG_STARTSESSION, 0, 0);
    PostMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0, 0);

    sem_post ((sem_t*)data);

    while (GetMessage(&Msg, HWND_DESKTOP)) {
        fprintf (stderr, "Message, %s: hWnd: %#x, wP: %#x, lP: %#lx. %s\n",
            Message2Str (Msg.message),
            Msg.hwnd,
            Msg.wParam,
            Msg.lParam,
            Msg.pAdd?"Sync":"Normal");

        if ( Msg.pAdd ) // this is a sync message.
        {
#if 0
            PSYNCMSG pSyncMsg;

            pSyncMsg = (PSYNCMSG)(Msg.pAdd);
            fprintf (stderr, "pSyncMsg: %p\n", pSyncMsg);
            pSyncMsg->retval = DesktopWinProc(HWND_DESKTOP, 
                   Msg.message, Msg.wParam, Msg.lParam);
            sem_post(&pSyncMsg->sem_handle);
            iRet = pSyncMsg->retval;
#else
            
            iRet = DesktopWinProc(HWND_DESKTOP, 
                    Msg.message, Msg.wParam, Msg.lParam);
            fprintf (stderr, "return : %d\n", iRet);
            ((PSYNCMSG)(Msg.pAdd))->retval = iRet;
            sem_post (&((PSYNCMSG)(Msg.pAdd))->sem_handle);
#endif
        }
        else
            iRet = DesktopWinProc(HWND_DESKTOP, 
                    Msg.message, Msg.wParam, Msg.lParam);

        fprintf (stderr, "Message, %s done, return value: %#x\n",
            Message2Str (Msg.message), iRet);
    }

    return NULL;
}

#else

void* DesktopMain(void* data)
{
    MSG Msg;
    PSYNCMSG pSyncMsg;

    DesktopWinProc (HWND_DESKTOP, MSG_STARTSESSION, 0, 0);
    PostMessage (HWND_DESKTOP, MSG_ERASEDESKTOP, 0, 0);

    sem_post ((sem_t*)data);

    while (GetMessage(&Msg, HWND_DESKTOP)) {

        if ( Msg.pAdd ) // this is a sync message.
        {
            pSyncMsg = (PSYNCMSG)(Msg.pAdd);
            pSyncMsg->retval = DesktopWinProc(HWND_DESKTOP, 
                   Msg.message, Msg.wParam, Msg.lParam);
            sem_post(&pSyncMsg->sem_handle);
        }
        else
            DesktopWinProc(HWND_DESKTOP, Msg.message, Msg.wParam, Msg.lParam);
    }

    return NULL;
}

#endif

pthread_t GUIAPI GetMainWinThread(HWND hMainWnd)
{
    if(hMainWnd == HWND_DESKTOP) return __mg_desktop;

    return ((PMAINWIN)hMainWnd)->th;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -