//MiniOS Version 1.0
//Created By: Joshua Nixon
//Greets: Raemar(Coding Concepts), Blake Royer(Snake Game)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class MiniOS
{
private:
//This will hold the attribute for the window
struct WndAttribute
{
int WndSize;//Size of the window in memory
int WndX1;//The X1 coordinate(Top Right)
int WndY1;//The Y1 coordinate(Top Right)
int WndX2;//The X2 coordinate(Bottom Left)
int WndY2;//The Y2 coordinate(Bottom Left)
int WndStyle;//How window will appear to user
int WndFcColor;//Window on Focus Color
int WndLFcColor;//Window on Lost Focus Color
int WndBackGrd;//Color of the windows background
//Icons Later add..
int WndTitleLine;//The color of the lines on the title bar
};
//We need the exact same kind of struct to hold the coordinates and info in mem
struct BackBuff
{
int WndSize;//Size of the window in memory
int WndX1;//The X1 coordinate(Top Right)
int WndY1;//The Y1 coordinate(Top Right)
int WndX2;//The X2 coordinate(Bottom Left)
int WndY2;//The Y2 coordinate(Bottom Left)
int WndStyle;//How window will appear to user
int WndFcColor;//Window on Focus Color
int WndLFcColor;//Window on Lost Focus Color
int WndBackGrd;//Color of the windows background
//Icons Later add..
int WndTitleLine;//The color of the lines on the title bar
};
//This will hold the quality (esstentail quality)
struct WndQuality
{
char* WndName;//The window name in memory will work like a handle;
char* WndCaption;//The windows Title Bar Caption
};
//Create the folder for the window
struct WndFolder
{
int X;
int Y;
int Color;
};
struct WndFile
{
char* FileName;
char* Bytes;
};
//Use inheritance to grab the member for the each Structure
struct WndMain
{
WndAttribute WndAttr;
WndQuality WndQual;
WndFolder WndFol;
};
struct UserInfo
{
char *ID;//This will hold the User Name
char *CODE;//This will hold the Password
};
//This struct will hold the data for the new user
struct Wizard_Info
{
char Id[15];
char Code[15];
char First[15];
char Last[15];
char Sex[15];
};
//*******************************************************************
//End Structure Declarations
//*******************************************************************
char* Emotion[4];
char* TitleBarButtons[2];//Used for close button, minimize button, max button
char* ButtonLabel[3];
char* InputBoxSy;//Icon for the inputbox
char* LogFileName;//The Filename for the log file to save\load .
int Mouse_x;//Used to hold the X coordinate of the cursor
int Mouse_y;//Used to hold the Y coordinate of the cursor
int WndCount;
public:
void Create_Log_File();
void Drawsprite(char SpriteFile[12],int XCo, int YCo, int StartX,
int StartY);
int CreateWindow(int WndX1,int WndY1,int WndX2,int WndY2,
int WndStyle, int WndFcColor, int WndLFcColor,
int WndBackGrd, int WndTitleLine);
int TypeEngine(int XCor, int YCor,int Visible_Color, int Cover_Color,
int XBound, int YBound, int BackSpace_Bound, int Tab_Bound,
int Return_TabCoor, int Status);
void GetMousePos(int *button,int *x, int *y);//Get the mouse position
void Hide_Cursor();
int CreateFolder(int X, int Y, int Color);
void CreateTxtBox_Lbl(int X1, int Y1, int X2, int Y2,char* TxtLabel);
void CreateMsgBox(int MsgStyle, int ChoiceEm,char* Line1, char* Line2,
char* Line3, char* Line4, char* Line5);
void Back_Buff(int a1,int b1,int a2,int b2,int x1,int y1);
void User_Wizard();
void Get_Wnd_Visual();
//Function for making the mouse work
void GetClick(int bta,int btb,int link[][5]);
void Mouse_Enable();
void Mouse_Read_Cursor();
void ShowMouse();
//Set default values for struct window
void Set_Default();
void Create_Entire_Interface();
void Set_WndNumber();
void External_EXE(char *FileName);
char Time[15];
char Date[15];
union REGS i,o;//
BackBuff BkBuff[100];//Hold the grpahics back buffer data
//*******************************************************
//These are are used for the differant sections
//*******************************************************
void Game();//Games ;)
//*******************************************************
//Set all the values for the variables used throughout
//the class [default construtor]
//*******************************************************
MiniOS::MiniOS()
{
WndCount = 0;
//Hold the coordinates and detail of windows
TitleBarButtons[0] = new char[1];
TitleBarButtons[1] = new char[1];
TitleBarButtons[2] = new char[1];
Emotion[0] = new char[1];
Emotion[1] = new char[1];
Emotion[2] = new char[1];
Emotion[3] = new char[1];
InputBoxSy = new char[1];
ButtonLabel[0] = new char[3];
ButtonLabel[1] = new char[7];
ButtonLabel[2] = new char[4];
ButtonLabel[3] = new char[3];
LogFileName = new char[255];
_strtime(Time);//Convert to string
_strdate(Date);//Convert to string
strcat(Date," ");//Do a nice little trick to store both of them in one
strcat(Date,Time);//Do a nice little trick to store both of them in one
//*****************************************
//Allocation errors
if((!TitleBarButtons[0]) || (!TitleBarButtons[1]) || (!TitleBarButtons[2]) ||
(!Emotion[0]) || (!Emotion[1]) || (!Emotion[2]) || (!Emotion[3]) ||
(!InputBoxSy) || (!LogFileName) )
cout<<"Error allocating memory for window";
//This is for the message box
strcpy(Emotion[0],"?");//Question(Do what now)
strcpy(Emotion[1],"!");//Explanation(Listen Up)
strcpy(Emotion[2],"X");//Critical(UH Oh)
strcpy(Emotion[3],"I");//Default
//This is the titlebar button used on the very right to close open minimize
strcpy(TitleBarButtons[0],"X");
strcpy(TitleBarButtons[1],"_");
strcpy(TitleBarButtons[2],"Û");
//These are the symbols for the input boxes
strcpy(InputBoxSy,"");//The Login in Symbol for Input Box
}
~MiniOS()//deconstrutor
{
delete WndMain.WndQual.WndCaption;
delete WndMain.WndQual.WndName;
delete TitleBarButtons[0];
delete TitleBarButtons[1];
delete TitleBarButtons[2];
delete Emotion[0];
delete Emotion[1];
delete Emotion[2];
delete Emotion[3];
delete InputBoxSy;
delete ButtonLabel[0];
delete ButtonLabel[1];
delete ButtonLabel[2];
delete ButtonLabel[3];
delete LogFileName;
closegraph();
}
WndMain WndMain;//Will Hold all information for the window
};
//*********************************************************************
//End MiniOS Class
//*********************************************************************
//Global Variables
MiniOS OS;//Make a instance of the class global
void Screen_Back_Buffer();//This function will update the screen when need
//*********************************************************************
//Begin the main program point
//*********************************************************************
int main()
{
//intailize graphics
int graphdriver = DETECT, graphmode, errorcode;
//Put the user into graphic mode
initgraph(&graphdriver,&graphmode,"..\\BGI\\");
errorcode = graphresult();//Use this to hold the number error
if (errorcode != grOk) /* an error
occurred */
{
cout<<"Error Number: "<= 15 + 100 && Mouse_x <= getmaxx() - 310 &&
Mouse_y >= 15 + 20 && Mouse_y <= getmaxy() - 280
&& Button == 1 )
{
OS.Hide_Cursor();
XM = Mouse_x - 100;
YM = Mouse_y - 20;
setactivepage(1);
//OS.Create_Entire_Interface();
setactivepage(0);//Back Buffer for the window
//cleardevice();
setfillstyle(SOLID_FILL,0);
bar(XM-10,YM-10,Mouse_x + 210,Mouse_y + 210);
setfillstyle(SOLID_FILL,0);
bar(5,5,getmaxx()-5,415);
OS.CreateWindow(XM,YM,Mouse_x + 200,Mouse_y + 200,1,2,3,6,1);
OS.ShowMouse();
setvisualpage(1);
//View the back buffer
setvisualpage(0);
}
//Location for each icons at the bottom
//Icon 1: Terminal
if( Mouse_x >= 20 && Mouse_x <= 52 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(13, getmaxy()-53,55, getmaxy()-13);
}
//Icon 2: System
if( Mouse_x >= 70 && Mouse_x <= 102 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(63,getmaxy()-53,103,getmaxy()-13);
}
//Icon 3: Apps
if( Mouse_x >= 120 && Mouse_x <= 170 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(113,getmaxy()-53,156,getmaxy()-13);
}
//Icon 4: Internet
if( Mouse_x >= 170 && Mouse_x <= 230 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(163,getmaxy()-53,203,getmaxy()-13);
}
//Icon 4: Media
if( Mouse_x >= 230 && Mouse_x <= 270 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(210,getmaxy()-53,253,getmaxy()-13);
}
//Icon 5: Games
if( Mouse_x >= 270 && Mouse_x <= 320 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= getmaxy() - 28
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(260,getmaxy()-53,303,getmaxy()-13);
OS.Game();
}
//Icon 6: System Time (on the very end of operation bar)
if( Mouse_x >= getmaxx()-100 && Mouse_x <= (getmaxx()-100)+32 &&
Mouse_y >= getmaxy()-100 && Mouse_y <= (getmaxx()-100)+32
&& Button == 1 )
{
OS.CreateMsgBox(0,2,"Current Date\Time is:",OS.Date,"","","");
getch();
goto Test;
}
//Icon 7: Exit Jinx
if( Mouse_x >= getmaxx()-50 && Mouse_x <= (getmaxx()-50)+32 &&
Mouse_y >= getmaxy()-50 && Mouse_y <= (getmaxx()-50)+32
&& Button == 1 )
{
setlinestyle(0,1,1);
setcolor(1);
rectangle(getmaxx()-55,getmaxy()-53,getmaxx()-15,getmaxy()-13);
//End sound
sound(900);
delay(200);
sound(200);
delay(100);
sound(900);
delay(200);
nosound();
//end sound part
OS.CreateMsgBox(0,2,"Log Off time Logged",OS.Date,"Good Bye","","");
exit(1);//Exit Jinx Totaly
return;
}
//Clear all other left behind stuff
if(Mouse_x >=10 && Mouse_y >= 10 && Mouse_x <= getmaxx()-10 &&
Mouse_y <= 410)
{
//Control the whole interactive screen
setcolor(0);
setlinestyle(0,1,1);
rectangle(63,getmaxy()-53,103,getmaxy()-13);
rectangle(113,getmaxy()-53,156,getmaxy()-13);
rectangle(163,getmaxy()-53,203,getmaxy()-13);
rectangle(210,getmaxy()-53,253,getmaxy()-13);
rectangle(260,getmaxy()-53,303,getmaxy()-13);
rectangle(13, getmaxy()-53,55, getmaxy()-13);
rectangle(getmaxx()-55,getmaxy()-53,getmaxx()-15,getmaxy()-13);
}
}//While Loop
//**************************************************
//End Drag and Drop
//**************************************************
//**************************************************
}//end update function
void MiniOS::Get_Wnd_Visual()
{
int I = 0;
for(I = 0; I < WndCount; I++)
{
//CReate the window
CreateWindow(BkBuff[WndCount].WndSize,BkBuff[WndCount].WndX1,
BkBuff[WndCount].WndY1,BkBuff[WndCount].WndX2,
BkBuff[WndCount].WndY2,BkBuff[WndCount].WndStyle,
BkBuff[WndCount].WndFcColor,BkBuff[WndCount].WndLFcColor,
BkBuff[WndCount].WndBackGrd);
}
}
void MiniOS::Set_WndNumber()
{
WndCount++;//Add one so the window will be able to have a back buffer
}
//*********************************************************************
//Very important function, this will show the windows on the screen
//There are three differant types 0-2
//*********************************************************************
int MiniOS::CreateWindow(int WndX1,int WndY1,int WndX2,int WndY2,
int WndStyle, int WndFcColor, int WndLFcColor,
int WndBackGrd, int WndTitleLine)
{
palettetype pal;//Contains palette information for the current graphics driver
getpalette(&pal);//GetPalette demands that a pointer be passed
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
WndMain.WndAttr.WndSize = sizeof(WndMain);
WndMain.WndAttr.WndX1 = WndX1;
WndMain.WndAttr.WndY1 = WndY1;
WndMain.WndAttr.WndX2 = WndX2;
WndMain.WndAttr.WndY2 = WndY2;
WndMain.WndAttr.WndStyle = WndStyle;
WndMain.WndAttr.WndFcColor = WndFcColor;
WndMain.WndAttr.WndLFcColor = WndLFcColor;
WndMain.WndAttr.WndBackGrd = WndBackGrd;
WndMain.WndAttr.WndTitleLine = WndTitleLine;
//**************************************************************
BkBuff[WndCount].WndSize = WndMain.WndAttr.WndSize;
BkBuff[WndCount].WndX1 = WndMain.WndAttr.WndX1;
BkBuff[WndCount].WndY1 = WndMain.WndAttr.WndY1;
BkBuff[WndCount].WndX2 = WndMain.WndAttr.WndX2;
BkBuff[WndCount].WndY2 = WndMain.WndAttr.WndY2;
BkBuff[WndCount].WndStyle = WndMain.WndAttr.WndStyle;
BkBuff[WndCount].WndFcColor = WndMain.WndAttr.WndFcColor;
BkBuff[WndCount].WndLFcColor = WndMain.WndAttr.WndLFcColor;
BkBuff[WndCount].WndBackGrd = WndMain.WndAttr.WndBackGrd;
//Create the BackBuffer Data
//**************************************************************
setfillstyle(SOLID_FILL,WndMain.WndAttr.WndBackGrd);
bar(WndMain.WndAttr.WndX1+70, WndMain.WndAttr.WndY1+30,
WndMain.WndAttr.WndX2,WndMain.WndAttr.WndY2);
//Used to create the gradient titlebar
for (int I=0; I= (MaxX/2)+90 && Mouse_x <= (MaxX/2+100)+45 &&
Mouse_y >= (MaxY/2)+120 && Mouse_y <= (MaxY/2+100)+40
&& Button == 1 )
{
setfillstyle(SOLID_FILL,BLACK);
bar(MaxX/2+15,MaxY/2-10,MaxX/2+300,MaxY/2+150);
}
}//End Emotion Choice If
}
break;
default:
break;
}//end switch
cin.get();
return;
}
//**************************************************************************
//This function will control all typing in the SHELL
//**************************************************************************
int MiniOS::TypeEngine(int XCor,int YCor,int Visible_Color, int Cover_Color,
int XBound, int YBound, int BackSpace_Bound,
int Tab_Bound, int Return_TabCoor, int Status)
{
UserInfo UI;
Wizard_Info UInfo;//Make a instance of the info struct for the user
UI.ID = new char [15];
UI.CODE = new char [15];
//int MaxX = getmaxx() / 2;
int MaxY = getmaxy() / 2;
cin.get();
int TempCorChar[4];
TempCorChar[0] = MaxY - 93;
TempCorChar[1] = MaxY - 63;
TempCorChar[2] = MaxY - 33;
TempCorChar[3] = MaxY - 3;
TempCorChar[4] = MaxY + 27;
//******************************
int X = XCor+45, Y = YCor-8;//Used to hold the place for the cursor coordiantes
//int MaxX = getmaxx() / 2, MaxY = getmaxy() / 2;
char *Key = NULL;//The big string being used
Key = 0;
int I = -1, J = -1;//Give them the lowest value of the array
int Wiz0 = -1, Wiz1 = -1, Wiz2 = -1, Wiz3 = -1, Wiz4 = -1;//Will Hold values
//for the string array
//Allocation error
if( (!UI.ID) || (!UI.CODE) )
return -1;
setcolor(Visible_Color);//Used to control color of cursor
outtextxy(X+8,Y,"_");
do
{
*Key = getch();
setcolor(Visible_Color);//Used to control color of cursor
outtextxy(X+16,Y,"_");
//Control the Range
X+=8;//Goto the next blank
//Where main output happens
if((*Key != 13) && (*Key != 8) && (*Key!= 9))
{
if(X <= (XBound))//X Boundries MaxX/2+260
{
outtextxy(X,Y,Key);
setcolor(Cover_Color);
outtextxy(X,Y,"_");
//Basically this part will let the compiler know how to control
//the range by the status
switch(Status)
{
case 0:
//Control which string we are on for the login
if(Y <= (YBound))//Y Boundries MaxY/2+75
{
I+=1;
UI.ID[I] = (char)*Key;
}
else
{
J+=1;
UI.CODE[J] = (char)*Key;
}//end else
case 1: //Used for most of the wizard on non moveable windows
if(Y == (TempCorChar[0]))//Y Boundries MaxY/2+75
{
Wiz0+=1;
UInfo.Id[Wiz0] = (char)*Key;
}
if(Y == (TempCorChar[1]))//Y Boundries MaxY/2+75
{
Wiz1+=1;
UInfo.Code[Wiz1] = (char)*Key;
}
if(Y == (TempCorChar[2]))//Y Boundries MaxY/2+75
{
Wiz2+=1;
UInfo.First[Wiz2] = (char)*Key;
}
if(Y == (TempCorChar[3]))//Y Boundries MaxY/2+75
{
Wiz3+=1;
UInfo.Last[Wiz3] = (char)*Key;
}
if(Y == (TempCorChar[4]))//Y Boundries MaxY/2+75
{
Wiz4+=1;
UInfo.Sex[Wiz4] = (char)*Key;
}
}//end Status
}//end Xbound
else
{
X-=8;
setcolor(Cover_Color);
outtextxy(X,Y,"__");
outtextxy(X,Y,"");
}//end else
}//end if
if(*Key == 8)//Backspace
{
if(X >= BackSpace_Bound)//BackSpace Boundry XCor + 55
{
//Preform BackSpace using a block to cover it up
X-=8;
setfillstyle(SOLID_FILL,Cover_Color);
bar(X,Y,X+8,Y+8);
//SetCursor to right place and cover its tracks
setcolor(Cover_Color);
outtextxy(X+8,Y,"__");
setcolor(Visible_Color);
outtextxy(X,Y,"_");
X-=8;
outtextxy(X,Y,"");
//Control which string we are on for the login
if(Y >= (YBound))//Max
{
I-=1;
UI.ID[I] = (char)" ";
}
else
{
J-=1;
UI.CODE[J] = (char)" ";
}
}//End if Outer IF
//If the back space does exceeds its
else
{
X-=0;
if(Y >= (YBound))//Max
{
I-=1;
UI.ID[I] = (char)" ";
}
else
{
J-=1;
UI.CODE[J] = (char)" ";
}
//Cover Procedure
setcolor(Cover_Color);
outtextxy(X+8,Y,"__");
setcolor(Visible_Color);
outtextxy(X,Y,"_");
}
}//end if
//This will be used as the tab key
if(*Key == 9)
{
if(Y <= Tab_Bound)//YCor + 30 Tab Boundry
{
setcolor(Cover_Color);
outtextxy(X,Y,"__");
Y+=30;
X=XCor+45;
//View the curosr
setcolor(Visible_Color);//Used to control color of cursor
outtextxy(X+8,Y,"_");
}
if( Y >= (Tab_Bound))//Move back up to ID
{
setcolor(Cover_Color);
outtextxy(X,Y,"__");
Y-=Return_TabCoor;//60 was this Tab Return Boundry
X=XCor+45;
//View the curosr
setcolor(Visible_Color);//Used to control color of cursor
outtextxy(X+8,Y,"_");
}
//cout<> Sprite[Y][X];
for(X=0;X= 100 && Mouse_y >= 100 &&
Mouse_x <= 132 && Mouse_y <= 132
&& Button == 1 )
External_EXE("C:\\Snake.exe");
//Call Upon Snake Game
if( Mouse_x >= 150 && Mouse_y >= 100 &&
Mouse_x <= 182 && Mouse_y <= 132
&& Button == 1 )
{
External_EXE("C:\\Falldown.exe");
outtext("YAAAAA");
}
}
}
//**************************************************
//Function to run exe inside the program itself
//**************************************************
void MiniOS::External_EXE(char *FileName)
{
char **Test= NULL;
execvp(FileName, Test);
return;
}