From 43aa977a914845885bee2fed5048c9bb68a0b65f Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 10 Feb 2018 23:46:09 -0500 Subject: [PATCH] add menu setting to toggle window decorations --- config.def.h | 3 +++ configuration.c | 1 + configuration.h | 1 + gfx/common/win32_common.c | 5 ++++- gfx/display_servers/dispserv_null.c | 1 + gfx/display_servers/dispserv_win32.c | 13 +++++++++++++ gfx/display_servers/dispserv_x11.c | 14 +++++++++++++- gfx/drivers_context/x_ctx.c | 27 ++++++++++++++++++++++++++- gfx/video_display_server.c | 7 +++++++ gfx/video_display_server.h | 2 ++ intl/msg_hash_ja.h | 2 ++ intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 2 ++ menu/menu_displaylist.c | 3 +++ menu/menu_setting.c | 19 +++++++++++++++++++ msg_hash.h | 1 + retroarch.cfg | 6 ++++++ 17 files changed, 106 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 2f11287444..dec7ad2eb3 100644 --- a/config.def.h +++ b/config.def.h @@ -125,6 +125,9 @@ static const unsigned fullscreen_y = 0; */ static const unsigned window_opacity = 100; +/* Whether to show the usual window decorations like border, titlebar etc. */ +static const bool window_decorations = true; + #if defined(RARCH_CONSOLE) || defined(__APPLE__) static const bool load_dummy_on_core_shutdown = false; #else diff --git a/configuration.c b/configuration.c index f6e65748f1..fb612c4735 100644 --- a/configuration.c +++ b/configuration.c @@ -1379,6 +1379,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("screenshots_in_content_dir", &settings->bools.screenshots_in_content_dir, true, default_screenshots_in_content_dir, false); SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, message_bgcolor_enable, false); + SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, window_decorations, false); *size = count; diff --git a/configuration.h b/configuration.h index 9223a210b3..19582b7047 100644 --- a/configuration.h +++ b/configuration.h @@ -254,6 +254,7 @@ typedef struct settings bool bluetooth_enable; bool automatically_add_content_to_playlist; + bool video_window_show_decorations; } bools; struct diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 64403356b1..6a1af71c1f 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -817,8 +817,11 @@ bool win32_window_create(void *data, unsigned style, video_driver_window_set((uintptr_t)main_window.hwnd); #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 /* 2K */ + if (!settings->bools.video_window_show_decorations) + SetWindowLongPtr(main_window.hwnd, GWL_STYLE, WS_POPUP); + /* Windows 2000 and above use layered windows to enable transparency */ - if(settings->uints.video_window_opacity < 100) + if (settings->uints.video_window_opacity < 100) { SetWindowLongPtr(main_window.hwnd, GWL_EXSTYLE, diff --git a/gfx/display_servers/dispserv_null.c b/gfx/display_servers/dispserv_null.c index 83df0a772f..aa02bcc9c4 100644 --- a/gfx/display_servers/dispserv_null.c +++ b/gfx/display_servers/dispserv_null.c @@ -48,6 +48,7 @@ const video_display_server_t dispserv_null = { null_display_server_destroy, null_set_window_opacity, null_set_window_progress, + NULL, "null" }; diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 715d1ddc24..ce72e247f9 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -54,6 +54,7 @@ typedef struct { unsigned opacity; int progress; + bool decorations; } dispserv_win32_t; /* @@ -180,11 +181,23 @@ static bool win32_set_window_progress(void *data, int progress, bool finished) return ret; } +static bool win32_set_window_decorations(void *data, bool on) +{ + dispserv_win32_t *serv = (dispserv_win32_t*)data; + + serv->decorations = on; + + /* menu_setting performs a reinit instead to properly apply decoration changes */ + + return true; +} + const video_display_server_t dispserv_win32 = { win32_display_server_init, win32_display_server_destroy, win32_set_window_opacity, win32_set_window_progress, + win32_set_window_decorations, "win32" }; diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index f39faeb9c1..0d20343315 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -22,6 +22,7 @@ typedef struct { unsigned opacity; + bool decorations; } dispserv_x11_t; static void* x11_display_server_init(void) @@ -47,7 +48,6 @@ static bool x11_set_window_opacity(void *data, unsigned opacity) dispserv_x11_t *serv = (dispserv_x11_t*)data; Atom net_wm_opacity = XInternAtom(g_x11_dpy, "_NET_WM_WINDOW_OPACITY", False); Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); - settings_t *settings = config_get_ptr(); serv->opacity = opacity; @@ -61,11 +61,23 @@ static bool x11_set_window_opacity(void *data, unsigned opacity) return true; } +static bool x11_set_window_decorations(void *data, bool on) +{ + dispserv_x11_t *serv = (dispserv_x11_t*)data; + + serv->decorations = on; + + /* menu_setting performs a reinit instead to properly apply decoration changes */ + + return true; +} + const video_display_server_t dispserv_x11 = { x11_display_server_init, x11_display_server_destroy, x11_set_window_opacity, NULL, + x11_set_window_decorations, "x11" }; diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index a5276d2ba7..48b6a057ae 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -113,6 +113,16 @@ static enum gfx_ctx_api x_api = GFX_CTX_NONE; static gfx_ctx_x_data_t *current_context_data = NULL; +typedef struct Hints +{ + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long inputMode; + unsigned long status; +} Hints; + +/* We use long because X11 wants 32-bit pixels for 32-bit systems and 64 for 64... */ const unsigned long retroarch_icon_data[] = { 16, 16, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -623,7 +633,6 @@ static bool gfx_ctx_x_set_video_mode(void *data, int (*old_handler)(Display*, XErrorEvent*) = NULL; gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*)data; Atom net_wm_icon = XInternAtom(g_x11_dpy, "_NET_WM_ICON", False); - Atom net_wm_opacity = XInternAtom(g_x11_dpy, "_NET_WM_WINDOW_OPACITY", False); Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); settings_t *settings = config_get_ptr(); unsigned opacity = settings->uints.video_window_opacity * ((unsigned)-1 / 100.0); @@ -717,7 +726,23 @@ static bool gfx_ctx_x_set_video_mode(void *data, XChangeProperty(g_x11_dpy, g_x11_win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char*)retroarch_icon_data, sizeof(retroarch_icon_data) / sizeof(*retroarch_icon_data)); if (opacity < (unsigned)-1) + { + Atom net_wm_opacity = XInternAtom(g_x11_dpy, "_NET_WM_WINDOW_OPACITY", False); XChangeProperty(g_x11_dpy, g_x11_win, net_wm_opacity, cardinal, 32, PropModeReplace, (const unsigned char*)&opacity, 1); + } + + if (!settings->bools.video_window_show_decorations) + { + /* We could have just set _NET_WM_WINDOW_TYPE_DOCK instead, but that removes the window from any taskbar/panel, + * so we are forced to use the old motif hints method. */ + Hints hints; + Atom property = XInternAtom(g_x11_dpy, "_MOTIF_WM_HINTS", False); + + hints.flags = 2; + hints.decorations = 0; + + XChangeProperty(g_x11_dpy, g_x11_win, property, property, 32, PropModeReplace, (const unsigned char*)&hints, 5); + } switch (x_api) { diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c index 94c249190f..55baa165a2 100644 --- a/gfx/video_display_server.c +++ b/gfx/video_display_server.c @@ -74,3 +74,10 @@ bool video_display_server_set_window_progress(int progress, bool finished) return current_display_server->set_window_progress(current_display_server_data, progress, finished); return false; } + +bool video_display_server_set_window_decorations(bool on) +{ + if (current_display_server && current_display_server->set_window_decorations) + return current_display_server->set_window_decorations(current_display_server_data, on); + return false; +} diff --git a/gfx/video_display_server.h b/gfx/video_display_server.h index 3a193aec2d..4f93a55e15 100644 --- a/gfx/video_display_server.h +++ b/gfx/video_display_server.h @@ -29,6 +29,7 @@ typedef struct video_display_server void (*destroy)(void *data); bool (*set_window_opacity)(void *data, unsigned opacity); bool (*set_window_progress)(void *data, int progress, bool finished); + bool (*set_window_decorations)(void *data, bool on); const char *ident; } video_display_server_t; @@ -36,6 +37,7 @@ void* video_display_server_init(void); void video_display_server_destroy(void); bool video_display_server_set_window_opacity(unsigned opacity); bool video_display_server_set_window_progress(int progress, bool finished); +bool video_display_server_set_window_decorations(bool on); extern const video_display_server_t dispserv_win32; extern const video_display_server_t dispserv_x11; diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index ea2f158556..bd87a61a92 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -3311,3 +3311,5 @@ MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY, "Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, "シェーダーファイルの変更を監視") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, + "ウィンドウ枠を表示") diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b90e2b508f..f895fd074e 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1437,3 +1437,5 @@ MSG_HASH(MENU_ENUM_LABEL_INPUT_DRIVER_UDEV, "udev") MSG_HASH(MENU_ENUM_LABEL_INPUT_DRIVER_LINUXRAW, "linuxraw") +MSG_HASH(MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS, + "video_window_show_decorations") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4afc164c31..857121be1f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3415,3 +3415,5 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, "Watch shader files for changes") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, "Auto-apply changes made to shader files on disk.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, + "Show Window Decorations") diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index ae9fe6bb8b..6750719740 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5829,6 +5829,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY, PARSE_ONLY_UINT, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS, + PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER, PARSE_ONLY_BOOL, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index ff952fec2d..aefbbbb9b6 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1854,6 +1854,9 @@ void general_write_handler(void *data) case MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY: video_display_server_set_window_opacity(settings->uints.video_window_opacity); break; + case MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS: + video_display_server_set_window_decorations(settings->bools.video_window_show_decorations); + break; default: break; } @@ -3663,6 +3666,22 @@ static bool setting_append_list( settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); } + CONFIG_BOOL( + list, list_info, + &settings->bools.video_window_show_decorations, + MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS, + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, + window_decorations, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_REINIT); + CONFIG_BOOL( list, list_info, &settings->bools.video_scale_integer, diff --git a/msg_hash.h b/msg_hash.h index 6ca4f72c5d..2caddc1745 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1734,6 +1734,7 @@ enum msg_hash_enums MENU_LABEL(NETPLAY_USE_MITM_SERVER), MENU_LABEL(NETPLAY_MITM_SERVER), + MENU_LABEL(VIDEO_WINDOW_SHOW_DECORATIONS), MSG_LAST }; diff --git a/retroarch.cfg b/retroarch.cfg index 19a0d18b75..f4639e8031 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -152,6 +152,12 @@ # If fullscreen, prefer using a windowed fullscreen mode. # video_windowed_fullscreen = true +# Percentage of opacity to use for the window (100 is completely opaque). +# video_window_opacity = 100 + +# Whether to enable the default window decorations like border, titlebar etc. +# video_window_show_decorations = true + # Which monitor to prefer. 0 (default) means no particular monitor is preferred, 1 and up (1 being first monitor), # suggests RetroArch to use that particular monitor. # video_monitor_index = 0