X11: handle window resize and close
This commit is contained in:
parent
74a8ad142f
commit
d5bd599461
14
src/input.c
14
src/input.c
@ -1358,6 +1358,20 @@ int Get_input(int sleep_time)
|
|||||||
Update_rect(event.xexpose.x, event.xexpose.y,
|
Update_rect(event.xexpose.x, event.xexpose.y,
|
||||||
event.xexpose.width, event.xexpose.height);
|
event.xexpose.width, event.xexpose.height);
|
||||||
break;
|
break;
|
||||||
|
case ConfigureNotify:
|
||||||
|
if (event.xconfigure.above == 0)
|
||||||
|
{
|
||||||
|
Resize_width = event.xconfigure.width;
|
||||||
|
Resize_height = event.xconfigure.height;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ClientMessage:
|
||||||
|
if (event.xclient.data.l[0] == XInternAtom(X11_display, "WM_DELETE_WINDOW", False))
|
||||||
|
{
|
||||||
|
Quit_is_required = 1;
|
||||||
|
user_feedback_required = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printf("event.type = %d\n", event.type);
|
printf("event.type = %d\n", event.type);
|
||||||
}
|
}
|
||||||
|
|||||||
112
src/x11screen.c
112
src/x11screen.c
@ -43,13 +43,9 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen)
|
|||||||
unsigned long white, black;
|
unsigned long white, black;
|
||||||
char * winName[] = { "GrafX2" };
|
char * winName[] = { "GrafX2" };
|
||||||
Visual * visual;
|
Visual * visual;
|
||||||
const char blank_data[1] = { 0 };
|
|
||||||
Pixmap blank;
|
|
||||||
Cursor cursor;
|
|
||||||
XColor dummy;
|
|
||||||
|
|
||||||
if (X11_display == NULL)
|
if (X11_display == NULL)
|
||||||
X11_display = XOpenDisplay(NULL);//getenv("DISPLAY")
|
X11_display = XOpenDisplay(NULL);// NULL is equivalent to getenv("DISPLAY")
|
||||||
if (X11_display == NULL)
|
if (X11_display == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "X11: cannot open display\n");
|
fprintf(stderr, "X11: cannot open display\n");
|
||||||
@ -75,53 +71,73 @@ void GFX2_Set_mode(int *width, int *height, int fullscreen)
|
|||||||
}
|
}
|
||||||
depth = DisplayPlanes(X11_display, s);
|
depth = DisplayPlanes(X11_display, s);
|
||||||
|
|
||||||
X11_window = XCreateSimpleWindow(X11_display, RootWindow(X11_display, s),
|
if (X11_window == NULL)
|
||||||
0, 0, *width, *height, 0, white, black);
|
|
||||||
|
|
||||||
// create blank 1x1 pixmap to make a 1x1 transparent cursor
|
|
||||||
blank = XCreateBitmapFromData(X11_display, X11_window, blank_data, 1, 1);
|
|
||||||
cursor = XCreatePixmapCursor(X11_display, blank, blank, &dummy, &dummy, 0, 0);
|
|
||||||
//cursor = XCreateFontCursor(X11_display, 130 /*XC_tcross*/);
|
|
||||||
XDefineCursor(X11_display, X11_window, cursor);
|
|
||||||
XFreePixmap(X11_display, blank);
|
|
||||||
XFreeCursor(X11_display, cursor);
|
|
||||||
|
|
||||||
X11_gc = XCreateGC(X11_display, X11_window, 0, NULL);
|
|
||||||
XSetFunction(X11_display, X11_gc, GXcopy);
|
|
||||||
|
|
||||||
XStringListToTextProperty(winName, 1, &windowName);
|
|
||||||
XSetWMName(X11_display, X11_window, &windowName);
|
|
||||||
// TODO : set icon
|
|
||||||
|
|
||||||
screen = New_GFX2_Surface(*width, *height);
|
|
||||||
memset(screen->pixels, 0, *width * *height);
|
|
||||||
|
|
||||||
image_pixels = malloc(*height * *width * 4);
|
|
||||||
memset(image_pixels, 64, *height * *width * 4);
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i= 3*8; i < (*height * *width * 4); i += *width * 4)
|
|
||||||
{
|
|
||||||
image_pixels[i+0] = 0; // B
|
|
||||||
image_pixels[i+1] = 0; // G
|
|
||||||
image_pixels[i+2] = 0; // R
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
X11_image = XCreateImage(X11_display, visual, depth,
|
|
||||||
ZPixmap, 0, image_pixels, *width, *height,
|
|
||||||
32, 0/**width * 4*/);
|
|
||||||
if(X11_image == NULL)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "XCreateImage failed\n");
|
static const char blank_data[1] = { 0 };
|
||||||
exit(1);
|
Pixmap blank;
|
||||||
|
Cursor cursor;
|
||||||
|
XColor dummy;
|
||||||
|
Atom wmDelete;
|
||||||
|
|
||||||
|
X11_window = XCreateSimpleWindow(X11_display, RootWindow(X11_display, s),
|
||||||
|
0, 0, *width, *height, 0, white, black);
|
||||||
|
|
||||||
|
// create blank 1x1 pixmap to make a 1x1 transparent cursor
|
||||||
|
blank = XCreateBitmapFromData(X11_display, X11_window, blank_data, 1, 1);
|
||||||
|
cursor = XCreatePixmapCursor(X11_display, blank, blank, &dummy, &dummy, 0, 0);
|
||||||
|
//cursor = XCreateFontCursor(X11_display, 130 /*XC_tcross*/);
|
||||||
|
XDefineCursor(X11_display, X11_window, cursor);
|
||||||
|
XFreePixmap(X11_display, blank);
|
||||||
|
XFreeCursor(X11_display, cursor);
|
||||||
|
|
||||||
|
X11_gc = XCreateGC(X11_display, X11_window, 0, NULL);
|
||||||
|
//XSetFunction(X11_display, X11_gc, GXcopy);
|
||||||
|
|
||||||
|
XStringListToTextProperty(winName, 1, &windowName);
|
||||||
|
XSetWMName(X11_display, X11_window, &windowName);
|
||||||
|
// TODO : set icon
|
||||||
|
|
||||||
|
XSelectInput(X11_display, X11_window,
|
||||||
|
PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | ExposureMask | StructureNotifyMask);
|
||||||
|
|
||||||
|
wmDelete = XInternAtom(X11_display, "WM_DELETE_WINDOW", True);
|
||||||
|
XSetWMProtocols(X11_display, X11_window, &wmDelete, 1);
|
||||||
|
|
||||||
|
XMapWindow(X11_display, X11_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
XSelectInput(X11_display, X11_window,
|
if (screen == NULL)
|
||||||
PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | ExposureMask | StructureNotifyMask);
|
{
|
||||||
|
screen = New_GFX2_Surface(*width, *height);
|
||||||
|
memset(screen->pixels, 0, *width * *height);
|
||||||
|
}
|
||||||
|
else if (*width > screen->w || *height > screen->h)
|
||||||
|
{
|
||||||
|
screen->pixels = realloc(screen->pixels, *width * *height);
|
||||||
|
screen->w = *width;
|
||||||
|
screen->h = *height;
|
||||||
|
XDestroyImage(X11_image);
|
||||||
|
X11_image = NULL;
|
||||||
|
image_pixels = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image_pixels == NULL)
|
||||||
|
{
|
||||||
|
image_pixels = malloc(*height * *width * 4);
|
||||||
|
memset(image_pixels, 64, *height * *width * 4);
|
||||||
|
}
|
||||||
|
if (X11_image == NULL)
|
||||||
|
{
|
||||||
|
X11_image = XCreateImage(X11_display, visual, depth,
|
||||||
|
ZPixmap, 0, image_pixels, *width, *height,
|
||||||
|
32, 0/**width * 4*/);
|
||||||
|
if(X11_image == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "XCreateImage failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
XMapWindow(X11_display, X11_window);
|
|
||||||
XFlush(X11_display);
|
XFlush(X11_display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user