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

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

Issue 2548653005: exo: Add initial support for service side decorations. (Closed)
Patch Set: fix typo Created 4 years 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/touch_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 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 wl_resource* resource = 843 wl_resource* resource =
844 wl_resource_create(client, &wl_subcompositor_interface, 1, id); 844 wl_resource_create(client, &wl_subcompositor_interface, 1, id);
845 845
846 wl_resource_set_implementation(resource, &subcompositor_implementation, data, 846 wl_resource_set_implementation(resource, &subcompositor_implementation, data,
847 nullptr); 847 nullptr);
848 } 848 }
849 849
850 //////////////////////////////////////////////////////////////////////////////// 850 ////////////////////////////////////////////////////////////////////////////////
851 // wl_shell_surface_interface: 851 // wl_shell_surface_interface:
852 852
853 class ShellSurfaceSizeObserver : public views::WidgetObserver {
854 public:
855 ShellSurfaceSizeObserver(wl_resource* shell_surface_resource,
856 const gfx::Size& initial_size)
857 : shell_surface_resource_(shell_surface_resource),
858 old_size_(initial_size) {
859 wl_shell_surface_send_configure(shell_surface_resource,
860 WL_SHELL_SURFACE_RESIZE_NONE,
861 old_size_.width(), old_size_.height());
862 }
863
864 // Overridden from view::WidgetObserver:
865 void OnWidgetDestroyed(views::Widget* widget) override { delete this; }
866 void OnWidgetBoundsChanged(views::Widget* widget,
867 const gfx::Rect& new_bounds) override {
868 if (old_size_ == new_bounds.size())
869 return;
870
871 wl_shell_surface_send_configure(shell_surface_resource_,
872 WL_SHELL_SURFACE_RESIZE_NONE,
873 new_bounds.width(), new_bounds.height());
874 old_size_ = new_bounds.size();
875 }
876
877 private:
878 wl_resource* shell_surface_resource_;
879 gfx::Size old_size_;
880
881 DISALLOW_COPY_AND_ASSIGN(ShellSurfaceSizeObserver);
882 };
883
884 void shell_surface_pong(wl_client* client, 853 void shell_surface_pong(wl_client* client,
885 wl_resource* resource, 854 wl_resource* resource,
886 uint32_t serial) { 855 uint32_t serial) {
887 NOTIMPLEMENTED(); 856 NOTIMPLEMENTED();
888 } 857 }
889 858
890 void shell_surface_move(wl_client* client, 859 void shell_surface_move(wl_client* client,
891 wl_resource* resource, 860 wl_resource* resource,
892 wl_resource* seat_resource, 861 wl_resource* seat_resource,
893 uint32_t serial) { 862 uint32_t serial) {
894 GetUserDataAs<ShellSurface>(resource)->Move(); 863 GetUserDataAs<ShellSurface>(resource)->Move();
895 } 864 }
896 865
897 void shell_surface_resize(wl_client* client, 866 void shell_surface_resize(wl_client* client,
898 wl_resource* resource, 867 wl_resource* resource,
899 wl_resource* seat_resource, 868 wl_resource* seat_resource,
900 uint32_t serial, 869 uint32_t serial,
901 uint32_t edges) { 870 uint32_t edges) {
902 NOTIMPLEMENTED(); 871 NOTIMPLEMENTED();
903 } 872 }
904 873
905 void shell_surface_set_toplevel(wl_client* client, wl_resource* resource) { 874 void shell_surface_set_toplevel(wl_client* client, wl_resource* resource) {
906 GetUserDataAs<ShellSurface>(resource)->SetEnabled(true); 875 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
876 if (shell_surface->enabled())
877 return;
878
879 shell_surface->SetFrame(true);
880 shell_surface->SetRectangularShadow(true);
881 shell_surface->SetEnabled(true);
907 } 882 }
908 883
909 void shell_surface_set_transient(wl_client* client, 884 void shell_surface_set_transient(wl_client* client,
910 wl_resource* resource, 885 wl_resource* resource,
911 wl_resource* parent_resource, 886 wl_resource* parent_resource,
912 int x, 887 int x,
913 int y, 888 int y,
914 uint32_t flags) { 889 uint32_t flags) {
915 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource); 890 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
916 if (shell_surface->enabled()) 891 if (shell_surface->enabled())
917 return; 892 return;
918 893
919 // Parent widget can be found by locating the closest ancestor with a widget. 894 // Parent widget can be found by locating the closest ancestor with a widget.
920 views::Widget* parent_widget = nullptr; 895 views::Widget* parent_widget = nullptr;
921 aura::Window* parent_window = 896 aura::Window* parent_window =
922 GetUserDataAs<Surface>(parent_resource)->window(); 897 GetUserDataAs<Surface>(parent_resource)->window();
923 while (parent_window) { 898 while (parent_window) {
924 parent_widget = views::Widget::GetWidgetForNativeWindow(parent_window); 899 parent_widget = views::Widget::GetWidgetForNativeWindow(parent_window);
925 if (parent_widget) 900 if (parent_widget)
926 break; 901 break;
927 parent_window = parent_window->parent(); 902 parent_window = parent_window->parent();
928 } 903 }
929 904
930 gfx::Point origin(x, y); 905 gfx::Point origin(x, y);
906 ShellSurface* parent_shell_surface = nullptr;
931 907
932 // Set parent if found and it is associated with a shell surface. 908 // Set parent if found and it is associated with a shell surface.
933 if (parent_widget && 909 if (parent_widget &&
934 ShellSurface::GetMainSurface(parent_widget->GetNativeWindow())) { 910 ShellSurface::GetMainSurface(parent_widget->GetNativeWindow())) {
935 wm::ConvertPointToScreen( 911 wm::ConvertPointToScreen(
936 ShellSurface::GetMainSurface(parent_widget->GetNativeWindow()) 912 ShellSurface::GetMainSurface(parent_widget->GetNativeWindow())
937 ->window(), 913 ->window(),
938 &origin); 914 &origin);
939 // Shell surface widget delegate implementation of GetContentsView() 915 // Shell surface widget delegate implementation of GetContentsView()
940 // returns a pointer to the shell surface instance. 916 // returns a pointer to the shell surface instance.
941 shell_surface->SetParent(static_cast<ShellSurface*>( 917 parent_shell_surface = static_cast<ShellSurface*>(
942 parent_widget->widget_delegate()->GetContentsView())); 918 parent_widget->widget_delegate()->GetContentsView());
943 } 919 }
944 920
945 shell_surface->SetOrigin(origin); 921 if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE) {
946 shell_surface->SetActivatable(!(flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE)); 922 shell_surface->SetOrigin(origin);
923 shell_surface->SetContainer(ash::kShellWindowId_SystemModalContainer);
924 } else {
925 shell_surface->SetFrame(true);
926 shell_surface->SetParent(parent_shell_surface);
927 }
928 shell_surface->SetRectangularShadow(true);
947 shell_surface->SetEnabled(true); 929 shell_surface->SetEnabled(true);
948 } 930 }
949 931
950 void shell_surface_set_fullscreen(wl_client* client, 932 void shell_surface_set_fullscreen(wl_client* client,
951 wl_resource* resource, 933 wl_resource* resource,
952 uint32_t method, 934 uint32_t method,
953 uint32_t framerate, 935 uint32_t framerate,
954 wl_resource* output_resource) { 936 wl_resource* output_resource) {
955 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource); 937 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
956 if (shell_surface->enabled()) 938 if (shell_surface->enabled())
957 return; 939 return;
958 940
959 shell_surface->SetEnabled(true); 941 shell_surface->SetEnabled(true);
960 shell_surface->SetFullscreen(true); 942 shell_surface->SetFullscreen(true);
961
962 views::Widget* widget = shell_surface->GetWidget();
963 widget->AddObserver(new ShellSurfaceSizeObserver(
964 resource, widget->GetWindowBoundsInScreen().size()));
965 } 943 }
966 944
967 void shell_surface_set_popup(wl_client* client, 945 void shell_surface_set_popup(wl_client* client,
968 wl_resource* resource, 946 wl_resource* resource,
969 wl_resource* seat_resource, 947 wl_resource* seat_resource,
970 uint32_t serial, 948 uint32_t serial,
971 wl_resource* parent_resource, 949 wl_resource* parent_resource,
972 int32_t x, 950 int32_t x,
973 int32_t y, 951 int32_t y,
974 uint32_t flags) { 952 uint32_t flags) {
975 NOTIMPLEMENTED(); 953 NOTIMPLEMENTED();
976 } 954 }
977 955
978 void shell_surface_set_maximized(wl_client* client, 956 void shell_surface_set_maximized(wl_client* client,
979 wl_resource* resource, 957 wl_resource* resource,
980 wl_resource* output_resource) { 958 wl_resource* output_resource) {
981 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource); 959 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
982 if (shell_surface->enabled()) 960 if (shell_surface->enabled())
983 return; 961 return;
984 962
985 shell_surface->SetEnabled(true); 963 shell_surface->SetEnabled(true);
986 shell_surface->Maximize(); 964 shell_surface->Maximize();
987
988 views::Widget* widget = shell_surface->GetWidget();
989 widget->AddObserver(new ShellSurfaceSizeObserver(
990 resource, widget->GetWindowBoundsInScreen().size()));
991 } 965 }
992 966
993 void shell_surface_set_title(wl_client* client, 967 void shell_surface_set_title(wl_client* client,
994 wl_resource* resource, 968 wl_resource* resource,
995 const char* title) { 969 const char* title) {
996 GetUserDataAs<ShellSurface>(resource) 970 GetUserDataAs<ShellSurface>(resource)
997 ->SetTitle(base::string16(base::UTF8ToUTF16(title))); 971 ->SetTitle(base::string16(base::UTF8ToUTF16(title)));
998 } 972 }
999 973
1000 void shell_surface_set_class(wl_client* client, 974 void shell_surface_set_class(wl_client* client,
1001 wl_resource* resource, 975 wl_resource* resource,
1002 const char* clazz) { 976 const char* clazz) {
1003 GetUserDataAs<ShellSurface>(resource)->SetApplicationId(clazz); 977 GetUserDataAs<ShellSurface>(resource)->SetApplicationId(clazz);
1004 } 978 }
1005 979
1006 const struct wl_shell_surface_interface shell_surface_implementation = { 980 const struct wl_shell_surface_interface shell_surface_implementation = {
1007 shell_surface_pong, shell_surface_move, 981 shell_surface_pong, shell_surface_move,
1008 shell_surface_resize, shell_surface_set_toplevel, 982 shell_surface_resize, shell_surface_set_toplevel,
1009 shell_surface_set_transient, shell_surface_set_fullscreen, 983 shell_surface_set_transient, shell_surface_set_fullscreen,
1010 shell_surface_set_popup, shell_surface_set_maximized, 984 shell_surface_set_popup, shell_surface_set_maximized,
1011 shell_surface_set_title, shell_surface_set_class}; 985 shell_surface_set_title, shell_surface_set_class};
1012 986
1013 //////////////////////////////////////////////////////////////////////////////// 987 ////////////////////////////////////////////////////////////////////////////////
1014 // wl_shell_interface: 988 // wl_shell_interface:
1015 989
990 void HandleShellSurfaceCloseCallback(wl_resource* resource) {
991 // Shell surface interface doesn't have a close event. Just send a ping event
992 // for now.
993 uint32_t serial = wl_display_next_serial(
994 wl_client_get_display(wl_resource_get_client(resource)));
995 wl_shell_surface_send_ping(resource, serial);
996 wl_client_flush(wl_resource_get_client(resource));
997 }
998
999 uint32_t HandleShellSurfaceConfigureCallback(
1000 wl_resource* resource,
1001 const gfx::Size& size,
1002 ash::wm::WindowStateType state_type,
1003 bool resizing,
1004 bool activated) {
1005 wl_shell_surface_send_configure(resource, WL_SHELL_SURFACE_RESIZE_NONE,
1006 size.width(), size.height());
1007 wl_client_flush(wl_resource_get_client(resource));
1008 return 0;
1009 }
1010
1016 void shell_get_shell_surface(wl_client* client, 1011 void shell_get_shell_surface(wl_client* client,
1017 wl_resource* resource, 1012 wl_resource* resource,
1018 uint32_t id, 1013 uint32_t id,
1019 wl_resource* surface) { 1014 wl_resource* surface) {
1020 std::unique_ptr<ShellSurface> shell_surface = 1015 std::unique_ptr<ShellSurface> shell_surface =
1021 GetUserDataAs<Display>(resource)->CreateShellSurface( 1016 GetUserDataAs<Display>(resource)->CreateShellSurface(
1022 GetUserDataAs<Surface>(surface)); 1017 GetUserDataAs<Surface>(surface));
1023 if (!shell_surface) { 1018 if (!shell_surface) {
1024 wl_resource_post_error(resource, WL_SHELL_ERROR_ROLE, 1019 wl_resource_post_error(resource, WL_SHELL_ERROR_ROLE,
1025 "surface has already been assigned a role"); 1020 "surface has already been assigned a role");
1026 return; 1021 return;
1027 } 1022 }
1028 1023
1029 wl_resource* shell_surface_resource = 1024 wl_resource* shell_surface_resource =
1030 wl_resource_create(client, &wl_shell_surface_interface, 1, id); 1025 wl_resource_create(client, &wl_shell_surface_interface, 1, id);
1031 1026
1032 // Shell surfaces are initially disabled and needs to be explicitly mapped 1027 // Shell surfaces are initially disabled and needs to be explicitly mapped
1033 // before they are enabled and can become visible. 1028 // before they are enabled and can become visible.
1034 shell_surface->SetEnabled(false); 1029 shell_surface->SetEnabled(false);
1035 1030
1031 shell_surface->set_close_callback(
1032 base::Bind(&HandleShellSurfaceCloseCallback,
1033 base::Unretained(shell_surface_resource)));
1034
1035 shell_surface->set_configure_callback(
1036 base::Bind(&HandleShellSurfaceConfigureCallback,
1037 base::Unretained(shell_surface_resource)));
1038
1036 shell_surface->set_surface_destroyed_callback(base::Bind( 1039 shell_surface->set_surface_destroyed_callback(base::Bind(
1037 &wl_resource_destroy, base::Unretained(shell_surface_resource))); 1040 &wl_resource_destroy, base::Unretained(shell_surface_resource)));
1038 1041
1039 SetImplementation(shell_surface_resource, &shell_surface_implementation, 1042 SetImplementation(shell_surface_resource, &shell_surface_implementation,
1040 std::move(shell_surface)); 1043 std::move(shell_surface));
1041 } 1044 }
1042 1045
1043 const struct wl_shell_interface shell_implementation = { 1046 const struct wl_shell_interface shell_implementation = {
1044 shell_get_shell_surface}; 1047 shell_get_shell_surface};
1045 1048
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
1491 wl_fixed_t scale) { 1494 wl_fixed_t scale) {
1492 GetUserDataAs<ShellSurface>(resource)->SetScale(wl_fixed_to_double(scale)); 1495 GetUserDataAs<ShellSurface>(resource)->SetScale(wl_fixed_to_double(scale));
1493 } 1496 }
1494 1497
1495 void remote_surface_set_rectangular_shadow(wl_client* client, 1498 void remote_surface_set_rectangular_shadow(wl_client* client,
1496 wl_resource* resource, 1499 wl_resource* resource,
1497 int32_t x, 1500 int32_t x,
1498 int32_t y, 1501 int32_t y,
1499 int32_t width, 1502 int32_t width,
1500 int32_t height) { 1503 int32_t height) {
1501 GetUserDataAs<ShellSurface>(resource)->SetRectangularShadow( 1504 ShellSurface* shell_surface = GetUserDataAs<ShellSurface>(resource);
1502 gfx::Rect(x, y, width, height)); 1505 gfx::Rect content_bounds(x, y, width, height);
1506
1507 shell_surface->SetRectangularShadowContentBounds(content_bounds);
1508 shell_surface->SetRectangularShadow(!content_bounds.IsEmpty());
1503 } 1509 }
1504 1510
1505 void remote_surface_set_rectangular_shadow_background_opacity( 1511 void remote_surface_set_rectangular_shadow_background_opacity(
1506 wl_client* client, 1512 wl_client* client,
1507 wl_resource* resource, 1513 wl_resource* resource,
1508 wl_fixed_t opacity) { 1514 wl_fixed_t opacity) {
1509 GetUserDataAs<ShellSurface>(resource)->SetRectangularShadowBackgroundOpacity( 1515 GetUserDataAs<ShellSurface>(resource)->SetRectangularShadowBackgroundOpacity(
1510 wl_fixed_to_double(opacity)); 1516 wl_fixed_to_double(opacity));
1511 } 1517 }
1512 1518
(...skipping 1591 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 DCHECK(event_loop); 3110 DCHECK(event_loop);
3105 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); 3111 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds());
3106 } 3112 }
3107 3113
3108 void Server::Flush() { 3114 void Server::Flush() {
3109 wl_display_flush_clients(wl_display_.get()); 3115 wl_display_flush_clients(wl_display_.get());
3110 } 3116 }
3111 3117
3112 } // namespace wayland 3118 } // namespace wayland
3113 } // namespace exo 3119 } // namespace exo
OLDNEW
« no previous file with comments | « components/exo/touch_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698