Beispiel #1
0
long WINAPI SysThread(sSysThreadHelper* p)
{
	lphp_vparam vp;
	mb_event mbe = {MBT_CALLBACK,0};
	char cb[32];

	mbe.php = p->php;
	strncpy(cb,p->cb,sizeof(cb)-1);

	//make a copy of vp
	vp = p->vp;

	if(vp.type == LPHP_STRING){
		vp.data = strdup((const char*)vp.data);
	}

	sman_incref(mbe.php);
	SetEvent(p->hEvent);

	MBMultiParam(mbe.php,cb,&mbe,"v",&vp);
	sman_decref(mbe.php);

	if(vp.type == LPHP_STRING){
		my_memfree(vp.data);
	}
	return 0;
}
Beispiel #2
0
BOOL CALLBACK DlgProcedure(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	sDialog* dlg = (sDialog*)GetWindowLong(hDlg,GWL_USERDATA);
	PHPR res;

	if((uMsg != WM_INITDIALOG && uMsg != (WM_USER + 2)) && (!dlg || (dlg->hDlg != hDlg) || (dlg->lDepth > 0) || !(dlg->lFlags))){
		return (FALSE);
	}

	if(dlg){dlg->lDepth++;}

	switch(uMsg)
	{
	case WM_INITDIALOG:
		SetWindowLong(hDlg,GWL_USERDATA,lParam);
		dlg = (sDialog*)lParam;
		sman_inc(dlg->php);
		return (TRUE);
	case (WM_USER + 2):
		{
			RECT rc;
			RECT drc;
			HWND hButton;
			//move the OK & CANCEL buttons
			GetClientRect(hDlg,&drc);

			hButton = GetDlgItem(hDlg,IDCANCEL);
			GetClientRect(hButton,&rc);
			SetWindowPos(hButton,NULL,drc.right - 10 - 2*(rc.right - rc.left),drc.bottom - 5 - (rc.bottom - rc.top),
				0,0,SWP_NOZORDER | SWP_NOSIZE);

			hButton = GetDlgItem(hDlg,IDOK);
			GetClientRect(hButton,&rc);
			SetWindowPos(hButton,NULL,drc.right - 5 - (rc.right - rc.left),
				drc.bottom - 5 - (rc.bottom - rc.top),0,0,SWP_NOZORDER | SWP_NOSIZE);
		}
		break;
	case (WM_USER + 3):
		DestroyWindow(hDlg);
		sman_dec(dlg->php);
		DlgFree(dlg);
		SetWindowLong(hDlg,GWL_USERDATA,0);
		return (TRUE);
	case WM_CLOSE:
		wParam = IDCANCEL;
		lParam = (LPARAM)GetDlgItem(dlg->hDlg,IDCANCEL);
	case WM_COMMAND:
		{
			UINT uid = LOWORD(wParam);
			UINT ncode = HIWORD(wParam); 
			if((uid == IDOK || uid == IDCANCEL) && ncode == BN_CLICKED)
			{
				mb_event mbe={MBT_DIALOG,wParam,lParam,0};
				mbe.php = dlg->php;
				mbe.t3 = MBE_DIALOGCB;
				mbe.p3 = (void*)dlg;

				res = (PHPR)MBMultiParam(mbe.php,dlg->pszCallback,&mbe,"lll",(uid==IDOK),dlg->param,0);
				if(res == PHPR_BREAK || res == PHPR_END){
					PostMessage(hDlg,WM_USER + 3,0,0);
				}
				break;
			}
			else if(uid >= 1000 && uid < (dlg->lNum + 1000))
			{
				sDlgControl* dc = dlg->table[uid - 1000];
				ULONG tmp = GetTickCount(); 
				if(((uid == dlg->lid) && (tmp - dlg->ltc < 250)) || dc->pszCallback[0]=='\0'){
					break;
				}

				mb_event mbe={MBT_DIALOG,wParam,lParam,0};
				mbe.php = dlg->php;
				mbe.t3 = MBE_DIALOGCB;
				mbe.p3 = (void*)dlg;
				mbe.lFlags = MBOT_FLAG_NOOUTPUT;

				if(dc->type == 2 && ncode==BN_CLICKED){//button
					res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"ll",uid,dc->param);
					if(res == PHPR_END){
						PostMessage(hDlg,WM_USER + 3,0,0);
					}
				}
				else if(dc->type == 4 && ncode == CBN_SELENDOK)
				{
					res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"ll",uid,dc->param);
					if(res == PHPR_END){
						PostMessage(hDlg,WM_USER + 3,0,0);
					}
				}
				else if(*dlg->pszWmCommand)
				{
					res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmCommand,&mbe,"llll",uid,dc->param,wParam,lParam);
					if(res == PHPR_END){
						PostMessage(hDlg,WM_USER + 3,0,0);
					}
				}
				dlg->lid = uid;
				dlg->ltc = GetTickCount();
			}
			break;
		}
		break;
	case WM_NOTIFY:
		if(wParam >= 1000 && (wParam < (dlg->lNum + 1000)) && 
			(((LPNMHDR)lParam)->code == NM_RCLICK || ((LPNMHDR)lParam)->code == NM_CLICK))
		{
			LVITEM lvi = {0};
			sDlgControl* dc = dlg->table[wParam - 1000];

			if(!dc || dc->type != 6 || !(*dc->pszCallback))break;

			mb_event mbe={MBT_DIALOG,wParam,lParam,0};
			mbe.php = dlg->php;
			mbe.t3 = MBE_DIALOGCB;
			mbe.p3 = (void*)dlg;
			mbe.lFlags = MBOT_FLAG_NOOUTPUT;

			res = (PHPR)MBMultiParam(dlg->php,dc->pszCallback,&mbe,"llll",wParam,dc->param,
				((LPNMLISTVIEW)lParam)->iItem,
				((LPNMHDR)lParam)->code == NM_RCLICK);

			if(res == PHPR_END){
				PostMessage(hDlg,WM_USER + 3,0,0);
			}
		}
		else if(*dlg->pszWmNotify && ((LPNMHDR)lParam)->idFrom >= 1000)
		{
			mb_event mbe={MBT_DIALOG,wParam,lParam,0};
			mbe.php = dlg->php;
			mbe.t3 = MBE_DIALOGCB;
			mbe.p3 = (void*)dlg;
			mbe.lFlags = MBOT_FLAG_NOOUTPUT;

			res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmNotify,&mbe,"llll",((LPNMHDR)lParam)->idFrom,
				dlg->param,wParam,lParam);

			if(res == PHPR_END){
				PostMessage(hDlg,WM_USER + 3,0,0);
			}
		}
		break;
	case WM_TIMER:
		{
			if(*dlg->pszWmTimer){
				mb_event mbe={MBT_DIALOG,wParam,lParam,0};
				mbe.php = dlg->php;
				mbe.t3 = MBE_DIALOGCB;
				mbe.p3 = (void*)dlg;
				mbe.lFlags = MBOT_FLAG_NOOUTPUT;

				res = (PHPR)MBMultiParam(dlg->php,dlg->pszWmTimer,&mbe,"llll",wParam,
				dlg->param,wParam,lParam);

				if(res == PHPR_END){
					PostMessage(hDlg,WM_USER + 3,0,0);
				}
			}
		}break;
	case WM_DESTROY:
		sman_dec(dlg->php);
		DlgFree(dlg);
		SetWindowLong(hDlg,GWL_USERDATA,0);
		return (TRUE);
	default:
		dlg->lDepth--;
		return (FALSE);
	};
	dlg->lDepth--;
	return (TRUE);
}