mirror of
https://github.com/swaywm/sway.git
synced 2026-04-23 06:46:27 -04:00
Merge branch 'master' of https://github.com/swaywm/sway
This commit is contained in:
commit
025af4c5b7
11 changed files with 102 additions and 39 deletions
15
README.ro.md
15
README.ro.md
|
|
@ -14,12 +14,12 @@ Noile versiuni sunt semnate cu [B22DA89A](http://pgp.mit.edu/pks/lookup?op=vinde
|
||||||
|
|
||||||
### Din pachete (packages)
|
### Din pachete (packages)
|
||||||
|
|
||||||
sway este valabil în multe distribuții. încercați a instala "sway" pe distribuția voastră. Dacă nu este valabil, uitați-vă în [această pagină wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
|
sway este disponibil în multe distribuții. Încercați să instalați pachetul "sway" pe distribuția voastră. Dacă nu este disponibil, uitați-vă în [această pagină wiki](https://github.com/swaywm/sway/wiki/Unsupported-packages)
|
||||||
pentru informații a cum puteți să instalați pentru distribuția voastră.
|
pentru informații a cum puteți să instalați pentru distribuția voastră.
|
||||||
|
|
||||||
Dacă sunteți interesați in a crea pachete pentru distribuția voastră, informați-ne prin IRC sau contactați prin email pe sir@cmpwn.com pentru ajutor.
|
Dacă sunteți interesați in a crea pachete pentru distribuția voastră, informați-ne prin IRC sau contactați prin email pe sir@cmpwn.com pentru ajutor.
|
||||||
|
|
||||||
### Construire din sursă
|
### Compilare din sursă
|
||||||
|
|
||||||
Dependențe pentru instalare:
|
Dependențe pentru instalare:
|
||||||
|
|
||||||
|
|
@ -31,9 +31,9 @@ Dependențe pentru instalare:
|
||||||
* json-c
|
* json-c
|
||||||
* pango
|
* pango
|
||||||
* cairo
|
* cairo
|
||||||
* gdk-pixbuf2 (optional: system tray)
|
* gdk-pixbuf2 (opțional, dacă doriți să aveți system tray)
|
||||||
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (optional: pagini man) \*
|
* [scdoc](https://git.sr.ht/~sircmpwn/scdoc) (opțional, pentru paginile man) \*
|
||||||
* git (optional: info versiune) \*
|
* git (opțional, pentru informații de versiune) \*
|
||||||
|
|
||||||
*Dependențe doar pentru compilare*
|
*Dependențe doar pentru compilare*
|
||||||
|
|
||||||
|
|
@ -45,12 +45,13 @@ Rulați aceste comenzi:
|
||||||
sudo ninja -C build install
|
sudo ninja -C build install
|
||||||
```
|
```
|
||||||
|
|
||||||
Pe sisteme fără logind, trebuie făcut următorul:
|
Pe sisteme fără logind, trebuie să folosiți următoarea comandă pentru a marca binarul de Sway ca suid:
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo chmod a+s /usr/local/bin/sway
|
sudo chmod a+s /usr/local/bin/sway
|
||||||
```
|
```
|
||||||
Sway o să scape de permisiuni root la puțin timp după lansare.
|
|
||||||
|
Imediat după pornire, Sway va renunța la permisiunile de root.
|
||||||
|
|
||||||
## Configurare
|
## Configurare
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,9 @@ struct sway_container *workspace_find_container(struct sway_workspace *ws,
|
||||||
*/
|
*/
|
||||||
struct sway_container *workspace_wrap_children(struct sway_workspace *ws);
|
struct sway_container *workspace_wrap_children(struct sway_workspace *ws);
|
||||||
|
|
||||||
|
void workspace_unwrap_children(struct sway_workspace *ws,
|
||||||
|
struct sway_container *wrap);
|
||||||
|
|
||||||
void workspace_detach(struct sway_workspace *workspace);
|
void workspace_detach(struct sway_workspace *workspace);
|
||||||
|
|
||||||
void workspace_add_tiling(struct sway_workspace *workspace,
|
void workspace_add_tiling(struct sway_workspace *workspace,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
project(
|
project(
|
||||||
'sway',
|
'sway',
|
||||||
'c',
|
'c',
|
||||||
version: '1.5-rc1', #release_version
|
version: 'v1.5-rc2', #release_version
|
||||||
license: 'MIT',
|
license: 'MIT',
|
||||||
meson_version: '>=0.53.0',
|
meson_version: '>=0.53.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<protocol name="wlr_layer_shell_v1_unstable_v1">
|
<protocol name="wlr_layer_shell_unstable_v1">
|
||||||
<copyright>
|
<copyright>
|
||||||
Copyright © 2017 Drew DeVault
|
Copyright © 2017 Drew DeVault
|
||||||
|
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
THIS SOFTWARE.
|
THIS SOFTWARE.
|
||||||
</copyright>
|
</copyright>
|
||||||
|
|
||||||
<interface name="zwlr_layer_shell_v1" version="1">
|
<interface name="zwlr_layer_shell_v1" version="3">
|
||||||
<description summary="create surfaces that are layers of the desktop">
|
<description summary="create surfaces that are layers of the desktop">
|
||||||
Clients can use this interface to assign the surface_layer role to
|
Clients can use this interface to assign the surface_layer role to
|
||||||
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
wl_surfaces. Such surfaces are assigned to a "layer" of the output and
|
||||||
|
|
@ -82,17 +82,27 @@
|
||||||
<entry name="top" value="2"/>
|
<entry name="top" value="2"/>
|
||||||
<entry name="overlay" value="3"/>
|
<entry name="overlay" value="3"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
|
<!-- Version 3 additions -->
|
||||||
|
|
||||||
|
<request name="destroy" type="destructor" since="3">
|
||||||
|
<description summary="destroy the layer_shell object">
|
||||||
|
This request indicates that the client will not use the layer_shell
|
||||||
|
object any more. Objects that have been created through this instance
|
||||||
|
are not affected.
|
||||||
|
</description>
|
||||||
|
</request>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="zwlr_layer_surface_v1" version="1">
|
<interface name="zwlr_layer_surface_v1" version="3">
|
||||||
<description summary="layer metadata interface">
|
<description summary="layer metadata interface">
|
||||||
An interface that may be implemented by a wl_surface, for surfaces that
|
An interface that may be implemented by a wl_surface, for surfaces that
|
||||||
are designed to be rendered as a layer of a stacked desktop-like
|
are designed to be rendered as a layer of a stacked desktop-like
|
||||||
environment.
|
environment.
|
||||||
|
|
||||||
Layer surface state (size, anchor, exclusive zone, margin, interactivity)
|
Layer surface state (layer, size, anchor, exclusive zone,
|
||||||
is double-buffered, and will be applied at the time wl_surface.commit of
|
margin, interactivity) is double-buffered, and will be applied at the
|
||||||
the corresponding wl_surface is called.
|
time wl_surface.commit of the corresponding wl_surface is called.
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<request name="set_size">
|
<request name="set_size">
|
||||||
|
|
@ -115,7 +125,7 @@
|
||||||
<request name="set_anchor">
|
<request name="set_anchor">
|
||||||
<description summary="configures the anchor point of the surface">
|
<description summary="configures the anchor point of the surface">
|
||||||
Requests that the compositor anchor the surface to the specified edges
|
Requests that the compositor anchor the surface to the specified edges
|
||||||
and corners. If two orthoginal edges are specified (e.g. 'top' and
|
and corners. If two orthogonal edges are specified (e.g. 'top' and
|
||||||
'left'), then the anchor point will be the intersection of the edges
|
'left'), then the anchor point will be the intersection of the edges
|
||||||
(e.g. the top left corner of the output); otherwise the anchor point
|
(e.g. the top left corner of the output); otherwise the anchor point
|
||||||
will be centered on that edge, or in the center if none is specified.
|
will be centered on that edge, or in the center if none is specified.
|
||||||
|
|
@ -127,19 +137,24 @@
|
||||||
|
|
||||||
<request name="set_exclusive_zone">
|
<request name="set_exclusive_zone">
|
||||||
<description summary="configures the exclusive geometry of this surface">
|
<description summary="configures the exclusive geometry of this surface">
|
||||||
Requests that the compositor avoids occluding an area of the surface
|
Requests that the compositor avoids occluding an area with other
|
||||||
with other surfaces. The compositor's use of this information is
|
surfaces. The compositor's use of this information is
|
||||||
implementation-dependent - do not assume that this region will not
|
implementation-dependent - do not assume that this region will not
|
||||||
actually be occluded.
|
actually be occluded.
|
||||||
|
|
||||||
A positive value is only meaningful if the surface is anchored to an
|
A positive value is only meaningful if the surface is anchored to one
|
||||||
edge, rather than a corner. The zone is the number of surface-local
|
edge or an edge and both perpendicular edges. If the surface is not
|
||||||
coordinates from the edge that are considered exclusive.
|
anchored, anchored to only two perpendicular edges (a corner), anchored
|
||||||
|
to only two parallel edges or anchored to all edges, a positive value
|
||||||
|
will be treated the same as zero.
|
||||||
|
|
||||||
|
A positive zone is the distance from the edge in surface-local
|
||||||
|
coordinates to consider exclusive.
|
||||||
|
|
||||||
Surfaces that do not wish to have an exclusive zone may instead specify
|
Surfaces that do not wish to have an exclusive zone may instead specify
|
||||||
how they should interact with surfaces that do. If set to zero, the
|
how they should interact with surfaces that do. If set to zero, the
|
||||||
surface indicates that it would like to be moved to avoid occluding
|
surface indicates that it would like to be moved to avoid occluding
|
||||||
surfaces with a positive excluzive zone. If set to -1, the surface
|
surfaces with a positive exclusive zone. If set to -1, the surface
|
||||||
indicates that it would not like to be moved to accommodate for other
|
indicates that it would not like to be moved to accommodate for other
|
||||||
surfaces, and the compositor should extend it all the way to the edges
|
surfaces, and the compositor should extend it all the way to the edges
|
||||||
it is anchored to.
|
it is anchored to.
|
||||||
|
|
@ -281,5 +296,16 @@
|
||||||
<entry name="left" value="4" summary="the left edge of the anchor rectangle"/>
|
<entry name="left" value="4" summary="the left edge of the anchor rectangle"/>
|
||||||
<entry name="right" value="8" summary="the right edge of the anchor rectangle"/>
|
<entry name="right" value="8" summary="the right edge of the anchor rectangle"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
|
<!-- Version 2 additions -->
|
||||||
|
|
||||||
|
<request name="set_layer" since="2">
|
||||||
|
<description summary="change the layer of the surface">
|
||||||
|
Change the layer that the surface is rendered on.
|
||||||
|
|
||||||
|
Layer is double-buffered, see wl_surface.commit.
|
||||||
|
</description>
|
||||||
|
<arg name="layer" type="uint" enum="zwlr_layer_shell_v1.layer" summary="layer to move this surface to"/>
|
||||||
|
</request>
|
||||||
</interface>
|
</interface>
|
||||||
</protocol>
|
</protocol>
|
||||||
|
|
|
||||||
|
|
@ -208,9 +208,13 @@ static void container_move_to_workspace(struct sway_container *container,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
container_detach(container);
|
container_detach(container);
|
||||||
container->width = container->height = 0;
|
if (workspace_is_empty(workspace) && container->children) {
|
||||||
container->width_fraction = container->height_fraction = 0;
|
workspace_unwrap_children(workspace, container);
|
||||||
workspace_add_tiling(workspace, container);
|
} else {
|
||||||
|
container->width = container->height = 0;
|
||||||
|
container->width_fraction = container->height_fraction = 0;
|
||||||
|
workspace_add_tiling(workspace, container);
|
||||||
|
}
|
||||||
container_update_representation(container);
|
container_update_representation(container);
|
||||||
}
|
}
|
||||||
if (container->view) {
|
if (container->view) {
|
||||||
|
|
@ -271,12 +275,11 @@ static void workspace_rejigger(struct sway_workspace *ws,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
container_detach(child);
|
container_detach(child);
|
||||||
struct sway_container *new_parent = workspace_wrap_children(ws);
|
workspace_wrap_children(ws);
|
||||||
|
|
||||||
int index =
|
int index =
|
||||||
move_dir == WLR_DIRECTION_LEFT || move_dir == WLR_DIRECTION_UP ? 0 : 1;
|
move_dir == WLR_DIRECTION_LEFT || move_dir == WLR_DIRECTION_UP ? 0 : 1;
|
||||||
workspace_insert_tiling(ws, child, index);
|
workspace_insert_tiling(ws, child, index);
|
||||||
container_flatten(new_parent);
|
|
||||||
ws->layout =
|
ws->layout =
|
||||||
move_dir == WLR_DIRECTION_LEFT || move_dir == WLR_DIRECTION_RIGHT ?
|
move_dir == WLR_DIRECTION_LEFT || move_dir == WLR_DIRECTION_RIGHT ?
|
||||||
L_HORIZ : L_VERT;
|
L_HORIZ : L_VERT;
|
||||||
|
|
@ -345,8 +348,11 @@ static bool container_move_in_direction(struct sway_container *container,
|
||||||
container_insert_child(current->parent, container,
|
container_insert_child(current->parent, container,
|
||||||
index + (offs < 0 ? 0 : 1));
|
index + (offs < 0 ? 0 : 1));
|
||||||
} else {
|
} else {
|
||||||
workspace_insert_tiling(current->workspace, container,
|
struct sway_workspace *ws = current->workspace;
|
||||||
index + (offs < 0 ? 0 : 1));
|
workspace_insert_tiling(ws,
|
||||||
|
container_split(container,
|
||||||
|
output_get_default_layout(ws->output)),
|
||||||
|
index + (offs < 0 ? 0 : 1));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,8 @@ char *input_device_get_identifier(struct wlr_input_device *device) {
|
||||||
|
|
||||||
char *p = name;
|
char *p = name;
|
||||||
for (; *p; ++p) {
|
for (; *p; ++p) {
|
||||||
if (*p == ' ') {
|
// There are in fact input devices with unprintable characters in its name
|
||||||
|
if (*p == ' ' || !isprint(*p)) {
|
||||||
*p = '_';
|
*p = '_';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -572,14 +572,6 @@ struct sway_seat *seat_create(const char *seat_name) {
|
||||||
|
|
||||||
seat->deferred_bindings = create_list();
|
seat->deferred_bindings = create_list();
|
||||||
|
|
||||||
if (!wl_list_empty(&server.input->seats)) {
|
|
||||||
// Since this is not the first seat, attempt to set initial focus
|
|
||||||
struct sway_seat *current_seat = input_manager_current_seat();
|
|
||||||
struct sway_node *current_focus =
|
|
||||||
seat_get_focus_inactive(current_seat, &root->node);
|
|
||||||
seat_set_focus(seat, current_focus);
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_signal_add(&root->events.new_node, &seat->new_node);
|
wl_signal_add(&root->events.new_node, &seat->new_node);
|
||||||
seat->new_node.notify = handle_new_node;
|
seat->new_node.notify = handle_new_node;
|
||||||
|
|
||||||
|
|
@ -604,8 +596,17 @@ struct sway_seat *seat_create(const char *seat_name) {
|
||||||
|
|
||||||
sway_input_method_relay_init(seat, &seat->im_relay);
|
sway_input_method_relay_init(seat, &seat->im_relay);
|
||||||
|
|
||||||
|
bool first = wl_list_empty(&server.input->seats);
|
||||||
wl_list_insert(&server.input->seats, &seat->link);
|
wl_list_insert(&server.input->seats, &seat->link);
|
||||||
|
|
||||||
|
if (!first) {
|
||||||
|
// Since this is not the first seat, attempt to set initial focus
|
||||||
|
struct sway_seat *current_seat = input_manager_current_seat();
|
||||||
|
struct sway_node *current_focus =
|
||||||
|
seat_get_focus_inactive(current_seat, &root->node);
|
||||||
|
seat_set_focus(seat, current_focus);
|
||||||
|
}
|
||||||
|
|
||||||
seatop_begin_default(seat);
|
seatop_begin_default(seat);
|
||||||
|
|
||||||
return seat;
|
return seat;
|
||||||
|
|
@ -924,7 +925,7 @@ void seat_configure_xcursor(struct sway_seat *seat) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_XWAYLAND
|
#if HAVE_XWAYLAND
|
||||||
if (config->xwayland && (!server.xwayland.xcursor_manager ||
|
if (server.xwayland.wlr_xwayland && (!server.xwayland.xcursor_manager ||
|
||||||
!xcursor_manager_is_named(server.xwayland.xcursor_manager,
|
!xcursor_manager_is_named(server.xwayland.xcursor_manager,
|
||||||
cursor_theme) ||
|
cursor_theme) ||
|
||||||
server.xwayland.xcursor_manager->size != cursor_size)) {
|
server.xwayland.xcursor_manager->size != cursor_size)) {
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,7 @@ bool server_start(struct sway_server *server) {
|
||||||
config->xwayland == XWAYLAND_MODE_LAZY);
|
config->xwayland == XWAYLAND_MODE_LAZY);
|
||||||
if (!server->xwayland.wlr_xwayland) {
|
if (!server->xwayland.wlr_xwayland) {
|
||||||
sway_log(SWAY_ERROR, "Failed to start Xwayland");
|
sway_log(SWAY_ERROR, "Failed to start Xwayland");
|
||||||
|
unsetenv("DISPLAY");
|
||||||
} else {
|
} else {
|
||||||
wl_signal_add(&server->xwayland.wlr_xwayland->events.new_surface,
|
wl_signal_add(&server->xwayland.wlr_xwayland->events.new_surface,
|
||||||
&server->xwayland_surface);
|
&server->xwayland_surface);
|
||||||
|
|
|
||||||
|
|
@ -1329,6 +1329,14 @@ void container_detach(struct sway_container *child) {
|
||||||
container_update_representation(old_parent);
|
container_update_representation(old_parent);
|
||||||
node_set_dirty(&old_parent->node);
|
node_set_dirty(&old_parent->node);
|
||||||
} else if (old_workspace) {
|
} else if (old_workspace) {
|
||||||
|
// We may have removed the last tiling child from the workspace. If the
|
||||||
|
// workspace layout was e.g. tabbed, then at this point it may be just
|
||||||
|
// H[]. So, reset it to the default (e.g. T[]) for next time.
|
||||||
|
if (!old_workspace->tiling->length) {
|
||||||
|
old_workspace->layout =
|
||||||
|
output_get_default_layout(old_workspace->output);
|
||||||
|
}
|
||||||
|
|
||||||
workspace_update_representation(old_workspace);
|
workspace_update_representation(old_workspace);
|
||||||
node_set_dirty(&old_workspace->node);
|
node_set_dirty(&old_workspace->node);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -746,6 +746,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
|
||||||
} else if ((class = view_get_class(view)) != NULL) {
|
} else if ((class = view_get_class(view)) != NULL) {
|
||||||
wlr_foreign_toplevel_handle_v1_set_app_id(
|
wlr_foreign_toplevel_handle_v1_set_app_id(
|
||||||
view->foreign_toplevel, class);
|
view->foreign_toplevel, class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void view_unmap(struct sway_view *view) {
|
void view_unmap(struct sway_view *view) {
|
||||||
|
|
@ -1170,7 +1171,7 @@ void view_update_title(struct sway_view *view, bool force) {
|
||||||
|
|
||||||
ipc_event_window(view->container, "title");
|
ipc_event_window(view->container, "title");
|
||||||
|
|
||||||
if (view->foreign_toplevel) {
|
if (view->foreign_toplevel && title) {
|
||||||
wlr_foreign_toplevel_handle_v1_set_title(view->foreign_toplevel, title);
|
wlr_foreign_toplevel_handle_v1_set_title(view->foreign_toplevel, title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -641,6 +641,21 @@ struct sway_container *workspace_wrap_children(struct sway_workspace *ws) {
|
||||||
return middle;
|
return middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void workspace_unwrap_children(struct sway_workspace *ws,
|
||||||
|
struct sway_container *wrap) {
|
||||||
|
if (!sway_assert(workspace_is_empty(ws),
|
||||||
|
"target workspace must be empty")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ws->layout = wrap->layout;
|
||||||
|
while (wrap->children->length) {
|
||||||
|
struct sway_container *child = wrap->children->items[0];
|
||||||
|
container_detach(child);
|
||||||
|
workspace_add_tiling(ws, child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void workspace_detach(struct sway_workspace *workspace) {
|
void workspace_detach(struct sway_workspace *workspace) {
|
||||||
struct sway_output *output = workspace->output;
|
struct sway_output *output = workspace->output;
|
||||||
int index = list_find(output->workspaces, workspace);
|
int index = list_find(output->workspaces, workspace);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue