Chromium Code Reviews| 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 |