screenshot-ui: Add screenshot/screencast toggle
Currently does nothing. When we're in screencast mode, we hide the screenshot preview because screencast doesn't start until the capture button is pressed. The window selection is currently left as is, but it should probably be changed to something closer to a real overview, showing windows in real-time. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2103>
This commit is contained in:
parent
643e8aec5f
commit
497d9f32eb
@ -8,6 +8,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$screenshot_ui_button_red: #e01b24;
|
||||||
|
|
||||||
.screenshot-ui-panel {
|
.screenshot-ui-panel {
|
||||||
background-color: $osd_bg_color;
|
background-color: $osd_bg_color;
|
||||||
border-radius: 12px + 21px;
|
border-radius: 12px + 21px;
|
||||||
@ -68,6 +70,48 @@
|
|||||||
background-color: darken(white, 50%);
|
background-color: darken(white, 50%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:cast {
|
||||||
|
.screenshot-ui-capture-button-circle {
|
||||||
|
background-color: $screenshot_ui_button_red;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover, &:focus {
|
||||||
|
.screenshot-ui-capture-button-circle {
|
||||||
|
background-color: darken($screenshot_ui_button_red, 15%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
.screenshot-ui-capture-button-circle {
|
||||||
|
background-color: darken($screenshot_ui_button_red, 30%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-ui-shot-cast-container {
|
||||||
|
background-color: $hover_bg_color;
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: $base_padding / 2;
|
||||||
|
spacing: $base_padding / 2;
|
||||||
|
|
||||||
|
&:ltr { margin-left: 3px; }
|
||||||
|
&:rtl { margin-right: 3px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-ui-shot-cast-button {
|
||||||
|
padding: $base_padding $base_padding * 1.5;
|
||||||
|
background-color: transparent;
|
||||||
|
&:hover, &:focus { background-color: lighten($hover_bg_color, 5%); }
|
||||||
|
&:active { background-color: $active_bg_color; }
|
||||||
|
&:checked { background-color: white; color: black; }
|
||||||
|
|
||||||
|
border-radius: 12px - 3px;
|
||||||
|
|
||||||
|
StIcon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.screenshot-ui-show-pointer-button {
|
.screenshot-ui-show-pointer-button {
|
||||||
|
@ -1153,6 +1153,46 @@ class ScreenshotUI extends St.Widget {
|
|||||||
this._bottomRowContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this._bottomRowContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
this._panel.add_child(this._bottomRowContainer);
|
this._panel.add_child(this._bottomRowContainer);
|
||||||
|
|
||||||
|
this._shotCastContainer = new St.BoxLayout({
|
||||||
|
style_class: 'screenshot-ui-shot-cast-container',
|
||||||
|
x_align: Clutter.ActorAlign.START,
|
||||||
|
x_expand: true,
|
||||||
|
});
|
||||||
|
this._bottomRowContainer.add_child(this._shotCastContainer);
|
||||||
|
|
||||||
|
this._shotButton = new St.Button({
|
||||||
|
style_class: 'screenshot-ui-shot-cast-button',
|
||||||
|
checked: true,
|
||||||
|
});
|
||||||
|
this._shotButton.set_child(new St.Icon({ icon_name: 'camera-photo-symbolic' }));
|
||||||
|
this._shotButton.connect('notify::checked',
|
||||||
|
this._onShotButtonToggled.bind(this));
|
||||||
|
this._shotCastContainer.add_child(this._shotButton);
|
||||||
|
|
||||||
|
this._castButton = new St.Button({
|
||||||
|
style_class: 'screenshot-ui-shot-cast-button',
|
||||||
|
toggle_mode: true,
|
||||||
|
});
|
||||||
|
this._castButton.set_child(new St.Icon({ icon_name: 'camera-web-symbolic' }));
|
||||||
|
this._castButton.connect('notify::checked',
|
||||||
|
this._onCastButtonToggled.bind(this));
|
||||||
|
this._shotCastContainer.add_child(this._castButton);
|
||||||
|
|
||||||
|
this._shotCastTooltip = new Tooltip(this._shotCastContainer, {
|
||||||
|
text: _('Screenshot / Screencast'),
|
||||||
|
style_class: 'screenshot-ui-tooltip',
|
||||||
|
visible: false,
|
||||||
|
});
|
||||||
|
const shotCastCallback = () => {
|
||||||
|
if (this._shotButton.hover || this._castButton.hover)
|
||||||
|
this._shotCastTooltip.open();
|
||||||
|
else
|
||||||
|
this._shotCastTooltip.close();
|
||||||
|
};
|
||||||
|
this._shotButton.connect('notify::hover', shotCastCallback);
|
||||||
|
this._castButton.connect('notify::hover', shotCastCallback);
|
||||||
|
this.add_child(this._shotCastTooltip);
|
||||||
|
|
||||||
this._captureButton = new St.Button({ style_class: 'screenshot-ui-capture-button' });
|
this._captureButton = new St.Button({ style_class: 'screenshot-ui-capture-button' });
|
||||||
this._captureButton.set_child(new St.Widget({
|
this._captureButton.set_child(new St.Widget({
|
||||||
style_class: 'screenshot-ui-capture-button-circle',
|
style_class: 'screenshot-ui-capture-button-circle',
|
||||||
@ -1307,7 +1347,8 @@ class ScreenshotUI extends St.Widget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._windowButton.reactive = windows.length > 0;
|
this._windowButton.reactive =
|
||||||
|
windows.length > 0 && !this._castButton.checked;
|
||||||
if (!this._windowButton.reactive)
|
if (!this._windowButton.reactive)
|
||||||
this._selectionButton.checked = true;
|
this._selectionButton.checked = true;
|
||||||
|
|
||||||
@ -1377,6 +1418,9 @@ class ScreenshotUI extends St.Widget {
|
|||||||
|
|
||||||
this._shooter = null;
|
this._shooter = null;
|
||||||
|
|
||||||
|
// Switch back to screenshot mode.
|
||||||
|
this._shotButton.checked = true;
|
||||||
|
|
||||||
this._stageScreenshotContainer.get_parent().remove_child(
|
this._stageScreenshotContainer.get_parent().remove_child(
|
||||||
this._stageScreenshotContainer);
|
this._stageScreenshotContainer);
|
||||||
Main.layoutManager.screenshotUIGroup.insert_child_at_index(
|
Main.layoutManager.screenshotUIGroup.insert_child_at_index(
|
||||||
@ -1499,6 +1543,54 @@ class ScreenshotUI extends St.Widget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onShotButtonToggled() {
|
||||||
|
if (this._shotButton.checked) {
|
||||||
|
this._shotButton.toggle_mode = false;
|
||||||
|
this._castButton.checked = false;
|
||||||
|
|
||||||
|
this._stageScreenshotContainer.show();
|
||||||
|
this._stageScreenshotContainer.remove_all_transitions();
|
||||||
|
this._stageScreenshotContainer.ease({
|
||||||
|
opacity: 255,
|
||||||
|
duration: 200,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this._shotButton.toggle_mode = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_onCastButtonToggled() {
|
||||||
|
if (this._castButton.checked) {
|
||||||
|
this._castButton.toggle_mode = false;
|
||||||
|
this._shotButton.checked = false;
|
||||||
|
|
||||||
|
this._captureButton.add_style_pseudo_class('cast');
|
||||||
|
|
||||||
|
this._stageScreenshotContainer.remove_all_transitions();
|
||||||
|
this._stageScreenshotContainer.ease({
|
||||||
|
opacity: 0,
|
||||||
|
duration: 200,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
onComplete: () => this._stageScreenshotContainer.hide(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Screen recording doesn't support window selection yet.
|
||||||
|
if (this._windowButton.checked)
|
||||||
|
this._selectionButton.checked = true;
|
||||||
|
|
||||||
|
this._windowButton.reactive = false;
|
||||||
|
} else {
|
||||||
|
this._castButton.toggle_mode = true;
|
||||||
|
|
||||||
|
this._captureButton.remove_style_pseudo_class('cast');
|
||||||
|
|
||||||
|
const windows =
|
||||||
|
this._windowSelectors.flatMap(selector => selector.windows());
|
||||||
|
this._windowButton.reactive = windows.length > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_getSelectedGeometry() {
|
_getSelectedGeometry() {
|
||||||
let x, y, w, h;
|
let x, y, w, h;
|
||||||
|
|
||||||
@ -1524,7 +1616,8 @@ class ScreenshotUI extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onCaptureButtonClicked() {
|
_onCaptureButtonClicked() {
|
||||||
this._saveScreenshot();
|
if (this._shotButton.checked)
|
||||||
|
this._saveScreenshot();
|
||||||
|
|
||||||
// TODO: screencasting.
|
// TODO: screencasting.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user