Beispiel #1
0
static void set_mode_impl(CPCHANDLE handle, int mode)
{
    if ((mode >= 0) && (mode < CPC_TEXTMODECOUNT))
    {
        handle->impl->mode = mode;
        SetConsoleSize(handle->impl->hConOut, PUB_CPC_TextMode[mode].X, PUB_CPC_TextMode[mode].Y);
        (*handle->api->clrscr)(handle);
    }
}
Beispiel #2
0
void ComspecDone(int aiRc)
{
#ifdef _DEBUG
    xf_dump_chk();
    xf_validate(NULL);
#endif
    //WARNING("Послать в GUI CONEMUCMDSTOPPED");
    LogSize(NULL, 0, "ComspecDone");

    // Это необходимо делать, т.к. при смене буфера (SetConsoleActiveScreenBuffer) приложением,
    // дескриптор нужно закрыть, иначе conhost может не вернуть предыдущий буфер
    //ConOutCloseHandle()

    // Поддержка алиасов
    if (gpSrv->szComSpecName[0] && gpSrv->szSelfName[0])
    {
        // Скопировать алиасы из cmd.exe в conemuc.exe
        wchar_t *pszPostAliases = NULL;
        DWORD nPostAliasSize;
        BOOL lbChanged = (gpSrv->pszPreAliases == NULL);

        if (!GetAliases(gpSrv->szComSpecName, &pszPostAliases, &nPostAliasSize))
        {
            if (pszPostAliases)
                _wprintf(pszPostAliases);
        }
        else
        {
            if (!lbChanged)
            {
                lbChanged = (gpSrv->nPreAliasSize!=nPostAliasSize);
            }

            if (!lbChanged && gpSrv->nPreAliasSize && gpSrv->pszPreAliases && pszPostAliases)
            {
                lbChanged = memcmp(gpSrv->pszPreAliases,pszPostAliases,gpSrv->nPreAliasSize)!=0;
            }

            if (lbChanged)
            {
                xf_dump_chk();

                if (gnMainServerPID)
                {
                    MCHKHEAP;
                    CESERVER_REQ* pIn = ExecuteNewCmd(CECMD_SAVEALIASES,sizeof(CESERVER_REQ_HDR)+nPostAliasSize);

                    if (pIn)
                    {
                        MCHKHEAP;
                        memmove(pIn->Data, pszPostAliases, nPostAliasSize);
                        MCHKHEAP;
                        CESERVER_REQ* pOut = ExecuteSrvCmd(gnMainServerPID, pIn, GetConEmuHWND(2), FALSE, 0, TRUE);
                        MCHKHEAP;

                        if (pOut) ExecuteFreeResult(pOut);

                        ExecuteFreeResult(pIn);
                        MCHKHEAP;
                    }
                }

                xf_dump_chk();
                wchar_t *pszNewName = pszPostAliases, *pszNewTarget, *pszNewLine;

                while (pszNewName && *pszNewName)
                {
                    pszNewLine = pszNewName + lstrlen(pszNewName);
                    pszNewTarget = wcschr(pszNewName, L'=');

                    if (pszNewTarget)
                    {
                        *pszNewTarget = 0;
                        pszNewTarget++;
                    }

                    if (*pszNewTarget == 0) pszNewTarget = NULL;

                    AddConsoleAlias(pszNewName, pszNewTarget, gpSrv->szSelfName);
                    pszNewName = pszNewLine+1;
                }

                xf_dump_chk();
            }
        }

        if (pszPostAliases)
        {
            free(pszPostAliases);
            pszPostAliases = NULL;
        }
    }

    xf_dump_chk();
    //TODO("Уведомить плагин через пайп (если родитель - FAR) что процесс завершен. Плагин должен считать и запомнить содержимое консоли и только потом вернуть управление в ConEmuC!");
    DWORD dwErr1 = 0; //, dwErr2 = 0;
    HANDLE hOut1 = NULL, hOut2 = NULL;
    BOOL lbRc1 = FALSE, lbRc2 = FALSE;
    CONSOLE_SCREEN_BUFFER_INFO sbi1 = {{0,0}}, sbi2 = {{0,0}};

#ifdef _DEBUG
    HWND hWndCon = GetConEmuHWND(2);
#endif

    // Тут нужна реальная, а не скорректированная информация!
    if (!gbNonGuiMode)
    {
        // Если GUI не сможет через сервер вернуть высоту буфера - это нужно сделать нам!
        lbRc1 = GetConsoleScreenBufferInfo(hOut1 = GetStdHandle(STD_OUTPUT_HANDLE), &sbi1);

        if (!lbRc1)
            dwErr1 = GetLastError();

        xf_dump_chk();
    }

    //PRAGMA_ERROR("Размер должен возвращать сам GUI, через серверный ConEmuC!");
#ifdef SHOW_STARTED_MSGBOX
    MessageBox(GetConEmuHWND(2), L"ConEmuC (comspec mode) is about to TERMINATE", L"ConEmuC.ComSpec", 0);
#endif

#ifdef _DEBUG
    xf_dump_chk();
    xf_validate(NULL);
#endif

    if (!gbNonGuiMode && (gpSrv->dwParentFarPID != 0))
    {
        //// Вернуть размер буфера (высота И ширина)
        //if (gpSrv->sbi.dwSize.X && gpSrv->sbi.dwSize.Y) {
        //	SMALL_RECT rc = {0};
        //	SetConsoleSize(0, gpSrv->sbi.dwSize, rc, "ComspecDone");
        //}
        //ConOutCloseHandle()
        CONSOLE_SCREEN_BUFFER_INFO l_csbi = {{0}};
        lbRc2 = GetConsoleScreenBufferInfo(hOut2 = GetStdHandle(STD_OUTPUT_HANDLE), &l_csbi);

        CESERVER_REQ *pOut = SendStopped(&l_csbi);

        if (pOut)
        {
            if (!pOut->StartStopRet.bWasBufferHeight)
            {
                //gpSrv->sbi.dwSize = pIn->StartStop.sbi.dwSize;
                lbRc1 = FALSE; // Консольное приложение самостоятельно сбросило буферный режим. Не дергаться...
            }
            else
            {
                lbRc1 = TRUE;
            }

            ExecuteFreeResult(pOut);
            pOut = NULL;
        }

        if (!gbWasBufferHeight)
        {
            lbRc2 = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi2);

#ifdef _DEBUG
            if (sbi2.dwSize.Y > 200)
            {
                wchar_t szTitle[128];
                _wsprintf(szTitle, SKIPLEN(countof(szTitle)) L"ConEmuC (PID=%i)", GetCurrentProcessId());
                MessageBox(NULL, L"BufferHeight was not turned OFF", szTitle, MB_SETFOREGROUND|MB_SYSTEMMODAL);
            }
#endif

            if (lbRc1 && lbRc2 && sbi2.dwSize.Y == sbi1.dwSize.Y)
            {
                // GUI не смог вернуть высоту буфера...
                // Это плохо, т.к. фар высоту буфера не меняет и будет сильно глючить на N сотнях строк...
                int nNeedHeight = gpSrv->sbi.dwSize.Y;

                if (nNeedHeight < 10)
                {
                    nNeedHeight = (sbi2.srWindow.Bottom-sbi2.srWindow.Top+1);
                }

                if (sbi2.dwSize.Y != nNeedHeight)
                {
                    _ASSERTE(sbi2.dwSize.Y == nNeedHeight);
                    PRINT_COMSPEC(L"Error: BufferHeight was not changed from %i\n", sbi2.dwSize.Y);
                    SMALL_RECT rc = {0};
                    sbi2.dwSize.Y = nNeedHeight;

                    if (gpLogSize) LogSize(&sbi2.dwSize, 0, ":ComspecDone.RetSize.before");

                    SetConsoleSize(0, sbi2.dwSize, rc, "ComspecDone.Force");

                    if (gpLogSize) LogSize(NULL, 0, ":ComspecDone.RetSize.after");
                }
            }
        }
    }

    if (gpSrv->pszPreAliases) {
        free(gpSrv->pszPreAliases);
        gpSrv->pszPreAliases = NULL;
    }

    //SafeCloseHandle(ghCtrlCEvent);
    //SafeCloseHandle(ghCtrlBreakEvent);
}
Beispiel #3
0
void SoloGame()
{
	int nx,ny,tx,ty;
	int owin=0,olose=0;
	int twin=0,tlose=0;
	int sall=0,result=0;
	char key=0;
	sysclear();
	SetConsoleSize(26,90);
	suv=ONEP;
game:
	ClearOhmok();
	sysclear();
	DrawOhMok();
	while(1)
	{
		nx=ny=6;
		if(suv==ONEP) SetNotice("1P 노실 차례입니다. ( 흑돌 )");
		else if(suv==TWOP) SetNotice("2P 노실 차례입니다. ( 백돌 )");
		gotoxy(nx*4,ny*2);
		SetColor(11);
		printf("⊙");
		gotoxy(50,11);
		SetColor(15);
		printf("○ : 1P ● : 2P");
		gotoxy(50,12);
		printf("총 경기수:%d",sall);
		gotoxy(50,13);
		printf(" 1P 전적 : %d 승 %d 패",owin,olose);
		gotoxy(50,14);
		printf(" 2P 전적 : %d 승 %d 패",twin,tlose);
		while(1)
		{
			tx=nx; ty=ny;
 			key=getch();
			if(key==32)
			{
				if(ohmok[ny][nx]==0){
					ohmok[ny][nx]=suv-2;
					gotoxy(nx*4,ny*2);
					SetColor(15);
					if(suv==ONEP) printf("○");
					else if(suv==TWOP) printf("●");
					break;}
				else SetNotice("놓을수 없는 자리입니다.");
			}
			switch(key)
			{
			case 72: //위로
				if(ny>0) ny--;
				break;
			case 75: //왼
				if(nx>0) nx--;
				break;
			case 77: //오른
				if(nx<12) nx++;
				break;
			case 80: //밑으로
				if(ny<12) ny++;
				break;
			default:
				continue;
			}
			gotoxy(tx*4,ty*2);
			SetColor(15);
			if(ohmok[ty][tx]==STONE_DARK) printf("○");
			else if(ohmok[ty][tx]==STONE_WHITE) printf("●");
			else if(ty==12 && tx==0) printf("┗");
			else if(ty==12 && tx==12) printf("┛");
			else if(tx==0 && ty==0) printf("┏");
			else if(tx==12 && ty==0) printf("┓");
			else if(ty==0) printf("┳");
			else if(tx==0) printf("┣");
			else if(tx==12) printf("┫");
			else if(ty==12) printf("┻");
			else printf("╋");
			gotoxy(nx*4,ny*2);
			SetColor(11);
			printf("⊙");
		}
		suv= suv==ONEP ? TWOP : ONEP;
		result=chk();
		if(result==STONE_DARK)
		{
		//	ClearOhmok();
			SetNotice("1P WIN");
			owin++;
			sall++;
			tlose++;
			suv=ONEP;
			gotoxy(50,15);
			printf(" 게임이 끝이 났습니다.");
			gotoxy(50,16);
			printf(" 한판 더하시겠습니까? ( y or n )");
			while(1)
			{
				key=getch();
				if(key=='Y' || key =='y') goto game;
				else if(key=='N' || key=='n') main();
			}
		}
		else if(result == STONE_WHITE)
		{
		//	ClearOhmok();
			SetNotice("2P WIN");
			twin++;
			olose++;
			sall++;
			suv=TWOP;
			gotoxy(50,15);
			printf(" 게임이 끝이 났습니다.");
			gotoxy(50,16);
			printf(" 한판 더하시겠습니까? ( y or n )");
			while(1)
			{
				key=getch();
				if(key=='Y' || key =='y') goto game;
				else if(key=='N'||key=='n') main();
			}
		}
	}
}
Beispiel #4
0
int main()
{
	string mainmenu[]={"Connect [ 들어가기 ]","Listen [ 기다리기 ]","2 P ( OffLine ) [ 2P 오프라인 ]","Exit [종 료]"};
	int mport[]={GAME_CONNECT,GAME_LISTEN,GAME_TWOPLAY,GAME_EXIT};
	int gt=0;
	WSADATA wsaData;
	SOCKADDR_IN addr;
	int port=36214;
	int caddrsize=0;
	char ip[25];
	SOCKET sServer,sClient;
	//메뉴 : 접속 , 기다리기 , 2인 플레이(오프라인) , 종료
MainMenu:
	title("CNOM 0.0.1 - By Qoo . http://cyworld.com/qoohk");
	sysclear();
	SetConsoleSize(17,68);
	gt=MenuSecond(0,4,10,5,20,4,"please select menu ~# [메뉴를 선택해주세요.]",mainmenu,mport,0);
	switch(gt)
	{
		case 0:
			ErrorMsg("Select Error");
			break;
		case GAME_EXIT:
			WSACleanup();
			exit(0);
			break;
		case GAME_TWOPLAY:
			SoloGame();
			break;
		case GAME_LISTEN:
			
			sysclear();
			SetConsoleSize(20,75);
			SetColor(15);
			printf("WSA Start Up ... ");
			if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
			{
				ErrorMsg("WSA Start Error!");
			}
			printf("OK\nSocket Create ... ");
			sServer=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
			if(sServer == INVALID_SOCKET) ErrorMsg("Socket Create Error");
			printf("OK\nBind.. ");
			memset(&addr,0,sizeof(addr));
			addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET;
			addr.sin_port = htons(port);	
			if(bind(sServer,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
			{
				ErrorMsg("Bind Error");	
			}
			if(listen(sServer,5)==SOCKET_ERROR)
			{
				ErrorMsg("Listen Error");
			}
			printf("OK\n");
			printf("... accept...");
			SOCKADDR_IN caddr;
			caddrsize=sizeof(caddr);
			sClient=accept(sServer,(SOCKADDR*)&caddr,&caddrsize);
			if(sClient==INVALID_SOCKET) ErrorMsg("ACCEPT ERROR");
			printf("OK\n");
			NetworkGame(sClient,inet_ntoa(caddr.sin_addr),SERVER);
			break;
		case GAME_CONNECT:
			sysclear();
			SetColor(15);
			SetConsoleSize(20,75);
			printf("Enter the IP address to access. (Up to 25 bytes) [IP주소를 입력해주세요.]\n->");
			SetColor(2);
			scanf("%s",ip);
			SetColor(15);
			printf("WSA Start Up ... ");
			if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
			{
				ErrorMsg("WSA Start Error!");
			}
			printf("OK\nSocket Create ... ");
			sClient=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
			if(sClient == INVALID_SOCKET) ErrorMsg("Socket Create Error");
			printf("OK\nConnect ... ");
			memset(&addr,0,sizeof(addr));
			addr.sin_addr.s_addr = inet_addr(ip); addr.sin_family = AF_INET;
			addr.sin_port = htons(port);	
			if(connect(sClient,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
			{
				printf("\nSorry.. Connect Error.. \n");
				printf("Do you want to go back?( Y or N )\n    - select y or n");
				while(1)
				{
					char th=getch();
					if(th=='Y' || th=='y') goto MainMenu;
					else if(th=='N' || th=='n') exit(0);
				}
			}
			printf("OK\n");
			NetworkGame(sClient,ip,CLIENT);
			break;
	}
	WSACleanup();
	return EXIT_SUCCESS;
}
Beispiel #5
0
void NetworkGame(SOCKET sck,char *ip,int type)
{
	char input[255],output[255],*f;
	char key=0;
	int nall=0,swin=0,slose=0,cwin=0,close=0,ny,nx,tx,ty,kto=0,x,y,result;
	SetConsoleSize(27,90);
gamecl:
	ClearOhmok();
	sysclear();
	DrawOhMok();
	suv=SERVER;
	while(1)
	{
		gotoxy(50,11);
		if(type==SERVER) printf("○ : SERVER(ME) ● : CLIENT");
		else if(type==CLIENT) printf("○ : SERVER ● : CLIENT(ME)");
		gotoxy(50,12);
		printf("총 경기수:%d",nall);
		gotoxy(50,13);
		printf(" SERVER 전적 : %d 승 %d 패",swin,slose);
		gotoxy(50,14);
		printf(" CLIENT 전적 : %d 승 %d 패",cwin,close);
		gotoxy(50,15);
		printf(" 상대방 IP : %s",ip);
		if(type!=suv){
			char a[2];
			SetNotice("상대가 놓는중입니다. 기다려주십시오.");
			recv(sck,a,2,0);
			memset(input,0,255);
			recv(sck,input,atoi(a),0);
			sscanf(input,"%d %d",&y,&x);
			ohmok[y][x]=suv-4;
			gotoxy(x*4,y*2);
			SetColor(15);
			if(suv==SERVER) printf("○");
			else if(suv==CLIENT) printf("●");
		}
		else if(type==suv)
		{
			ny=nx=6;
			gotoxy(nx*4,ny*2);
			SetColor(11);
			printf("⊙");
			SetNotice("놓을곳을 선택해주세요.");
			while(1)
			{
				tx=nx; ty=ny;
				key=getch();
				if(key==32)
				{
					if(ohmok[ny][nx]==0){
						ohmok[ny][nx]=suv-4;
						gotoxy(nx*4,ny*2);
						SetColor(15);
						if(type==SERVER) printf("○");
						else if(type==CLIENT) printf("●");
						memset(output,0,255);
						sprintf(output,"%d %d",ny,nx);
						kto=strlen(output);
						f=new char[kto];
						strcpy(f,output);
						if(kto>=10) sprintf(output,"%d%s",kto,f);
						else sprintf(output,"0%d%s",kto,f);
						send(sck,output,strlen(output),0);
						break;}
					else SetNotice("놓을수 없는 자리입니다.");
				}
				switch(key)
				{
				case 72: //위로
					if(ny>0) ny--;
					break;
				case 75: //왼
					if(nx>0) nx--;
					break;
				case 77: //오른
					if(nx<12) nx++;
					break;
				case 80: //밑으로
					if(ny<12) ny++;
					break;
				default:
					continue;
				}
				gotoxy(tx*4,ty*2);
				SetColor(15);
				if(ohmok[ty][tx]==STONE_DARK) printf("○");
				else if(ohmok[ty][tx]==STONE_WHITE) printf("●");
				else if(ty==12 && tx==0) printf("┗");
				else if(ty==12 && tx==12) printf("┛");
				else if(tx==0 && ty==0) printf("┏");
				else if(tx==12 && ty==0) printf("┓");
				else if(ty==0) printf("┳");
				else if(tx==0) printf("┣");
				else if(tx==12) printf("┫");
				else if(ty==12) printf("┻");
				else printf("╋");
				gotoxy(nx*4,ny*2);
				SetColor(11);
				printf("⊙");
			}
		}
		suv=suv==SERVER ? CLIENT : SERVER;
		result=chk();
		if(result==STONE_DARK)
		{
			SetNotice("SERVER WIN");
			swin++;
			nall++;
			close++;
			suv=ONEP;
			gotoxy(50,15);
			printf(" 게임이 끝이 났습니다.");
			gotoxy(50,16);
			printf(" 한판 더하시겠습니까? ( y or n )");
			while(1)
			{
				key=getch();
				if(key=='Y' || key =='y')
				{
					memset(input,0,strlen(input));
					send(sck,"YES",strlen("YES"),0);
					recv(sck,input,255,0);
					if(!strcmp(input,"YES"))
					{
						sysclear();
						goto gamecl;
					} else if(!strcmp(input,"NO"))
					{
						sysclear();
						SetColor(15);
						printf("상대가 수락을 하지 않았습니다.");
						getch();
						main();
					}
					
				}
				else
				{
					send(sck,"NO",strlen("NO"),0);
					main();
				}
			}
		}
		else if(result == STONE_WHITE)
		{
			SetNotice("CLIENT WIN");
			cwin++;
			slose++;
			nall++;
			suv=TWOP;
			gotoxy(50,15);
			printf(" 게임이 끝이 났습니다.");
			gotoxy(50,16);
			printf(" 한판 더하시겠습니까? ( y or n )");
			while(1)
			{
				key=getch();
				if(key=='Y' || key =='y')
				{
					memset(input,0,strlen(input));
					recv(sck,input,255,0);
					if(!strcmp(input,"YES"))
					{
						goto gamecl;
					} else if(!strcmp(input,"NO"))
					{
						SetColor(15);
						printf("상대가 수락을 하지 않았습니다.");
						getch();
						main();
					}
					
				}
				else if(key=='N' || key == 'n')
				{
					send(sck,"NO",strlen("NO"),0);
					main();
				}
			}
		}
	}
}
Beispiel #6
0
void doSameSession()
{
 char *arg;
 RESULTCODES rc;
 int i,j;

 if (progtitle)
  SetConsoleTitle(progtitle);

 if (fForegroundConsole)
  SelectConsole();

 if (fConsoleSize)
  SetConsoleSize(Console.W, Console.H, colSAME);

 if (fFontSet)
 {
  RECTL r;
  LockConsoleUpdate();
  SetConsoleFontSize(Font.H, Font.W);
  if (fResizeWindowToMax && !fExplicitSize)
   SetMaxConsoleSize();

  // Workaround: NPS WPS does not redraw window shadow when window grows :-(
  GetPixelConsoleSize((int *)&r.xLeft, (int *)&r.yBottom, (int *)&r.xRight, (int *)&r.yTop);
  r.xRight += r.xLeft + 8; r.yTop += r.yBottom + 8;
  r.xLeft -= 8; r.yBottom -= 8;
  WinInvalidateRect(HWND_DESKTOP, &r, FALSE);

  UnlockConsoleUpdate();
 } else
 if (fResizeWindowToMax && !fExplicitSize)
  SetMaxConsoleSize();

 if (fSetBorder)
  SetConsoleBorderSize(Border.W, Border.H);
 if (fSetFlash)
  FlashConsole(fFlashWindow);

 if (fMinimizeConsole)
  MinimizeConsole();
 else if (fMaximizeConsole)
  MaximizeConsole();

 if (GetWindowHWND())
 {
  if ((fExplicitPos || fExplicitSize))
   SetPixelConsoleSize(ConsolePos.X, ConsolePos.Y, ConsolePos.W, ConsolePos.H,
    (fExplicitPos ? SWP_MOVE : 0) | (fExplicitSize ? SWP_SIZE : 0));
  else if (fMaximizeConsole)
   SetPixelConsoleSize(ConsolePos.X, ConsolePos.Y, 0, 0, SWP_MOVE);
 }

 if (fHideConsole)
  ShowConsole(FALSE);
 else if (fShowConsole)
  ShowConsole(TRUE);

 if (fRestoreConsole)
  RestoreConsole();

 if (!progname) return;
 if (!progname[0]) progname = getenv("COMSPEC");
 if (progname) i = strlen(progname); else i = 0;
 j = i; i++;
 if (progargs) i+= strlen(progargs);
 arg = malloc(i);

 if (progname) strcpy(arg, progname); else arg[0] = 0;
 strcat(arg, "*");
 if (progargs) strcat(arg, progargs);
 arg[j] = 0;

 ReleaseINI();
 if (DosExecPgm(NULL, 0, EXEC_SYNC, arg, NULL, &rc, progname))
 {
  SetColor(colLRED, colSAME);
  printf("Error running command %s\n", progname);
  if (_isterm(1)) getch();
  return;
 }
}