OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/exo/wayland/server.h" | 5 #include "components/exo/wayland/server.h" |
6 | 6 |
7 #include <grp.h> | 7 #include <grp.h> |
8 #include <linux/input.h> | 8 #include <linux/input.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1165 wl_resource* resource, | 1165 wl_resource* resource, |
1166 wl_resource* output) { | 1166 wl_resource* output) { |
1167 GetUserDataAs<ShellSurface>(resource)->SetFullscreen(true); | 1167 GetUserDataAs<ShellSurface>(resource)->SetFullscreen(true); |
1168 } | 1168 } |
1169 | 1169 |
1170 void xdg_surface_unset_fullscreen(wl_client* client, wl_resource* resource) { | 1170 void xdg_surface_unset_fullscreen(wl_client* client, wl_resource* resource) { |
1171 GetUserDataAs<ShellSurface>(resource)->SetFullscreen(false); | 1171 GetUserDataAs<ShellSurface>(resource)->SetFullscreen(false); |
1172 } | 1172 } |
1173 | 1173 |
1174 void xdg_surface_set_minimized(wl_client* client, wl_resource* resource) { | 1174 void xdg_surface_set_minimized(wl_client* client, wl_resource* resource) { |
1175 NOTIMPLEMENTED(); | 1175 GetUserDataAs<ShellSurface>(resource)->Minimize(); |
1176 } | 1176 } |
1177 | 1177 |
1178 const struct xdg_surface_interface xdg_surface_implementation = { | 1178 const struct xdg_surface_interface xdg_surface_implementation = { |
1179 xdg_surface_destroy, | 1179 xdg_surface_destroy, |
1180 xdg_surface_set_parent, | 1180 xdg_surface_set_parent, |
1181 xdg_surface_set_title, | 1181 xdg_surface_set_title, |
1182 xdg_surface_set_add_id, | 1182 xdg_surface_set_add_id, |
1183 xdg_surface_show_window_menu, | 1183 xdg_surface_show_window_menu, |
1184 xdg_surface_move, | 1184 xdg_surface_move, |
1185 xdg_surface_resize, | 1185 xdg_surface_resize, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1384 GetUserDataAs<ShellSurface>(resource)->SetGeometry( | 1384 GetUserDataAs<ShellSurface>(resource)->SetGeometry( |
1385 gfx::Rect(x, y, width, height)); | 1385 gfx::Rect(x, y, width, height)); |
1386 } | 1386 } |
1387 | 1387 |
1388 void remote_surface_set_scale(wl_client* client, | 1388 void remote_surface_set_scale(wl_client* client, |
1389 wl_resource* resource, | 1389 wl_resource* resource, |
1390 wl_fixed_t scale) { | 1390 wl_fixed_t scale) { |
1391 GetUserDataAs<ShellSurface>(resource)->SetScale(wl_fixed_to_double(scale)); | 1391 GetUserDataAs<ShellSurface>(resource)->SetScale(wl_fixed_to_double(scale)); |
1392 } | 1392 } |
1393 | 1393 |
1394 void remote_surface_fullscreen(wl_client* client, wl_resource* resource) { | |
Daniele Castagna
2016/06/06 03:11:23
This file could be probably made much compact with
reveman
2016/06/06 03:26:57
Yes, that was always the plan but it's been easier
| |
1395 GetUserDataAs<ShellSurface>(resource)->SetFullscreen(true); | |
1396 } | |
1397 | |
1398 void remote_surface_maximize(wl_client* client, wl_resource* resource) { | |
1399 GetUserDataAs<ShellSurface>(resource)->Maximize(); | |
1400 } | |
1401 | |
1402 void remote_surface_minimize(wl_client* client, wl_resource* resource) { | |
1403 GetUserDataAs<ShellSurface>(resource)->Minimize(); | |
1404 } | |
1405 | |
1406 void remote_surface_restore(wl_client* client, wl_resource* resource) { | |
1407 GetUserDataAs<ShellSurface>(resource)->Restore(); | |
1408 } | |
1409 | |
1394 const struct zwp_remote_surface_v1_interface remote_surface_implementation = { | 1410 const struct zwp_remote_surface_v1_interface remote_surface_implementation = { |
1395 remote_surface_destroy, remote_surface_set_app_id, | 1411 remote_surface_destroy, |
1396 remote_surface_set_window_geometry, remote_surface_set_scale}; | 1412 remote_surface_set_app_id, |
1413 remote_surface_set_window_geometry, | |
1414 remote_surface_set_scale, | |
1415 remote_surface_fullscreen, | |
1416 remote_surface_maximize, | |
1417 remote_surface_minimize, | |
1418 remote_surface_restore}; | |
1397 | 1419 |
1398 //////////////////////////////////////////////////////////////////////////////// | 1420 //////////////////////////////////////////////////////////////////////////////// |
1399 // remote_shell_interface: | 1421 // remote_shell_interface: |
1400 | 1422 |
1401 // Observer class that monitors workspace state needed to implement the | 1423 // Observer class that monitors workspace state needed to implement the |
1402 // remote shell interface. | 1424 // remote shell interface. |
1403 class WaylandWorkspaceObserver : public ash::ShellObserver, | 1425 class WaylandWorkspaceObserver : public ash::ShellObserver, |
1404 public aura::client::ActivationChangeObserver, | 1426 public aura::client::ActivationChangeObserver, |
1405 public display::DisplayObserver { | 1427 public display::DisplayObserver { |
1406 public: | 1428 public: |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1514 DLOG(WARNING) << "Unsupported container: " << container; | 1536 DLOG(WARNING) << "Unsupported container: " << container; |
1515 return ash::kShellWindowId_DefaultContainer; | 1537 return ash::kShellWindowId_DefaultContainer; |
1516 } | 1538 } |
1517 } | 1539 } |
1518 | 1540 |
1519 void HandleRemoteSurfaceCloseCallback(wl_resource* resource) { | 1541 void HandleRemoteSurfaceCloseCallback(wl_resource* resource) { |
1520 zwp_remote_surface_v1_send_close(resource); | 1542 zwp_remote_surface_v1_send_close(resource); |
1521 wl_client_flush(wl_resource_get_client(resource)); | 1543 wl_client_flush(wl_resource_get_client(resource)); |
1522 } | 1544 } |
1523 | 1545 |
1546 void HandleRemoteSurfaceStateChangedCallback( | |
1547 wl_resource* resource, | |
1548 ash::wm::WindowStateType old_state_type, | |
1549 ash::wm::WindowStateType new_state_type) { | |
1550 DCHECK_NE(old_state_type, new_state_type); | |
1551 | |
1552 switch (old_state_type) { | |
1553 case ash::wm::WINDOW_STATE_TYPE_MINIMIZED: | |
1554 if (wl_resource_get_version(resource) >= 2) | |
Daniele Castagna
2016/06/06 03:11:23
Wouldn't this code be clearer if it was something
reveman
2016/06/06 03:26:57
I'm expecting "wl_resource_get_version(resource) >
| |
1555 zwp_remote_surface_v1_send_unset_minimized(resource); | |
1556 break; | |
1557 case ash::wm::WINDOW_STATE_TYPE_MAXIMIZED: | |
1558 if (wl_resource_get_version(resource) >= 2) | |
1559 zwp_remote_surface_v1_send_unset_maximized(resource); | |
1560 break; | |
1561 case ash::wm::WINDOW_STATE_TYPE_FULLSCREEN: | |
1562 zwp_remote_surface_v1_send_unset_fullscreen(resource); | |
1563 break; | |
1564 default: | |
1565 break; | |
1566 } | |
1567 switch (new_state_type) { | |
1568 case ash::wm::WINDOW_STATE_TYPE_MINIMIZED: | |
1569 if (wl_resource_get_version(resource) >= 2) | |
1570 zwp_remote_surface_v1_send_set_minimized(resource); | |
1571 break; | |
1572 case ash::wm::WINDOW_STATE_TYPE_MAXIMIZED: | |
1573 if (wl_resource_get_version(resource) >= 2) | |
1574 zwp_remote_surface_v1_send_set_maximized(resource); | |
1575 break; | |
1576 case ash::wm::WINDOW_STATE_TYPE_FULLSCREEN: | |
1577 zwp_remote_surface_v1_send_set_fullscreen(resource); | |
1578 break; | |
1579 default: | |
1580 break; | |
1581 } | |
1582 wl_client_flush(wl_resource_get_client(resource)); | |
1583 } | |
1584 | |
1524 void remote_shell_get_remote_surface(wl_client* client, | 1585 void remote_shell_get_remote_surface(wl_client* client, |
1525 wl_resource* resource, | 1586 wl_resource* resource, |
1526 uint32_t id, | 1587 uint32_t id, |
1527 wl_resource* surface, | 1588 wl_resource* surface, |
1528 uint32_t container) { | 1589 uint32_t container) { |
1529 std::unique_ptr<ShellSurface> shell_surface = | 1590 std::unique_ptr<ShellSurface> shell_surface = |
1530 GetUserDataAs<Display>(resource)->CreateRemoteShellSurface( | 1591 GetUserDataAs<Display>(resource)->CreateRemoteShellSurface( |
1531 GetUserDataAs<Surface>(surface), RemoteSurfaceContainer(container)); | 1592 GetUserDataAs<Surface>(surface), RemoteSurfaceContainer(container)); |
1532 if (!shell_surface) { | 1593 if (!shell_surface) { |
1533 wl_resource_post_error(resource, ZWP_REMOTE_SHELL_V1_ERROR_ROLE, | 1594 wl_resource_post_error(resource, ZWP_REMOTE_SHELL_V1_ERROR_ROLE, |
1534 "surface has already been assigned a role"); | 1595 "surface has already been assigned a role"); |
1535 return; | 1596 return; |
1536 } | 1597 } |
1537 | 1598 |
1538 wl_resource* remote_surface_resource = | 1599 wl_resource* remote_surface_resource = |
1539 wl_resource_create(client, &zwp_remote_surface_v1_interface, 1, id); | 1600 wl_resource_create(client, &zwp_remote_surface_v1_interface, |
1601 wl_resource_get_version(resource), id); | |
1540 | 1602 |
1541 shell_surface->set_close_callback( | 1603 shell_surface->set_close_callback( |
1542 base::Bind(&HandleRemoteSurfaceCloseCallback, | 1604 base::Bind(&HandleRemoteSurfaceCloseCallback, |
1543 base::Unretained(remote_surface_resource))); | 1605 base::Unretained(remote_surface_resource))); |
1606 shell_surface->set_state_changed_callback( | |
1607 base::Bind(&HandleRemoteSurfaceStateChangedCallback, | |
1608 base::Unretained(remote_surface_resource))); | |
1544 | 1609 |
1545 SetImplementation(remote_surface_resource, &remote_surface_implementation, | 1610 SetImplementation(remote_surface_resource, &remote_surface_implementation, |
1546 std::move(shell_surface)); | 1611 std::move(shell_surface)); |
1547 } | 1612 } |
1548 | 1613 |
1549 const struct zwp_remote_shell_v1_interface remote_shell_implementation = { | 1614 const struct zwp_remote_shell_v1_interface remote_shell_implementation = { |
1550 remote_shell_destroy, remote_shell_get_remote_surface}; | 1615 remote_shell_destroy, remote_shell_get_remote_surface}; |
1551 | 1616 |
1617 const uint32_t remote_shell_version = 2; | |
1618 | |
1552 void bind_remote_shell(wl_client* client, | 1619 void bind_remote_shell(wl_client* client, |
1553 void* data, | 1620 void* data, |
1554 uint32_t version, | 1621 uint32_t version, |
1555 uint32_t id) { | 1622 uint32_t id) { |
1556 wl_resource* resource = | 1623 wl_resource* resource = |
1557 wl_resource_create(client, &zwp_remote_shell_v1_interface, 1, id); | 1624 wl_resource_create(client, &zwp_remote_shell_v1_interface, |
1625 std::min(version, remote_shell_version), id); | |
1558 | 1626 |
1559 // TODO(reveman): Multi-display support. | 1627 // TODO(reveman): Multi-display support. |
1560 const display::Display& display = ash::Shell::GetInstance() | 1628 const display::Display& display = ash::Shell::GetInstance() |
1561 ->display_manager() | 1629 ->display_manager() |
1562 ->GetPrimaryDisplayCandidate(); | 1630 ->GetPrimaryDisplayCandidate(); |
1563 | 1631 |
1564 SetImplementation( | 1632 SetImplementation( |
1565 resource, &remote_shell_implementation, | 1633 resource, &remote_shell_implementation, |
1566 base::WrapUnique(new WaylandWorkspaceObserver(display, resource))); | 1634 base::WrapUnique(new WaylandWorkspaceObserver(display, resource))); |
1567 } | 1635 } |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2427 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1, | 2495 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1, |
2428 display_, bind_data_device_manager); | 2496 display_, bind_data_device_manager); |
2429 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, | 2497 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, |
2430 display_, bind_seat); | 2498 display_, bind_seat); |
2431 wl_global_create(wl_display_.get(), &wp_viewporter_interface, 1, display_, | 2499 wl_global_create(wl_display_.get(), &wp_viewporter_interface, 1, display_, |
2432 bind_viewporter); | 2500 bind_viewporter); |
2433 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, | 2501 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, |
2434 display_, bind_secure_output); | 2502 display_, bind_secure_output); |
2435 wl_global_create(wl_display_.get(), &zwp_alpha_compositing_v1_interface, 1, | 2503 wl_global_create(wl_display_.get(), &zwp_alpha_compositing_v1_interface, 1, |
2436 display_, bind_alpha_compositing); | 2504 display_, bind_alpha_compositing); |
2437 wl_global_create(wl_display_.get(), &zwp_remote_shell_v1_interface, 1, | 2505 wl_global_create(wl_display_.get(), &zwp_remote_shell_v1_interface, |
2438 display_, bind_remote_shell); | 2506 remote_shell_version, display_, bind_remote_shell); |
2439 } | 2507 } |
2440 | 2508 |
2441 Server::~Server() {} | 2509 Server::~Server() {} |
2442 | 2510 |
2443 // static | 2511 // static |
2444 std::unique_ptr<Server> Server::Create(Display* display) { | 2512 std::unique_ptr<Server> Server::Create(Display* display) { |
2445 std::unique_ptr<Server> server(new Server(display)); | 2513 std::unique_ptr<Server> server(new Server(display)); |
2446 | 2514 |
2447 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); | 2515 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); |
2448 if (!runtime_dir) { | 2516 if (!runtime_dir) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2500 DCHECK(event_loop); | 2568 DCHECK(event_loop); |
2501 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); | 2569 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); |
2502 } | 2570 } |
2503 | 2571 |
2504 void Server::Flush() { | 2572 void Server::Flush() { |
2505 wl_display_flush_clients(wl_display_.get()); | 2573 wl_display_flush_clients(wl_display_.get()); |
2506 } | 2574 } |
2507 | 2575 |
2508 } // namespace wayland | 2576 } // namespace wayland |
2509 } // namespace exo | 2577 } // namespace exo |
OLD | NEW |