綺麗に

This commit is contained in:
2026-01-17 18:35:27 +09:00
parent b20fa6cc3a
commit fa83f224e2
9 changed files with 164 additions and 151 deletions

112
main.c
View File

@@ -4,73 +4,67 @@
#include "src/utils.h"
#include "src/control.h"
XftColor color, btncolor;
Colormap colormap;
XftFont *font;
XftFont *prbfont;
XftFont *disfont;
Visual *visual;
const char *sofname = "ucalc";
const char *version = "0.0.0";
const char *disname = "Unix Calc";
int main() {
Display *display;
Window window;
UiSystem ui;
XEvent event;
int screen;
GC gc = NULL;
XGCValues values;
display = XOpenDisplay(NULL);
if (display == NULL) {
ui.display = XOpenDisplay(NULL);
if (ui.display == NULL) {
fprintf(stderr, "画面を開けられません。\n");
exit(1);
}
screen = DefaultScreen(display);
screen = DefaultScreen(ui.display);
int sw = DisplayWidth(display, screen);
int sh = DisplayHeight(display, screen);
int sw = DisplayWidth(ui.display, screen);
int sh = DisplayHeight(ui.display, screen);
int window_x = (sw - window_width) / 3;
int window_y = (sh - window_height) / 2;
window = XCreateSimpleWindow(display, RootWindow(display, screen),
ui.window = XCreateSimpleWindow(ui.display,
RootWindow(ui.display, screen),
window_x, window_y, window_width, window_height, 1, BTCOL, BGCOL);
if (!window) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
if (!ui.window) {
cleanup(&ui);
fprintf(stderr, "ウィンドウを作成に失敗。\n");
exit(1);
}
backbuf = XCreatePixmap(display, window, window_width, window_height, DefaultDepth(display, screen));
ui.backbuf = XCreatePixmap(ui.display, ui.window, window_width, window_height,
DefaultDepth(ui.display, screen));
ui.target = ui.backbuf;
Atom net_wm_window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
Atom dialog = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DIALOG", False);
Atom net_wm_window_type = XInternAtom(ui.display, "_NET_WM_WINDOW_TYPE", False);
Atom dialog = XInternAtom(ui.display, "_NET_WM_WINDOW_TYPE_DIALOG", False);
XChangeProperty(display, window, net_wm_window_type, XA_ATOM, 32,
XChangeProperty(ui.display, ui.window, net_wm_window_type, XA_ATOM, 32,
PropModeReplace, (unsigned char *)&dialog, 1);
XStoreName(display, window, disname);
Atom net_wm_name = XInternAtom(display, "_NET_WM_NAME", False);
XStoreName(ui.display, ui.window, disname);
Atom net_wm_name = XInternAtom(ui.display, "_NET_WM_NAME", False);
char displayname[16];
snprintf(displayname, 16, "%s %s", disname, version);
XChangeProperty(display, window, net_wm_name,
XInternAtom(display, "UTF8_STRING", False), 8,
XChangeProperty(ui.display, ui.window, net_wm_name,
XInternAtom(ui.display, "UTF8_STRING", False), 8,
PropModeReplace, (unsigned char *)displayname, strlen(displayname));
XClassHint *classHint = XAllocClassHint();
if (classHint) {
classHint->res_name = "unixcalc";
classHint->res_class = "UnixCalc";
XSetClassHint(display, window, classHint);
XSetClassHint(ui.display, ui.window, classHint);
XFree(classHint);
}
XSetWindowBackground(display, window, BGCOL);
XSetWindowBackground(ui.display, ui.window, BGCOL);
XSelectInput(display, window,
XSelectInput(ui.display, ui.window,
ExposureMask
| ButtonPressMask
| ButtonReleaseMask
@@ -80,84 +74,84 @@ int main() {
// | StructureNotifyMask
);
gc = XCreateGC(display, window, 0, &values);
if (!gc) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
ui.gc = XCreateGC(ui.display, ui.window, 0, &values);
if (!ui.gc) {
cleanup(&ui);
fprintf(stderr, "GCを作成に失敗。\n");
exit(1);
}
visual = DefaultVisual(display, screen);
ui.visual = *DefaultVisual(ui.display, screen);
colormap = XCreateColormap(display, window, visual, AllocNone);
if (colormap == None) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
ui.colormap = XCreateColormap(ui.display, ui.window, &ui.visual, AllocNone);
if (ui.colormap == None) {
cleanup(&ui);
fprintf(stderr, "カラーマップを作成に失敗。\n");
exit(1);
}
font = XftFontOpenName(display, screen, "Noto Sans CJK-12");
if (!font) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
ui.font = XftFontOpenName(ui.display, screen, "Noto Sans CJK-12");
if (!ui.font) {
cleanup(&ui);
fprintf(stderr, "フォントの読み込みに失敗。\n");
exit(1);
}
prbfont = XftFontOpenName(display, screen, "Noto Sans CJK-24");
if (!prbfont) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
ui.prbfont = XftFontOpenName(ui.display, screen, "Noto Sans CJK-24");
if (!ui.prbfont) {
cleanup(&ui);
fprintf(stderr, "問題フォントの読み込みに失敗。\n");
exit(1);
}
disfont = XftFontOpenName(display, screen, "Noto Sans CJK-72");
if (!disfont) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
ui.disfont = XftFontOpenName(ui.display, screen, "Noto Sans CJK-72");
if (!ui.disfont) {
cleanup(&ui);
fprintf(stderr, "解決フォントの読み込みに失敗。\n");
exit(1);
}
if (!XftColorAllocName(display, visual, colormap, "#232020", &color)) {
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
if (!XftColorAllocName(ui.display, &ui.visual, ui.colormap, "#232020", &ui.color)) {
cleanup(&ui);
fprintf(stderr, "色の役割に失敗。\n");
exit(1);
}
XMapWindow(display, window);
XMapWindow(ui.display, ui.window);
{
XWindowAttributes attr;
XGetWindowAttributes(display, window, &attr);
XGetWindowAttributes(ui.display, ui.window, &attr);
XEvent fake = { .type = Expose };
fake.xexpose.window = window;
fake.xexpose.window = ui.window;
fake.xexpose.width = attr.width;
fake.xexpose.height = attr.height;
control_expose(display, window, gc, &event, &color, font, disfont, prbfont);
control_expose(&ui, &event);
}
while (isrunning) {
XNextEvent(display, &event);
XNextEvent(ui.display, &event);
switch (event.type) {
case Expose:
case ConfigureNotify:
XClearWindow(display, window);
control_expose(display, window, gc, &event, &color, font, disfont, prbfont);
XClearWindow(ui.display, ui.window);
control_expose(&ui, &event);
break;
case ButtonPress:
if (event.xbutton.button == Button1) {
handle_button_press(display, gc, event.xbutton.x, event.xbutton.y, &color, font);
handle_button_press(&ui, event.xbutton.x, event.xbutton.y);
break;
}
case ButtonRelease:
if (event.xbutton.button == Button1) {
handle_button_release(display, window, gc, event.xbutton.x, event.xbutton.y, &color, font, disfont, prbfont);
handle_button_release(&ui, event.xbutton.x, event.xbutton.y);
break;
}
case KeyPress:
handle_key_press(display, window, gc, &event, &color, font, disfont, prbfont);
handle_key_press(&ui, &event);
break;
// case MotionNotify:
// handle_mouse_hover(display, window, gc, &event, &color, font);
// handle_mouse_hover(&ui, &event);
// break;
case ClientMessage:
// WM_DELETE_WINDOW
@@ -165,7 +159,7 @@ int main() {
}
}
cleanup(display, window, gc, &color, &btncolor, font, disfont, prbfont, colormap, visual, backbuf);
cleanup(&ui);
return 0;
}