From 6f8f9d1405f64ca8218a6b83b83e01e3ece3c9ea Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sun, 15 May 2011 15:17:43 +0000 Subject: added QuickMessages plugin added webOSD plugin git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@106 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- QuickMessages/Utils.c | 615 +++++++++++++++++++ QuickMessages/Utils.h | 78 +++ QuickMessages/icons/qicon.ico | Bin 0 -> 2038 bytes QuickMessages/main.c | 409 +++++++++++++ QuickMessages/options.c | 1169 ++++++++++++++++++++++++++++++++++++ QuickMessages/quickmessages.dsp | 301 ++++++++++ QuickMessages/quickmessages.dsw | 29 + QuickMessages/quickmessages.h | 93 +++ QuickMessages/quickmessages.rc | 234 ++++++++ QuickMessages/quickmessages.sln | 31 + QuickMessages/quickmessages.vcproj | 645 ++++++++++++++++++++ QuickMessages/resource.h | 47 ++ wbOSD/buildnumber.h | 6 + wbOSD/events.cpp | 218 +++++++ wbOSD/lpgen.pl | 212 +++++++ wbOSD/main.cpp | 105 ++++ wbOSD/options.cpp | 426 +++++++++++++ wbOSD/pack.cmd | 31 + wbOSD/readme | 84 +++ wbOSD/resource.h | 57 ++ wbOSD/wbOSD-translation.txt | 42 ++ wbOSD/wbOSD.cpp | 332 ++++++++++ wbOSD/wbOSD.dep | 24 + wbOSD/wbOSD.dsp | 200 ++++++ wbOSD/wbOSD.dsw | 29 + wbOSD/wbOSD.h | 144 +++++ wbOSD/wbOSD.mak | 336 +++++++++++ wbOSD/wbOSD.rc | 188 ++++++ wbOSD/wbOSD.vcproj | 191 ++++++ wbOSD/wbOSD_10.vcxproj | 182 ++++++ wbOSD/wbOSD_10.vcxproj.filters | 44 ++ wbOSD/wbOSD_9.vcproj | 423 +++++++++++++ 32 files changed, 6925 insertions(+) create mode 100644 QuickMessages/Utils.c create mode 100644 QuickMessages/Utils.h create mode 100644 QuickMessages/icons/qicon.ico create mode 100644 QuickMessages/main.c create mode 100644 QuickMessages/options.c create mode 100644 QuickMessages/quickmessages.dsp create mode 100644 QuickMessages/quickmessages.dsw create mode 100644 QuickMessages/quickmessages.h create mode 100644 QuickMessages/quickmessages.rc create mode 100644 QuickMessages/quickmessages.sln create mode 100644 QuickMessages/quickmessages.vcproj create mode 100644 QuickMessages/resource.h create mode 100644 wbOSD/buildnumber.h create mode 100644 wbOSD/events.cpp create mode 100644 wbOSD/lpgen.pl create mode 100644 wbOSD/main.cpp create mode 100644 wbOSD/options.cpp create mode 100644 wbOSD/pack.cmd create mode 100644 wbOSD/readme create mode 100644 wbOSD/resource.h create mode 100644 wbOSD/wbOSD-translation.txt create mode 100644 wbOSD/wbOSD.cpp create mode 100644 wbOSD/wbOSD.dep create mode 100644 wbOSD/wbOSD.dsp create mode 100644 wbOSD/wbOSD.dsw create mode 100644 wbOSD/wbOSD.h create mode 100644 wbOSD/wbOSD.mak create mode 100644 wbOSD/wbOSD.rc create mode 100644 wbOSD/wbOSD.vcproj create mode 100644 wbOSD/wbOSD_10.vcxproj create mode 100644 wbOSD/wbOSD_10.vcxproj.filters create mode 100644 wbOSD/wbOSD_9.vcproj diff --git a/QuickMessages/Utils.c b/QuickMessages/Utils.c new file mode 100644 index 0000000..da6ef4e --- /dev/null +++ b/QuickMessages/Utils.c @@ -0,0 +1,615 @@ +/* +Quick Messages plugin for Miranda IM + +Copyright (C) 2008 Danil Mozhar + +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 3 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, see . +*/ + +#include "quickmessages.h" + +ListData* ButtonsList[100]; + +SortedList* QuickList=NULL; + + +typedef void (*ItemDestuctor)(void*); + + +int sstSortButtons(const void * vmtbi1, const void * vmtbi2) + { + ButtonData * mtbi1=(ButtonData *)*((ButtonData ** )vmtbi1); + ButtonData * mtbi2=(ButtonData *)*((ButtonData ** )vmtbi2); + if (mtbi1==NULL || mtbi2==NULL) return (mtbi1-mtbi2); + return mtbi1->dwPos-mtbi2->dwPos; + } + +int sstQuickSortButtons(const void * vmtbi1, const void * vmtbi2) + { + QuickData * mtbi1=(QuickData *)*((QuickData ** )vmtbi1); + QuickData * mtbi2=(QuickData *)*((QuickData ** )vmtbi2); + if (mtbi1==NULL || mtbi2==NULL) return (mtbi1-mtbi2); + return mtbi1->dwPos-mtbi2->dwPos; + } + + +int sstOpSortButtons(const void * vmtbi1, const void * vmtbi2) + { + ButtonData * mtbi1=(ButtonData *)*((ButtonData ** )vmtbi1); + ButtonData * mtbi2=(ButtonData *)*((ButtonData ** )vmtbi2); + if (mtbi1==NULL || mtbi2==NULL) return (mtbi1-mtbi2); + return mtbi1->dwOPPos-mtbi2->dwOPPos; + } + + +void li_ListDestruct(SortedList *pList, ItemDestuctor pItemDestructor) + { + int i=0; + if (!pList) return; + for (i=0; irealCount; i++) pItemDestructor(pList->items[i]); + li.List_Destroy(pList); + mir_free(pList); + } + +void li_RemoveDestruct(SortedList *pList, int index, ItemDestuctor pItemDestructor) + { + if (index>=0 && indexrealCount) + { + pItemDestructor(pList->items[index]); + li.List_Remove(pList, index); + } + } + +void li_RemovePtrDestruct(SortedList *pList, void * ptr, ItemDestuctor pItemDestructor) + { + if (li.List_RemovePtr(pList, ptr)) + pItemDestructor(ptr); + } + +void li_SortList(SortedList *pList, FSortFunc pSortFunct) + { + FSortFunc pOldSort=pList->sortFunc; + int i; + if (!pSortFunct) pSortFunct=pOldSort; + pList->sortFunc=NULL; + for (i=0; irealCount-1; i++) + if (pOldSort(pList->items[i],pList->items[i+1])<0) + { + void * temp=pList->items[i]; + pList->items[i]=pList->items[i+1]; + pList->items[i+1]=temp; + i--; + if (i>0) i--; + } + pList->sortFunc=pOldSort; + } + +void li_ZeroQuickList(SortedList *pList) + { + int i; + for (i=0; irealCount; i++) + { + QuickData * qd=(QuickData *)pList->items[i]; + qd->dwPos=0; + qd->bIsService=0; + qd->ptszValue=NULL; + qd->ptszValueName=NULL; + li.List_Remove(pList, i); + i--; + } + } + +static void listdestructor(void * input) + { + ButtonData * cbdi=(ButtonData *)input; + + if(cbdi->pszName!=cbdi->pszOpName) + { + if(cbdi->pszOpName) + mir_free(cbdi->pszOpName); + if(cbdi->pszName) + mir_free(cbdi->pszName); + } + else if(cbdi->pszName) + mir_free(cbdi->pszName); + + if(cbdi->pszValue!=cbdi->pszOpValue) + { + if(cbdi->pszOpValue) + mir_free(cbdi->pszOpValue); + if(cbdi->pszValue) + mir_free(cbdi->pszValue); + } + else if(cbdi->pszValue) + mir_free(cbdi->pszValue); + + mir_free(cbdi); + } + +void RemoveMenuEntryNode(SortedList *pList, int index) + { + li_RemoveDestruct(pList,index,listdestructor); + } + +void DestroyButton(int listnum) + { + int i=listnum; + ListData* ld=ButtonsList[listnum]; + + if(ld->ptszButtonName) mir_free(ld->ptszButtonName); + + if(ld->ptszOPQValue!=ld->ptszQValue) + if(ld->ptszOPQValue) mir_free(ld->ptszOPQValue); + + if (ld->ptszQValue) mir_free(ld->ptszQValue); + + li_ListDestruct((SortedList*)ld->sl,listdestructor); + + + mir_free(ld); + ButtonsList[i]=NULL; + while(ButtonsList[i+1]) + { + ButtonsList[i]=ButtonsList[i+1]; + ButtonsList[i+1]=NULL; + i++; + } +} + + +void SaveModuleSettings(int buttonnum,ButtonData* bd) + { + char szMEntry[256]={'\0'}; + + mir_snprintf(szMEntry,255,"EntryName_%u_%u",buttonnum,bd->dwPos); + DBWriteContactSettingTString(NULL, PLGNAME,szMEntry,bd->pszName ); + + mir_snprintf(szMEntry,255,"EntryValue_%u_%u",buttonnum,bd->dwPos); + if(bd->pszValue) + DBWriteContactSettingTString(NULL, PLGNAME,szMEntry,bd->pszValue ); + else + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + + mir_snprintf(szMEntry,255,"EntryRel_%u_%u",buttonnum,bd->dwPos); + DBWriteContactSettingByte(NULL, PLGNAME,szMEntry,bd->fEntryType ); + + mir_snprintf(szMEntry,255,"EntryToQMenu_%u_%u",buttonnum,bd->dwPos); + DBWriteContactSettingByte(NULL, PLGNAME,szMEntry,bd->bInQMenu); + + mir_snprintf(szMEntry,255,"EntryIsServiceName_%u_%u",buttonnum,bd->dwPos); + DBWriteContactSettingByte(NULL, PLGNAME,szMEntry,bd->bIsServName); + } + +void CleanSettings(int buttonnum,int from) + { + char szMEntry[256]={'\0'}; + DBVARIANT dbv = {0}; + if(from==-1){ + mir_snprintf(szMEntry,255,"ButtonName_%u",buttonnum); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"ButtonValue_%u",buttonnum); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"RCEntryIsServiceName_%u",buttonnum); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + } + + mir_snprintf(szMEntry,255,"EntryName_%u_%u",buttonnum,from); + while(!DBGetContactSettingTString(NULL, PLGNAME,szMEntry,&dbv)){ + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"EntryValue_%u_%u",buttonnum,from); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"EntryRel_%u_%u",buttonnum,from); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"EntryToQMenu_%u_%u",buttonnum,from); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + mir_snprintf(szMEntry,255,"EntryIsServiceName_%u_%u",buttonnum,from); + DBDeleteContactSetting(NULL, PLGNAME,szMEntry); + + mir_snprintf(szMEntry,255,"EntryName_%u_%u",buttonnum,++from); + } + DBFreeVariant(&dbv); + } + +BYTE getEntryByte(int buttonnum,int entrynum,BOOL mode) + { + char szMEntry[256]={'\0'}; + if (mode==0) + mir_snprintf(szMEntry,255,"EntryToQMenu_%u_%u",buttonnum,entrynum); + else if (mode==1) + mir_snprintf(szMEntry,255,"EntryRel_%u_%u",buttonnum,entrynum); + else if (mode==2) + mir_snprintf(szMEntry,255,"EntryIsServiceName_%u_%u",buttonnum,entrynum); + else if (mode==3) + mir_snprintf(szMEntry,255,"RCEntryIsServiceName_%u",buttonnum); + return DBGetContactSettingByte(NULL, PLGNAME,szMEntry, 0); + } + +DWORD BalanceButtons(int buttonsWas,int buttonsNow) + { + if (ServiceExists(MS_BB_ADDBUTTON)) + { + BBButton bb={0}; + bb.cbSize=sizeof(BBButton); + bb.pszModuleName=PLGNAME; + + while(buttonsWas>(buttonsNow)) + { + bb.dwButtonID=--buttonsWas; + CallService(MS_BB_REMOVEBUTTON,0,(LPARAM)&bb); + } + while (buttonsWas<(buttonsNow)) + { + if (ServiceExists(MS_BB_ADDBUTTON)) + { + char iconname[20]={'\0'}; + mir_snprintf(iconname,SIZEOF(iconname),"QMessagesButton_%u",buttonsWas); + bb.bbbFlags=BBBF_ISIMBUTTON|BBBF_ISCHATBUTTON|BBBF_ISLSIDEBUTTON; + bb.dwButtonID=buttonsWas++; + bb.dwDefPos=300+buttonsWas; + bb.hIcon=(HANDLE)AddIcon(hIcon, iconname, iconname); + CallService(MS_BB_ADDBUTTON, 0, (LPARAM)&bb); + } + } + } + return buttonsNow; + } + + +void InitButtonsList() + { + int i,j,k=0; + QuickList=li.List_Create(0,1); + for(i=0;isl=li.List_Create(0,1); + ld->ptszQValue=ld->ptszOPQValue=getMenuEntry(i,0,2); + ld->ptszButtonName=pszBName; + ld->dwPos=ld->dwOPPos=i; + ld->dwOPFlags=0; + ld->bIsServName=ld->bIsOpServName=getEntryByte(i,0,3); + for(j=0;;j++) + { + TCHAR* pszEntry=NULL; + ButtonData *bd=NULL; + + if(!(pszEntry=getMenuEntry(i,j,0))) + break; + + bd=mir_alloc(sizeof(ButtonData)); + memset(bd,0,sizeof(ButtonData)); + + bd->dwPos=bd->dwOPPos=j; + bd->pszName=bd->pszOpName=pszEntry; + bd->pszValue=bd->pszOpValue=getMenuEntry(i,j,1); + bd->fEntryType=bd->fEntryOpType=getEntryByte(i,j,1); + bd->bInQMenu=bd->bOpInQMenu=getEntryByte(i,j,0); + bd->bIsServName=bd->bIsOpServName=getEntryByte(i,j,2); + if(bd->bInQMenu){ + QuickData* qd=mir_alloc(sizeof(QuickData)); + qd->dwPos=k++; + qd->ptszValue=bd->pszValue; + qd->ptszValueName=bd->pszName; + li.List_InsertPtr(QuickList,qd); + } + li.List_InsertPtr((SortedList*)ld->sl,bd); + } + } + + } + +void DestructButtonsList() +{ + int i=0; +// for ( i=0; i < g_iButtonsCount; i++ ) +while(ButtonsList[i]) + { + li_ListDestruct(ButtonsList[i]->sl,listdestructor); + mir_free(ButtonsList[i]->ptszButtonName); + if(ButtonsList[i]->ptszOPQValue!=ButtonsList[i]->ptszQValue) + if (ButtonsList[i]->ptszOPQValue) mir_free(ButtonsList[i]->ptszOPQValue); + if (ButtonsList[i]->ptszQValue) mir_free(ButtonsList[i]->ptszQValue); + i++; + } +if(QuickList) + { + li_ZeroQuickList(QuickList); + li.List_Destroy(QuickList); + } +} + +TCHAR* getMenuEntry(int buttonnum,int entrynum,BYTE mode) + { + TCHAR* buffer=NULL; + char szMEntry[256]={'\0'}; + DBVARIANT dbv = {0}; + + if(mode==0) + mir_snprintf(szMEntry,255,"EntryName_%u_%u",buttonnum,entrynum); + else if (mode==1) + mir_snprintf(szMEntry,255,"EntryValue_%u_%u",buttonnum,entrynum); + else if (mode==2) + mir_snprintf(szMEntry,255,"ButtonValue_%u",buttonnum); + else if (mode==3) + mir_snprintf(szMEntry,255,"ButtonName_%u",buttonnum); + + + DBGetContactSettingTString(NULL, PLGNAME,szMEntry, &dbv); + + if(dbv.ptszVal&&_tcslen(dbv.ptszVal)) + { + buffer=mir_tstrdup(dbv.ptszVal); + DBFreeVariant(&dbv); + } + + return buffer; + } + + +int AddIcon(HICON icon, char *name, char *description) + { + SKINICONDESC sid = {0}; + sid.cbSize = sizeof(SKINICONDESC); + sid.pszSection = "Quick Messages"; + sid.cx = sid.cy = 16; + sid.pszDescription = description; + sid.pszName = name; + sid.hDefaultIcon = icon; + + return CallService(MS_SKIN2_ADDICON, 0, (LPARAM) &sid); + } + +int RegisterCustomButton(WPARAM wParam,LPARAM lParam) + { + if (ServiceExists(MS_BB_ADDBUTTON)) + { + int i; + for(i=0;iptszButtonName; + CallService(MS_BB_ADDBUTTON, 0, (LPARAM)&bbd); + } + return 0; + } + return 1; + } + +TCHAR* ParseString(HANDLE hContact,TCHAR* ptszQValIn,TCHAR* ptszText,TCHAR* ptszClip,int QVSize,int TextSize ,int ClipSize) + { + int i=0,iOffset=0,iCount=0; + TCHAR* tempPointer=NULL; + TCHAR* ptszQValue=_tcsdup(ptszQValIn); + TCHAR* tempQValue=ptszQValue; + TCHAR varstr=_T('%'); + + if(TextSize&&ptszText[TextSize-1]=='\0') TextSize--; + if(ClipSize&&ptszClip[ClipSize-1]=='\0') ClipSize--; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + while(ptszQValue[i]) + { + if(ptszQValue[i]=='%'){ + switch(ptszQValue[i+1]) + { + case 't':{ + TCHAR* p=NULL; + p=realloc(tempQValue, (QVSize+TextSize+1)*sizeof(TCHAR)); + if(p){ + int test=0; + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+TextSize,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + + if(TextSize) memcpy(ptszQValue+i, ptszText, TextSize*sizeof(TCHAR)); + + QVSize+=(TextSize-2); + + ptszQValue[QVSize]='\0'; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=TextSize-1; + i=-1; + } + }break; + + case 'c':{ + TCHAR* p=NULL; + p=realloc(tempQValue, (QVSize+ClipSize+1)*sizeof(TCHAR)); + if(p){ + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+ClipSize,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + if(ClipSize) memcpy(ptszQValue+i, ptszClip, ClipSize*sizeof(TCHAR)); + QVSize+=(ClipSize-2); + + ptszQValue[QVSize]='\0'; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=ClipSize-1; + i=-1; + } + }break; + + case 'P':{ + TCHAR* p=NULL; + int NameLenght=0; + TCHAR* ptszName=NULL; +#ifdef _UNICODE + ptszName=mir_a2u((char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0)); +#else + ptszName=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); +#endif + NameLenght=_tcslen(ptszName); + + p=realloc(tempQValue, (QVSize+NameLenght+1)*sizeof(TCHAR)); + if(p){ + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+NameLenght,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + if(NameLenght) memcpy(ptszQValue+i, ptszName, NameLenght*sizeof(TCHAR)); + QVSize+=(NameLenght-2); + + ptszQValue[QVSize]='\0'; + if(ptszName) mir_free(ptszName); + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=NameLenght-1; + i=-1; + } + }break; + + case 'n':{ + TCHAR* p=NULL; + int NameLenght=0; + TCHAR* ptszName=NULL; + + ptszName=(TCHAR *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR); + NameLenght=_tcslen(ptszName); + p=realloc(tempQValue, (QVSize+NameLenght+1)*sizeof(TCHAR)); + if(p){ + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+NameLenght,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + if(NameLenght)memcpy(ptszQValue+i, ptszName, NameLenght*sizeof(TCHAR)); + QVSize+=(NameLenght-2); + + //if(ptszName) mir_free(ptszName); + + ptszQValue[QVSize]='\0'; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=NameLenght-1; + i=-1; + } + }break; + case 'F':{ + TCHAR* p=NULL; + int NameLenght=0; + TCHAR* ptszName=NULL; + CONTACTINFO ci; + ZeroMemory(&ci,sizeof(CONTACTINFO)); + ci.cbSize = sizeof(CONTACTINFO); + ci.hContact = hContact; +#ifdef UNICODE + ci.dwFlag =CNF_FIRSTNAME|CNF_UNICODE; +#else + ci.dwFlag =CNF_FIRSTNAME; +#endif + ci.szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); + if(!CallService(MS_CONTACT_GETCONTACTINFO,(WPARAM)0,(LPARAM)&ci)&&ci.pszVal){ + NameLenght=_tcslen(ci.pszVal); + ptszName=ci.pszVal; + } + p=realloc(tempQValue, (QVSize+NameLenght+1)*sizeof(TCHAR)); + if(p){ + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+NameLenght,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + if(NameLenght)memcpy(ptszQValue+i, ptszName, NameLenght*sizeof(TCHAR)); + QVSize+=(NameLenght-2); + + if(ptszName) mir_free(ptszName); + + ptszQValue[QVSize]='\0'; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=NameLenght-1; + i=-1; + } + }break; + case 'L':{ + TCHAR* p=NULL; + int NameLenght=0; + TCHAR* ptszName=NULL; + CONTACTINFO ci; + ZeroMemory(&ci,sizeof(CONTACTINFO)); + ci.cbSize = sizeof(CONTACTINFO); + ci.hContact = hContact; + ci.szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); +#ifdef UNICODE + ci.dwFlag =CNF_LASTNAME|CNF_UNICODE; +#else + ci.dwFlag =CNF_LASTNAME; +#endif + if(!CallService(MS_CONTACT_GETCONTACTINFO,(WPARAM)0,(LPARAM)&ci)&&ci.pszVal){ + NameLenght=_tcslen(ci.pszVal); + ptszName=ci.pszVal; + } + p=realloc(tempQValue, (QVSize+NameLenght+1)*sizeof(TCHAR)); + if(p){ + i=iOffset; + tempQValue=ptszQValue=p; + + tempPointer=memmove(ptszQValue+i+NameLenght,ptszQValue+i+2,(QVSize-i-1)*sizeof(TCHAR)); + if(NameLenght)memcpy(ptszQValue+i, ptszName, NameLenght*sizeof(TCHAR)); + QVSize+=(NameLenght-2); + + ptszQValue[QVSize]='\0'; + + if(!_tcschr(ptszQValue,varstr)) + return ptszQValue; + + ptszQValue=tempPointer; + iOffset+=NameLenght-1; + i=-1; + } + }break; + } + } + iOffset++; + i++; + } + return ptszQValue; + } \ No newline at end of file diff --git a/QuickMessages/Utils.h b/QuickMessages/Utils.h new file mode 100644 index 0000000..c136459 --- /dev/null +++ b/QuickMessages/Utils.h @@ -0,0 +1,78 @@ +/* +Quick Messages plugin for Miranda IM + +Copyright (C) 2008 Danil Mozhar + +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 3 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, see . +*/ +#define QMF_NEW (1<<0) +#define QMF_DELETNEEDED (1<<1) +#define QMF_RENAMED (1<<2) + +#define QMF_EX_CHILD (1<<0) +#define QMF_EX_SEPARATOR (1<<1) + +typedef struct _tagButtonData + { + DWORD dwPos; + DWORD dwOPPos; + BYTE fEntryType; + BYTE fEntryOpType; + BYTE bIsServName; + BYTE bIsOpServName; + BYTE bInQMenu; + BYTE bOpInQMenu; + DWORD dwOPFlags; + TCHAR *pszName; + TCHAR *pszValue; + TCHAR *pszOpValue; + TCHAR *pszOpName; + }ButtonData; + +typedef struct _tagListData + { + SortedList* sl; + DWORD dwPos; + DWORD dwOPPos; + TCHAR* ptszQValue; + TCHAR* ptszOPQValue; + TCHAR* ptszButtonName; + BYTE bIsServName; + BYTE bIsOpServName; + DWORD dwOPFlags; + }ListData; + +typedef struct _tagQuickData + { + DWORD dwPos; + BOOL bIsService; + BYTE fEntryType; + TCHAR* ptszValue; + TCHAR* ptszValueName; + }QuickData; + +void InitButtonsList(); +void DestructButtonsList(); +int sstSortButtons(const void * vmtbi1, const void * vmtbi2); +int sstOpSortButtons(const void * vmtbi1, const void * vmtbi2); +int sstQuickSortButtons(const void * vmtbi1, const void * vmtbi2); +void li_ZeroQuickList(SortedList *pList); +TCHAR* getMenuEntry(int entrynum,int buttonnum,BYTE mode) ; +int RegisterCustomButton(WPARAM wParam,LPARAM lParam); +void RemoveMenuEntryNode(SortedList *pList, int index); +void DestroyButton(int listnum); +void SaveModuleSettings(int buttonnum,ButtonData* bd); +void CleanSettings(int buttonnum,int from); +DWORD BalanceButtons(int buttonsWas,int buttonsNow); +TCHAR* ParseString(HANDLE hContact,TCHAR* ptszQValueIn,TCHAR* ptszText,TCHAR* ptszClip,int QVSize,int TextSize ,int ClipSize); \ No newline at end of file diff --git a/QuickMessages/icons/qicon.ico b/QuickMessages/icons/qicon.ico new file mode 100644 index 0000000..a46ae2b Binary files /dev/null and b/QuickMessages/icons/qicon.ico differ diff --git a/QuickMessages/main.c b/QuickMessages/main.c new file mode 100644 index 0000000..001aae9 --- /dev/null +++ b/QuickMessages/main.c @@ -0,0 +1,409 @@ +/* +Quick Messages plugin for Miranda IM + +Copyright (C) 2008 Danil Mozhar + +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 3 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, see . +*/ + +#include "quickmessages.h" + +HINSTANCE hinstance; + +WNDPROC mainProc; + +HANDLE hEventCBButtonPressed, hEventCBInit,hEventInputMenu, hEventDbOptionsInit, hEventDbPluginsLoaded, +hEventDbPreShutdown, hIcon ; + +int g_iButtonsCount=0; +int g_bShutDown=0; +int g_bStartup=0; +BOOL g_bRClickAuto=0; +BOOL g_bLClickAuto=0; +BOOL g_bQuickMenu=0; + +struct MM_INTERFACE mmi; +struct LIST_INTERFACE li; + +PLUGINLINK *pluginLink; + +PLUGININFOEX pluginInfo = { + sizeof(PLUGININFOEX), + MODULENAME, + PLUGIN_MAKE_VERSION(0,0,4,2), + "Plugin for quick insert pre-defined messages in message input area.", + "MaD_CLuSTeR", + "daniok@yandex.ru", + "© 2008 Danil Mozhar", + "http://miranda.radicaled.ru/index.php?plugin=3", + UNICODE_AWARE, + 0, +#ifdef _UNICODE + // {37ED754B-6CF9-40ed-9EB6-0FEF8E822475} + { 0x37ed754b, 0x6cf9, 0x40ed, { 0x9e, 0xb6, 0xf, 0xef, 0x8e, 0x82, 0x24, 0x75 } } +#else + // {A15C6605-75F3-4be2-9193-6D3DDD0A13B7} + { 0xa15c6605, 0x75f3, 0x4be2, { 0x91, 0x93, 0x6d, 0x3d, 0xdd, 0xa, 0x13, 0xb7 } } +#endif + }; + + +int PreShutdown(WPARAM wparam,LPARAM lparam) + { + g_bShutDown=1; + DestructButtonsList(); + + if(hEventCBButtonPressed) UnhookEvent(hEventCBButtonPressed); + if(hEventCBInit) UnhookEvent(hEventCBInit); + if(hEventInputMenu) UnhookEvent(hEventInputMenu); + UnhookEvent(hEventDbPluginsLoaded); + UnhookEvent(hEventDbOptionsInit); + UnhookEvent(hEventDbPreShutdown); + + return 0; + } +static int InputMenuPopup(WPARAM wParam,LPARAM lParam) + { + HMENU hSubMenu=NULL; + int i=0; + MessageWindowPopupData * mwpd = (MessageWindowPopupData *)lParam; + if(mwpd->uFlags==MSG_WINDOWPOPUP_LOG||!g_bQuickMenu||!QuickList->realCount) return 0; + + if(mwpd->uType==MSG_WINDOWPOPUP_SHOWING) + { + hSubMenu = CreatePopupMenu(); + + InsertMenu((HMENU)mwpd->hMenu,6,MF_STRING|MF_POPUP|MF_BYPOSITION,(UINT_PTR)hSubMenu,TranslateT("Quick Messages")); + InsertMenu((HMENU)mwpd->hMenu,7,MF_SEPARATOR|MF_BYPOSITION,0,0); + qsort(QuickList->items,QuickList->realCount,sizeof(QuickData *),sstQuickSortButtons); + for(i=0;irealCount;i++) + { + QuickData* qd= (QuickData *)QuickList->items[i]; + if(qd->fEntryType&QMF_EX_SEPARATOR) + AppendMenu(hSubMenu,MF_SEPARATOR,0,NULL); + else + AppendMenu(hSubMenu,MF_STRING,qd->dwPos+254,qd->ptszValueName); + } + } + else if(mwpd->uType==MSG_WINDOWPOPUP_SELECTED&&mwpd->selection>=254) + { + for(i=0;irealCount;i++) + { + QuickData* qd= (QuickData *)QuickList->items[i]; + if((qd->dwPos+254)==mwpd->selection) + { + CHARRANGE cr; + UINT textlenght=0; + TCHAR* pszText=NULL; + TCHAR* ptszQValue=NULL; + TCHAR* pszCBText=NULL; + BOOL bIsService=0; + + if(IsClipboardFormatAvailable(CF_TEXT)){ + if (OpenClipboard(mwpd->hwnd)){ + HANDLE hData=NULL; + TCHAR* chBuffer=NULL; + int textLength=0; +#ifdef _UNICODE + hData= GetClipboardData(CF_UNICODETEXT); +#else + hData = GetClipboardData(CF_TEXT); +#endif + chBuffer= (TCHAR*)GlobalLock(hData); + textLength=_tcslen(chBuffer); + pszCBText=mir_tstrdup(chBuffer); + GlobalUnlock(hData); + CloseClipboard(); + } + } + + SendMessage(mwpd->hwnd, EM_EXGETSEL, 0, (LPARAM)&cr); + textlenght=cr.cpMax-cr.cpMin; + + if(textlenght) + { + pszText=mir_alloc((textlenght+10)*sizeof(TCHAR)); + ZeroMemory(pszText,(textlenght+10)*sizeof(TCHAR)); + SendMessage(mwpd->hwnd,EM_GETSELTEXT, 0, (LPARAM)pszText); + } + if(qd->ptszValue){ + ptszQValue=ParseString(mwpd->hContact,qd->ptszValue,pszText?pszText:_T(""),pszCBText?pszCBText:_T(""),_tcslen(qd->ptszValue),textlenght,pszCBText?_tcslen(pszCBText):0); + if((bIsService=qd->bIsService)&&ptszQValue) +#ifdef _UNICODE + CallService(mir_u2a(ptszQValue),(WPARAM)mwpd->hContact,0); +#else + CallService(ptszQValue,(WPARAM)mwpd->hContact,0); +#endif + } + + if(ptszQValue) + SendMessage(mwpd->hwnd, EM_REPLACESEL, TRUE, (LPARAM)ptszQValue); + + if(pszText) mir_free(pszText); + if(ptszQValue) free(ptszQValue); + if(pszCBText) mir_free(pszCBText); + break; + } + } + return 1; + } + return 0; + } + +static int CustomButtonPressed(WPARAM wParam,LPARAM lParam) + { + CustomButtonClickData *cbcd=(CustomButtonClickData *)lParam; + + CHARRANGE cr; + HWND hEdit=NULL; + int i=0; + BOOL bCTRL=0; + BOOL bIsService=0; + TCHAR* pszText=NULL; + TCHAR* pszCBText=NULL; + TCHAR* pszFormatedText=NULL; + TCHAR* ptszQValue=NULL; + int cblenght=0,qvlenght=0; + int count=0,mode=0; + UINT textlenght=0; + BBButton bbd={0}; + SortedList* sl=NULL; + int state=0; + + if(strcmp(cbcd->pszModule,PLGNAME)) return 0; + + if(!ButtonsList[cbcd->dwButtonId]) return 1; + + sl=ButtonsList[cbcd->dwButtonId]->sl; + + if(!sl) return 1; + + if(IsClipboardFormatAvailable(CF_TEXT)){ + if (OpenClipboard(cbcd->hwndFrom)){ + HANDLE hData=NULL; + TCHAR* chBuffer=NULL; + int textLength=0; +#ifdef _UNICODE + hData= GetClipboardData(CF_UNICODETEXT); +#else + hData = GetClipboardData(CF_TEXT); +#endif + chBuffer= (TCHAR*)GlobalLock(hData); + textLength=_tcslen(chBuffer); + pszCBText=mir_tstrdup(chBuffer); + GlobalUnlock(hData); + CloseClipboard(); + } + } + + + + + qsort(sl->items,sl->realCount,sizeof(ButtonData *),sstSortButtons); + + hEdit=GetDlgItem(cbcd->hwndFrom,IDC_MESSAGE); + if(!hEdit) hEdit=GetDlgItem(cbcd->hwndFrom,IDC_CHATMESSAGE); + + cr.cpMin = cr.cpMax = 0; + SendMessage(hEdit, EM_EXGETSEL, 0, (LPARAM)&cr); + + textlenght=cr.cpMax-cr.cpMin; + if(textlenght) + { + pszText=mir_alloc((textlenght+10)*sizeof(TCHAR)); + ZeroMemory(pszText,(textlenght+10)*sizeof(TCHAR)); + SendMessage(hEdit,EM_GETSELTEXT, 0, (LPARAM)pszText); + } + + if(cbcd->flags&BBCF_RIGHTBUTTON) + state=1; + else if(sl->realCount==1) + state=2; + else + state=3; + + + switch(state) + { + case 1: + if(ButtonsList[cbcd->dwButtonId]->ptszQValue) + ptszQValue=ParseString(cbcd->hContact,ButtonsList[cbcd->dwButtonId]->ptszQValue,pszText?pszText:_T(""),pszCBText?pszCBText:_T(""),_tcslen(ButtonsList[cbcd->dwButtonId]->ptszQValue),textlenght,pszCBText?_tcslen(pszCBText):0); + if((bIsService=ButtonsList[cbcd->dwButtonId]->bIsServName)&&ptszQValue) +#ifdef _UNICODE + CallService(mir_u2a(ptszQValue),(WPARAM)cbcd->hContact,0); +#else + CallService(ptszQValue,(WPARAM)cbcd->hContact,0); +#endif + break; + case 2: + { + ButtonData * bd=NULL; + bd=(ButtonData *)sl->items[0]; + if(bd&&bd->pszValue){ + ptszQValue=ParseString(cbcd->hContact,bd->pszValue,pszText?pszText:_T(""),pszCBText?pszCBText:_T(""),_tcslen(bd->pszValue),textlenght,pszCBText?_tcslen(pszCBText):0); + if((bIsService=bd->bIsServName)&&ptszQValue) +#ifdef _UNICODE + CallService(mir_u2a(ptszQValue),(WPARAM)cbcd->hContact,0); +#else + CallService(ptszQValue,(WPARAM)cbcd->hContact,0); +#endif + } + } + break; + case 3:{ + int res=0; + int menunum; + ButtonData * bd=NULL; + HMENU hMenu=NULL,hSubMenu=NULL; + BOOL bSetPopUpMark=FALSE; + + if(g_iButtonsCount){ + hMenu = CreatePopupMenu(); + } + else break; + for(menunum=0;menunumrealCount;menunum++) + { + bd=(ButtonData *)sl->items[menunum]; + if(bd->dwOPFlags&QMF_NEW) + continue; + + bSetPopUpMark=FALSE; + if(bd->pszValue==0&&bd->fEntryType==0) + { + hSubMenu = CreatePopupMenu(); + bSetPopUpMark=TRUE; + } + + if(bd->pszValue&&bd->fEntryType==0) + hSubMenu=NULL; + + if(bd->fEntryType&QMF_EX_SEPARATOR) + AppendMenu((HMENU)((hSubMenu&&!bSetPopUpMark)?hSubMenu:hMenu),MF_SEPARATOR,0,NULL); + else + AppendMenu((HMENU)((hSubMenu&&!bSetPopUpMark)?hSubMenu:hMenu), + MF_STRING|(bSetPopUpMark?MF_POPUP:0), + (bSetPopUpMark?(UINT_PTR)hSubMenu:(menunum+1)), bd->pszName); + } + + res = TrackPopupMenu(hMenu, TPM_RETURNCMD, cbcd->pt.x, cbcd->pt.y, 0, cbcd->hwndFrom, NULL); + if(res==0) break; + + bd= (ButtonData *)sl->items[res-1]; + bCTRL=(GetKeyState(VK_CONTROL)&0x8000)?1:0; + if(bd->pszValue){ + ptszQValue=ParseString(cbcd->hContact,bd->pszValue,pszText?pszText:_T(""),pszCBText?pszCBText:_T(""),_tcslen(bd->pszValue),textlenght,pszCBText?_tcslen(pszCBText):0); + if((bIsService=bd->bIsServName)&&ptszQValue) +#ifdef _UNICODE + CallService(mir_u2a(ptszQValue),(WPARAM)cbcd->hContact,0); +#else + CallService(ptszQValue,(WPARAM)cbcd->hContact,0); +#endif + } + }break; + } + + + if(ptszQValue){ + if(!bIsService){ + SendMessage(hEdit, EM_REPLACESEL, TRUE, (LPARAM)ptszQValue); + + if((g_bLClickAuto&&state!=1)||(g_bRClickAuto&&state==1)||cbcd->flags&BBCF_CONTROLPRESSED||bCTRL) + SendMessage(cbcd->hwndFrom, WM_COMMAND,IDOK,0); + } + free(ptszQValue); + } + + + if(pszText) mir_free(pszText); + if(pszCBText) mir_free(pszCBText); + return 1; + } + + +static int PluginInit(WPARAM wparam,LPARAM lparam) + { + g_bStartup=1; + hEventDbOptionsInit=HookEvent(ME_OPT_INITIALISE,OptionsInit); + hEventCBButtonPressed=HookEvent(ME_MSG_BUTTONPRESSED,CustomButtonPressed); + hEventCBInit=HookEvent(ME_MSG_TOOLBARLOADED,RegisterCustomButton); + + hEventInputMenu=HookEvent(ME_MSG_WINDOWPOPUP,InputMenuPopup); + + + g_bRClickAuto=DBGetContactSettingByte(NULL,PLGNAME,"RClickAuto",0); + g_bLClickAuto=DBGetContactSettingByte(NULL,PLGNAME,"LClickAuto",0); + g_iButtonsCount=DBGetContactSettingByte(NULL, PLGNAME,"ButtonsCount", 0); + g_bQuickMenu=DBGetContactSettingByte(NULL, PLGNAME,"QuickMenu", 1); + + if(ServiceExists(MS_UPDATE_REGISTER)) { + char buffer[1024]; + Update update = {0}; + update.cbSize = sizeof(Update); + update.szComponentName = pluginInfo.shortName; + update.pbVersion = (BYTE *) CreateVersionString(pluginInfo.version, buffer); + update.cpbVersion = strlen((char *) update.pbVersion); + //update.szUpdateURL = UPDATER_AUTOREGISTER; + update.szBetaVersionURL = QMESSAGES_VERSION_URL; + update.szBetaUpdateURL = QMESSAGES_UPDATE_URL; + update.pbBetaVersionPrefix = (BYTE *) QMESSAGES_VERSION_PREFIX; + update.cpbBetaVersionPrefix = strlen(QMESSAGES_VERSION_PREFIX); + update.szBetaChangelogURL=QMESSAGES_CHAGELOG_URL; + CallService(MS_UPDATE_REGISTER, 0, (LPARAM) &update); + } + + hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(IDI_QICON)); + + InitButtonsList(); + + g_bStartup=0; + return 0; + } + + +// {651EAD6E-00C6-47e4-94A3-C63789ED89F9} +static const MUUID interfaces[] = {{ 0x651ead6e, 0xc6, 0x47e4, { 0x94, 0xa3, 0xc6, 0x37, 0x89, 0xed, 0x89, 0xf9 } }, MIID_LAST}; +const __declspec(dllexport) MUUID* MirandaPluginInterfaces(void){ + return interfaces;} + +__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) + { + + if (mirandaVersion < PLUGIN_MAKE_VERSION(0, 7, 0, 0)) + return NULL; + + return &pluginInfo; + } + +__declspec(dllexport)int Unload(void) + { + return 0; + } + +BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved) + { + hinstance=hinst; + return 1; + } + +int __declspec(dllexport)Load(PLUGINLINK *link) + { + + pluginLink=link; + mir_getMMI(&mmi); + mir_getLI(&li); + + hEventDbPluginsLoaded=HookEvent(ME_SYSTEM_MODULESLOADED,PluginInit); + hEventDbPreShutdown=HookEvent(ME_SYSTEM_PRESHUTDOWN,PreShutdown); + return 0; + } diff --git a/QuickMessages/options.c b/QuickMessages/options.c new file mode 100644 index 0000000..840f629 --- /dev/null +++ b/QuickMessages/options.c @@ -0,0 +1,1169 @@ +/* +Quick Messages plugin for Miranda IM + +Copyright (C) 2008 Danil Mozhar + +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 3 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, see . +*/ + +#include "quickmessages.h" + +static BOOL bOptionsInit; + +int g_iOPButtonsCount; +BOOL bNeedRestart=FALSE; +BOOL drag=FALSE,bOptionsInit=TRUE; +HANDLE hDragItem=NULL; +HANDLE hButtonsList=NULL; +HANDLE hMenuTree=NULL; +HWND hwndEdit=NULL; +WNDPROC oldEditProc=0, oldBNameProc=0, oldMNameProc=0; + +HWND g_opHdlg=NULL,g_varhelpDlg=NULL; + +BOOL CALLBACK HelpDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) + { + switch(msg){ + case WM_INITDIALOG:{ + LOGFONT logFont; + HFONT hFont; + RECT rc; + g_varhelpDlg=hdlg; + TranslateDialogDefault(hdlg); + hFont = (HFONT)SendMessage(GetDlgItem(hdlg, IDC_STATICTITLE), WM_GETFONT, 0, 0); + GetObject(hFont, sizeof logFont, &logFont); + logFont.lfWeight = FW_BOLD; + hFont = CreateFontIndirect(&logFont); + SendMessage(GetDlgItem(hdlg, IDC_STATICTITLE), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_STATICTITLE2), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARTEXT), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARCLIP), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARPUNAME), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARPLNAME), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARCNAME), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARCFNAME), WM_SETFONT, (WPARAM)hFont, 0); + SendMessage(GetDlgItem(hdlg, IDC_VARCLNAME), WM_SETFONT, (WPARAM)hFont, 0); + + GetWindowRect(g_opHdlg,&rc); + SetWindowPos(hdlg,0,rc.left,rc.top,0,0,SWP_SHOWWINDOW|SWP_NOSIZE); + }break; + + case WM_LBUTTONDOWN:{ + PostMessage( hdlg,WM_NCLBUTTONDOWN, HTCAPTION,lparam); + }break; + + case WM_CLOSE: + case WM_DESTROY: + DestroyWindow(g_varhelpDlg); + g_varhelpDlg=NULL; + break; + default: + return FALSE; + } + return TRUE; + } + +static LRESULT CALLBACK LabelEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) + { + switch (msg) { + case WM_GETDLGCODE: + return DLGC_WANTALLKEYS; + } + return CallWindowProc(oldEditProc, hwnd, msg, wParam, lParam); + } + +static LRESULT CALLBACK EditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) + { + HWND hParent=GetParent(hwnd); + switch (msg) { + case WM_GETDLGCODE: + return DLGC_WANTALLKEYS|DLGC_HASSETSEL; + case WM_SETFOCUS: + PostMessage(hwnd,EM_SETSEL,0,-1); + break; + case WM_KEYDOWN: + { + if(wParam==VK_RETURN) + if(hwnd==GetDlgItem(hParent,IDC_BUTTONNAME)) + SendMessage(hParent,WM_COMMAND,IDC_BLISTADD,0); + else + SendMessage(hParent,WM_COMMAND,IDC_MTREEADD,0); + }break; + } + if(hwnd==GetDlgItem(hParent,IDC_BUTTONNAME)) + return CallWindowProc(oldBNameProc, hwnd, msg, wParam, lParam); + else + return CallWindowProc(oldMNameProc, hwnd, msg, wParam, lParam); + } + +void SetMenuEntryProperties(HWND hdlg) + { + TVITEM tvi; + HTREEITEM hItem=NULL; + ButtonData* bd=NULL; + int pos=0; + + if(TreeView_GetCount(hButtonsList)&&(tvi.hItem=TreeView_GetSelection(hButtonsList))) + { + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + TreeView_GetItem(hButtonsList,&tvi); + + if (tvi.lParam) + { + ListData* ld = ( ListData* )tvi.lParam; + TCHAR szValue[256]; + GetWindowText(GetDlgItem(hdlg,IDC_RCLICKVALUE), szValue, sizeof(szValue)); + if(_tcslen(szValue)) + { + if(ld->ptszOPQValue&&(ld->ptszOPQValue!=ld->ptszQValue)) + mir_free(ld->ptszOPQValue); + ld->ptszOPQValue=mir_tstrdup(szValue); + } + ld->bIsOpServName=IsDlgButtonChecked(hdlg,IDC_ISSERVNAME2); + } + } + + tvi.hItem=NULL; + if(TreeView_GetCount(hMenuTree)&&(tvi.hItem=TreeView_GetSelection(hMenuTree))) + { + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + TreeView_GetItem(hMenuTree,&tvi); + + if (tvi.lParam) + { + ButtonData* bd = ( ButtonData* )tvi.lParam; + TCHAR szValue[256]; + GetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE), szValue, sizeof(szValue)); + if(_tcslen(szValue)) + { + if(_tcslen(bd->pszOpValue)&&(bd->pszOpValue!=bd->pszValue)) + mir_free(bd->pszOpValue); + bd->pszOpValue=mir_tstrdup(szValue); + } + bd->bOpInQMenu=IsDlgButtonChecked(hdlg,IDC_INQMENU); + bd->bIsOpServName=IsDlgButtonChecked(hdlg,IDC_ISSERVNAME); + } + + tvi.mask = TVIF_HANDLE | TVIF_PARAM; + tvi.hItem = TreeView_GetRoot(hMenuTree); + } + while (tvi.hItem) { + TreeView_GetItem(hMenuTree, &tvi); + bd= (ButtonData*)tvi.lParam; + + bd->dwOPPos=pos++; + + if(hItem=TreeView_GetChild(hMenuTree, tvi.hItem)){ + + bd->fEntryOpType&=~QMF_EX_CHILD; + + if(bd->pszOpValue){ + mir_free(bd->pszOpValue); + bd->pszOpValue=NULL; + } + tvi.hItem=hItem; + continue; + } + else + { + if(bd->fEntryOpType&QMF_EX_SEPARATOR){ + if(bd->pszOpValue){ + mir_free(bd->pszOpValue); + bd->pszOpValue=NULL; + }} + else + { + if(!bd->pszOpValue) + bd->pszOpValue=mir_tstrdup(_T("Enter Value")); + } + if(TreeView_GetParent(hMenuTree, tvi.hItem)) + bd->fEntryOpType|=QMF_EX_CHILD; + else bd->fEntryOpType&=~QMF_EX_CHILD; + + if(!(hItem=TreeView_GetNextSibling(hMenuTree, tvi.hItem))) + tvi.hItem=TreeView_GetNextSibling(hMenuTree, TreeView_GetParent(hMenuTree,tvi.hItem)); + else + tvi.hItem=hItem; + + } + } + } + +void SaveMenuTree(HWND hdlg) + { + int iBl=0,i=0,k=0; + int iBtd=g_iButtonsCount; + BOOL bDeleted=FALSE; + char szMEntry[256]={'\0'}; + TCHAR strbuf[256]; + HTREEITEM hti=NULL; + TVITEM tvi; + + g_iButtonsCount=TreeView_GetCount(hButtonsList); + + tvi.pszText = strbuf; + tvi.cchTextMax = 256; + tvi.mask=TVIF_HANDLE|TVIF_TEXT ; + tvi.hItem=TreeView_GetRoot(hButtonsList); + + TreeView_GetItem(hButtonsList,&tvi); + + li_ZeroQuickList(QuickList); + + BalanceButtons(iBtd,g_iButtonsCount); + + while(ButtonsList[iBl]) + { + SortedList * sl=NULL; + ListData* ld=ButtonsList[iBl]; + + if(!ld->sl) break; + + sl=ld->sl; + + if(ld->dwOPFlags&QMF_DELETNEEDED) + { + bDeleted=(ld->dwOPFlags&QMF_NEW)?FALSE:TRUE; + if(bDeleted) CleanSettings(ld->dwPos,-1); + DestroyButton(iBl); + continue; + } + if(ld->ptszQValue!=ld->ptszOPQValue) + { + if(ld->ptszQValue) + mir_free(ld->ptszQValue); + + ld->ptszQValue=(ld->ptszOPQValue)?ld->ptszOPQValue:NULL; + } + + if(ld->ptszButtonName) + mir_free(ld->ptszButtonName); + if(iBl>0) + if(hti=TreeView_GetNextSibling(hButtonsList,hti?hti:tvi.hItem)) + { + tvi.hItem=hti; + TreeView_GetItem(hButtonsList,&tvi); + } + + ld->ptszButtonName=mir_tstrdup(tvi.pszText); + + if(ld->ptszQValue) + { + mir_snprintf(szMEntry,255,"ButtonValue_%u",iBl); + DBWriteContactSettingTString(NULL, PLGNAME,szMEntry,ld->ptszQValue); + } + + + if (ServiceExists(MS_BB_MODIFYBUTTON)&&((ld->dwOPFlags&QMF_NEW)||(ld->dwOPFlags&QMF_RENAMED)||bDeleted)) + { + BBButton bb={0}; + bb.cbSize=sizeof(BBButton); + bb.pszModuleName=PLGNAME; + bb.dwButtonID=iBl; + bb.ptszTooltip=ld->ptszButtonName; + CallService(MS_BB_MODIFYBUTTON,0,(LPARAM)&bb); + } + + + mir_snprintf(szMEntry,255,"ButtonName_%u",iBl); + DBWriteContactSettingTString(NULL, PLGNAME,szMEntry,ld->ptszButtonName); + + ld->dwOPFlags=0; + ld->dwPos=iBl; + ld->bIsServName=ld->bIsOpServName; + mir_snprintf(szMEntry,255,"RCEntryIsServiceName_%u",iBl); + DBWriteContactSettingByte(NULL, PLGNAME,szMEntry,ld->bIsServName); + + bDeleted=FALSE; + + qsort(sl->items,sl->realCount,sizeof(ButtonData *),sstSortButtons); + + for ( i=0; i < sl->realCount; i++ ) { + ButtonData * bd= (ButtonData *)sl->items[i]; + + if(bd->dwOPFlags&QMF_DELETNEEDED){ + RemoveMenuEntryNode(sl, i--); + continue; + } + bd->bIsServName=bd->bIsOpServName; + bd->bInQMenu=bd->bOpInQMenu; + bd->dwPos=bd->dwOPPos; + bd->fEntryType=bd->fEntryOpType; + bd->dwOPFlags=0; + + if(bd->pszName!=bd->pszOpName) + { + if(bd->pszName) + mir_free(bd->pszName); + bd->pszName=bd->pszOpName?bd->pszOpName:NULL; + } + + if(bd->pszValue!=bd->pszOpValue) + { + if(bd->pszValue) + mir_free(bd->pszValue); + bd->pszValue=bd->pszOpValue?bd->pszOpValue:NULL; + } + if(bd->bInQMenu) + { + QuickData* qd=mir_alloc(sizeof(QuickData)); + qd->dwPos=k++; + qd->fEntryType=bd->fEntryType; + qd->bIsService=bd->bIsServName; + qd->ptszValue=bd->pszValue; + qd->ptszValueName=bd->pszName; + li.List_InsertPtr(QuickList,qd); + } + + SaveModuleSettings(iBl,bd); + } + CleanSettings(iBl,sl->realCount); + + iBl++; + } + + DBWriteContactSettingByte(NULL, PLGNAME,"ButtonsCount", (BYTE)g_iButtonsCount); + } + +void RestoreModuleData(HWND hdlg) + { + int iBl=0,i=0; + char szMEntry[256]={'\0'}; + while(ButtonsList[iBl]) + { + SortedList * sl=NULL; + ListData* ld=ButtonsList[iBl]; + + if(!(sl=ld->sl)) break; + + if(ld->dwOPFlags&QMF_NEW) + { + DestroyButton(iBl); + continue; + } + + if(ld->ptszQValue!=ld->ptszOPQValue) + { + if(ld->ptszOPQValue) + mir_free(ld->ptszOPQValue); + + ld->ptszOPQValue=(ld->ptszQValue)?ld->ptszQValue:NULL; + } + + ld->bIsOpServName=ld->bIsServName; + ld->dwOPFlags=0; + + qsort(sl->items,sl->realCount,sizeof(ButtonData *),sstSortButtons); + + for ( i=0; i < sl->realCount; i++ ) { + ButtonData * bd= (ButtonData *)sl->items[i]; + + if(bd->dwOPFlags&QMF_NEW){ + RemoveMenuEntryNode(sl, i--); + continue; + } + bd->bIsOpServName=bd->bIsServName; + bd->bOpInQMenu=bd->bInQMenu; + bd->dwOPPos=bd->dwPos; + bd->fEntryOpType=bd->fEntryType; + bd->dwOPFlags=0; + + if(bd->pszName!=bd->pszOpName) + { + if(bd->pszOpName) + mir_free(bd->pszOpName); + bd->pszOpName=bd->pszName?bd->pszName:NULL; + } + + if(bd->pszValue!=bd->pszOpValue) + { + if(bd->pszOpValue) + mir_free(bd->pszOpValue); + bd->pszOpValue=bd->pszValue?bd->pszValue:NULL; + } + } + iBl++; + } + } + +static int BuildMenuTree(HWND hToolBarTree,SortedList * sl) + { + TVINSERTSTRUCT tvis; + int i; + HTREEITEM hParent=NULL; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM | TVIF_TEXT; + + TreeView_DeleteAllItems( hToolBarTree ); + if (!sl) return 1; + + qsort(sl->items,sl->realCount,sizeof(ButtonData *),sstOpSortButtons); + + for ( i=0; i < sl->realCount; i++ ) { + ButtonData * bd= (ButtonData *)sl->items[i]; + + if(bd->dwOPFlags&QMF_DELETNEEDED) + continue; + + tvis.item.lParam= (LPARAM) bd; + tvis.item.pszText= bd->pszOpName; + + if(bd->fEntryOpType==0) + tvis.hParent = NULL; + + hParent=TreeView_InsertItem( hToolBarTree, &tvis ); + if(tvis.hParent) TreeView_Expand( hMenuTree, tvis.hParent, TVE_EXPAND ); + if(!bd->pszOpValue&&bd->fEntryOpType==0) + { + tvis.hParent = hParent; + } +// else if(!(bd->fEntryOpType&QMF_EX_CHILD)) +// tvis.hParent = NULL; + } + + return 1; + } + +static int BuildButtonsList(HWND hToolBarTree) + { + TVINSERTSTRUCT tvis; + int i=0; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask =TVIF_PARAM | TVIF_TEXT; + + TreeView_DeleteAllItems( hToolBarTree ); + + //for(i=0;iptszButtonName; + + TreeView_InsertItem( hToolBarTree, &tvis ); + i++; + } + return 1; + } +/////////////////////////////////// +//From UserInfoEx by DeathAxe +// +void MoveItem( HTREEITEM hItem, HTREEITEM hInsertAfter, BOOLEAN bAsChild ) + { + TVINSERTSTRUCT tvis; + //TCHAR strbuf[128]; + HTREEITEM hParent, hChild, hNewItem; + + if( !hItem || !hInsertAfter ) + return; + if( hItem == hInsertAfter ) + return; + + switch( ( ULONG_PTR )hInsertAfter ) { + case TVI_ROOT: + case TVI_FIRST: + case TVI_LAST: + hParent = NULL; + bAsChild = FALSE; + break; + default: + hParent = TreeView_GetParent( hMenuTree, hInsertAfter ); + break; + } + // do not move a parent next to its own children! + if( hItem == hParent ) + return; + + // prepare the insert structure + { + TCHAR strbuf[128]; + tvis.item.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT; + + tvis.item.pszText=strbuf; + tvis.item.cchTextMax=sizeof(strbuf); + tvis.item.hItem=hItem; + TreeView_GetItem(hMenuTree,&tvis.item); + } + + // item should be inserted as the first child of an existing root item + if( bAsChild ) { + tvis.hParent = hInsertAfter; + tvis.hInsertAfter = ( bAsChild == 2 ) ? TVI_LAST : TVI_FIRST ; + } + // item should be inserted after an existing item + else { + tvis.hParent = hParent; + tvis.hInsertAfter = hInsertAfter; + } + // insert the item + if( !( hNewItem = TreeView_InsertItem( hMenuTree, &tvis ) ) ) + return; + + // move children + hInsertAfter = hNewItem; + while( hChild = TreeView_GetChild( hMenuTree, hItem ) ) { + MoveItem( hChild, hInsertAfter, 2 ); + } + // delete old tree + TreeView_DeleteItem( hMenuTree, hItem ); + + TreeView_SelectItem( hMenuTree, hNewItem ); + //TreeView_Expand( hMenuTree, hNewItem, TVE_EXPAND ); + } + + +/////// +BOOL CALLBACK OptionsProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) + { + switch(msg){ + case WM_INITDIALOG:{ + DWORD style; + g_opHdlg=hdlg; + bOptionsInit=TRUE; + TranslateDialogDefault(hdlg); + if(g_iButtonsCount!=DBGetContactSettingByte(NULL, PLGNAME,"ButtonsCount", 0)) + { + LOGFONT logFont; + HFONT hFont; + bNeedRestart=TRUE; + EnableWindow(GetDlgItem(hdlg,IDC_BUTTONSLIST),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_BLISTADD),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_BLISTREMOVE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_MENUTREE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_MTREEADD),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_MTREEREMOVE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_BUTTONNAME),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_MENUNAME),FALSE); + ShowWindow(GetDlgItem(hdlg,IDC_WARNING),SW_SHOW); + + hFont = (HFONT)SendMessage(GetDlgItem(hdlg, IDC_WARNING), WM_GETFONT, 0, 0); + GetObject(hFont, sizeof logFont, &logFont); + logFont.lfWeight = FW_BOLD; + hFont = CreateFontIndirect(&logFont); + SendMessage(GetDlgItem(hdlg, IDC_WARNING), WM_SETFONT, (WPARAM)hFont, 0); + break; + } + + g_iOPButtonsCount=g_iButtonsCount; + + hButtonsList=GetDlgItem(hdlg,IDC_BUTTONSLIST); + hMenuTree=GetDlgItem(hdlg,IDC_MENUTREE); + + style = GetWindowLong(hButtonsList,GWL_STYLE); + style |=TVS_NOHSCROLL; + SetWindowLong(hButtonsList,GWL_STYLE, style); + + style = GetWindowLong(hMenuTree,GWL_STYLE); + style |=TVS_NOHSCROLL; + SetWindowLong(hMenuTree,GWL_STYLE, style); + BuildButtonsList(hButtonsList); + + if(!TreeView_GetCount(hButtonsList)) EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); + + oldBNameProc = (WNDPROC) SetWindowLong(GetDlgItem(hdlg,IDC_BUTTONNAME), GWL_WNDPROC, (LONG) EditSubclassProc); + oldMNameProc = (WNDPROC) SetWindowLong(GetDlgItem(hdlg,IDC_MENUNAME) , GWL_WNDPROC, (LONG) EditSubclassProc); + + + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + CheckDlgButton(hdlg,IDC_RAUTOSEND,(g_bRClickAuto=DBGetContactSettingByte(NULL,PLGNAME,"RClickAuto",0))); + CheckDlgButton(hdlg,IDC_LAUTOSEND,(g_bLClickAuto=DBGetContactSettingByte(NULL,PLGNAME,"LClickAuto",0))); + CheckDlgButton(hdlg,IDC_ENABLEQUICKMENU,(g_bQuickMenu=DBGetContactSettingByte(NULL, PLGNAME,"QuickMenu", 1))); + + bOptionsInit=FALSE; + }break; + + case WM_LBUTTONUP: + if(drag) { + TVHITTESTINFO hti; + HTREEITEM htiAfter=NULL; + ButtonData* bd=NULL; + TVITEM tvi; + RECT rc; + BYTE height; + BOOLEAN bAsChild = FALSE; + + TreeView_SetInsertMark(hMenuTree, NULL, 0 ); + ReleaseCapture(); + SetCursor( LoadCursor( NULL, IDC_ARROW ) ); + + hti.pt.x = ( SHORT )LOWORD( lparam ); + hti.pt.y = ( SHORT )HIWORD( lparam ); + ClientToScreen(hdlg,&hti.pt); + ScreenToClient(hMenuTree,&hti.pt); + TreeView_HitTest( hMenuTree, &hti ); + + if(TreeView_GetParent(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) + break; + + if(TreeView_GetChild(hMenuTree,hti.hItem)&&TreeView_GetChild(hMenuTree,hDragItem)) + break; + + + if( hti.flags & TVHT_ABOVE ) { + htiAfter = TVI_FIRST; + } + else + if( hti.flags & ( TVHT_NOWHERE|TVHT_BELOW ) ) { + htiAfter = TVI_LAST; + } + else + if( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT ) ) { + // check where over the item, the pointer is + if( !TreeView_GetItemRect( hMenuTree, hti.hItem, &rc, FALSE ) ) { + drag=0; + break; + } + height = ( BYTE )( rc.bottom - rc.top ); + + if( hti.pt.y - ( height / 3 ) < rc.top ) { + HTREEITEM hItem = hti.hItem; + + if( !( hti.hItem = TreeView_GetPrevSibling( hMenuTree, hItem ) ) ) { + if( !( hti.hItem = TreeView_GetParent(hMenuTree, hItem ) )) + htiAfter = TVI_FIRST; + else + bAsChild = TRUE; + } + } + else + if( hti.pt.y + ( height / 3 ) <= rc.bottom ) { + bAsChild = TRUE; + } + } + + + if(TreeView_GetChild(hMenuTree,hDragItem)&&bAsChild) + break; + + + if(hti.hItem){ + tvi.hItem=hti.hItem; + tvi.mask=TVIF_PARAM |TVIF_HANDLE; + TreeView_GetItem(hMenuTree,&tvi); + if((bd=(ButtonData*)tvi.lParam)&&(bd->fEntryOpType&QMF_EX_SEPARATOR)) + bAsChild = FALSE; + } + + if(TreeView_GetParent(hMenuTree,hti.hItem)) + bAsChild = FALSE; + + + MoveItem( hDragItem, htiAfter?htiAfter:hti.hItem, bAsChild ); + SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + drag=0; + + } + break; + + /////////////////////////////////// + //From UserInfoEx by DeathAxe + // + case WM_MOUSEMOVE: + { + if (!drag) break; + { + TVHITTESTINFO hti; + + hti.pt.x=(short)LOWORD(lparam); + hti.pt.y=(short)HIWORD(lparam); + ClientToScreen(hdlg,&hti.pt); + ScreenToClient(hMenuTree,&hti.pt); + TreeView_HitTest(hMenuTree,&hti); + if( hti.flags & ( TVHT_ONITEM|TVHT_ONITEMRIGHT ) ) { + RECT rc; + BYTE height; + + if( TreeView_GetItemRect(hMenuTree, hti.hItem, &rc, FALSE ) ) { + height = ( BYTE )( rc.bottom - rc.top ); + + if( hti.pt.y - ( height / 3 ) < rc.top ) { + SetCursor( LoadCursor( NULL, IDC_ARROW ) ); + TreeView_SetInsertMark( hMenuTree, hti.hItem, 0 ); + } + else + if( hti.pt.y + ( height / 3 ) > rc.bottom ) { + SetCursor( LoadCursor( NULL, IDC_ARROW ) ); + TreeView_SetInsertMark( hMenuTree, hti.hItem, 1 ); + } + else { + TreeView_SetInsertMark( hMenuTree, NULL, 0 ); + SetCursor( LoadCursor( GetModuleHandle(NULL), MAKEINTRESOURCE( 183 ) ) ); + } + } + } + else { + if( hti.flags & TVHT_ABOVE ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEUP, 0 ), 0 ); + if( hti.flags & TVHT_BELOW ) SendMessage( hMenuTree, WM_VSCROLL, MAKEWPARAM( SB_LINEDOWN, 0 ), 0 ); + TreeView_SetInsertMark( hMenuTree, NULL, 0 ); + } + } + }break; + ///////////// + case WM_DESTROY: + if (g_varhelpDlg) + DestroyWindow(g_varhelpDlg); + g_varhelpDlg=NULL; + break; + + case WM_NOTIFY:{ + switch(((LPNMHDR)lparam)->idFrom) { + case 0:{ + if (((LPNMHDR)lparam)->code == PSN_APPLY ) { + if(!bNeedRestart){ + SetMenuEntryProperties(hdlg); + SaveMenuTree(hdlg); + } + DBWriteContactSettingByte(NULL,PLGNAME,"RClickAuto",(BYTE)(g_bRClickAuto=IsDlgButtonChecked(hdlg,IDC_RAUTOSEND))); + DBWriteContactSettingByte(NULL,PLGNAME,"LClickAuto",(BYTE)(g_bLClickAuto=IsDlgButtonChecked(hdlg,IDC_LAUTOSEND))); + DBWriteContactSettingByte(NULL,PLGNAME,"QuickMenu",(BYTE)(g_bQuickMenu=IsDlgButtonChecked(hdlg,IDC_ENABLEQUICKMENU))); + return 1; + } + else if (((LPNMHDR)lparam)->code == PSN_RESET ) { + if(!bNeedRestart) + RestoreModuleData(hdlg); + return 1; + } + } + break; + + case IDC_MENUTREE: + switch (((LPNMHDR)lparam)->code){ + + case TVN_KEYDOWN:{ + TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); + if ( pTVKeyDown->wVKey == VK_F2 ) + TreeView_EditLabel(hMenuTree,TreeView_GetSelection(hMenuTree)); + else if ( pTVKeyDown->wVKey == VK_DELETE ) + SendMessage(hdlg,WM_COMMAND,IDC_MTREEREMOVE,0); + }break; + + case TVN_BEGINLABELEDITA: + case TVN_BEGINLABELEDITW: + hwndEdit=TreeView_GetEditControl(hMenuTree); + oldEditProc = (WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) LabelEditSubclassProc); + break; + + case TVN_ENDLABELEDITA: + case TVN_ENDLABELEDITW: + { + TVITEM tvi; + ButtonData* bd=NULL; + TCHAR strbuf[256]; + TCHAR szLabel[256]; + + SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) oldEditProc); + + tvi.pszText = strbuf; + tvi.cchTextMax = sizeof(strbuf); + tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; + tvi.hItem=TreeView_GetSelection(hMenuTree); + TreeView_GetItem(hMenuTree,&tvi); + + GetWindowText(hwndEdit, szLabel, sizeof(szLabel)); + hwndEdit=NULL; + if(!_tcslen(szLabel)) break; + if (bd = (ButtonData*)tvi.lParam){ + if(!_tcscmp(szLabel,_T("---"))){ + if(TreeView_GetChild(hMenuTree,tvi.hItem)) + break; + else{ + bd->fEntryOpType=QMF_EX_SEPARATOR; + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + } + } + else { + bd->fEntryOpType&=~QMF_EX_SEPARATOR; + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); + } + + bd->pszOpName=mir_tstrdup(szLabel); + + tvi.pszText=szLabel; + TreeView_SetItem(hMenuTree, &tvi); + SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + } + }break; + + case NM_KILLFOCUS: + TreeView_EndEditLabelNow(hButtonsList, 1); + break; + + case TVN_BEGINDRAGA: + case TVN_BEGINDRAGW: + SetCapture(hdlg); + drag=1; + hDragItem=((LPNMTREEVIEW)lparam)->itemNew.hItem; + TreeView_SelectItem(hMenuTree,hDragItem); + break; + + case TVN_SELCHANGINGA: + case TVN_SELCHANGINGW: + { + TVITEM tvi; + HTREEITEM hti; + ButtonData* bd; + + hti=TreeView_GetSelection(hMenuTree); + + if (hti==NULL) + break; + + tvi.hItem=hti; + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + TreeView_GetItem(hMenuTree,&tvi); + + if (tvi.lParam == 0) + break; + + bd = ( ButtonData* )tvi.lParam; + if (bd) { + TCHAR szValue[256]; + GetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE), szValue, sizeof(szValue)); + if(_tcslen(szValue)) + { + if(bd->pszOpValue&&(bd->pszOpValue!=bd->pszValue)) + mir_free(bd->pszOpValue); + bd->pszOpValue=mir_tstrdup(szValue); + } + bd->bOpInQMenu=IsDlgButtonChecked(hdlg,IDC_INQMENU); + bd->bIsOpServName=IsDlgButtonChecked(hdlg,IDC_ISSERVNAME); + } + }break; + case TVN_SELCHANGEDA: + case TVN_SELCHANGEDW: + { + TVITEM tvi; + HTREEITEM hti; + ButtonData* bd=NULL; + + hti=TreeView_GetSelection(hMenuTree); + + if (hti==NULL) + break; + + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + + tvi.hItem=hti; + TreeView_GetItem(hMenuTree,&tvi); + + + bd = ( ButtonData* )tvi.lParam; + if (bd) { + if(!TreeView_GetChild(hMenuTree, tvi.hItem)&&!(bd->fEntryOpType&QMF_EX_SEPARATOR)) + { + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),TRUE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),TRUE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),TRUE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),bd->pszOpValue/*?bd->pszOpValue:bd->pszValue*/); + } + else + { + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + if(!(bd->fEntryOpType&QMF_EX_SEPARATOR)) + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + } + CheckDlgButton(hdlg,IDC_INQMENU,bd->bOpInQMenu); + CheckDlgButton(hdlg,IDC_ISSERVNAME,bd->bIsOpServName); + } + } + }break; + + case IDC_BUTTONSLIST: + switch (((LPNMHDR)lparam)->code) { + + case TVN_KEYDOWN:{ + TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*) ((LPNMHDR)lparam); + if ( pTVKeyDown->wVKey == VK_F2 ) + TreeView_EditLabel(hButtonsList,TreeView_GetSelection(hButtonsList)); + else if ( pTVKeyDown->wVKey == VK_DELETE ) + SendMessage(hdlg,WM_COMMAND,IDC_BLISTREMOVE,0); + }break; + + case TVN_BEGINLABELEDITA: + case TVN_BEGINLABELEDITW: + hwndEdit=TreeView_GetEditControl(hButtonsList); + oldEditProc = (WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) LabelEditSubclassProc); + break; + + case TVN_ENDLABELEDITA: + case TVN_ENDLABELEDITW:{ + TVITEM tvi; + TCHAR strbuf[128]; + TCHAR szLabel[128]; + + SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG) oldEditProc); + + tvi.pszText = strbuf; + tvi.cchTextMax = sizeof(strbuf); + tvi.mask=TVIF_TEXT |TVIF_HANDLE|TVIF_PARAM; + tvi.hItem=TreeView_GetSelection(hButtonsList); + TreeView_GetItem(hButtonsList,&tvi); + + GetWindowText(hwndEdit, szLabel, sizeof(szLabel)); + hwndEdit=NULL; + if(!_tcslen(szLabel)) break; + + tvi.pszText=szLabel; + ((ListData*)tvi.lParam)->dwOPFlags|=QMF_RENAMED; + + TreeView_SetItem(hButtonsList, &tvi); + SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + }break; + + case TVN_SELCHANGINGA: + case TVN_SELCHANGINGW: + SetMenuEntryProperties(hdlg); + break; + + case TVN_SELCHANGEDA: + case TVN_SELCHANGEDW:{ + TVITEM tvi; + HTREEITEM hti; + + hti=TreeView_GetSelection(hButtonsList); + + if(hti==NULL||!TreeView_GetCount(hButtonsList)){ + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + break; + } + + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + tvi.hItem=hti; + TreeView_GetItem(hButtonsList,&tvi); + + if(tvi.lParam==0) break; + + BuildMenuTree(hMenuTree,(SortedList *)((ListData*)tvi.lParam)->sl); + + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),TRUE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),TRUE); + CheckDlgButton(hdlg,IDC_ISSERVNAME2,((ListData*)tvi.lParam)->bIsOpServName); + + if(((ListData*)tvi.lParam)->ptszOPQValue) + SetWindowText(GetDlgItem(hdlg,IDC_RCLICKVALUE),((ListData*)tvi.lParam)->ptszOPQValue); + else + SetWindowText(GetDlgItem(hdlg,IDC_RCLICKVALUE),_T("")); + + }break; + }break; + } + }break; + + case WM_COMMAND:{ + switch(LOWORD(wparam)){ + case IDC_VARHELP:{ + if(!g_varhelpDlg) + g_varhelpDlg=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_HELPDIALOG), 0, HelpDlgProc); + else + //ShowWindow(g_varhelpDlg,SW_SHOWDEFAULT); + SetWindowPos(g_varhelpDlg,0,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE); + }break; + case IDC_BLISTADD:{ + TVINSERTSTRUCT tvis; + ListData* ld=NULL; + TCHAR namebuff[MAX_PATH]={'\0'}; + int count=TreeView_GetCount(hButtonsList); + if (count>10) break; + if(g_iOPButtonsCount==99){ + MessageBox(NULL,_T("Congratulation!\n\ + You have clicked this button 100 times!\n\ + There was access violation at this point...\n\ + And now function for freeing resources must be called...\n\ + But no! there's only break :D"),_T("You win!"),MB_OK); + break; + } + + ld=mir_alloc(sizeof(ListData)); + ButtonsList[g_iOPButtonsCount++]=ld; + + ld->sl=li.List_Create(0,1); + ld->dwOPFlags=QMF_NEW; + ld->bIsOpServName=0; + ld->ptszButtonName=NULL; + ld->ptszOPQValue=NULL; + ld->ptszQValue=NULL; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + + GetWindowText(GetDlgItem(hdlg,IDC_BUTTONNAME),namebuff,MAX_PATH); + + tvis.item.mask=TVIF_PARAM|TVIF_TEXT; + tvis.item.pszText=(_tcslen(namebuff))?namebuff:TranslateT("New Button"); + tvis.item.lParam=(LPARAM)ld; + TreeView_SelectItem(hButtonsList,TreeView_InsertItem(hButtonsList,&tvis)); + + }break; + + case IDC_BLISTREMOVE:{ + TVITEM tvi; + ListData* ld; + + if(!(tvi.hItem=TreeView_GetSelection(hButtonsList))) + break; + + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + TreeView_GetItem(hButtonsList,&tvi); + + ld= (ListData*)tvi.lParam; + + ld->dwOPFlags|=QMF_DELETNEEDED; + + TreeView_DeleteItem(hButtonsList,tvi.hItem); + if(!TreeView_GetCount(hButtonsList)) + { + TreeView_DeleteAllItems(hMenuTree); + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_RCLICKVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME2),FALSE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + SetWindowText(GetDlgItem(hdlg,IDC_RCLICKVALUE),_T("")); + } + }break; + + case IDC_MTREEADD:{ + TVINSERTSTRUCT tvis; + TVITEM tvi; + ButtonData *bd=NULL; + SortedList *sl=NULL; + TCHAR namebuff[MAX_PATH]={'\0'}; + + if(!TreeView_GetCount(hButtonsList)) break; + if(!(tvi.hItem=TreeView_GetSelection(hButtonsList))) break; + + bd=mir_alloc(sizeof(ButtonData)); + memset(bd,0,sizeof(ButtonData)); + + GetWindowText(GetDlgItem(hdlg,IDC_MENUNAME),namebuff,MAX_PATH); + + bd->dwOPPos=TreeView_GetCount(hMenuTree)-1; + bd->pszOpName=_tcslen(namebuff)?mir_tstrdup(namebuff):mir_tstrdup(TranslateT("New Menu Entry")); + bd->pszOpValue=mir_tstrdup(bd->pszOpName); + bd->fEntryOpType=!_tcscmp(namebuff,_T("---"))?QMF_EX_SEPARATOR:0; + bd->dwOPFlags=QMF_NEW; + bd->pszName=NULL; + bd->pszValue=NULL; + + + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + + TreeView_GetItem(hButtonsList,&tvi); + + sl=((ListData*)tvi.lParam)->sl; + + li.List_InsertPtr(sl,bd); + + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask=TVIF_PARAM|TVIF_TEXT; + tvis.item.pszText=bd->pszOpName; + tvis.item.lParam=(LPARAM)bd; + TreeView_SelectItem(hMenuTree,TreeView_InsertItem(hMenuTree,&tvis)); + }break; + + case IDC_MTREEREMOVE:{ + TVITEM tvi; + TVINSERTSTRUCT tvis; + HTREEITEM hti=NULL; + ButtonData *bd=NULL; + tvi.mask=TVIF_HANDLE|TVIF_PARAM; + if(!(tvi.hItem=TreeView_GetSelection(hMenuTree))) + break; + TreeView_GetItem(hMenuTree,&tvi); + hti=tvi.hItem; + + bd= (ButtonData*)tvi.lParam; + bd->dwOPFlags|=QMF_DELETNEEDED; + + if(tvi.hItem=TreeView_GetChild(hMenuTree,tvi.hItem)){ + TCHAR strbuf[128]; + while(tvi.hItem){ + tvis.hInsertAfter=hti; + tvi.pszText = strbuf; + tvi.cchTextMax = sizeof(strbuf); + tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT; + + TreeView_GetItem(hMenuTree,&tvi); + tvis.hParent=NULL; + tvis.item=tvi; + TreeView_InsertItem(hMenuTree,&tvis); + tvi.hItem=TreeView_GetNextSibling(hMenuTree,tvi.hItem); + } + } + + TreeView_DeleteItem(hMenuTree,hti); + if(!TreeView_GetCount(hMenuTree)){ + EnableWindow(GetDlgItem(hdlg,IDC_MENUVALUE),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_ISSERVNAME),FALSE); + EnableWindow(GetDlgItem(hdlg,IDC_INQMENU),FALSE); + SetWindowText(GetDlgItem(hdlg,IDC_MENUVALUE),_T("")); + } + + }break; + + } + }break; + + case WM_NCDESTROY: + if(oldBNameProc) SetWindowLong(GetDlgItem(hdlg,IDC_BUTTONNAME), GWL_WNDPROC, (LONG) oldBNameProc); + if(oldMNameProc) SetWindowLong(GetDlgItem(hdlg,IDC_MENUNAME) , GWL_WNDPROC, (LONG) oldMNameProc); + break; + + case WM_CLOSE: + EndDialog(hdlg,0); + return 0; + } + if (HIWORD(wparam)==BN_CLICKED && GetFocus()==(HWND)lparam) + SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + else if ((HIWORD(wparam) == EN_CHANGE)&&(GetFocus()==(HWND)lparam)) + if (!bOptionsInit) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); + + return 0; + } + +int OptionsInit(WPARAM wparam,LPARAM lparam) + { + OPTIONSDIALOGPAGE odp={0}; + + odp.cbSize=sizeof(odp); + odp.position=940000000; + odp.hInstance=hinstance; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPTIONS); + odp.pszTitle=LPGEN("Quick Messages"); + odp.pfnDlgProc=OptionsProc; + odp.pszGroup=LPGEN("Plugins"); + odp.flags=ODPF_BOLDGROUPS; + + CallService(MS_OPT_ADDPAGE,wparam,(LPARAM)&odp); + return 0; + } diff --git a/QuickMessages/quickmessages.dsp b/QuickMessages/quickmessages.dsp new file mode 100644 index 0000000..c918568 --- /dev/null +++ b/QuickMessages/quickmessages.dsp @@ -0,0 +1,301 @@ +# Microsoft Developer Studio Project File - Name="quickmessages" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=quickmessages - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "quickmessages.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "quickmessages.mak" CFG="quickmessages - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "quickmessages - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "quickmessages - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "quickmessages - Win32 Unicode Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "quickmessages - Win32 Unicode Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "quickmessages - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\Release" +# PROP BASE Intermediate_Dir ".\Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O1 /Ob2 /GF PRECOMP_VC7_TOBEREMOVED /c +# ADD CPP /nologo /MD /W3 /GX /O1 /Ob2 /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /map /machine:IX86 /out:".\$(ConfigurationName)\quickmessages.dll" /pdbtype:sept /filealign:0x200 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /map /machine:IX86 /pdbtype:sept /filealign:0x200 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir ".\debug" +# PROP BASE Intermediate_Dir ".\debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\Debug" +# PROP Intermediate_Dir ".\Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /ZI /Od /FR /GZ PRECOMP_VC7_TOBEREMOVED /c +# ADD CPP /nologo /MD /W3 /GX /ZI /Od /FR /GZ PRECOMP_VC7_TOBEREMOVED /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x417 /d "NDEBUG" +# ADD RSC /l 0x417 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /incremental:no /pdb:".\release\quickmessages.pdb" /map /debug /machine:IX86 /out:"$(ConfigurationName)\quickmessages.dll" /implib:".\release/quickmessages.lib" /pdbtype:sept /filealign:0x200 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /incremental:no /pdb:".\release\quickmessages.pdb" /map /debug /machine:IX86 /out:"$(ConfigurationName)\quickmessages.dll" /implib:".\release/quickmessages.lib" /pdbtype:sept /filealign:0x200 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "$(ConfigurationName)" +# PROP BASE Intermediate_Dir "$(ConfigurationName)" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\UNICODE_RELEASE" +# PROP Intermediate_Dir ".\UNICODE_RELEASE" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O1 /Ob2 /D "_UNICODE" /Fo".\Release/" /GF PRECOMP_VC7_TOBEREMOVED /c +# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /D "_UNICODE" /D "UNICODE" /c +# SUBTRACT CPP /WX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /pdb:".\Release\quickmessages.pdb" /map:".\Release\quickmessages.map" /machine:IX86 /out:".\$(ConfigurationName)\quickmessages.dll" /implib:".\Release/quickmessages.lib" /pdbtype:sept /filealign:0x200 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib msimg32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /map /machine:IX86 /pdbtype:sept /filealign:0x200 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "$(ConfigurationName)" +# PROP BASE Intermediate_Dir "$(ConfigurationName)" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\UNICODE_DEBUG" +# PROP Intermediate_Dir ".\UNICODE_DEBUG" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /ZI /Od /D "_UNICODE" /D "PRECOMP_VC7_TOBEREMOVED" /FR /Fo".\debug/" /Fd".\debug/" /GZ "DEBUG" /c +# ADD CPP /nologo /MD /W3 /GX /ZI /Od /D "_UNICODE" /D "UNICODE" /FR /GZ "UNICODE_DEBUG" /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x417 /d "NDEBUG" +# ADD RSC /l 0x417 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /incremental:no /pdb:".\release\quickmessages.pdb" /map:".\debug\quickmessages.map" /debug /machine:IX86 /implib:".\release/quickmessages.lib" /pdbtype:sept /filealign:0x200 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x67100000" /subsystem:windows /dll /incremental:no /map /debug /debugtype:both /machine:IX86 /pdbtype:sept /filealign:0x200 +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "quickmessages - Win32 Release" +# Name "quickmessages - Win32 Debug" +# Name "quickmessages - Win32 Unicode Release" +# Name "quickmessages - Win32 Unicode Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=main.c +DEP_CPP_MAIN_=\ + "..\..\include\m_clist.h"\ + "..\..\include\m_database.h"\ + "..\..\include\m_icolib.h"\ + "..\..\include\m_langpack.h"\ + "..\..\include\m_message.h"\ + "..\..\include\m_options.h"\ + "..\..\include\m_plugins.h"\ + "..\..\include\m_protocols.h"\ + "..\..\include\m_protomod.h"\ + "..\..\include\m_system.h"\ + "..\..\include\m_utils.h"\ + "..\..\include\newpluginapi.h"\ + "..\..\include\statusmodes.h"\ + ".\m_msg_buttonsbar.h"\ + ".\m_updater.h"\ + ".\quickmessages.h"\ + ".\Utils.h"\ + + +!IF "$(CFG)" == "quickmessages - Win32 Release" + +# ADD CPP /nologo /GX /O1 + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Debug" + +# ADD CPP /nologo /GX /Od /FR /GZ + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Release" + +# ADD CPP /nologo /GX /O1 + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Debug" + +# ADD CPP /nologo /GX /Od /FR /GZ + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=options.c +DEP_CPP_OPTIO=\ + "..\..\include\m_clist.h"\ + "..\..\include\m_database.h"\ + "..\..\include\m_icolib.h"\ + "..\..\include\m_langpack.h"\ + "..\..\include\m_message.h"\ + "..\..\include\m_options.h"\ + "..\..\include\m_plugins.h"\ + "..\..\include\m_protocols.h"\ + "..\..\include\m_protomod.h"\ + "..\..\include\m_system.h"\ + "..\..\include\m_utils.h"\ + "..\..\include\newpluginapi.h"\ + "..\..\include\statusmodes.h"\ + ".\m_msg_buttonsbar.h"\ + ".\m_updater.h"\ + ".\quickmessages.h"\ + ".\Utils.h"\ + + +!IF "$(CFG)" == "quickmessages - Win32 Release" + +# ADD CPP /nologo /GX /O1 + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Debug" + +# ADD CPP /nologo /GX /Od /FR /GZ + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Release" + +# ADD CPP /nologo /GX /O1 + +!ELSEIF "$(CFG)" == "quickmessages - Win32 Unicode Debug" + +# ADD CPP /nologo /GX /Od /FR /GZ + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Utils.c +DEP_CPP_UTILS=\ + "..\..\include\m_clist.h"\ + "..\..\include\m_database.h"\ + "..\..\include\m_icolib.h"\ + "..\..\include\m_langpack.h"\ + "..\..\include\m_message.h"\ + "..\..\include\m_options.h"\ + "..\..\include\m_plugins.h"\ + "..\..\include\m_protocols.h"\ + "..\..\include\m_protomod.h"\ + "..\..\include\m_system.h"\ + "..\..\include\m_utils.h"\ + "..\..\include\newpluginapi.h"\ + "..\..\include\statusmodes.h"\ + ".\m_msg_buttonsbar.h"\ + ".\m_updater.h"\ + ".\quickmessages.h"\ + ".\Utils.h"\ + +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\m_msg_buttonsbar.h +# End Source File +# Begin Source File + +SOURCE=.\m_updater.h +# End Source File +# Begin Source File + +SOURCE=.\quickmessages.h +# End Source File +# Begin Source File + +SOURCE=resource.h +# End Source File +# Begin Source File + +SOURCE=.\Utils.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\icons\qicon.ico +# End Source File +# Begin Source File + +SOURCE=.\quickmessages.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/QuickMessages/quickmessages.dsw b/QuickMessages/quickmessages.dsw new file mode 100644 index 0000000..1c6bc0c --- /dev/null +++ b/QuickMessages/quickmessages.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "quickmessages"=.\quickmessages.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/QuickMessages/quickmessages.h b/QuickMessages/quickmessages.h new file mode 100644 index 0000000..bc8e372 --- /dev/null +++ b/QuickMessages/quickmessages.h @@ -0,0 +1,93 @@ +/* +Quick Messages plugin for Miranda IM + +Copyright (C) 2008 Danil Mozhar + +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 3 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, see . +*/ +#define _CRT_SECURE_NO_DEPRECATE + + +#include +#include +#include "resource.h" +#include +#include +#include + +#define MIRANDA_VER 0x0600 +#include "..\..\include\m_plugins.h" +#include "..\..\include\newpluginapi.h" +#include "..\..\include\m_utils.h" +#include "..\..\include\m_system.h" +#include "..\..\include\m_clist.h" +#include "..\..\include\m_options.h" +#include "..\..\include\m_database.h" +#include "..\..\include\m_protomod.h" +#include "..\..\include\m_langpack.h" +#include "..\..\include\m_icolib.h" +#include "..\..\include\m_message.h" +#include "..\..\include\m_contacts.h" + +#include "Utils.h" +#include "m_msg_buttonsbar.h" +#include "m_updater.h" + +#pragma optimize("gsy",on) + +#define MODULENAME "Quick Messages" +#define PLGNAME "QuickMessages" + +extern struct LIST_INTERFACE li; +extern HINSTANCE hinstance; +extern HANDLE hIcon; +extern ListData* ButtonsList[100]; +extern SortedList* QuickList; +extern BOOL g_bRClickAuto; +extern BOOL g_bLClickAuto; +extern BOOL g_bQuickMenu; +extern int g_iButtonsCount; + +//#define MIIM_STRING 0x00000040 + + + +int AddIcon(HICON icon, char *name, char *description); +int OptionsInit(WPARAM,LPARAM); + + +#define IDC_MESSAGE 1002 +#define IDC_CHATMESSAGE 1009 + +#define SIZEOF(X)(sizeof(X)/sizeof(X[0])) + +#ifdef _UNICODE +#define QMESSAGES_NAME "quickmessages_u" +#else +#define QMESSAGES_NAME "quickmessages_a" +#endif + +#define QMESSAGES_VERSION_URL "http://miranda.radicaled.ru/public/updater/quickmessages.txt" + +#define QMESSAGES_CHAGELOG_URL "http://miranda.radicaled.ru/public/quickmessages/changelog_en.txt" + +#define QMESSAGES_UPDATE_URL "http://miranda.radicaled.ru/public/quickmessages/"QMESSAGES_NAME".zip" + +#define QMESSAGES_UPDATE_URL "http://miranda.radicaled.ru/public/quickmessages/"QMESSAGES_NAME".zip" + +#define QMESSAGES_VERSION_PREFIX "QuickMessages " + + + + diff --git a/QuickMessages/quickmessages.rc b/QuickMessages/quickmessages.rc new file mode 100644 index 0000000..e44b078 --- /dev/null +++ b/QuickMessages/quickmessages.rc @@ -0,0 +1,234 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" + "version.rc\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OPTIONS DIALOGEX 0, 0, 316, 257 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_BUTTONSLIST,"SysTreeView32",TVS_EDITLABELS | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | TVS_FULLROWSELECT | WS_TABSTOP,6,19,95,130,WS_EX_STATICEDGE + PUSHBUTTON "+",IDC_BLISTADD,70,152,16,14,BS_FLAT + PUSHBUTTON "-",IDC_BLISTREMOVE,86,152,16,14,BS_FLAT + CONTROL "",IDC_MENUTREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | WS_TABSTOP,114,19,95,130,WS_EX_STATICEDGE + PUSHBUTTON "+",IDC_MTREEADD,178,152,16,14,BS_FLAT + PUSHBUTTON "-",IDC_MTREEREMOVE,194,152,16,14,BS_FLAT + EDITTEXT IDC_MENUVALUE,212,49,93,14,ES_AUTOHSCROLL + EDITTEXT IDC_RCLICKVALUE,114,182,193,14,ES_AUTOHSCROLL + GROUPBOX "Button Right-Click value",IDC_STATIC,110,172,204,47 + GROUPBOX "Button Left-Click menu",IDC_STATIC,110,9,204,160 + GROUPBOX "Buttons",IDC_STATIC,2,9,103,160 + LTEXT "Menu entry value:",IDC_STATIC,214,37,86,8 + EDITTEXT IDC_BUTTONNAME,6,152,63,14,ES_AUTOHSCROLL | ES_WANTRETURN + EDITTEXT IDC_MENUNAME,114,152,63,14,ES_AUTOHSCROLL | ES_WANTRETURN + GROUPBOX "Misc.",IDC_STATIC,2,172,103,66 + CONTROL "Auto-send on Left-Click",IDC_LAUTOSEND,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,6,181,98,16 + CONTROL "Auto-send on Right-Click",IDC_RAUTOSEND,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,6,199,98,16 + CONTROL "Add to QuickMenu",IDC_INQMENU,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,214,66,99,20 + CONTROL "Enable QuickMenu",IDC_ENABLEQUICKMENU,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,6,217,98,16 + CONTROL "Consider as ServiceName",IDC_ISSERVNAME,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,214,90,99,20 + LTEXT "You have changed the plugin settings via database.\nThis requires restart!",IDC_WARNING,110,223,179,28,NOT WS_VISIBLE + PUSHBUTTON "?",IDC_VARHELP,291,223,16,14 + CONTROL "Consider as ServiceName",IDC_ISSERVNAME2,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,117,196,189,20 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_OPTIONS, DIALOG + BEGIN + RIGHTMARGIN, 314 + VERTGUIDE, 5 + VERTGUIDE, 105 + VERTGUIDE, 110 + VERTGUIDE, 114 + VERTGUIDE, 307 + BOTTOMMARGIN, 251 + HORZGUIDE, 9 + HORZGUIDE, 19 + HORZGUIDE, 149 + HORZGUIDE, 152 + HORZGUIDE, 166 + HORZGUIDE, 169 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_HELPDIALOG DIALOGEX 0, 0, 202, 210 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Quick Messages Help" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "- Selected text",IDC_STATIC,68,20,127,17 + LTEXT "List of variables:",IDC_STATICTITLE,12,7,113,8 + LTEXT "- Text from Clipboard",IDC_STATIC,68,41,127,17 + LTEXT "- Contacts Protocol name (upper case)",IDC_STATIC,68,62,127,17 + LTEXT "- Contact display name",IDC_STATIC,68,83,127,17 + LTEXT "%t",IDC_VARTEXT,18,20,15,12 + LTEXT "%c",IDC_VARCLIP,18,41,15,12 + LTEXT "%P",IDC_VARPUNAME,18,62,15,12 + LTEXT "%n",IDC_VARCNAME,18,83,15,12 + LTEXT "Tips:",IDC_STATICTITLE2,12,149,113,8 + LTEXT "*Rename menu item into ""---"" to insert separator",IDC_STATIC,18,160,177,17 + LTEXT "*Use drag'n'drop for arranging menu items",IDC_STATIC,18,179,177,17 + LTEXT "- Contact first name",IDC_STATIC,68,104,127,17 + LTEXT "%F",IDC_VARCFNAME,18,104,15,12 + LTEXT "- Contact last name",IDC_STATIC,68,125,127,17 + LTEXT "%L",IDC_VARCLNAME,18,125,15,12 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_HELPDIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 195 + TOPMARGIN, 7 + BOTTOMMARGIN, 203 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_QICON ICON "icons\\qicon.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,4,2 + PRODUCTVERSION 0,0,4,2 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "041904b0" + BEGIN + VALUE "Author", "MaD_CLuSTeR" + VALUE "FileDescription", "Quick Messages" + VALUE "FileVersion", "0.0.4.2" + VALUE "InternalName", "quick messages" + VALUE "LegalCopyright", "Copyright © 2008 Danil Mozhar" + VALUE "ProductVersion", "0, 0, 4, 2" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x419, 1200 + END +END + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/QuickMessages/quickmessages.sln b/QuickMessages/quickmessages.sln new file mode 100644 index 0000000..b5f6626 --- /dev/null +++ b/QuickMessages/quickmessages.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "quickmessages", "quickmessages.vcproj", "{DD76B998-ED0D-4BFD-9660-3ADC3A334872}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Unicode Static|Win32 = Debug Unicode Static|Win32 + Debug Unicode|Win32 = Debug Unicode|Win32 + Debug|Win32 = Debug|Win32 + Release Unicode|Win32 = Release Unicode|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug Unicode Static|Win32.ActiveCfg = Debug Unicode Static|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug Unicode Static|Win32.Build.0 = Debug Unicode Static|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug Unicode|Win32.ActiveCfg = Unicode Debug|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug Unicode|Win32.Build.0 = Unicode Debug|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Debug|Win32.Build.0 = Debug|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Release Unicode|Win32.ActiveCfg = Unicode Release|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Release Unicode|Win32.Build.0 = Unicode Release|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Release|Win32.ActiveCfg = Release|Win32 + {DD76B998-ED0D-4BFD-9660-3ADC3A334872}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + VisualSVNWorkingCopyRoot = + EndGlobalSection +EndGlobal diff --git a/QuickMessages/quickmessages.vcproj b/QuickMessages/quickmessages.vcproj new file mode 100644 index 0000000..492d4b5 --- /dev/null +++ b/QuickMessages/quickmessages.vcproj @@ -0,0 +1,645 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuickMessages/resource.h b/QuickMessages/resource.h new file mode 100644 index 0000000..9facd53 --- /dev/null +++ b/QuickMessages/resource.h @@ -0,0 +1,47 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by quickmessages.rc +// +#define IDD_OPTIONS 101 +#define IDI_QICON 102 +#define IDC_BUTTONSLIST 104 +#define IDC_BLISTADD 105 +#define IDC_BLISTREMOVE 106 +#define IDC_MENUTREE 107 +#define IDC_MTREEADD 108 +#define IDC_MTREEREMOVE 109 +#define IDC_MENUVALUE 110 +#define IDC_RCLICKVALUE 111 +#define IDD_HELPDIALOG 112 +#define IDC_BUTTONNAME 1076 +#define IDC_MENUNAME 1077 +#define IDC_LAUTOSEND 1079 +#define IDC_RAUTOSEND 1080 +#define IDC_INQMENU 1081 +#define IDC_RAUTOSEND2 1082 +#define IDC_ENABLEQUICKMENU 1082 +#define IDC_ISSERVNAME 1083 +#define IDC_WARNING 1084 +#define IDC_VARHELP 1085 +#define IDC_VARTEXT 1086 +#define IDC_ISSERVNAME2 1086 +#define IDC_VARCLIP 1087 +#define IDC_VARPUNAME 1088 +#define IDC_VARPLNAME 1089 +#define IDC_VARCNAME 1090 +#define IDC_STATICTITLE 1091 +#define IDC_STATICTITLE2 1092 +#define IDC_VARCFNAME 1093 +#define IDC_VARCLNAME 1094 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 113 +#define _APS_NEXT_COMMAND_VALUE 40015 +#define _APS_NEXT_CONTROL_VALUE 1092 +#define _APS_NEXT_SYMED_VALUE 1125 +#endif +#endif diff --git a/wbOSD/buildnumber.h b/wbOSD/buildnumber.h new file mode 100644 index 0000000..b777277 --- /dev/null +++ b/wbOSD/buildnumber.h @@ -0,0 +1,6 @@ +#ifndef _BUILDNUMBER_ +#define BUILDNUMBER 0 +#define __FILEVERSION_STRING 0,2,1,0 +#define __VERSION_STRING "0.2.1.0" +#define __VERSION_DWORD 0x20100 +#endif //_BUILDNUMBER_ diff --git a/wbOSD/events.cpp b/wbOSD/events.cpp new file mode 100644 index 0000000..34dd361 --- /dev/null +++ b/wbOSD/events.cpp @@ -0,0 +1,218 @@ +/* +Wannabe OSD +This plugin tries to become miranda's standard OSD ;-) + +(C) 2005 Andrej Krutak + +Distributed under GNU's GPL 2 or later +*/ + +#include "wbOSD.h" +#include + +extern HWND hwnd; +extern HANDLE hHookContactStatusChanged; + +void logmsg2(char *str) +{ + FILE *f=fopen("c:\\logm.txt", "a"); + fprintf(f, "%s\n", str); + fclose(f); +} + +void showmsgwnd(unsigned int param) +{ + logmsg("showmsgwnd"); + if (DBGetContactSettingByte(NULL,THIS_MODULE, "showMessageWindow", DEFAULT_SHOWMSGWIN)) + CallService(MS_MSG_SENDMESSAGE, (WPARAM)param, 0); +} + +LRESULT ShowOSD(TCHAR *str, int timeout, COLORREF color, HANDLE user) +{ + osdmsg om; + + logmsg("ShowOSD"); + + if (!hwnd) + return 0; + + if (timeout==0) + timeout=DBGetContactSettingDword(NULL,THIS_MODULE, "timeout", DEFAULT_TIMEOUT); + om.text=str; + om.timeout=timeout; + om.color=color; + om.param=(unsigned int)user; + om.callback=showmsgwnd; + + return SendMessage(hwnd, WM_USER+4, (WPARAM)&om, 0); +} + +int ProtoAck(WPARAM wparam,LPARAM lparam) +{ + ACKDATA *ack=(ACKDATA *)lparam; + + logmsg("ProtoAck"); + + if (!DBGetContactSettingByte(NULL,THIS_MODULE, "a_user", DEFAULT_ANNOUNCESTATUS)) + return 0; + + if (!(DBGetContactSettingDword(NULL,THIS_MODULE,"showWhen", DEFAULT_SHOWWHEN)&(1<<(DBGetContactSettingWord(NULL, "CList", "Status", ID_STATUS_OFFLINE)-ID_STATUS_OFFLINE)))) + return 0; + + if ( ack->type == ACKTYPE_STATUS ) { + if (!DBGetContactSettingByte(NULL,THIS_MODULE, "showMyStatus", DEFAULT_SHOWMYSTATUS)) + return 0; + + if ( ack->result == ACKRESULT_SUCCESS && (LPARAM)ack->hProcess != ack->lParam ) { + DWORD ann = DBGetContactSettingDword( NULL, THIS_MODULE, "announce", DEFAULT_ANNOUNCE ); + if ( ann & ( 1 << ( ack->lParam - ID_STATUS_OFFLINE ))) { + TCHAR* ptszName = (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)ack->hContact, GCDNF_TCHAR); + TCHAR buffer[512]; + mir_sntprintf(buffer, SIZEOF(buffer), TranslateT("%s is %s"), ptszName, TranslateTS(statusValues[ack->lParam-ID_STATUS_OFFLINE].szDescr)); + ShowOSD(buffer, 0, DBGetContactSettingDword(NULL,THIS_MODULE, "clr_status", DEFAULT_CLRSTATUS), ack->hContact); + } } } + + return 0; +} + +int ContactSettingChanged(WPARAM wParam,LPARAM lParam) +{ + DBCONTACTWRITESETTING *cws=(DBCONTACTWRITESETTING*)lParam; + WORD newStatus = 0,oldStatus = 0; + DWORD dwStatuses = 0; + + logmsg("ContactSettingChanged1"); + + if((HANDLE)wParam==NULL || lstrcmpA(cws->szSetting,"Status")) return 0; + + newStatus = cws->value.wVal; + oldStatus = DBGetContactSettingRangedWord((HANDLE)wParam,"UserOnline","OldStatus2",ID_STATUS_OFFLINE, ID_STATUS_MIN, ID_STATUS_MAX); + + if (oldStatus == newStatus) return 0; + + logmsg("ContactSettingChanged2"); + + DBWriteContactSettingWord((HANDLE)wParam,"UserOnline","OldStatus2",(WORD)newStatus); + + if(CallService(MS_IGNORE_ISIGNORED,wParam,IGNOREEVENT_USERONLINE)) return 0; + + dwStatuses = MAKELPARAM(oldStatus, newStatus); + NotifyEventHooks(hHookContactStatusChanged, (WPARAM)wParam, (LPARAM)dwStatuses); + + return 0; +} + +int ContactStatusChanged(WPARAM wParam, LPARAM lParam) +{ + WORD oldStatus = LOWORD(lParam); + WORD newStatus = HIWORD(lParam); + DWORD ann=DBGetContactSettingDword(NULL,THIS_MODULE,"announce", DEFAULT_ANNOUNCE); + char buffer[512]; +#if defined(_UNICODE) + wchar_t bufferW[512]; +#endif + + logmsg("ContactStatusChanged1"); + + if (!DBGetContactSettingByte(NULL,THIS_MODULE, "a_user", DEFAULT_ANNOUNCESTATUS)) + return 0; + + if (!(DBGetContactSettingDword(NULL,THIS_MODULE,"showWhen", DEFAULT_SHOWWHEN)&(1<<(DBGetContactSettingWord(NULL, "CList", "Status", ID_STATUS_OFFLINE)-ID_STATUS_OFFLINE)))) + return 0; + + if (!(ann&(1<<(newStatus-ID_STATUS_OFFLINE))) ) + return 0; + + logmsg("ContactStatusChanged2"); + + if (DBGetContactSettingByte((HANDLE)wParam,"CList","NotOnList",0) || + DBGetContactSettingByte((HANDLE)wParam,"CList","Hidden",0) || + (CallService(MS_IGNORE_ISIGNORED,wParam,IGNOREEVENT_USERONLINE) && newStatus==ID_STATUS_ONLINE) + ) + return 0; + + mir_snprintf(buffer, sizeof(buffer), Translate("%s is %s"), (char*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, wParam, 0), Translate(statusValues[newStatus-ID_STATUS_OFFLINE].szDescr)); +#if defined(_UNICODE) + MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufferW, 511); + bufferW[511] = 0; + ShowOSD(bufferW, 0, DBGetContactSettingDword(NULL,THIS_MODULE, "clr_status", DEFAULT_CLRSTATUS), (HANDLE)wParam); +#else + ShowOSD(buffer, 0, DBGetContactSettingDword(NULL,THIS_MODULE, "clr_status", DEFAULT_CLRSTATUS), (HANDLE)wParam); +#endif + return 0; +} + +int HookedNewEvent(WPARAM wParam, LPARAM lParam) +{ + logmsg("HookedNewEvent1"); + + DBEVENTINFO dbe; + dbe.cbSize = sizeof(dbe); + dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM) lParam, 0); + if (dbe.cbBlob == -1) + return 0; + + dbe.pBlob = (PBYTE) malloc(dbe.cbBlob); + CallService(MS_DB_EVENT_GET, (WPARAM)lParam, (LPARAM)&dbe); + + if (dbe.flags & DBEF_SENT || dbe.eventType == 25368) + return 0; + + if (DBGetContactSettingByte(NULL,THIS_MODULE, "messages", DEFAULT_ANNOUNCEMESSAGES)==0) + return 0; + + if (!(DBGetContactSettingDword(NULL,THIS_MODULE,"showWhen", DEFAULT_SHOWWHEN)&(1<<(DBGetContactSettingWord(NULL, "CList", "Status", ID_STATUS_OFFLINE)-ID_STATUS_OFFLINE)))) + return 0; + + logmsg("HookedNewEvent2"); + + TCHAR buf[512]; + _tcscpy(buf, DEFAULT_MESSAGEFORMAT); + + DBVARIANT dbv; + if(!DBGetContactSettingTString(NULL,THIS_MODULE,"message_format",&dbv)) { + _tcscpy(buf, dbv.ptszVal); + DBFreeVariant(&dbv); + } + + int i1=-1, i2=-1; + TCHAR* pbuf = buf; + while (*pbuf) { + if (*pbuf=='%') { + if (*(pbuf+1)=='n') { + if (i1==-1) + i1=1; + else i2=1; + *(pbuf+1)='s'; + } else if (*(pbuf+1)=='m') { + if (i1==-1) + i1=2; + else i2=2; + *(pbuf+1)='s'; + } else if (*(pbuf+1)=='l') { + *pbuf=0x0d; + *(pbuf+1)=0x0a; + } + } + pbuf++; + } + + TCHAR *c1 = 0, *c2 = 0; + if ( i1 == 1 ) + c1 = mir_tstrdup(( TCHAR* )CallService(MS_CLIST_GETCONTACTDISPLAYNAME, wParam, GCDNF_TCHAR)); + else if ( i1 == 2 ) + c1 = DbGetEventTextT( &dbe, 0 ); + + if ( i2 == 1 ) + c2 = mir_tstrdup(( TCHAR* )CallService(MS_CLIST_GETCONTACTDISPLAYNAME, wParam, GCDNF_TCHAR)); + else if ( i2 == 2 ) + c2 = DbGetEventTextT( &dbe, 0 ); + + TCHAR buffer[512]; + mir_sntprintf(buffer, SIZEOF(buffer), buf, c1, c2); + ShowOSD(buffer, 0, DBGetContactSettingDword(NULL,THIS_MODULE, "clr_msg", DEFAULT_CLRMSG), (HANDLE)wParam); + + mir_free( c1 ); + mir_free( c2 ); + return 0; +} diff --git a/wbOSD/lpgen.pl b/wbOSD/lpgen.pl new file mode 100644 index 0000000..6593868 --- /dev/null +++ b/wbOSD/lpgen.pl @@ -0,0 +1,212 @@ +#!/usr/bin/perl + +use POSIX; +use File::Find; +use strict; + +my $rootdir = ''; +my %hash = (); +my $clines = 0; + +my $version = '0.7svn'; +my $time = localtime(); + +if (@ARGV && $ARGV[0] eq "version") { + shift @ARGV; + # 1st arg version major i.e. 07 for "0.7" + if (@ARGV) { + my $vermaj = shift @ARGV; + if ($vermaj =~ /^([0-9]*)([0-9])$/) { + if ($1 eq "") { + $version = $2; + } else { + $version = "$1.$2"; + } + } else { + $version = $vermaj; + } + } + # 2nd arg version minor i.e. 1 for "0.7.1" + if (@ARGV) { + my $vermin = shift @ARGV; + if ($vermin =~ /^[0-9]+$/) { + $version .= ".$vermin"; + } else { + $version .= $vermin; + } + } + # 3rd arg build number i.e. 36 for "0.7.1 build 36" + if (@ARGV) { + my $build = shift @ARGV; + if ($build =~ /^[0-9]+$/) { + $version .= " build $build"; + } else { + $version .= $build; + } + } +} + +#Language Files +if (!@ARGV) { + create_langfile( + '../../miranda', + '../../miranda/i18n/langpack_english.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'project-info@miranda-im.org', + 'Scriver,avs,chat,clist,clist_nicer,db3x,db3x_mmap,dbrw,advaimg,import,modernb,mwclist,png2dib,srmm,tabsrmm,AimOscar,Gadu-Gadu,IRC,IcqOscarJ,JabberG,MSN,Yahoo'); +} +elsif ($ARGV[0] eq "core") { + create_langfile('../../miranda/src', + '../../miranda/i18n/core-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'project-info@miranda-im.org'); +} +elsif ($ARGV[0] eq "srmm") { + create_langfile('../../miranda/plugins/SRMM/', + '../../miranda/plugins/SRMM/Docs/srmm-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'project-info@miranda-im.org'); +} +elsif ($ARGV[0] eq "import") { + create_langfile('../../miranda/plugins/Import/', + '../../miranda/plugins/Import/docs/import-translation.txt', + 'English (US)', '0809', + 'Miranda IM Development Team', + 'project-info@miranda-im.org'); +} +elsif ($ARGV[0] eq "wbOSD") { + create_langfile('./', + 'wbOSD-translation.txt', + 'English (US)', '0809', + 'Andrej Krutak', + 'andree182 {at} gmail (dot) com'); +} +else { + print "Error: Unknown module $ARGV[0]\n"; + exit 1; +} + +sub create_langfile { + $rootdir = shift(@_); + my $outfile = shift(@_); + my $lang = shift(@_); + my $locale = shift(@_); + my $author = shift(@_); + my $email = shift(@_); + my $plugins = @_ ? shift(@_) : ''; + %hash = (); + my %common = (); + $clines = 0; + print "Building language file for $rootdir:\n"; + find({ wanted => \&csearch, preprocess => \&pre_dir }, $rootdir); + find({ wanted => \&rcsearch, preprocess => \&pre_dir }, $rootdir); + open(WRITE, "> $outfile") or die; + print WRITE < $common{$a}) } keys %common; + print WRITE "; Common strings that belong to many files\n;["; + print WRITE join "]\n;[", @sorted; + print WRITE "]\n"; + + my $file = ''; + foreach my $trans (sort { ($hash{$a} eq $hash{$b}) ? ($a cmp $b) : ($hash{$a} cmp $hash{$b}) } keys %hash) { + if ($hash{$trans} ne $file) { + $file = $hash{$trans}; + print WRITE "\n; $file\n"; + } + print WRITE ";[$trans]\n"; + } + + close(WRITE); + print " $outfile is complete ($clines)\n\n"; +} + +sub pre_dir { + # avoid parsing some ext SDKs + my @files = (); + return @files if ( + $File::Find::name =~/..\/extplugins/ or + $File::Find::name =~/freeimage\/Source/ or + $File::Find::name =~/dbrw\/sqlite3/); + @files = grep { not /^\.\.?$/ } @_; + return sort @files; +} + +sub append_str { + my $str = shift(@_); + my $found = shift(@_); + $str = substr($str, 1, length($str) - 2); + if (length($str) gt 0 and $str ne "List1" and $str ne "Tree1" and $str =~ /[a-zA-Z]+/g) { + my $path = $File::Find::name; + $path =~ s/(\.\.\/)+miranda\///; + if (!$hash{$str}) { + $hash{$str} = $path; + $clines ++; + return 1; + } elsif ($hash{$str} ne $path) { + if ($hash{$str} =~ /^\d+$/) { + $hash{$str} ++; + } else { + $hash{$str} = 1; + } + } + } + return 0; +} + +sub csearch { + if (-f $_ and ($_ =~ m/\.c(pp)?$/i or $_ =~ m/\.h(pp)?$/i)) { + my $found = 0; + my $file = $_; + print " Processing $_ "; + open(READ, "< $_") or return; + my $all = ''; + while (my $lines = ) { + $all = $all.$lines; + } + close(READ); + $_ = $all; + while (/(?:Button_SetIcon_IcoLib|Translate[A-Z]{0,2}|LPGENT?|ICQTranslateUtfStatic)\s*\(\s*(\".*?\")\s*[,\)]/g) { + $found += append_str($1, $found); + } + print "($found)\n"; + } +} + +sub rcsearch { + if ( -f $_ and $_ =~ m/\.rc$/i) { + my $found = 0; + my $file = $_; + print " Processing $_ "; + open(READ, "< $_") or return; + my $all = ''; + while (my $lines = ) { + $all = $all.$lines; + } + close(READ); + $_ = $all; + while (/\s*(?:CONTROL|(?:DEF)?PUSHBUTTON|[LRC]TEXT|GROUPBOX|CAPTION|MENUITEM|POPUP)\s*(\".*?\")/g) { + $found += append_str($1, $found); + } + print "($found)\n"; + } +} diff --git a/wbOSD/main.cpp b/wbOSD/main.cpp new file mode 100644 index 0000000..4a888dd --- /dev/null +++ b/wbOSD/main.cpp @@ -0,0 +1,105 @@ +/* +Wannabe OSD +This plugin tries to become miranda's standard OSD ;-) + +(C) 2005 Andrej Krutak + +Distributed under GNU's GPL 2 or later +*/ + +#include "wbOSD.h" +#include "buildnumber.h" + +HINSTANCE hI; +MM_INTERFACE mmi; + +HWND hwnd=0; +HANDLE hservosda; +PLUGINLINK *pluginLink; +HANDLE hHookedNewEvent, hHookedInit, hProtoAck, hContactSettingChanged, hHookContactStatusChanged, hContactStatusChanged, hpluginShutDown; +HINSTANCE hUser32; +BOOL (WINAPI*pSetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD); + +void logmsg2(char *str); +int MainInit(WPARAM wparam,LPARAM lparam); + +///////////////////////////////////////////////////////////////////////////////////////// + +extern "C" int __declspec(dllexport)Load(PLUGINLINK *link) +{ + pluginLink=link; + mir_getMMI( &mmi ); + + logmsg("Load"); + pSetLayeredWindowAttributes=0; + +#ifndef FORCE_9XDRAWING + hUser32=LoadLibraryA("user32.dll"); +#else + hUser32=0; +#endif + + if (hUser32) { + pSetLayeredWindowAttributes=(BOOL(WINAPI*)(HWND, COLORREF, BYTE, DWORD))GetProcAddress(hUser32, "SetLayeredWindowAttributes"); + if (!pSetLayeredWindowAttributes) { + FreeLibrary(hUser32); + hUser32=0; + } + } + + hHookedInit = HookEvent(ME_SYSTEM_MODULESLOADED, MainInit); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +extern "C" __declspec(dllexport) int Unload(void) +{ + logmsg("Unload"); + UnhookEvent(hpluginShutDown); + UnhookEvent(hProtoAck); + UnhookEvent(hContactSettingChanged); + UnhookEvent(hContactStatusChanged); + UnhookEvent(hHookedNewEvent); + UnhookEvent(hHookedInit); + + if (hUser32) + FreeLibrary(hUser32); + pSetLayeredWindowAttributes=0; + + DestroyServiceFunction(hservosda); + DestroyHookableEvent(hHookContactStatusChanged); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static PLUGININFO pluginInfo={ + sizeof(PLUGININFO), + #ifdef UNICODE + "WannaBe OSD (Unicode)", + #else + "WannaBe OSD", + #endif + __VERSION_DWORD, + "Show new message/status change info using onscreen display", + "Andrej Krutak", + "andree182 {at} gmail (dot) com", + "©2005 Andrej Krutak", + "http://urtax.ms.mff.cuni.cz/~andree/", + UNICODE_AWARE, + 0 +}; + +extern "C" __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved) +{ + hI = hinst; + return 1; +} diff --git a/wbOSD/options.cpp b/wbOSD/options.cpp new file mode 100644 index 0000000..16106c8 --- /dev/null +++ b/wbOSD/options.cpp @@ -0,0 +1,426 @@ +/* +Wannabe OSD +This plugin tries to become miranda's standard OSD ;-) + +(C) 2005 Andrej Krutak + +Distributed under GNU's GPL 2 or later +*/ + +#include "wbOSD.h" + +COLORREF pencustcolors[16]; + +const static osdmsg defstr={_T(""), 0, RGB(0, 0, 0), 0, 0}; + +void FillCheckBoxTree(HWND hwndTree,const struct CheckBoxValues_t *values,int nValues,DWORD style) +{ + logmsg("FillCheckBoxTree"); + + TVINSERTSTRUCT tvis; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM|TVIF_TEXT|TVIF_STATE; + for ( int i=0; i < nValues; i++ ) { + tvis.item.lParam = values[i].style - ID_STATUS_OFFLINE; + tvis.item.pszText = TranslateTS( values[i].szDescr ); + tvis.item.stateMask = TVIS_STATEIMAGEMASK; + tvis.item.state = INDEXTOSTATEIMAGEMASK(( style & ( 1 << tvis.item.lParam )) != 0 ? 2 : 1 ); + TreeView_InsertItem( hwndTree, &tvis ); + } +} + +DWORD MakeCheckBoxTreeFlags(HWND hwndTree) +{ + DWORD flags=0; + TVITEM tvi; + + logmsg("MakeCheckBoxTreeFlags"); + + tvi.mask=TVIF_HANDLE|TVIF_PARAM|TVIF_STATE; + tvi.hItem=TreeView_GetRoot(hwndTree); + while(tvi.hItem) { + TreeView_GetItem(hwndTree,&tvi); + if(((tvi.state&TVIS_STATEIMAGEMASK)>>12==2)) flags|=1<align=DBGetContactSettingByte(NULL,THIS_MODULE, "align", DEFAULT_ALIGN); + ps->salign=DBGetContactSettingByte(NULL,THIS_MODULE, "salign", DEFAULT_SALIGN); + ps->altShadow=DBGetContactSettingByte(NULL,THIS_MODULE, "altShadow", DEFAULT_ALTSHADOW); + ps->transparent=DBGetContactSettingByte(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT); + ps->showShadow=DBGetContactSettingByte(NULL,THIS_MODULE, "showShadow", DEFAULT_SHOWSHADOW); + ps->messages=DBGetContactSettingByte(NULL,THIS_MODULE, "messages", DEFAULT_ANNOUNCEMESSAGES); + ps->a_user=DBGetContactSettingByte(NULL,THIS_MODULE, "a_user", DEFAULT_ANNOUNCESTATUS); + ps->distance=DBGetContactSettingByte(NULL,THIS_MODULE, "distance", DEFAULT_DISTANCE); + ps->winx=DBGetContactSettingDword(NULL,THIS_MODULE, "winx", DEFAULT_WINX); + ps->winy=DBGetContactSettingDword(NULL,THIS_MODULE, "winy", DEFAULT_WINY); + ps->winxpos=DBGetContactSettingDword(NULL,THIS_MODULE, "winxpos", DEFAULT_WINXPOS); + ps->winypos=DBGetContactSettingDword(NULL,THIS_MODULE, "winypos", DEFAULT_WINYPOS); + ps->alpha=DBGetContactSettingByte(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA); + ps->showmystatus=DBGetContactSettingByte(NULL,THIS_MODULE, "showMyStatus", DEFAULT_SHOWMYSTATUS); + ps->timeout=DBGetContactSettingDword(NULL,THIS_MODULE, "timeout", DEFAULT_TIMEOUT); + ps->clr_msg=DBGetContactSettingDword(NULL,THIS_MODULE, "clr_msg", DEFAULT_CLRMSG); + ps->clr_status=DBGetContactSettingDword(NULL,THIS_MODULE, "clr_status", DEFAULT_CLRSTATUS); + ps->clr_shadow=DBGetContactSettingDword(NULL,THIS_MODULE, "clr_shadow", DEFAULT_CLRSHADOW); + ps->bkclr=DBGetContactSettingDword(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR); + + ps->showMsgWindow=DBGetContactSettingByte(NULL,THIS_MODULE, "showMessageWindow", DEFAULT_SHOWMSGWIN); + ps->showWhen=DBGetContactSettingDword(NULL,THIS_MODULE,"showWhen", DEFAULT_SHOWWHEN); + + _tcscpy(ps->msgformat, DEFAULT_MESSAGEFORMAT); + if ( !DBGetContactSettingTString( NULL, THIS_MODULE, "message_format", &dbv )) { + _tcscpy(ps->msgformat, dbv.ptszVal); + DBFreeVariant(&dbv); + } + + ps->announce=DBGetContactSettingDword(NULL,THIS_MODULE,"announce", DEFAULT_ANNOUNCE); + + ps->lf.lfHeight=DBGetContactSettingDword(NULL,THIS_MODULE, "fntHeight", DEFAULT_FNT_HEIGHT); + ps->lf.lfWidth=DBGetContactSettingDword(NULL,THIS_MODULE, "fntWidth", DEFAULT_FNT_WIDTH); + ps->lf.lfEscapement=DBGetContactSettingDword(NULL,THIS_MODULE, "fntEscapement", DEFAULT_FNT_ESCAPEMENT); + ps->lf.lfOrientation=DBGetContactSettingDword(NULL,THIS_MODULE, "fntOrientation", DEFAULT_FNT_ORIENTATION); + ps->lf.lfWeight=DBGetContactSettingDword(NULL,THIS_MODULE, "fntWeight", DEFAULT_FNT_WEIGHT); + ps->lf.lfItalic=DBGetContactSettingByte(NULL,THIS_MODULE, "fntItalic", DEFAULT_FNT_ITALIC); + ps->lf.lfUnderline=DBGetContactSettingByte(NULL,THIS_MODULE, "fntUnderline", DEFAULT_FNT_UNDERLINE); + ps->lf.lfStrikeOut=DBGetContactSettingByte(NULL,THIS_MODULE, "fntStrikeout", DEFAULT_FNT_STRIKEOUT); + ps->lf.lfCharSet=DBGetContactSettingByte(NULL,THIS_MODULE, "fntCharSet", DEFAULT_FNT_CHARSET); + ps->lf.lfOutPrecision=DBGetContactSettingByte(NULL,THIS_MODULE, "fntOutPrecision", DEFAULT_FNT_OUTPRECISION); + ps->lf.lfClipPrecision=DBGetContactSettingByte(NULL,THIS_MODULE, "fntClipPrecision", DEFAULT_FNT_CLIPRECISION); + ps->lf.lfQuality=DBGetContactSettingByte(NULL,THIS_MODULE, "fntQuality", DEFAULT_FNT_QUALITY); + ps->lf.lfPitchAndFamily=DBGetContactSettingByte(NULL,THIS_MODULE, "fntPitchAndFamily", DEFAULT_FNT_PITCHANDFAM); + strcpy(ps->lf.lfFaceName, DEFAULT_FNT_FACENAME); + if(!DBGetContactSetting(NULL,THIS_MODULE,"fntFaceName",&dbv)) { + strcpy(ps->lf.lfFaceName, dbv.pszVal); + DBFreeVariant(&dbv); + } +} + +void saveDBSettings(plgsettings *ps) +{ + logmsg("saveDBSettings"); + + DBWriteContactSettingByte(NULL,THIS_MODULE,"showShadow", ps->showShadow); + DBWriteContactSettingByte(NULL,THIS_MODULE,"altShadow",ps->altShadow); + DBWriteContactSettingByte(NULL,THIS_MODULE,"distance",ps->distance); + + DBWriteContactSettingDword(NULL,THIS_MODULE,"winx",ps->winx); + DBWriteContactSettingDword(NULL,THIS_MODULE,"winy",ps->winy); + DBWriteContactSettingDword(NULL,THIS_MODULE,"winxpos", ps->winxpos); + DBWriteContactSettingDword(NULL,THIS_MODULE,"winypos", ps->winypos); + + DBWriteContactSettingByte(NULL,THIS_MODULE,"alpha",ps->alpha); + DBWriteContactSettingDword(NULL,THIS_MODULE,"timeout", ps->timeout); + + DBWriteContactSettingByte(NULL,THIS_MODULE,"transparent",ps->transparent); + DBWriteContactSettingByte(NULL,THIS_MODULE,"messages",ps->messages); + DBWriteContactSettingByte(NULL,THIS_MODULE,"a_user",ps->a_user); + DBWriteContactSettingTString(NULL,THIS_MODULE, "message_format", ps->msgformat); + + DBWriteContactSettingByte(NULL,THIS_MODULE,"align",ps->align); + DBWriteContactSettingByte(NULL,THIS_MODULE,"salign",ps->salign); + + DBWriteContactSettingByte(NULL,THIS_MODULE,"showMyStatus",ps->showmystatus); + + DBWriteContactSettingDword(NULL,THIS_MODULE,"clr_msg", ps->clr_msg); + DBWriteContactSettingDword(NULL,THIS_MODULE,"clr_shadow", ps->clr_shadow); + DBWriteContactSettingDword(NULL,THIS_MODULE,"clr_status", ps->clr_status); + DBWriteContactSettingDword(NULL,THIS_MODULE,"bkclr", ps->bkclr); + + DBWriteContactSettingDword(NULL,THIS_MODULE, "fntHeight", ps->lf.lfHeight); + DBWriteContactSettingDword(NULL,THIS_MODULE, "fntWidth", ps->lf.lfWidth); + DBWriteContactSettingDword(NULL,THIS_MODULE, "fntEscapement", ps->lf.lfEscapement); + DBWriteContactSettingDword(NULL,THIS_MODULE, "fntOrientation", ps->lf.lfOrientation); + DBWriteContactSettingDword(NULL,THIS_MODULE, "fntWeight", ps->lf.lfWeight); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntItalic", ps->lf.lfItalic); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntUnderline", ps->lf.lfUnderline); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntStrikeout", ps->lf.lfStrikeOut); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntCharSet", ps->lf.lfCharSet); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntOutPrecision", ps->lf.lfOutPrecision); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntClipPrecision", ps->lf.lfClipPrecision); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntQuality", ps->lf.lfQuality); + DBWriteContactSettingByte(NULL,THIS_MODULE, "fntPitchAndFamily", ps->lf.lfPitchAndFamily); + DBWriteContactSettingString(NULL,THIS_MODULE, "fntFaceName", ps->lf.lfFaceName); + + DBWriteContactSettingDword(NULL,THIS_MODULE,"announce", ps->announce); + + DBWriteContactSettingByte(NULL,THIS_MODULE, "showMessageWindow", ps->showMsgWindow); + DBWriteContactSettingDword(NULL,THIS_MODULE,"showWhen", ps->showWhen); +} + +BOOL CALLBACK OptDlgProc(HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam) +{ + RECT rect; + plgsettings *ps; //0: current; 1: original + + logmsg("OptDlgProc"); + + switch(msg){ + case WM_INITDIALOG: + logmsg("OptDlgProc::INITDIALOG"); + TranslateDialogDefault(hDlg); + + ps=(plgsettings*)malloc(sizeof(plgsettings)*2); + loadDBSettings(&ps[0]); + ps[1]=ps[0]; + SetWindowLong(hDlg, GWL_USERDATA, (LONG)ps); + SetWindowLong(hwnd, GWL_STYLE, (LONG)(pSetLayeredWindowAttributes?0:WS_CLIPSIBLINGS)|WS_POPUP|WS_SIZEBOX); + SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED); + + SetWindowLong(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE,GetWindowLong(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); + SetWindowLong(GetDlgItem(hDlg,IDC_TREE2),GWL_STYLE,GetWindowLong(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); + + CheckDlgButton(hDlg, IDC_RADIO1+ps->align-1, BST_CHECKED); + CheckDlgButton(hDlg, IDC_RADIO10+9-ps->salign, BST_CHECKED); + CheckDlgButton(hDlg, IDC_CHECK1, ps->altShadow); + CheckDlgButton(hDlg, IDC_CHECK2, ps->showMsgWindow); + CheckDlgButton(hDlg, IDC_CHECK3, ps->transparent); + CheckDlgButton(hDlg, IDC_CHECK4, ps->showShadow); + CheckDlgButton(hDlg, IDC_CHECK5, ps->messages); + + SetDlgItemText(hDlg, IDC_EDIT2, ps->msgformat); + + CheckDlgButton(hDlg, IDC_CHECK6, ps->a_user); + CheckDlgButton(hDlg, IDC_CHECK7, ps->showmystatus); + SetDlgItemInt(hDlg, IDC_EDIT1, ps->distance, 0); + + SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_SETRANGE, (WPARAM)0, MAKELONG(0, 255)); + SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)ps->alpha); + + { + TCHAR buf[20]; + mir_sntprintf(buf, SIZEOF(buf), _T("%d %%"), ps->alpha*100/255); + SetDlgItemText(hDlg, IDC_ALPHATXT, buf); + } + + SetDlgItemInt(hDlg, IDC_EDIT5, ps->timeout, 0); + FillCheckBoxTree(GetDlgItem(hDlg, IDC_TREE1), statusValues, SIZEOF(statusValues), ps->announce); + FillCheckBoxTree(GetDlgItem(hDlg, IDC_TREE2), statusValues, SIZEOF(statusValues), ps->showWhen); + return 0; + + case WM_HSCROLL: + if (LOWORD(wparam)==SB_ENDSCROLL||LOWORD(wparam)==SB_THUMBPOSITION||LOWORD(wparam)==SB_ENDSCROLL) + return 0; + ps=(plgsettings*)GetWindowLong(hDlg, GWL_USERDATA); + ps->alpha=SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_GETPOS, 0, 0); + { + TCHAR buf[20]; + mir_sntprintf(buf, SIZEOF(buf), _T("%d %%"), ps->alpha*100/255); + SetDlgItemText(hDlg, IDC_ALPHATXT, buf); + } + goto xxx; + case WM_DESTROY: + logmsg("OptDlgProc::DESTROY"); + ps=(plgsettings*)GetWindowLong(hDlg, GWL_USERDATA); + ps[0]=ps[1]; + saveDBSettings(&ps[0]); + + SetWindowLong(hwnd, GWL_STYLE, (LONG)(pSetLayeredWindowAttributes?0:WS_CLIPSIBLINGS)|WS_POPUP); + SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED); + + SetWindowPos(hwnd, 0, ps->winxpos, ps->winypos, ps->winx, ps->winy, SWP_NOZORDER|SWP_NOACTIVATE); + if (pSetLayeredWindowAttributes) + pSetLayeredWindowAttributes(hwnd, ps->bkclr, ps->alpha, (ps->transparent?LWA_COLORKEY:0)|LWA_ALPHA); + + free((void*)GetWindowLong(hDlg, GWL_USERDATA)); + return 0; + case WM_COMMAND: + logmsg("OptDlgProc::COMMAND"); + ps=(plgsettings*)GetWindowLong(hDlg, GWL_USERDATA); + switch (LOWORD(wparam)) { + case IDC_BUTTON7: + MessageBox(hDlg, _T("Variables:\n %n : Nick\n %m : Message\n %l : New line"), _T("Help"), MB_ICONINFORMATION|MB_OK); + return 0; + case IDC_BUTTON5: + SendMessage(hwnd, WM_USER+1, (WPARAM)_T("miranda is gr8 and this is a long message ;-)"), 0); + break; + case IDC_BUTTON1: + selectFont(hDlg, &(ps->lf)); + break; + case IDC_BUTTON2: + selectColor(hDlg, &ps->clr_status); + break; + case IDC_BUTTON6: + selectColor(hDlg, &ps->clr_msg); + break; + case IDC_BUTTON3: + selectColor(hDlg, &ps->clr_shadow); + break; + case IDC_BUTTON4: + selectColor(hDlg, &ps->bkclr); + break; + case IDC_CHECK4: + ps->showShadow=IsDlgButtonChecked(hDlg, IDC_CHECK4); + break; + case IDC_CHECK1: + ps->altShadow=IsDlgButtonChecked(hDlg, IDC_CHECK1); + break; + case IDC_CHECK2: + ps->showMsgWindow=IsDlgButtonChecked(hDlg, IDC_CHECK2); + case IDC_EDIT1: + ps->distance=GetDlgItemInt(hDlg, IDC_EDIT1, 0, 0); + break; + case IDC_EDIT5: + ps->timeout=GetDlgItemInt(hDlg, IDC_EDIT5, 0, 0); + break; + case IDC_CHECK3: + ps->transparent=IsDlgButtonChecked(hDlg, IDC_CHECK3); + break; + case IDC_CHECK5: + ps->messages=IsDlgButtonChecked(hDlg, IDC_CHECK5); + break; + case IDC_CHECK6: + ps->a_user=IsDlgButtonChecked(hDlg, IDC_CHECK6); + break; + case IDC_CHECK7: + ps->showmystatus=IsDlgButtonChecked(hDlg, IDC_CHECK7); + break; + case IDC_RADIO1: + case IDC_RADIO2: + case IDC_RADIO3: + case IDC_RADIO4: + case IDC_RADIO5: + case IDC_RADIO6: + case IDC_RADIO7: + case IDC_RADIO8: + case IDC_RADIO9: + if (IsDlgButtonChecked(hDlg, LOWORD(wparam))) + ps->align=LOWORD(wparam)-IDC_RADIO1+1; + break; + case IDC_RADIO10: + case IDC_RADIO11: + case IDC_RADIO12: + case IDC_RADIO13: + case IDC_RADIO14: + case IDC_RADIO15: + case IDC_RADIO16: + case IDC_RADIO17: + case IDC_RADIO18: + if (IsDlgButtonChecked(hDlg, LOWORD(wparam))) + ps->salign=10-(LOWORD(wparam)-IDC_RADIO10+1); + break; + } +xxx: + saveDBSettings(ps); + SetWindowPos(hwnd, 0, 0, 0, ps->winx, ps->winy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); + if (pSetLayeredWindowAttributes) + pSetLayeredWindowAttributes(hwnd, DBGetContactSettingDword(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR), DBGetContactSettingByte(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA), (DBGetContactSettingByte(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)?LWA_COLORKEY:0)|LWA_ALPHA); + InvalidateRect(hwnd, 0, TRUE); + SendMessage(GetParent(hDlg),PSM_CHANGED,0,0); + + return 0; + + case WM_NOTIFY: + logmsg("OptDlgProc::NOTIFY"); + switch(((LPNMHDR)lparam)->code){ + case TVN_SETDISPINFO: + case NM_CLICK: + case NM_RETURN: + case TVN_SELCHANGED: + if (((LPNMHDR)lparam)->idFrom==IDC_TREE1) + SendMessage(GetParent(hDlg),PSM_CHANGED,0,0); + break; + case PSN_APPLY: + ps=(plgsettings*)GetWindowLong(hDlg, GWL_USERDATA); + + GetWindowRect(hwnd, &rect); + ps->winx=rect.right-rect.left; + ps->winy=rect.bottom-rect.top; + ps->winxpos=rect.left; + ps->winypos=rect.top; + ps->announce=MakeCheckBoxTreeFlags(GetDlgItem(hDlg, IDC_TREE1)); + ps->showWhen=MakeCheckBoxTreeFlags(GetDlgItem(hDlg, IDC_TREE2)); + GetDlgItemText(hDlg, IDC_EDIT2, ps->msgformat, 255); + ps[1]=ps[0]; //apply current settings at closing + + saveDBSettings(ps); + if (pSetLayeredWindowAttributes) + pSetLayeredWindowAttributes(hwnd, DBGetContactSettingDword(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR), DBGetContactSettingByte(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA), (DBGetContactSettingByte(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)?LWA_COLORKEY:0)|LWA_ALPHA); + InvalidateRect(hwnd, 0, TRUE); + break; + } + break; + } + + return 0; +} + +int OptionsInit(WPARAM wparam,LPARAM lparam) +{ + OPTIONSDIALOGPAGE odp; + + logmsg("OptionsInit"); + ZeroMemory(&odp,sizeof(odp)); + odp.cbSize=sizeof(odp); + odp.position=150000000; + odp.pszGroup="Plugins"; + odp.groupPosition=950000000; + odp.hInstance=hI; + odp.pszTemplate=MAKEINTRESOURCEA(IDD_DIALOG1); + odp.pszTitle="OSD"; + odp.pfnDlgProc=(DLGPROC)OptDlgProc; + odp.flags=ODPF_BOLDGROUPS; + CallService(MS_OPT_ADDPAGE,wparam,(LPARAM)&odp); + return 0; +} diff --git a/wbOSD/pack.cmd b/wbOSD/pack.cmd new file mode 100644 index 0000000..bd37e4d --- /dev/null +++ b/wbOSD/pack.cmd @@ -0,0 +1,31 @@ +@echo off +nmake -f wbOSD.mak CFG="wbOSD - Win32 Release" +if errorlevel 1 ( + echo "Make failed" + goto :eof ) +nmake -f wbOSD.mak CFG="wbOSD - Win32 Release Unicode" +if errorlevel 1 ( + echo "Make failed" + goto :eof ) + +del "%temp%\wbOSD.zip" > nul +del "%temp%\wbOSDW.zip" > nul +del "%temp%\wbOSDSrc.zip" > nul +del *.user > nul + +for /F "tokens=1-6 delims=, " %%i in (buildnumber.h) do call :Translate %%i %%j %%k %%l %%m %%n + +"%PROGRAMFILES%\7-zip\7z.exe" a -tzip -r- -mx=9 "%temp%\wbOSD.zip" ./Release/wbOSD.dll wbOSD-translation.txt +"%PROGRAMFILES%\7-zip\7z.exe" a -tzip -r- -mx=9 "%temp%\wbOSDW.zip" ./Release_Unicode/wbOSD.dll wbOSD-translation.txt + +rd /S /Q Release +rd /S /Q Release_Unicode + +"%PROGRAMFILES%\7-zip\7z.exe" a -tzip -r0 -mx=9 "%temp%\wbOSDSrc.zip" -xr!.svn -x!*.cmd +goto :eof + +:Translate +if %2 == __FILEVERSION_STRING ( + perl lpgen.pl wbOSD version %3 %4 %5 %6 ) + +goto :eof diff --git a/wbOSD/readme b/wbOSD/readme new file mode 100644 index 0000000..09815bf --- /dev/null +++ b/wbOSD/readme @@ -0,0 +1,84 @@ +Wannabe (Miranda's) OSD +(c)2005 Andrej Krutak +Distribute under the GNU GPL 2.0 license + +======================================================= + +Hello there, I'm happy you are trying out my OSD plugin... I've just started +to make it (in fact, it's the first miranda plugin i ever made ;-) so please +excuse bugs etc. (but you may report them, of course ;-) + +The plugin is trying to implement all the functionality of the 'old' OSD plugin. +However, I never got to it's documentation, so I can't tell if everything's gonna +work the way it should... Let me know :o) + +And I'll be happy if you send some suggestions/code parts etc., but please, +send it into the forum of this project on miranda's web ;-) + + + +------| Short tips: |---------------------------------- + +Moving the OSD: +Simply drag it by pressing left mouse button and then move the cursor ;-) +Note that only position changes done while settings dialog is shown are +saved. + +Closing the actual OSD: +Press the right button over the OSD - that will close the OSD and +show a message window for the contact who caused the OSD activity. + + + +------| Changelog: |----------------------------------- + +0.2.0.5 + New: Enable/disable OSD announces for specific own statuses + Fix: User interface improvemets... + Fix: used 100% of the processor time sometimes + +0.2.0.1 + Fix: Help button + Fix: Translation of status announces + +0.2.0.0 + Fix: multiline output + New: separate color for status & message announces + New: by pressing the right mouse button you can send message + New: message announce format can be customized a little + Fix: User interface improvemets... + Fix: again a little bit more compatible to win9x ;-) + Info: The unicode version might be broken, sorry if it is + +0.1.5.0 + New: unicode support (thanx to SilverCircle) + New: multiline output (thanx to SilverCircle) + (Hopefully)Fix: win9x-workaround memory leak +0.1.0.0 + New: more comfortable OSD positioning + New: possibility to not show own status changes + New: translation support + Fix: should work under win9x, however the transparency doesn't work well + Fix: some small bugfixes (e.g. saving of announce settings) ;-) + +0.0.2.0 + New: some more documentation + New: settings applied to osd instantly, saved after apply + New: user offline notification + Fix: only showing status of people in the contact list + +0.0.1.1 + Tiny little fix ;-) + +0.0.1.0 + Initial release + + + + +------| Some TODOs: |---------------------------------- + +* different color schemes for messages/online notifications etc. (in progess) +* test (and make work in case it doesn't) under other os than winxp +* add some other formatting options (not sure if it's worth the work) +* other things ;-) diff --git a/wbOSD/resource.h b/wbOSD/resource.h new file mode 100644 index 0000000..64e57a5 --- /dev/null +++ b/wbOSD/resource.h @@ -0,0 +1,57 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by wbOSD.rc +// +#define IDD_DIALOG1 101 +#define IDC_BUTTON1 1001 +#define IDC_BUTTON2 1002 +#define IDC_BUTTON3 1003 +#define IDC_BUTTON6 1004 +#define IDC_BUTTON4 1008 +#define IDC_EDIT1 1009 +#define IDC_CHECK1 1010 +#define IDC_CHECK3 1013 +#define IDC_EDIT4 1015 +#define IDC_EDIT5 1016 +#define IDC_CHECK4 1017 +#define IDC_TREE1 1018 +#define IDC_CHECK5 1019 +#define IDC_CHECK6 1020 +#define IDC_BUTTON5 1021 +#define IDC_CHECK7 1022 +#define IDC_CHECK8 1023 +#define IDC_CHECK2 1023 +#define IDC_SLIDER1 1024 +#define IDC_ALPHATXT 1025 +#define IDC_EDIT2 1027 +#define IDC_BUTTON7 1028 +#define IDC_TREE2 1029 +#define IDC_RADIO1 1101 +#define IDC_RADIO2 1102 +#define IDC_RADIO3 1103 +#define IDC_RADIO4 1104 +#define IDC_RADIO5 1105 +#define IDC_RADIO6 1106 +#define IDC_RADIO7 1107 +#define IDC_RADIO8 1108 +#define IDC_RADIO9 1109 +#define IDC_RADIO10 1120 +#define IDC_RADIO11 1121 +#define IDC_RADIO12 1122 +#define IDC_RADIO13 1123 +#define IDC_RADIO14 1124 +#define IDC_RADIO15 1125 +#define IDC_RADIO16 1126 +#define IDC_RADIO17 1127 +#define IDC_RADIO18 1128 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1029 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/wbOSD/wbOSD-translation.txt b/wbOSD/wbOSD-translation.txt new file mode 100644 index 0000000..29236a7 --- /dev/null +++ b/wbOSD/wbOSD-translation.txt @@ -0,0 +1,42 @@ +Miranda Language Pack Version 1 +Locale: 0809 +Authors: Andrej Krutak +Author-email: andree182 {at} gmail (dot) com +Last-Modified-Using: Miranda IM 0.7svn +Plugins-included: +; Generated by lpgen on Thu Jan 13 21:36:28 2011 +; Translations: 27 + +; Common strings that belong to many files +;[] + +; ./events.cpp +;[%s is %s] + +; ./wbOSD.rc +;[Align] +;[Alpha:] +;[Alternative shadow] +;[Announce] +;[Background color] +;[Dialog] +;[Format:] +;[General] +;[Other] +;[Radio1] +;[Select font] +;[Shadow] +;[Shadow align] +;[Shadow color] +;[Shadow distance:] +;[Show] +;[Show events] +;[Show message window after click] +;[Show my status changes] +;[Show testing OSD] +;[Show when my status is:] +;[Static] +;[Status changes] +;[Text color] +;[Timeout (ms):] +;[Transparent] diff --git a/wbOSD/wbOSD.cpp b/wbOSD/wbOSD.cpp new file mode 100644 index 0000000..d4f9cf7 --- /dev/null +++ b/wbOSD/wbOSD.cpp @@ -0,0 +1,332 @@ +/* +Wannabe OSD +This plugin tries to become miranda's standard OSD ;-) + +(C) 2005 Andrej Krutak + +Distributed under GNU's GPL 2 or later +*/ + +#include "wbOSD.h" + +#define WORKAROUND_9X //transparent window support on 9x workaround... +//#define FORCE_9XDRAWING + +TCHAR szClassName[] = _T("wbOSD"); +const static osdmsg defstr={_T(""), 0, RGB(0, 0, 0), 0, 0}; + +int DrawMe(HWND hwnd, TCHAR *string, COLORREF color) +{ + HDC hdc; + PAINTSTRUCT ps; + RECT rect, rect2; + HGDIOBJ oo; + UINT talign=0; + HBRUSH bkb; + int sxo, syo; + HFONT fh; + plgsettings plgs; + + logmsg("DrawMe"); + if (!string) string=_T("bullshit"); + + loadDBSettings(&plgs); + fh=CreateFontIndirectA(&(plgs.lf)); + + hdc=BeginPaint(hwnd, &ps); + SetBkMode(hdc, TRANSPARENT); + + GetClientRect(hwnd, &rect); + bkb=CreateSolidBrush(plgs.bkclr); + +#ifdef WORKAROUND_9X + //workaround for 9x, needs to get fixed... + if (!pSetLayeredWindowAttributes && DBGetContactSettingByte(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)) { + HDC shdc; + + logmsg("DrawMe::w9x"); + + shdc=CreateDC(TEXT("DISPLAY"), 0, 0, 0); + GetWindowRect(hwnd, &rect2); + BitBlt(hdc, 0, 0, rect2.right-rect2.left, rect2.bottom-rect2.top, shdc, rect2.left, rect2.top, SRCCOPY); + DeleteDC(shdc); + } else +#endif + FillRect(hdc, &rect, bkb); + + DeleteObject(bkb); + + oo=SelectObject(hdc, fh); + +// rect2.left=0; +// rect2.top=0; +// DrawText(hdc, string, -1, &rect2, DT_SINGLELINE|DT_CALCRECT); + rect2 = rect; + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|DT_CALCRECT); + + if (plgs.align>=1 && plgs.align<=3) + rect.top=0; + if (plgs.align>=4 && plgs.align<=6) + rect.top=(rect.bottom-rect2.bottom)/2; + if (plgs.align>=7 && plgs.align<=9) + rect.top=rect.bottom-rect2.bottom; + + if (((plgs.align-1)%3)==0) + rect.left=0; + else if (((plgs.align-2)%3)==0) + rect.left=(rect.right-rect2.right)/2; + else if (((plgs.align-3)%3)==0) + rect.left=rect.right-rect2.right; + + rect.bottom=rect.top+rect2.bottom; + rect.right=rect.left+rect2.right; + + //draw shadow + if (plgs.showShadow) { + logmsg("DrawMe::showShadow"); + if (plgs.salign>=1 && plgs.salign<=3) syo=-plgs.distance; + if (plgs.salign>=4 && plgs.salign<=6) syo=0; + if (plgs.salign>=7 && plgs.salign<=9) syo=plgs.distance; + + if (((plgs.salign-1)%3)==0) sxo=-plgs.distance; + else if (((plgs.salign-2)%3)==0) sxo=0; + else if (((plgs.salign-3)%3)==0) sxo=plgs.distance; + + SetTextColor(hdc, plgs.clr_shadow); + if (plgs.altShadow==0) { + rect2=rect; + OffsetRect(&rect, sxo, syo); + + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|talign); + } else { + rect2=rect; + rect2.left+=plgs.distance; + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|talign); + + rect2=rect; + rect2.left-=plgs.distance; + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|talign); + + rect2=rect; + rect2.top-=plgs.distance; + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|talign); + + rect2=rect; + rect2.top+=plgs.distance; + DrawText(hdc, string, -1, &rect2, DT_WORDBREAK|talign); + + OffsetRect(&rect, sxo/2, syo/2); + } + } + + //draw text + SetTextColor(hdc, color); + DrawText(hdc, string, -1, &rect, DT_WORDBREAK); + + SelectObject(hdc, oo); + DeleteObject(fh); + EndPaint(hwnd, &ps); + + return 0; +} + +LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + osdmsg* ms; + + switch (message) { + case WM_CREATE: + logmsg("WindowProcedure::CREATE"); + SetWindowLong(hwnd, GWL_USERDATA, (LONG)&defstr); + return 0; + + case WM_DESTROY: + logmsg("WindowProcedure::DESTROY"); + return 0; + + case WM_PAINT: + logmsg("WindowProcedure::PAINT"); + + ms=(osdmsg*)GetWindowLong(hwnd, GWL_USERDATA); + if (ms) + return DrawMe(hwnd, ms->text, ms->color); + + PAINTSTRUCT ps; + BeginPaint(hwnd, &ps); + EndPaint(hwnd, &ps); + return 0; + + case WM_NCRBUTTONDOWN: + logmsg("WindowProcedure::NCRBUTTONDOWN"); + + ms = (osdmsg*)GetWindowLong(hwnd, GWL_USERDATA); + if ( ms ) { + if ( ms->callback) ms->callback(ms->param); + SendMessage(hwnd, WM_USER+3, 0, 0); + } + return 0; + + case WM_TIMER: + logmsg("WindowProcedure::TIMER"); + SendMessage(hwnd, WM_USER+3, wParam, 0); + return 0; + + case WM_USER+1: //draw text ((char *)string, (int) timeout + logmsg("WindowProcedure::USER+1"); + + ms=(osdmsg*)mir_alloc(sizeof(osdmsg)); + ms->text = mir_tstrdup((TCHAR *)wParam ); + if ( lParam == 0 ) + lParam = DBGetContactSettingDword( NULL,THIS_MODULE, "timeout", DEFAULT_TIMEOUT ); + ms->timeout = lParam; + ms->callback = 0; + ms->color = DBGetContactSettingDword(NULL,THIS_MODULE, "clr_msg", DEFAULT_CLRMSG); + ms->param = 0; + SendMessage(hwnd, WM_USER+4, (WPARAM)ms, 0); + mir_free(ms->text); + mir_free(ms); + return 0; + + case WM_USER+2: //show + logmsg("WindowProcedure::USER+2"); + SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_NOACTIVATE); + return 0; + + case WM_USER+3: //hide + ms = ( osdmsg* )GetWindowLong(hwnd, GWL_USERDATA); + logmsg("WindowProcedure::USER+3"); + if ( !ms ) + return 0; + + logmsg("WindowProcedure::USER+3/om"); + KillTimer(hwnd, (UINT)ms); + mir_free(ms->text); + mir_free(ms); + SetWindowLong(hwnd, GWL_USERDATA, 0); + ShowWindow(hwnd, SW_HIDE); + return 0; + + case WM_USER+4: + logmsg("WindowProcedure::USER+4"); + + ms = (osdmsg*)GetWindowLong(hwnd, GWL_USERDATA); + if ( ms != 0 ) { + logmsg("WindowProcedure::USER+4/old"); + KillTimer(hwnd, (UINT)ms); + mir_free(ms->text); + mir_free(ms); + SetWindowLong(hwnd, GWL_USERDATA, 0); + if (!pSetLayeredWindowAttributes) { + logmsg("WindowProcedure::USER+4/old+9x"); + ShowWindow(hwnd, SW_HIDE); + Sleep(50); + } } + + ms =(osdmsg*)mir_alloc(sizeof(osdmsg)); + memcpy(ms, (osdmsg*)wParam, sizeof(osdmsg)); + ms->text = mir_tstrdup( ms->text ); + + SetWindowLong(hwnd, GWL_USERDATA, (LONG)ms); + SetTimer(hwnd, (UINT)ms, (int)ms->timeout, 0); + InvalidateRect(hwnd, 0, TRUE); + SendMessage(hwnd, WM_USER+2, 0, 0); + return 0; + + case WM_NCHITTEST: + { + RECT rect; + GetWindowRect(hwnd, &rect); + + logmsg("WindowProcedure::NCHITTEST"); + + if (LOWORD(lParam)>=(rect.left+5) && LOWORD(lParam)<=(rect.right-5) && + HIWORD(lParam)>=(rect.top+5) && HIWORD(lParam)<=(rect.bottom-5)) + return HTCAPTION; + return DefWindowProc (hwnd, message, wParam, lParam); + } + //here will be the doubleclick => open-message-window solution ;-) + //case WM_NCLBUTTONDBLCLK: + // CallService(MS_MSG_SENDMESSAGE, wparam,(LPARAM)&odp); + // return 0; + default: + return DefWindowProc (hwnd, message, wParam, lParam); + } + + return 0; +} + +int OSDAnnounce(WPARAM wParam, LPARAM lParam) +{ + logmsg("OSDAnnounce"); + return SendMessage(hwnd, WM_USER+1, wParam, lParam); +} + +int pluginShutDown(WPARAM wparam,LPARAM lparam) +{ + logmsg("pluginShutDown"); + if (hwnd) { + logmsg("pluginShutDown/hwnd"); + SendMessage(hwnd, WM_USER+3, 0, 0); + DestroyWindow(hwnd); + hwnd=0; + } + return 0; +} + +int MainInit(WPARAM wparam,LPARAM lparam) +{ + logmsg("MainInit"); + HookEvent(ME_OPT_INITIALISE,OptionsInit); + + WNDCLASSEX wincl; + wincl.hInstance = hI; + wincl.lpszClassName = szClassName; + wincl.lpfnWndProc = WindowProcedure; + wincl.style = CS_DBLCLKS; + wincl.cbSize = sizeof (WNDCLASSEX); + + wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); + wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); + wincl.hCursor = LoadCursor (NULL, IDC_ARROW); + wincl.lpszMenuName = NULL; + wincl.cbClsExtra = 0; + wincl.cbWndExtra = 0; + wincl.hbrBackground = 0; + + if ( !RegisterClassEx( &wincl )) + return 0; + + hwnd = CreateWindowEx((pSetLayeredWindowAttributes?WS_EX_LAYERED:0)|WS_EX_TOOLWINDOW, szClassName, _T("WannaBeOSD"), + (pSetLayeredWindowAttributes?0:WS_CLIPSIBLINGS) | WS_POPUP, + DBGetContactSettingDword(NULL,THIS_MODULE, "winxpos", DEFAULT_WINXPOS), + DBGetContactSettingDword(NULL,THIS_MODULE, "winypos", DEFAULT_WINYPOS), + DBGetContactSettingDword(NULL,THIS_MODULE, "winx", DEFAULT_WINX), + DBGetContactSettingDword(NULL,THIS_MODULE, "winy", DEFAULT_WINY), + HWND_DESKTOP, NULL, hI, NULL); + + SetWindowLong(hwnd, GWL_USERDATA, 0); + + if (pSetLayeredWindowAttributes) + pSetLayeredWindowAttributes(hwnd, DBGetContactSettingDword(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR), DBGetContactSettingByte(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA), (DBGetContactSettingByte(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)?LWA_COLORKEY:0)|LWA_ALPHA); + + hservosda=CreateServiceFunction("OSD/Announce", OSDAnnounce); + +#if !defined(UNICODE_SERVICE_ONLY) + hHookedNewEvent = HookEvent(ME_DB_EVENT_ADDED, HookedNewEvent); + + // try to create ME_STATUSCHANGE_CONTACTSTATUSCHANGED event... I hope it fails when newstatusnotify or equal creates it before ;-) + + hContactStatusChanged = HookEvent(ME_STATUSCHANGE_CONTACTSTATUSCHANGED,ContactStatusChanged); + if (!hContactStatusChanged) { + hHookContactStatusChanged = CreateHookableEvent(ME_STATUSCHANGE_CONTACTSTATUSCHANGED); + hContactSettingChanged = HookEvent(ME_DB_CONTACT_SETTINGCHANGED,ContactSettingChanged); + + hContactStatusChanged = HookEvent(ME_STATUSCHANGE_CONTACTSTATUSCHANGED,ContactStatusChanged); + } + hProtoAck=HookEvent(ME_PROTO_ACK,ProtoAck); +#endif + + hpluginShutDown=HookEvent(ME_SYSTEM_SHUTDOWN,pluginShutDown); + + return 0; +} diff --git a/wbOSD/wbOSD.dep b/wbOSD/wbOSD.dep new file mode 100644 index 0000000..7b3cf35 --- /dev/null +++ b/wbOSD/wbOSD.dep @@ -0,0 +1,24 @@ +# Microsoft Developer Studio Generated Dependency File, included by wbOSD.mak + +.\events.cpp : \ + "..\..\include\m_message.h"\ + + +.\main.cpp : \ + "..\..\include\m_clc.h"\ + "..\..\include\m_clist.h"\ + "..\..\include\m_contacts.h"\ + "..\..\include\m_database.h"\ + "..\..\include\m_ignore.h"\ + "..\..\include\m_langpack.h"\ + "..\..\include\m_options.h"\ + "..\..\include\m_plugins.h"\ + "..\..\include\m_protocols.h"\ + "..\..\include\m_protosvc.h"\ + "..\..\include\m_system.h"\ + "..\..\include\m_utils.h"\ + "..\..\include\newpluginapi.h"\ + "..\..\include\statusmodes.h"\ + "..\..\include\win2k.h"\ + ".\wbOSD.h"\ + diff --git a/wbOSD/wbOSD.dsp b/wbOSD/wbOSD.dsp new file mode 100644 index 0000000..212f620 --- /dev/null +++ b/wbOSD/wbOSD.dsp @@ -0,0 +1,200 @@ +# Microsoft Developer Studio Project File - Name="wbOSD" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=wbOSD - Win32 Release Unicode +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "wbOSD.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "wbOSD.mak" CFG="wbOSD - Win32 Release Unicode" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wbOSD - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Debug Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Release Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "wbOSD - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "wbOSD_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"wbOSD.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40d /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock32.lib /nologo /base:"0x32240000" /dll /machine:I386 /out:"./Release/wbOSD.dll" /filealign:512 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "wbOSD_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Yu"wbOSD.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40d /d "_DEBUG" +# ADD RSC /l 0x40d /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /dll /debug /machine:I386 /out:"./Debug/wbOSD.dll" /pdbtype:sept +# SUBTRACT LINK32 /verbose /pdb:none /map + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_Unicode" +# PROP BASE Intermediate_Dir "Debug_Unicode" +# PROP BASE Ignore_Export_Lib 1 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_Unicode" +# PROP Intermediate_Dir "Debug_Unicode" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "wbOSD_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /Yu"wbOSD.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40d /d "_DEBUG" +# ADD RSC /l 0x40d /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /verbose /map +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock.lib /nologo /dll /debug /machine:I386 /out:"./Debug_Unicode/wbOSD.dll" /pdbtype:sept +# SUBTRACT LINK32 /verbose /pdb:none /map + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Release Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_Unicode" +# PROP BASE Intermediate_Dir "Release_Unicode" +# PROP BASE Ignore_Export_Lib 1 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Unicode" +# PROP Intermediate_Dir "Release_Unicode" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "wbOSD_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /D "wbOSD_EXPORTS" /Yu"wbOSD.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock32.lib /nologo /base:"0x32240000" /dll /pdb:none /map /machine:I386 +# SUBTRACT BASE LINK32 /verbose +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock32.lib /nologo /base:"0x32240000" /dll /machine:I386 /out:"./Release_Unicode/wbOSD.dll" /filealign:512 +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "wbOSD - Win32 Release" +# Name "wbOSD - Win32 Debug" +# Name "wbOSD - Win32 Debug Unicode" +# Name "wbOSD - Win32 Release Unicode" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\events.cpp +# End Source File +# Begin Source File + +SOURCE=.\main.cpp +# ADD CPP /Yc"wbOSD.h" +# End Source File +# Begin Source File + +SOURCE=.\options.cpp +# End Source File +# Begin Source File + +SOURCE=.\wbOSD.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\wbOSD.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\wbOSD.rc +# End Source File +# End Group +# Begin Source File + +SOURCE=.\copying.txt +# End Source File +# Begin Source File + +SOURCE=.\Notes.txt +# End Source File +# End Target +# End Project diff --git a/wbOSD/wbOSD.dsw b/wbOSD/wbOSD.dsw new file mode 100644 index 0000000..b48606c --- /dev/null +++ b/wbOSD/wbOSD.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "wbOSD"=.\wbOSD.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/wbOSD/wbOSD.h b/wbOSD/wbOSD.h new file mode 100644 index 0000000..680f791 --- /dev/null +++ b/wbOSD/wbOSD.h @@ -0,0 +1,144 @@ +/* +Wannabe OSD +This plugin tries to become miranda's standard OSD ;-) + +(C) 2005 Andrej Krutak + +Distributed under GNU's GPL 2 or later +*/ + +#define _WIN32_WINNT 0x0500 +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include +#include + +#include "resource.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define THIS_MODULE "mirandaosd" + +//SETTINGS DEFAULTS +#define DEFAULT_FNT_HEIGHT -30 +#define DEFAULT_FNT_WIDTH 0 +#define DEFAULT_FNT_ESCAPEMENT 0 +#define DEFAULT_FNT_ORIENTATION 0 +#define DEFAULT_FNT_WEIGHT 700 +#define DEFAULT_FNT_ITALIC 0 +#define DEFAULT_FNT_UNDERLINE 0 +#define DEFAULT_FNT_STRIKEOUT 0 +#define DEFAULT_FNT_CHARSET 0 +#define DEFAULT_FNT_OUTPRECISION 3 +#define DEFAULT_FNT_CLIPRECISION 2 +#define DEFAULT_FNT_QUALITY 1 +#define DEFAULT_FNT_PITCHANDFAM 49 +#define DEFAULT_FNT_FACENAME "Arial" + +#define DEFAULT_CLRMSG RGB(255, 100, 0) //fore +#define DEFAULT_CLRSTATUS RGB(40, 160, 255) //fore +#define DEFAULT_CLRSHADOW RGB(0, 0, 0) //bk +#define DEFAULT_BKCLR RGB(255, 255, 255) +#define DEFAULT_ALIGN 1 +#define DEFAULT_SALIGN 1 +#define DEFAULT_DISTANCE 2 +#define DEFAULT_ALTSHADOW 0 +#define DEFAULT_TRANPARENT 1 +#define DEFAULT_WINX 500 +#define DEFAULT_WINY 100 +#define DEFAULT_WINXPOS 10 +#define DEFAULT_WINYPOS 10 +#define DEFAULT_ALPHA 175 +#define DEFAULT_TIMEOUT 3000 +#define DEFAULT_SHOWSHADOW 1 +#define DEFAULT_ANNOUNCEMESSAGES 1 +#define DEFAULT_ANNOUNCESTATUS 1 +#define DEFAULT_ANNOUNCE 0x00000002 //status mask +#define DEFAULT_SHOWMYSTATUS 1 +#define DEFAULT_MESSAGEFORMAT _T("Message from %n: %m") +#define DEFAULT_SHOWMSGWIN 1 +#define DEFAULT_SHOWWHEN 0x00000002 + +//HOOKS +#define ME_STATUSCHANGE_CONTACTSTATUSCHANGED "Miranda/StatusChange/ContactStatusChanged" + +int ContactStatusChanged(WPARAM wParam, LPARAM lParam); +int ProtoAck(WPARAM wparam,LPARAM lparam); +int ContactSettingChanged(WPARAM wparam,LPARAM lparam); +int HookedNewEvent(WPARAM wParam, LPARAM lParam); + +//ANNOUNCING MESSAGES FROM OUTSIDE ;-) +int OSDAnnounce(WPARAM wParam, LPARAM lParam); + +struct CheckBoxValues_t { + DWORD style; + TCHAR* szDescr; +}; + +static const struct CheckBoxValues_t statusValues[]={ + {ID_STATUS_OFFLINE,_T("offline")}, + {ID_STATUS_ONLINE,_T("online")}, + {ID_STATUS_AWAY,_T("away")}, + {ID_STATUS_DND,_T("DND")}, + {ID_STATUS_NA,_T("NA")}, + {ID_STATUS_OCCUPIED,_T("occupied")}, + {ID_STATUS_FREECHAT,_T("free for chat")}, + {ID_STATUS_INVISIBLE,_T("invisible")}, + {ID_STATUS_ONTHEPHONE,_T("on the phone")}, + {ID_STATUS_OUTTOLUNCH,_T("out to lunch")} +}; + +#define ID_STATUS_MIN ID_STATUS_OFFLINE +#define ID_STATUS_MAX ID_STATUS_OUTTOLUNCH + +typedef struct _plgsettings { + int align, salign, altShadow, showShadow, a_user, distance, onlyfromlist, showmystatus; + int showMsgWindow; + int messages; //also other events... + TCHAR msgformat[256]; + int winx, winy, winxpos, winypos, alpha, transparent, timeout; + COLORREF clr_msg, clr_status, clr_shadow, bkclr; + DWORD announce, showWhen; + LOGFONTA lf; +} plgsettings; + +typedef struct _osdmsg { + TCHAR *text; + int timeout; //ms + COLORREF color; + void (*callback)(unsigned int param); + int param; +} osdmsg; + +//#define logmsg(x) logmsg2(x) + +#ifndef logmsg +#define logmsg(x) //x +#endif + +int OptionsInit(WPARAM wparam,LPARAM lparam); + +extern BOOL (WINAPI*pSetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD); + +void loadDBSettings(plgsettings *ps); + +extern HINSTANCE hI; +extern HWND hwnd; +extern HANDLE hservosda; +extern HANDLE hHookedNewEvent, hHookedInit, hProtoAck, hContactSettingChanged, hHookContactStatusChanged, hContactStatusChanged, hpluginShutDown; +extern HINSTANCE hUser32; + diff --git a/wbOSD/wbOSD.mak b/wbOSD/wbOSD.mak new file mode 100644 index 0000000..1c2c285 --- /dev/null +++ b/wbOSD/wbOSD.mak @@ -0,0 +1,336 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on wbOSD.dsp +!IF "$(CFG)" == "" +CFG=wbOSD - Win32 Release Unicode +!MESSAGE No configuration specified. Defaulting to wbOSD - Win32 Release Unicode. +!ENDIF + +!IF "$(CFG)" != "wbOSD - Win32 Release" && "$(CFG)" != "wbOSD - Win32 Debug" && "$(CFG)" != "wbOSD - Win32 Debug Unicode" && "$(CFG)" != "wbOSD - Win32 Release Unicode" +!MESSAGE Invalid configuration "$(CFG)" specified. +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "wbOSD.mak" CFG="wbOSD - Win32 Release Unicode" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wbOSD - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Debug Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "wbOSD - Win32 Release Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE +!ERROR An invalid configuration is specified. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "wbOSD - Win32 Release" + +OUTDIR=.\Release +INTDIR=.\Release +# Begin Custom Macros +OutDir=.\Release +# End Custom Macros + +ALL : "$(OUTDIR)\wbOSD.dll" + + +CLEAN : + -@erase "$(INTDIR)\events.obj" + -@erase "$(INTDIR)\main.obj" + -@erase "$(INTDIR)\options.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\vc60.pdb" + -@erase "$(INTDIR)\wbOSD.obj" + -@erase "$(INTDIR)\wbOSD.pch" + -@erase "$(INTDIR)\wbOSD.res" + -@erase "$(OUTDIR)\wbOSD.dll" + -@erase "$(OUTDIR)\wbOSD.exp" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP_PROJ=/nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yu"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\wbOSD.res" /d "NDEBUG" +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\wbOSD.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock32.lib /nologo /base:"0x32240000" /dll /incremental:no /pdb:"$(OUTDIR)\wbOSD.pdb" /machine:I386 /out:"$(OUTDIR)\wbOSD.dll" /implib:"$(OUTDIR)\wbOSD.lib" /filealign:512 +LINK32_OBJS= \ + "$(INTDIR)\events.obj" \ + "$(INTDIR)\main.obj" \ + "$(INTDIR)\options.obj" \ + "$(INTDIR)\wbOSD.obj" \ + "$(INTDIR)\wbOSD.res" + +"$(OUTDIR)\wbOSD.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug" + +OUTDIR=.\Debug +INTDIR=.\Debug +# Begin Custom Macros +OutDir=.\Debug +# End Custom Macros + +ALL : "$(OUTDIR)\wbOSD.dll" + + +CLEAN : + -@erase "$(INTDIR)\events.obj" + -@erase "$(INTDIR)\main.obj" + -@erase "$(INTDIR)\options.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\vc60.pdb" + -@erase "$(INTDIR)\wbOSD.obj" + -@erase "$(INTDIR)\wbOSD.pch" + -@erase "$(INTDIR)\wbOSD.res" + -@erase "$(OUTDIR)\wbOSD.dll" + -@erase "$(OUTDIR)\wbOSD.exp" + -@erase "$(OUTDIR)\wbOSD.ilk" + -@erase "$(OUTDIR)\wbOSD.pdb" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP_PROJ=/nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yu"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32 +RSC_PROJ=/l 0x40d /fo"$(INTDIR)\wbOSD.res" /d "_DEBUG" +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\wbOSD.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\wbOSD.pdb" /debug /machine:I386 /out:"$(OUTDIR)\wbOSD.dll" /implib:"$(OUTDIR)\wbOSD.lib" /pdbtype:sept +LINK32_OBJS= \ + "$(INTDIR)\events.obj" \ + "$(INTDIR)\main.obj" \ + "$(INTDIR)\options.obj" \ + "$(INTDIR)\wbOSD.obj" \ + "$(INTDIR)\wbOSD.res" + +"$(OUTDIR)\wbOSD.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug Unicode" + +OUTDIR=.\Debug_Unicode +INTDIR=.\Debug_Unicode +# Begin Custom Macros +OutDir=.\Debug_Unicode +# End Custom Macros + +ALL : "$(OUTDIR)\wbOSD.dll" + + +CLEAN : + -@erase "$(INTDIR)\events.obj" + -@erase "$(INTDIR)\main.obj" + -@erase "$(INTDIR)\options.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\vc60.pdb" + -@erase "$(INTDIR)\wbOSD.obj" + -@erase "$(INTDIR)\wbOSD.pch" + -@erase "$(INTDIR)\wbOSD.res" + -@erase "$(OUTDIR)\wbOSD.dll" + -@erase "$(OUTDIR)\wbOSD.exp" + -@erase "$(OUTDIR)\wbOSD.ilk" + -@erase "$(OUTDIR)\wbOSD.pdb" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP_PROJ=/nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yu"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32 +RSC_PROJ=/l 0x40d /fo"$(INTDIR)\wbOSD.res" /d "_DEBUG" +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\wbOSD.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\wbOSD.pdb" /debug /machine:I386 /out:"$(OUTDIR)\wbOSD.dll" /implib:"$(OUTDIR)\wbOSD.lib" /pdbtype:sept +LINK32_OBJS= \ + "$(INTDIR)\events.obj" \ + "$(INTDIR)\main.obj" \ + "$(INTDIR)\options.obj" \ + "$(INTDIR)\wbOSD.obj" \ + "$(INTDIR)\wbOSD.res" + +"$(OUTDIR)\wbOSD.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Release Unicode" + +OUTDIR=.\Release_Unicode +INTDIR=.\Release_Unicode +# Begin Custom Macros +OutDir=.\Release_Unicode +# End Custom Macros + +ALL : "$(OUTDIR)\wbOSD.dll" + + +CLEAN : + -@erase "$(INTDIR)\events.obj" + -@erase "$(INTDIR)\main.obj" + -@erase "$(INTDIR)\options.obj" + -@erase "$(INTDIR)\vc60.idb" + -@erase "$(INTDIR)\vc60.pdb" + -@erase "$(INTDIR)\wbOSD.obj" + -@erase "$(INTDIR)\wbOSD.pch" + -@erase "$(INTDIR)\wbOSD.res" + -@erase "$(OUTDIR)\wbOSD.dll" + -@erase "$(OUTDIR)\wbOSD.exp" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP_PROJ=/nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /D "wbOSD_EXPORTS" /Fp"$(INTDIR)\wbOSD.pch" /Yu"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32 +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\wbOSD.res" /d "NDEBUG" +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\wbOSD.bsc" +BSC32_SBRS= \ + +LINK32=link.exe +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib wsock32.lib /nologo /base:"0x32240000" /dll /incremental:no /pdb:"$(OUTDIR)\wbOSD.pdb" /machine:I386 /out:"$(OUTDIR)\wbOSD.dll" /implib:"$(OUTDIR)\wbOSD.lib" /filealign:512 +LINK32_OBJS= \ + "$(INTDIR)\events.obj" \ + "$(INTDIR)\main.obj" \ + "$(INTDIR)\options.obj" \ + "$(INTDIR)\wbOSD.obj" \ + "$(INTDIR)\wbOSD.res" + +"$(OUTDIR)\wbOSD.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) + $(LINK32) @<< + $(LINK32_FLAGS) $(LINK32_OBJS) +<< + +!ENDIF + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("wbOSD.dep") +!INCLUDE "wbOSD.dep" +!ELSE +!MESSAGE Warning: cannot find "wbOSD.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "wbOSD - Win32 Release" || "$(CFG)" == "wbOSD - Win32 Debug" || "$(CFG)" == "wbOSD - Win32 Debug Unicode" || "$(CFG)" == "wbOSD - Win32 Release Unicode" +SOURCE=.\events.cpp + +"$(INTDIR)\events.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\wbOSD.pch" + + +SOURCE=.\main.cpp + +!IF "$(CFG)" == "wbOSD - Win32 Release" + +CPP_SWITCHES=/nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yc"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +"$(INTDIR)\main.obj" "$(INTDIR)\wbOSD.pch" : $(SOURCE) "$(INTDIR)" + $(CPP) @<< + $(CPP_SWITCHES) $(SOURCE) +<< + + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug" + +CPP_SWITCHES=/nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yc"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c + +"$(INTDIR)\main.obj" "$(INTDIR)\wbOSD.pch" : $(SOURCE) "$(INTDIR)" + $(CPP) @<< + $(CPP_SWITCHES) $(SOURCE) +<< + + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Debug Unicode" + +CPP_SWITCHES=/nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /Fp"$(INTDIR)\wbOSD.pch" /Yc"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c + +"$(INTDIR)\main.obj" "$(INTDIR)\wbOSD.pch" : $(SOURCE) "$(INTDIR)" + $(CPP) @<< + $(CPP_SWITCHES) $(SOURCE) +<< + + +!ELSEIF "$(CFG)" == "wbOSD - Win32 Release Unicode" + +CPP_SWITCHES=/nologo /MD /W3 /GX /Zi /O1 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_USRDLL" /D "wbOSD_EXPORTS" /Fp"$(INTDIR)\wbOSD.pch" /Yc"wbOSD.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c + +"$(INTDIR)\main.obj" "$(INTDIR)\wbOSD.pch" : $(SOURCE) "$(INTDIR)" + $(CPP) @<< + $(CPP_SWITCHES) $(SOURCE) +<< + + +!ENDIF + +SOURCE=.\options.cpp + +"$(INTDIR)\options.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\wbOSD.pch" + + +SOURCE=.\wbOSD.cpp + +"$(INTDIR)\wbOSD.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\wbOSD.pch" + + +SOURCE=.\wbOSD.rc + +"$(INTDIR)\wbOSD.res" : $(SOURCE) "$(INTDIR)" + $(RSC) $(RSC_PROJ) $(SOURCE) + + + +!ENDIF + diff --git a/wbOSD/wbOSD.rc b/wbOSD/wbOSD.rc new file mode 100644 index 0000000..0dad96f --- /dev/null +++ b/wbOSD/wbOSD.rc @@ -0,0 +1,188 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Slovak resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SKY) +#ifdef _WIN32 +LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_DIALOG1 DIALOGEX 0, 0, 316, 250 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION +CAPTION "Dialog" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,21,22,8,8 + CONTROL "Radio1",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,39,22,8, + 8 + CONTROL "Radio1",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,59,22,8, + 8 + CONTROL "Radio1",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,21,33,8, + 8 + CONTROL "Radio1",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,39,33,8, + 8 + CONTROL "Radio1",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON,59,33,8, + 8 + CONTROL "Radio1",IDC_RADIO7,"Button",BS_AUTORADIOBUTTON,21,45,8, + 8 + CONTROL "Radio1",IDC_RADIO8,"Button",BS_AUTORADIOBUTTON,39,45,8, + 8 + CONTROL "Radio1",IDC_RADIO9,"Button",BS_AUTORADIOBUTTON,59,45,8, + 8 + PUSHBUTTON "Select font",IDC_BUTTON1,80,17,68,14 + PUSHBUTTON "Text color",IDC_BUTTON2,175,91,68,14 + PUSHBUTTON "Background color",IDC_BUTTON4,11,182,67,14 + CONTROL "Transparent",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,11,199,72,10 + CONTROL "Radio1",IDC_RADIO10,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,21,99,8,8 + CONTROL "Radio1",IDC_RADIO11,"Button",BS_AUTORADIOBUTTON,39,99,8, + 8 + CONTROL "Radio1",IDC_RADIO12,"Button",BS_AUTORADIOBUTTON,59,99,8, + 8 + CONTROL "Radio1",IDC_RADIO13,"Button",BS_AUTORADIOBUTTON,21,110, + 8,8 + CONTROL "Radio1",IDC_RADIO14,"Button",BS_AUTORADIOBUTTON,39,110, + 8,8 + CONTROL "Radio1",IDC_RADIO15,"Button",BS_AUTORADIOBUTTON,59,110, + 8,8 + CONTROL "Radio1",IDC_RADIO16,"Button",BS_AUTORADIOBUTTON,21,121, + 8,8 + CONTROL "Radio1",IDC_RADIO17,"Button",BS_AUTORADIOBUTTON,39,121, + 8,8 + CONTROL "Radio1",IDC_RADIO18,"Button",BS_AUTORADIOBUTTON,59,121, + 8,8 + PUSHBUTTON "Shadow color",IDC_BUTTON3,80,92,67,14 + CONTROL "Alternative shadow",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,13,135,133,10 + EDITTEXT IDC_EDIT1,79,148,27,14,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Shadow align",IDC_STATIC,13,89,62,43 + GROUPBOX "General",IDC_STATIC,6,0,150,66 + GROUPBOX "Shadow",IDC_STATIC,5,70,151,99 + GROUPBOX "Align",IDC_STATIC,13,13,61,43 + LTEXT "Shadow distance:",IDC_STATIC,10,151,64,8, + SS_PATHELLIPSIS,WS_EX_RIGHT + GROUPBOX "Other",IDC_STATIC,5,171,152,75 + LTEXT "Alpha:",IDC_STATIC,92,183,60,8,SS_PATHELLIPSIS + GROUPBOX "Announce",IDC_STATIC,162,0,150,246 + LTEXT "Timeout (ms):",IDC_STATIC,91,213,62,8,SS_PATHELLIPSIS + EDITTEXT IDC_EDIT5,91,224,27,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_TREE1,"SysTreeView32",TVS_DISABLEDRAGDROP | + TVS_NOTOOLTIPS | WS_BORDER | WS_TABSTOP | 0x4000,170,22, + 138,55 + CONTROL "Show",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 13,80,85,10 + CONTROL "Show events",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,167,110,139,10 + CONTROL "Status changes",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,167,10,136,10 + PUSHBUTTON "Show testing OSD",IDC_BUTTON5,11,224,67,14 + CONTROL "Show my status changes",IDC_CHECK7,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,175,80,133,10 + CONTROL "Show message window after click",IDC_CHECK2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,167,156,138,10 + CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | + TBS_NOTICKS | WS_TABSTOP,87,193,45,15 + LTEXT "Static",IDC_ALPHATXT,136,195,17,8 + PUSHBUTTON "Text color",IDC_BUTTON6,175,121,68,14 + EDITTEXT IDC_EDIT2,214,137,81,14,ES_AUTOHSCROLL + LTEXT "Format:",IDC_STATIC,177,140,35,8 + PUSHBUTTON "?",IDC_BUTTON7,298,137,10,14 + CONTROL "",IDC_TREE2,"SysTreeView32",TVS_DISABLEDRAGDROP | + TVS_NOTOOLTIPS | WS_BORDER | WS_TABSTOP | 0x4000,170,182, + 138,59 + LTEXT "Show when my status is:",IDC_STATIC,168,171,139,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_DIALOG1, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 309 + TOPMARGIN, 7 + BOTTOMMARGIN, 243 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Slovak resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/wbOSD/wbOSD.vcproj b/wbOSD/wbOSD.vcproj new file mode 100644 index 0000000..a6bdec2 --- /dev/null +++ b/wbOSD/wbOSD.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wbOSD/wbOSD_10.vcxproj b/wbOSD/wbOSD_10.vcxproj new file mode 100644 index 0000000..606c60f --- /dev/null +++ b/wbOSD/wbOSD_10.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug Unicode + Win32 + + + Debug + Win32 + + + Release Unicode + Win32 + + + Release + Win32 + + + + wbOSD + {DA450122-7F0B-45DA-9EAA-421887AD8450} + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + MultiByte + true + + + DynamicLibrary + MultiByte + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + true + true + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + false + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + false + + + + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;WBOSD_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + ../../include;%(AdditionalIncludeDirectories) + wbOSD.h + + + true + $(OutDir)wbOSD.pdb + Windows + $(OutDir)wbOSD.lib + MachineX86 + + + + + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;WBOSD_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + ../../include;%(AdditionalIncludeDirectories) + wbOSD.h + + + true + $(OutDir)wbOSD.pdb + Windows + $(OutDir)wbOSD.lib + MachineX86 + + + + + WIN32;NDEBUG;_WINDOWS;_USRDLL;WBOSD_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + Use + Level3 + ProgramDatabase + Full + Size + ../../include;%(AdditionalIncludeDirectories) + wbOSD.h + + + true + Windows + true + true + $(OutDir)wbOSD.lib + MachineX86 + + + + + WIN32;NDEBUG;_WINDOWS;_USRDLL;WBOSD_EXPORTS;UNICODE;_UNICODE;%(PreprocessorDefinitions) + MultiThreadedDLL + Use + Level3 + ProgramDatabase + Full + Size + true + ../../include;%(AdditionalIncludeDirectories) + wbOSD.h + + + true + Windows + true + true + $(OutDir)wbOSD.lib + MachineX86 + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wbOSD/wbOSD_10.vcxproj.filters b/wbOSD/wbOSD_10.vcxproj.filters new file mode 100644 index 0000000..e50c5a8 --- /dev/null +++ b/wbOSD/wbOSD_10.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/wbOSD/wbOSD_9.vcproj b/wbOSD/wbOSD_9.vcproj new file mode 100644 index 0000000..acf4980 --- /dev/null +++ b/wbOSD/wbOSD_9.vcproj @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3