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

📄 accelkey.c

📁 在ecos 下mingui 的移植开发
💻 C
字号:
// $Id: accelkey.c,v 1.3 2000/06/20 01:36:29 weiym Exp $//// accelkey.c: The Accelerator module.//// Copyright (C) 1999, Kang Xiaoning.// Copyright (C) 1999, Wei Yongming.//// Current maintainer: Wei Yongming./***  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Library General Public**  License as published by the Free Software Foundation; either**  version 2 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**  Library General Public License for more details.****  You should have received a copy of the GNU Library 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*/// Create date: 1999.04.19//// Modify records:////  Who             When        Where       For What                Status//-----------------------------------------------------------------------------//// TODO:// #include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <semaphore.h>#include "common.h"#include "gdi.h"#include "window.h"#include "cliprect.h"#include "gal.h"#include "internals.h"#include "accelkey.h"#ifndef lintstatic char fileid[] = "$Id: accelkey.c,v 1.3 2000/06/20 01:36:29 weiym Exp $";#endifstatic FREEAILIST FreeAIList;static FREEACLIST FreeACList;// copy from menu.c :pp// acceltable construction static BOOL InitFreeACList(void){    if( !(FreeACList.heap = malloc (sizeof(ACCELTABLE)*SIZE_AC_HEAP)))         return FALSE;            FreeACList.free = 0;    pthread_mutex_init (&FreeACList.lock, NULL);    FreeACList.head = FreeACList.tail = NULL;    FreeACList.nr = 0;    return TRUE;}static PACCELTABLE AccelTableAlloc(void){    PACCELTABLE pac;    pthread_mutex_lock (&FreeACList.lock);    if (FreeACList.head) {        pac = FreeACList.head;        FreeACList.head = pac->next;        FreeACList.nr --;    }    else {        if (FreeACList.free < SIZE_AC_HEAP) {            pac = FreeACList.heap + FreeACList.free;            pac->fromheap = TRUE;            FreeACList.free ++;        }        else {            pac = malloc (sizeof(ACCELTABLE));            if (pac == NULL)                fprintf (stderr, "ACCELTBL error: alloc accel table failure!\n");            else                pac->fromheap = FALSE;        }    }    pthread_mutex_unlock (&FreeACList.lock);    return pac;}static void FreeAccelTable(PACCELTABLE pac){    pthread_mutex_lock (&FreeACList.lock);    pac->next = NULL;    if (FreeACList.head) {        FreeACList.tail->next = pac;        FreeACList.tail = pac;    }    else {        FreeACList.head = FreeACList.tail = pac;     }    FreeACList.nr++;    pthread_mutex_unlock (&FreeACList.lock);}static void EmptyFreeACList(void){    PACCELTABLE pac, pTemp;    pthread_mutex_lock (&FreeACList.lock);    pac = FreeACList.head;    while (pac) {        pTemp = pac->next;                if (!pac->fromheap)            free (pac);        pac = pTemp;    }    FreeACList.head = FreeACList.tail = NULL;    FreeACList.nr = 0;    FreeACList.free = 0;    pthread_mutex_unlock (&FreeACList.lock);}static void DestroyFreeACList(void){    EmptyFreeACList ();    free (FreeACList.heap);}// accelkey item routeline static BOOL InitFreeAIList(void){    if( !(FreeAIList.heap = malloc (sizeof(ACCELITEM)*SIZE_AI_HEAP)))         return FALSE;            FreeAIList.free = 0;    pthread_mutex_init (&FreeAIList.lock, NULL);    FreeAIList.head = FreeAIList.tail = NULL;    FreeAIList.nr = 0;    return TRUE;}static PACCELITEM AccelItemAlloc(void){    PACCELITEM pai;    pthread_mutex_lock (&FreeACList.lock);    if (FreeAIList.head) {        pai = FreeAIList.head;        FreeAIList.head = pai->next;        FreeAIList.nr --;    }    else {        if (FreeAIList.free < SIZE_AI_HEAP) {            pai = FreeAIList.heap + FreeAIList.free;            pai->fromheap = TRUE;            FreeAIList.free ++;        }        else {            pai = malloc (sizeof(ACCELITEM));            if (pai == NULL)                fprintf (stderr, "Accel item error: alloc accelkey item failure!\n");            else                pai->fromheap = FALSE;        }    }    pthread_mutex_unlock (&FreeAIList.lock);    return pai;}static void FreeAccelItem(ACCELITEM* pai){    pthread_mutex_lock (&FreeACList.lock);    pai->next = NULL;    if (FreeAIList.head) {        FreeAIList.tail->next = pai;        FreeAIList.tail = pai;    }    else {        FreeAIList.head = FreeAIList.tail = pai;    }    FreeAIList.nr++;    pthread_mutex_unlock (&FreeAIList.lock);}static void EmptyFreeAIList(void){    PACCELITEM pai, pTemp;    pthread_mutex_lock (&FreeACList.lock);    pai = FreeAIList.head;    while (pai) {        pTemp = pai->next;                if (!pai->fromheap)            free (pai);        pai = pTemp;    }    FreeAIList.head = FreeAIList.tail = NULL;    FreeAIList.nr = 0;    FreeAIList.free = 0;    pthread_mutex_unlock (&FreeAIList.lock);}static void DestroyFreeAIList(void){    EmptyFreeAIList ();    free (FreeAIList.heap);}DWORD mergeKeymask(DWORD keymask){   DWORD result = 0;   if (keymask & 3) result |= ACCEL_SHIFT;   if (keymask & 12) result |= ACCEL_ALT;   if (keymask & 48) result |= ACCEL_CTRL;   return result;}               BOOL InitAccel (void){    if (!InitFreeACList ()) return FALSE;    if (!InitFreeAIList ()) return FALSE;    return TRUE;}void TerminateAccel (void){     DestroyFreeACList ();    DestroyFreeAIList ();  }/*********  interfaces  ************************************/HACCEL GUIAPI LoadAccelerators(const char* filename, int id){    return 0;}HACCEL GUIAPI CreateAcceleratorTable (HWND hWnd){    PACCELTABLE pac;    if (!(pac = AccelTableAlloc ()))        return 0;        pac->class = TYPE_HACCEL;    pac->hwnd = hWnd;    pac->head = NULL;    return (HACCEL)pac;}int GUIAPI IsAccel (HACCEL hac){    PACCELTABLE pAcc = (PACCELTABLE)hac;    if (pAcc->class != TYPE_HACCEL) return 0;    return TRUE;}int GUIAPI DestroyAcceleratorTable (HACCEL hacc){    PACCELTABLE pac;    PACCELITEM pai, ptmpai;    pac = (PACCELTABLE) hacc;    if (pac->class != TYPE_HACCEL)        return ERR_INVALID_HANDLE;            pai = pac->head;    while (pai) {            ptmpai = pai->next;            FreeAccelItem (pai);            pai = ptmpai;        }     FreeAccelTable (pac);    return 0;}PACCELITEM *accFindMatchAccelKeys(HACCEL hacc, int key,DWORD keymask ){    PACCELITEM  pai;    PACCELTABLE pacc = (PACCELTABLE) hacc;    pai = pacc -> head;    if (pai)    {       if (pai -> key == key && pai -> keymask == keymask)            return &(pacc->head);       else while (pai -> next)       {	  if (pai -> next ->key == key && pai -> next -> keymask == keymask)	       return &(pai->next) ;	  pai = pai ->next;       }     }     return NULL;} int GUIAPI AddAccelerators (HACCEL hacc, int key,DWORD keymask, WPARAM wParam , LPARAM lParam){    PACCELTABLE pac;    PACCELITEM pnewai;    pac = (PACCELTABLE) hacc;    if (pac->class != TYPE_HACCEL)        return ERR_INVALID_HANDLE;     if (accFindMatchAccelKeys(hacc,key,mergeKeymask(keymask)))       return  ERR_ALREADY_EXIST;    if (!(pnewai = AccelItemAlloc ()))         return ERR_RES_ALLOCATION;    pnewai->key             = key;    pnewai->keymask         = mergeKeymask (keymask);    pnewai->wParam	    = wParam;      pnewai->lParam	    = lParam;    pnewai->next = pac    -> head ;    pac -> head  = pnewai ;    return 0;}int DeleteAccelerators(HACCEL hacc,int key, DWORD keymask) // key has the same meaning in accelitem struct{    PACCELTABLE pac;    PACCELITEM *ptempac;    PACCELITEM ptempac1;    pac = (PACCELTABLE) hacc;    if (pac -> class != TYPE_HACCEL)	return ERR_INVALID_HANDLE;    if (!(ptempac=accFindMatchAccelKeys(hacc,key, mergeKeymask(keymask))))	return ERR_NO_MATCH;    ptempac1= ((*ptempac)->next);    FreeAccelItem(*ptempac);    (*ptempac) = ptempac1;     return 0;  }HACCEL CopyAcceleratorTable(HACCEL hacc){	HACCEL hac;	PACCELTABLE pac = (PACCELTABLE)hacc;	PACCELITEM pai;	if ((hac = (HACCEL) CreateAcceleratorTable(pac->hwnd)))	{		pai = pac -> head;		while (pai)		{			if (AddAccelerators(hac,pai->key,pai->keymask,pai->wParam,pai->lParam)!=0)			   {			   	  DestroyAcceleratorTable(hac);			   	  return (HACCEL) NULL;			   }			pai = pai -> next;					}		return hac;			}	else return (HACCEL) NULL; }int GUIAPI TranslateAccelerator(HWND hWnd, HACCEL hAccel, PMSG pMsg){   PACCELTABLE pac;   PACCELITEM  *pai;   int key;   pac = (PACCELTABLE) hAccel;   if (pac -> hwnd != hWnd)      return ERR_BAD_OWNER;   if ( pMsg->message == MSG_KEYDOWN || pMsg->message == MSG_SYSKEYDOWN)       key = pMsg -> wParam | 256 ;   else  if ( pMsg->message == MSG_CHAR || pMsg->message == MSG_SYSCHAR)             key = pMsg -> wParam & 255;   else        return FALSE;   if ((pai=accFindMatchAccelKeys(hAccel,key, mergeKeymask(pMsg -> lParam))))   {       if (pMsg -> message == MSG_SYSKEYDOWN || pMsg -> message == MSG_SYSCHAR)           return  SendNotifyMessage(hWnd,                    MSG_SYSCOMMAND, (*pai) -> wParam, (*pai) -> lParam);       else            return SendNotifyMessage(hWnd,                     MSG_COMMAND, (*pai) -> wParam , (*pai) -> lParam);   }   else         return FALSE;}

⌨️ 快捷键说明

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