Compare commits
3 Commits
9476bc3672
...
63260a916e
Author | SHA1 | Date |
---|---|---|
Jonas 'Sortie' Termansen | 63260a916e | |
Jonas 'Sortie' Termansen | b2585414a0 | |
Jonas 'Sortie' Termansen | 068684d6ff |
|
@ -196,6 +196,8 @@ CONNECTION_MESSAGE_HANDLER(render_window)
|
||||||
msg->left, msg->top, msg->width, msg->height);
|
msg->left, msg->top, msg->width, msg->height);
|
||||||
|
|
||||||
framebuffer_copy_to_framebuffer(dst, src);
|
framebuffer_copy_to_framebuffer(dst, src);
|
||||||
|
|
||||||
|
window_schedule_redraw(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
CONNECTION_MESSAGE_HANDLER(title_window)
|
CONNECTION_MESSAGE_HANDLER(title_window)
|
||||||
|
@ -216,6 +218,8 @@ CONNECTION_MESSAGE_HANDLER_NO_AUX(show_window)
|
||||||
struct window* window = connection_find_window(connection, msg->window_id);
|
struct window* window = connection_find_window(connection, msg->window_id);
|
||||||
if ( !window )
|
if ( !window )
|
||||||
return;
|
return;
|
||||||
|
if ( !window->show )
|
||||||
|
display_schedule_redraw(window->display);
|
||||||
window->show = true;
|
window->show = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,6 +228,8 @@ CONNECTION_MESSAGE_HANDLER_NO_AUX(hide_window)
|
||||||
struct window* window = connection_find_window(connection, msg->window_id);
|
struct window* window = connection_find_window(connection, msg->window_id);
|
||||||
if ( !window )
|
if ( !window )
|
||||||
return;
|
return;
|
||||||
|
if ( window->show )
|
||||||
|
display_schedule_redraw(window->display);
|
||||||
window->show = false;
|
window->show = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,11 +310,11 @@ CONNECTION_MESSAGE_HANDLER_NO_AUX_SERVER(request_display_modes)
|
||||||
failure.error = EINVAL;
|
failure.error = EINVAL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t modes_count;
|
size_t modes_count = 0;
|
||||||
modes = get_available_modes(&server->display->display, &modes_count);
|
modes = get_available_modes(&server->display->display, &modes_count);
|
||||||
if ( !modes )
|
if ( !modes )
|
||||||
failure.error = errno;
|
failure.error = errno;
|
||||||
if ( (uint32_t) modes_count != modes_count )
|
else if ( (uint32_t) modes_count != modes_count )
|
||||||
{
|
{
|
||||||
failure.error = EOVERFLOW;
|
failure.error = EOVERFLOW;
|
||||||
free(modes);
|
free(modes);
|
||||||
|
|
|
@ -46,6 +46,7 @@ extern struct framebuffer arrow_framebuffer;
|
||||||
void display_initialize(struct display* display)
|
void display_initialize(struct display* display)
|
||||||
{
|
{
|
||||||
memset(display, 0, sizeof(*display));
|
memset(display, 0, sizeof(*display));
|
||||||
|
display->redraw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void assert_is_well_formed_display_list(struct display* display)
|
void assert_is_well_formed_display_list(struct display* display)
|
||||||
|
@ -98,6 +99,8 @@ void display_link_window_at_top(struct display* display, struct window* window)
|
||||||
display->bottom_window = window;
|
display->bottom_window = window;
|
||||||
|
|
||||||
assert_is_well_formed_display_list(display);
|
assert_is_well_formed_display_list(display);
|
||||||
|
|
||||||
|
display_schedule_redraw(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_unlink_window(struct display* display, struct window* window)
|
void display_unlink_window(struct display* display, struct window* window)
|
||||||
|
@ -123,6 +126,8 @@ void display_unlink_window(struct display* display, struct window* window)
|
||||||
window->below_window = NULL;
|
window->below_window = NULL;
|
||||||
|
|
||||||
assert_is_well_formed_display_list(display);
|
assert_is_well_formed_display_list(display);
|
||||||
|
|
||||||
|
display_schedule_redraw(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_unlink_window_removal(struct display* display,
|
void display_unlink_window_removal(struct display* display,
|
||||||
|
@ -139,6 +144,7 @@ void display_unlink_window_removal(struct display* display,
|
||||||
display->active_window = NULL;
|
display->active_window = NULL;
|
||||||
|
|
||||||
window->focus = false;
|
window->focus = false;
|
||||||
|
display_schedule_redraw(display);
|
||||||
|
|
||||||
assert_is_well_formed_display_list(display);
|
assert_is_well_formed_display_list(display);
|
||||||
|
|
||||||
|
@ -392,8 +398,17 @@ void display_composit(struct display* display, struct framebuffer fb)
|
||||||
memset(&damage_rect, 0, sizeof(damage_rect));
|
memset(&damage_rect, 0, sizeof(damage_rect));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void display_schedule_redraw(struct display* display)
|
||||||
|
{
|
||||||
|
display->redraw = true;
|
||||||
|
}
|
||||||
|
|
||||||
void display_render(struct display* display)
|
void display_render(struct display* display)
|
||||||
{
|
{
|
||||||
|
if ( !display->redraw )
|
||||||
|
return;
|
||||||
|
display->redraw = false;
|
||||||
|
|
||||||
struct dispmsg_get_crtc_mode get_mode_msg = {0};
|
struct dispmsg_get_crtc_mode get_mode_msg = {0};
|
||||||
get_mode_msg.msgid = DISPMSG_GET_CRTC_MODE;
|
get_mode_msg.msgid = DISPMSG_GET_CRTC_MODE;
|
||||||
get_mode_msg.device = display->display.device;
|
get_mode_msg.device = display->display.device;
|
||||||
|
@ -608,6 +623,8 @@ void display_mouse_event(struct display* display, uint8_t byte)
|
||||||
}
|
}
|
||||||
display->pointer_x += xm;
|
display->pointer_x += xm;
|
||||||
display->pointer_y += ym;
|
display->pointer_y += ym;
|
||||||
|
if ( xm || ym )
|
||||||
|
display_schedule_redraw(display);
|
||||||
|
|
||||||
bool clipped_edge = false;
|
bool clipped_edge = false;
|
||||||
if ( display->pointer_x < 0 )
|
if ( display->pointer_x < 0 )
|
||||||
|
@ -788,6 +805,9 @@ void display_mouse_event(struct display* display, uint8_t byte)
|
||||||
else if ( (ssize_t) window->width <= window_pointer_x &&
|
else if ( (ssize_t) window->width <= window_pointer_x &&
|
||||||
(ssize_t) window->height <= window_pointer_y )
|
(ssize_t) window->height <= window_pointer_y )
|
||||||
display->mouse_state = MOUSE_STATE_RESIZE_BOTTOM_RIGHT;
|
display->mouse_state = MOUSE_STATE_RESIZE_BOTTOM_RIGHT;
|
||||||
|
if ( display->mouse_state != MOUSE_STATE_NONE &&
|
||||||
|
display->mouse_state != MOUSE_STATE_IGNORE )
|
||||||
|
display_schedule_redraw(display);
|
||||||
}
|
}
|
||||||
if ( xm || ym )
|
if ( xm || ym )
|
||||||
{
|
{
|
||||||
|
@ -805,15 +825,10 @@ void display_mouse_event(struct display* display, uint8_t byte)
|
||||||
case MOUSE_STATE_TITLE_MOVE:
|
case MOUSE_STATE_TITLE_MOVE:
|
||||||
if ( clipped_edge )
|
if ( clipped_edge )
|
||||||
{
|
{
|
||||||
// TODO: Clean these up.
|
|
||||||
// I'd declare those in function scope but I'm afraid of
|
|
||||||
// messing with the code too much.
|
|
||||||
ssize_t x = display->pointer_x;
|
ssize_t x = display->pointer_x;
|
||||||
ssize_t y = display->pointer_y;
|
ssize_t y = display->pointer_y;
|
||||||
|
|
||||||
ssize_t sw = display->screen_width;
|
ssize_t sw = display->screen_width;
|
||||||
ssize_t sh = display->screen_height;
|
ssize_t sh = display->screen_height;
|
||||||
|
|
||||||
ssize_t corner_size = (sw < sh ? sw : sh) / 4;
|
ssize_t corner_size = (sw < sh ? sw : sh) / 4;
|
||||||
if ( x < corner_size && y < corner_size )
|
if ( x < corner_size && y < corner_size )
|
||||||
window_tile_top_left(window);
|
window_tile_top_left(window);
|
||||||
|
@ -878,8 +893,11 @@ void display_mouse_event(struct display* display, uint8_t byte)
|
||||||
// TODO: Leave mouse state if the top window closes.
|
// TODO: Leave mouse state if the top window closes.
|
||||||
// TODO: Leave mouse state if the top window is switched.
|
// TODO: Leave mouse state if the top window is switched.
|
||||||
}
|
}
|
||||||
else
|
else if ( display->mouse_state != MOUSE_STATE_NONE )
|
||||||
|
{
|
||||||
display->mouse_state = MOUSE_STATE_NONE;
|
display->mouse_state = MOUSE_STATE_NONE;
|
||||||
|
display_schedule_redraw(display);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_on_resolution_change(struct display* display, size_t width,
|
void display_on_resolution_change(struct display* display, size_t width,
|
||||||
|
|
|
@ -66,6 +66,7 @@ struct display
|
||||||
bool key_lalt;
|
bool key_lalt;
|
||||||
bool key_lsuper;
|
bool key_lsuper;
|
||||||
bool key_rsuper;
|
bool key_rsuper;
|
||||||
|
bool redraw;
|
||||||
int pointer_x;
|
int pointer_x;
|
||||||
int pointer_y;
|
int pointer_y;
|
||||||
enum mouse_state mouse_state;
|
enum mouse_state mouse_state;
|
||||||
|
@ -91,6 +92,7 @@ void display_set_active_window(struct display* display, struct window* window);
|
||||||
void display_add_window(struct display* display, struct window* window);
|
void display_add_window(struct display* display, struct window* window);
|
||||||
void display_remove_window(struct display* display, struct window* window);
|
void display_remove_window(struct display* display, struct window* window);
|
||||||
void display_composit(struct display* display, struct framebuffer fb);
|
void display_composit(struct display* display, struct framebuffer fb);
|
||||||
|
void display_schedule_redraw(struct display* display);
|
||||||
void display_render(struct display* display);
|
void display_render(struct display* display);
|
||||||
void display_keyboard_event(struct display* display, uint32_t codepoint);
|
void display_keyboard_event(struct display* display, uint32_t codepoint);
|
||||||
void display_on_resolution_change(struct display* display, size_t width,
|
void display_on_resolution_change(struct display* display, size_t width,
|
||||||
|
|
|
@ -275,7 +275,6 @@ void server_mainloop(struct server* server)
|
||||||
{
|
{
|
||||||
while ( true )
|
while ( true )
|
||||||
{
|
{
|
||||||
// TODO: Only do this if a redraw is actually needed.
|
|
||||||
display_render(server->display);
|
display_render(server->display);
|
||||||
server_poll(server);
|
server_poll(server);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,12 @@ struct framebuffer window_client_buffer(struct window* window)
|
||||||
window->height - TITLE_HEIGHT - BORDER_WIDTH);
|
window->height - TITLE_HEIGHT - BORDER_WIDTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void window_schedule_redraw(struct window* window)
|
||||||
|
{
|
||||||
|
if ( window->show )
|
||||||
|
display_schedule_redraw(window->display);
|
||||||
|
}
|
||||||
|
|
||||||
void window_render_frame(struct window* window)
|
void window_render_frame(struct window* window)
|
||||||
{
|
{
|
||||||
if ( !window->width || !window->height )
|
if ( !window->width || !window->height )
|
||||||
|
@ -195,12 +201,14 @@ void window_render_frame(struct window* window)
|
||||||
}
|
}
|
||||||
render_text(framebuffer_crop(window->buffer, tt_pos_x, tt_pos_y,
|
render_text(framebuffer_crop(window->buffer, tt_pos_x, tt_pos_y,
|
||||||
tt_width, tt_height), tt, tt_color);
|
tt_width, tt_height), tt, tt_color);
|
||||||
|
window_schedule_redraw(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_move(struct window* window, size_t left, size_t top)
|
void window_move(struct window* window, size_t left, size_t top)
|
||||||
{
|
{
|
||||||
window->left = left;
|
window->left = left;
|
||||||
window->top = top;
|
window->top = top;
|
||||||
|
window_schedule_redraw(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_client_resize(struct window* window,
|
void window_client_resize(struct window* window,
|
||||||
|
@ -230,6 +238,7 @@ void window_client_resize(struct window* window,
|
||||||
|
|
||||||
window_render_frame(window);
|
window_render_frame(window);
|
||||||
window_notify_client_resize(window);
|
window_notify_client_resize(window);
|
||||||
|
window_schedule_redraw(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_resize(struct window* window, size_t width, size_t height)
|
void window_resize(struct window* window, size_t width, size_t height)
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct window
|
||||||
};
|
};
|
||||||
|
|
||||||
struct framebuffer window_client_buffer(struct window* window);
|
struct framebuffer window_client_buffer(struct window* window);
|
||||||
|
void window_schedule_redraw(struct window* window);
|
||||||
void window_render_frame(struct window* window);
|
void window_render_frame(struct window* window);
|
||||||
void window_move(struct window* window, size_t left, size_t top);
|
void window_move(struct window* window, size_t left, size_t top);
|
||||||
void window_resize(struct window* window, size_t width, size_t height);
|
void window_resize(struct window* window, size_t width, size_t height);
|
||||||
|
|
|
@ -17,11 +17,14 @@
|
||||||
* Interactive utility functions.
|
* Interactive utility functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/display.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <sys/termmode.h>
|
#include <sys/termmode.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
@ -262,6 +265,36 @@ bool missing_program(const char* program)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_video_mode(struct dispmsg_crtc_mode* mode)
|
||||||
|
{
|
||||||
|
struct tiocgdisplay display;
|
||||||
|
struct tiocgdisplays gdisplays;
|
||||||
|
memset(&gdisplays, 0, sizeof(gdisplays));
|
||||||
|
gdisplays.count = 1;
|
||||||
|
gdisplays.displays = &display;
|
||||||
|
struct dispmsg_get_driver_name dgdn = { 0 };
|
||||||
|
if ( ioctl(1, TIOCGDISPLAYS, &gdisplays) < 0 || gdisplays.count == 0 )
|
||||||
|
return false;
|
||||||
|
dgdn.device = display.device;
|
||||||
|
dgdn.msgid = DISPMSG_GET_DRIVER_NAME;
|
||||||
|
dgdn.device = display.device;
|
||||||
|
dgdn.driver_index = 0;
|
||||||
|
dgdn.name.byte_size = 0;
|
||||||
|
dgdn.name.str = NULL;
|
||||||
|
if ( dispmsg_issue(&dgdn, sizeof(dgdn)) < 0 && errno == ENODEV )
|
||||||
|
return false;
|
||||||
|
struct dispmsg_get_crtc_mode get_mode;
|
||||||
|
memset(&get_mode, 0, sizeof(get_mode));
|
||||||
|
get_mode.msgid = DISPMSG_GET_CRTC_MODE;
|
||||||
|
get_mode.device = display.device;
|
||||||
|
get_mode.connector = display.connector;
|
||||||
|
// TODO: Still allow setting the video mode if none was already set.
|
||||||
|
if ( dispmsg_issue(&get_mode, sizeof(get_mode)) < 0 )
|
||||||
|
return false;
|
||||||
|
*mode = get_mode.mode;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void gui_shutdown(int code)
|
void gui_shutdown(int code)
|
||||||
{
|
{
|
||||||
if ( getenv("DISPLAY_SOCKET") )
|
if ( getenv("DISPLAY_SOCKET") )
|
||||||
|
|
|
@ -42,6 +42,7 @@ void password(char* buffer,
|
||||||
size_t buffer_size,
|
size_t buffer_size,
|
||||||
const char* question);
|
const char* question);
|
||||||
bool missing_program(const char* program);
|
bool missing_program(const char* program);
|
||||||
|
bool get_video_mode(struct dispmsg_crtc_mode* mode);
|
||||||
void gui_shutdown(int code);
|
void gui_shutdown(int code);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -623,38 +623,16 @@ int main(void)
|
||||||
text("\n");
|
text("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tiocgdisplay display;
|
struct dispmsg_crtc_mode mode;
|
||||||
struct tiocgdisplays gdisplays;
|
if ( get_video_mode(&mode) )
|
||||||
memset(&gdisplays, 0, sizeof(gdisplays));
|
|
||||||
gdisplays.count = 1;
|
|
||||||
gdisplays.displays = &display;
|
|
||||||
struct dispmsg_get_driver_name dgdn = { 0 };
|
|
||||||
dgdn.msgid = DISPMSG_GET_DRIVER_NAME;
|
|
||||||
dgdn.device = 0;
|
|
||||||
dgdn.driver_index = 0;
|
|
||||||
dgdn.name.byte_size = 0;
|
|
||||||
dgdn.name.str = NULL;
|
|
||||||
if ( ioctl(1, TIOCGDISPLAYS, &gdisplays) == 0 &&
|
|
||||||
0 < gdisplays.count &&
|
|
||||||
(dgdn.device = display.device, true) &&
|
|
||||||
(dispmsg_issue(&dgdn, sizeof(dgdn)) == 0 || errno != ENODEV) )
|
|
||||||
{
|
{
|
||||||
struct dispmsg_get_crtc_mode get_mode;
|
bool good = (mode.control & DISPMSG_CONTROL_VALID) &&
|
||||||
memset(&get_mode, 0, sizeof(get_mode));
|
(mode.control & DISPMSG_CONTROL_GOOD_DEFAULT);
|
||||||
get_mode.msgid = DISPMSG_GET_CRTC_MODE;
|
if ( mode.control & DISPMSG_CONTROL_VM_AUTO_SCALE )
|
||||||
get_mode.device = 0;
|
|
||||||
get_mode.connector = 0;
|
|
||||||
bool good = false;
|
|
||||||
if ( dispmsg_issue(&get_mode, sizeof(get_mode)) == 0 )
|
|
||||||
{
|
{
|
||||||
good = (get_mode.mode.control & DISPMSG_CONTROL_VALID) &&
|
text("The display resolution will automatically change to "
|
||||||
(get_mode.mode.control & DISPMSG_CONTROL_GOOD_DEFAULT);
|
"match the size of the virtual machine window.\n\n");
|
||||||
if ( get_mode.mode.control & DISPMSG_CONTROL_VM_AUTO_SCALE )
|
good = true;
|
||||||
{
|
|
||||||
text("The display resolution will automatically change to "
|
|
||||||
"match the size of the virtual machine window.\n\n");
|
|
||||||
good = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const char* def = non_interactive || good ? "no" : "yes";
|
const char* def = non_interactive || good ? "no" : "yes";
|
||||||
while ( true )
|
while ( true )
|
||||||
|
@ -673,14 +651,12 @@ int main(void)
|
||||||
if ( execute((const char*[]) { "chvideomode", r, NULL }, "f") != 0 )
|
if ( execute((const char*[]) { "chvideomode", r, NULL }, "f") != 0 )
|
||||||
continue;
|
continue;
|
||||||
input[0] = '\0';
|
input[0] = '\0';
|
||||||
if ( dispmsg_issue(&get_mode, sizeof(get_mode)) < 0 ||
|
if ( !get_video_mode(&mode) ||
|
||||||
!(get_mode.mode.control & DISPMSG_CONTROL_VALID) ||
|
!(mode.control & DISPMSG_CONTROL_VALID) ||
|
||||||
get_mode.mode.control & DISPMSG_CONTROL_VGA )
|
mode.control & DISPMSG_CONTROL_VGA )
|
||||||
break;
|
continue;
|
||||||
snprintf(input, sizeof(input), "%ux%ux%u",
|
snprintf(input, sizeof(input), "%ux%ux%u",
|
||||||
get_mode.mode.view_xres,
|
mode.view_xres, mode.view_yres, mode.fb_format);
|
||||||
get_mode.mode.view_yres,
|
|
||||||
get_mode.mode.fb_format);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -509,38 +509,16 @@ int main(void)
|
||||||
if ( kblayout_setable )
|
if ( kblayout_setable )
|
||||||
text("\n");
|
text("\n");
|
||||||
|
|
||||||
struct tiocgdisplay display;
|
struct dispmsg_crtc_mode mode;
|
||||||
struct tiocgdisplays gdisplays;
|
if ( get_video_mode(&mode) )
|
||||||
memset(&gdisplays, 0, sizeof(gdisplays));
|
|
||||||
gdisplays.count = 1;
|
|
||||||
gdisplays.displays = &display;
|
|
||||||
struct dispmsg_get_driver_name dgdn = { 0 };
|
|
||||||
dgdn.msgid = DISPMSG_GET_DRIVER_NAME;
|
|
||||||
dgdn.device = 0;
|
|
||||||
dgdn.driver_index = 0;
|
|
||||||
dgdn.name.byte_size = 0;
|
|
||||||
dgdn.name.str = NULL;
|
|
||||||
if ( ioctl(1, TIOCGDISPLAYS, &gdisplays) == 0 &&
|
|
||||||
0 < gdisplays.count &&
|
|
||||||
(dgdn.device = display.device, true) &&
|
|
||||||
(dispmsg_issue(&dgdn, sizeof(dgdn)) == 0 || errno != ENODEV) )
|
|
||||||
{
|
{
|
||||||
struct dispmsg_get_crtc_mode get_mode;
|
bool good = (mode.control & DISPMSG_CONTROL_VALID) &&
|
||||||
memset(&get_mode, 0, sizeof(get_mode));
|
(mode.control & DISPMSG_CONTROL_GOOD_DEFAULT);
|
||||||
get_mode.msgid = DISPMSG_GET_CRTC_MODE;
|
if ( mode.control & DISPMSG_CONTROL_VM_AUTO_SCALE )
|
||||||
get_mode.device = 0;
|
|
||||||
get_mode.connector = 0;
|
|
||||||
bool good = false;
|
|
||||||
if ( dispmsg_issue(&get_mode, sizeof(get_mode)) == 0 )
|
|
||||||
{
|
{
|
||||||
good = (get_mode.mode.control & DISPMSG_CONTROL_VALID) &&
|
text("The display resolution will automatically change to "
|
||||||
(get_mode.mode.control & DISPMSG_CONTROL_GOOD_DEFAULT);
|
"match the size of the virtual machine window.\n\n");
|
||||||
if ( get_mode.mode.control & DISPMSG_CONTROL_VM_AUTO_SCALE )
|
good = true;
|
||||||
{
|
|
||||||
text("The display resolution will automatically change to "
|
|
||||||
"match the size of the virtual machine window.\n\n");
|
|
||||||
good = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const char* def = non_interactive || good ? "no" : "yes";
|
const char* def = non_interactive || good ? "no" : "yes";
|
||||||
while ( true )
|
while ( true )
|
||||||
|
|
Loading…
Reference in New Issue