diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index e4481b91d..ae17db532 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -40,6 +40,8 @@ static void xfreerdp_print_help(void) printf("\t\ttoggles fullscreen state of the application\n"); printf("\t++c\n"); printf("\t\ttoggles remote control in a remote assistance session\n"); + printf("\t++m\n"); + printf("\t\tminimizes the application\n"); printf("\tAction Script\n"); printf("\t\tExecutes a predefined script on key press.\n"); printf("\t\tShould the script not exist it is ignored.\n"); diff --git a/client/X11/man/xfreerdp-shortcuts.1.xml.in b/client/X11/man/xfreerdp-shortcuts.1.xml.in index 000fc7e47..32420e390 100644 --- a/client/X11/man/xfreerdp-shortcuts.1.xml.in +++ b/client/X11/man/xfreerdp-shortcuts.1.xml.in @@ -10,6 +10,10 @@ toggles fullscreen state of the application + <CTRL>+<ALT>+<m> + Minimizes the application + + <CTRL>+<ALT>+c toggles remote control in a remote assistance session diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 9cd7c9fd4..b7ca986ed 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -762,7 +762,7 @@ static void xf_window_free(xfContext* xfc) void xf_toggle_fullscreen(xfContext* xfc) { - WindowStateChangeEventArgs e; + WindowStateChangeEventArgs e = { 0 }; rdpContext* context = (rdpContext*)xfc; rdpSettings* settings = context->settings; @@ -782,6 +782,28 @@ void xf_toggle_fullscreen(xfContext* xfc) PubSub_OnWindowStateChange(context->pubSub, context, &e); } +void xf_minimize(xfContext* xfc) +{ + WindowStateChangeEventArgs e = { 0 }; + rdpContext* context = (rdpContext*)xfc; + WINPR_ASSERT(context); + + rdpSettings* settings = context->settings; + WINPR_ASSERT(settings); + + /* + when debugging, ungrab keyboard when toggling fullscreen + to allow keyboard usage on the debugger + */ + if (xfc->debug) + xf_ungrab(xfc); + + xf_SetWindowMinimized(xfc, xfc->window); + + e.state = xfc->fullscreen ? FREERDP_WINDOW_STATE_FULLSCREEN : 0; + PubSub_OnWindowStateChange(context->pubSub, context, &e); +} + void xf_lock_x11_(xfContext* xfc, const char* fkt) { diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 74ed404a0..f90468d12 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -588,24 +588,37 @@ BOOL xf_keyboard_handle_special_keys(xfContext* xfc, KeySym keysym) if (!xfc->remote_app && xfc->fullscreen_toggle) { - if (keysym == XK_Return) + switch (keysym) { - if (mod.Ctrl && mod.Alt) - { - /* Ctrl-Alt-Enter: toggle full screen */ - xf_toggle_fullscreen(xfc); - return TRUE; - } + case XK_Return: + if (mod.Ctrl && mod.Alt) + { + /* Ctrl-Alt-Enter: toggle full screen */ + xf_toggle_fullscreen(xfc); + return TRUE; + } + break; + default: + break; } } - if ((keysym == XK_c) || (keysym == XK_C)) + if (mod.Ctrl && mod.Alt) { - if (mod.Ctrl && mod.Alt) + switch (keysym) { - /* Ctrl-Alt-C: toggle control */ - if (freerdp_client_encomsp_toggle_control(xfc->common.encomsp)) + case XK_m: + case XK_M: + xf_minimize(xfc); return TRUE; + case XK_c: + case XK_C: + /* Ctrl-Alt-C: toggle control */ + if (freerdp_client_encomsp_toggle_control(xfc->common.encomsp)) + return TRUE; + break; + default: + break; } } diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index eb733ec7b..182c8d3ba 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -312,6 +312,7 @@ struct xf_context BOOL xf_create_window(xfContext* xfc); BOOL xf_create_image(xfContext* xfc); void xf_toggle_fullscreen(xfContext* xfc); +void xf_minimize(xfContext* xfc); enum XF_EXIT_CODE {