Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: components/exo/wayland/server.cc

Issue 2040743002: exo: Implement version 2 of remote shell interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remote-shell-version-2
Patch Set: popup placement fix Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/exo/shell_surface_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « components/exo/shell_surface_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698