PGP Zach
PGP Zach
PGP Zach
c
#include "Application.h"
#include <stdio.h>
#include <X11/keysym.h>
#define CELL_SIZE 80
#define HORSE_SIZE 60
Application app;
void createColors() {
Colormap colormap = DefaultColormap(app.dpy, 0);
void initMainWindow() {
XSetWindowAttributes attr;
unsigned long mask;
int src;
unsigned width;
unsigned height;
app.dpy = XOpenDisplay(NULL);
взаимодействие Х-клиента и Х-сервера
app.root = DefaultRootWindow(app.dpy);
родительское окно
src = DefaultScreen(app.dpy);
информация о номере родительского окна
app.depth = DefaultDepth(app.dpy, src);
оценка цветовых возможностей экрана
// create window
mask = CWOverrideRedirect;
attr.override_redirect = False;
app.window = XCreateWindow(app.dpy, app.root, 0, 0, width,
height, 1, app.depth,
InputOutput, CopyFromParent, mask, &attr);
void appRun() {
// selected horse
Horse* pSelectedHorse = NULL;
XEvent event;
int done = 0;
while (!done) {
XNextEvent(app.dpy, &event);
switch (event.type) {
case ButtonPress:
pSelectedHorse = boardPickHorse(&app.board,
event.xbutton.x, event.xbutton.y);
// нажмите кнопку на пустой ячейке платы
if (!pSelectedHorse) {
done = 1;
}
break;
case MotionNotify:
// move horse
// Я вычитаю половину размера лошади так что
указатель мыши находится в центре
if (pSelectedHorse) {
horseSetPosition(pSelectedHorse, event.xbutton.x
- app.horseSize / 2, event.xbutton.y - app.horseSize / 2);
}
break;
case ButtonRelease:
// put horse
if (pSelectedHorse) {
boardPutHorse(&app.board, pSelectedHorse,
event.xbutton.x, event.xbutton.y);
boardUpdate(&app.board);
pSelectedHorse = NULL;
}
break;
case KeyPress:
boardSetDefaultConfiguration(&app.board);
boardUpdate(&app.board);
break;
default:
break;
}
Board.c
#include "Board.h"
#include "Application.h"
#include <stdlib.h>
int defaultHorsePositions[12][2] = {
{5, 1},
{1, 2},
{2, 2},
{4, 2},
{5, 2},
{2, 3},
{5, 4},
{2, 5},
{3, 5},
{5, 5},
{6, 5},
{2, 6},
};
// инициализация лошадей
for (int i = 0; i < 12; ++i) {
horseInit(&board->horses[i], board);
}
XMapSubwindows(app.dpy, board->window);
boardSetDefaultConfiguration(board);
boardUpdate(board);
}
void boardDeinit(Board* board) {
// free cell windows
for (int i = 0; i <8; ++i) {
for (int j = 0; j < 8; ++j) {
XDestroyWindow(app.dpy, board->cells[i][j]);
}
free(board->cells[i]);
}
free(board->cells);
// deinit horses
for (int i = 0; i < 12; ++i) {
horseDeinit(&board->horses[i]);
// find horse
for (int i = 0; i < 12; ++i) {
if (board->horses[i].col == col && board->horses[i].row
== row) {
return &board->horses[i];
}
}
Horse.c
#include <stdlib.h>
#include "Horse.h"
#include "Application.h"
#include "Board.h"
// создать окно
horse->window = XCreateWindow(app.dpy, board->window, 0, 0,
app.horseSize, app.horseSize,
1, app.depth, InputOutput, CopyFromParent, mask, &attr);
return 0;
}
Application.h
#ifndef APPLICATION_H
#define APPLICATION_H
#include "Board.h"
#include <X11/Xlib.h>
typedef struct {
Display *dpy;
Window window;
Window root;
unsigned depth;
unsigned cellSize;
unsigned horseSize;
unsigned offset; // смещение в ячейке для лошади
Board board;
} Application;
void appInit();
void appDeinit();
void appRun();
#endif
Board.h
#ifndef MATRIX_H
#define MATRIX_H
#include <X11/Xlib.h>
#include "Horse.h"
#endif
Horse.h
#ifndef HORSE_H
#define HORSE_H
#include <X11/Xlib.h>
struct Board;
typedef struct {
Window window;
// координаты лошади на доске
int row;
int col;
} Horse ;
#endif