diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index f4935437552..2e1326ae4f6 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -788,6 +788,7 @@ bool DisplayServerMacOS::has_feature(Feature p_feature) const { case FEATURE_STATUS_INDICATOR: case FEATURE_NATIVE_HELP: case FEATURE_WINDOW_DRAG: + case FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE: return true; default: { } diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index c053408ed4c..6a0ab3d4c6b 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -138,6 +138,7 @@ bool DisplayServerWindows::has_feature(Feature p_feature) const { case FEATURE_SCREEN_CAPTURE: case FEATURE_STATUS_INDICATOR: case FEATURE_WINDOW_EMBEDDING: + case FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE: return true; default: return false; diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index c4a9ce8c3b0..08634f100bd 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -161,13 +161,19 @@ void ColorPicker::_notification(int p_what) { Vector2 ofs = ds->mouse_get_position(); picker_window->set_position(ofs - Vector2(28, 28)); - Color c = DisplayServer::get_singleton()->screen_get_pixel(DisplayServer::get_singleton()->mouse_get_position()); + Color c = DisplayServer::get_singleton()->screen_get_pixel(ofs); picker_preview_style_box_color->set_bg_color(c); picker_preview_style_box->set_bg_color(c.get_luminance() < 0.5 ? Color(1.0f, 1.0f, 1.0f) : Color(0.0f, 0.0f, 0.0f)); - Ref zoom_preview_img = ds->screen_get_image_rect(Rect2i(ofs.x - 8, ofs.y - 8, 17, 17)); - picker_texture_zoom->set_texture(ImageTexture::create_from_image(zoom_preview_img)); + if (ds->has_feature(DisplayServer::FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE)) { + Ref zoom_preview_img = ds->screen_get_image_rect(Rect2i(ofs.x - 8, ofs.y - 8, 17, 17)); + picker_window->set_position(ofs - Vector2(28, 28)); + picker_texture_zoom->set_texture(ImageTexture::create_from_image(zoom_preview_img)); + } else { + Size2i screen_size = ds->screen_get_size(); + picker_window->set_position(ofs + Vector2(ofs.x < screen_size.width / 2 ? 8 : -36, ofs.y < screen_size.height / 2 ? 8 : -36)); + } set_pick_color(c); } @@ -1708,12 +1714,16 @@ void ColorPicker::_pick_button_pressed() { if (!picker_window) { picker_window = memnew(Popup); - picker_window->set_size(Vector2i(55, 72)); + bool has_feature_exclude_from_capture = DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE); + if (!has_feature_exclude_from_capture) { + picker_window->set_size(Vector2i(28, 28)); + } else { + picker_window->set_size(Vector2i(55, 72)); + picker_window->set_flag(Window::FLAG_EXCLUDE_FROM_CAPTURE, true); // Only supported on MacOS and Windows. + } picker_window->connect(SceneStringName(visibility_changed), callable_mp(this, &ColorPicker::_pick_finished)); picker_window->connect(SceneStringName(window_input), callable_mp(this, &ColorPicker::_target_gui_input)); - picker_window->set_flag(Window::FLAG_EXCLUDE_FROM_CAPTURE, true); - picker_preview = memnew(Panel); picker_preview->set_mouse_filter(MOUSE_FILTER_IGNORE); picker_preview->set_size(Vector2i(55, 72)); @@ -1721,16 +1731,23 @@ void ColorPicker::_pick_button_pressed() { picker_preview_color = memnew(Panel); picker_preview_color->set_mouse_filter(MOUSE_FILTER_IGNORE); - picker_preview_color->set_size(Vector2i(51, 15)); - picker_preview_color->set_position(Vector2i(2, 55)); + if (!has_feature_exclude_from_capture) { + picker_preview_color->set_size(Vector2i(24, 24)); + picker_preview_color->set_position(Vector2i(2, 2)); + } else { + picker_preview_color->set_size(Vector2i(51, 15)); + picker_preview_color->set_position(Vector2i(2, 55)); + } picker_preview->add_child(picker_preview_color); - picker_texture_zoom = memnew(TextureRect); - picker_texture_zoom->set_mouse_filter(MOUSE_FILTER_IGNORE); - picker_texture_zoom->set_custom_minimum_size(Vector2i(51, 51)); - picker_texture_zoom->set_position(Vector2i(2, 2)); - picker_texture_zoom->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); - picker_preview->add_child(picker_texture_zoom); + if (has_feature_exclude_from_capture) { + picker_texture_zoom = memnew(TextureRect); + picker_texture_zoom->set_mouse_filter(MOUSE_FILTER_IGNORE); + picker_texture_zoom->set_custom_minimum_size(Vector2i(51, 51)); + picker_texture_zoom->set_position(Vector2i(2, 2)); + picker_texture_zoom->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); + picker_preview->add_child(picker_texture_zoom); + } picker_preview_style_box.instantiate(); picker_preview->add_theme_style_override(SceneStringName(panel), picker_preview_style_box); @@ -1886,23 +1903,35 @@ void ColorPicker::_pick_button_pressed_legacy() { picker_window->add_child(picker_texture_rect); picker_texture_rect->connect(SceneStringName(gui_input), callable_mp(this, &ColorPicker::_picker_texture_input)); + bool has_feature_exclude_from_capture = DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_SCREEN_EXCLUDE_FROM_CAPTURE); picker_preview = memnew(Panel); picker_preview->set_mouse_filter(MOUSE_FILTER_IGNORE); - picker_preview->set_size(Vector2i(55, 72)); + if (!has_feature_exclude_from_capture) { + picker_preview->set_size(Vector2i(28, 28)); + } else { + picker_preview->set_size(Vector2i(55, 72)); + } picker_window->add_child(picker_preview); picker_preview_color = memnew(Panel); picker_preview_color->set_mouse_filter(MOUSE_FILTER_IGNORE); - picker_preview_color->set_size(Vector2i(51, 15)); - picker_preview_color->set_position(Vector2i(2, 55)); + if (!has_feature_exclude_from_capture) { + picker_preview_color->set_size(Vector2i(24, 24)); + picker_preview_color->set_position(Vector2i(2, 2)); + } else { + picker_preview_color->set_size(Vector2i(51, 15)); + picker_preview_color->set_position(Vector2i(2, 55)); + } picker_preview->add_child(picker_preview_color); - picker_texture_zoom = memnew(TextureRect); - picker_texture_zoom->set_mouse_filter(MOUSE_FILTER_IGNORE); - picker_texture_zoom->set_custom_minimum_size(Vector2i(51, 51)); - picker_texture_zoom->set_position(Vector2i(2, 2)); - picker_texture_zoom->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); - picker_preview->add_child(picker_texture_zoom); + if (has_feature_exclude_from_capture) { + picker_texture_zoom = memnew(TextureRect); + picker_texture_zoom->set_mouse_filter(MOUSE_FILTER_IGNORE); + picker_texture_zoom->set_custom_minimum_size(Vector2i(51, 51)); + picker_texture_zoom->set_position(Vector2i(2, 2)); + picker_texture_zoom->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); + picker_preview->add_child(picker_texture_zoom); + } picker_preview_style_box.instantiate(); picker_preview->add_theme_style_override(SceneStringName(panel), picker_preview_style_box);