Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
orbea
wayland
Commits
3d76e652
Commit
3d76e652
authored
Dec 06, 2010
by
Kristian Høgsberg
Browse files
Use the per-surface destroy callback for grabs as well
parent
ab8475ca
Changes
3
Hide whitespace changes
Inline
Side-by-side
compositor/compositor.c
View file @
3d76e652
...
...
@@ -165,9 +165,6 @@ destroy_surface(struct wl_resource *resource, struct wl_client *client)
wl_list_remove
(
&
surface
->
link
);
glDeleteTextures
(
1
,
&
surface
->
texture
);
wl_list_for_each
(
l
,
&
compositor
->
surface_destroy_listener_list
,
link
)
l
->
func
(
l
,
&
surface
->
surface
);
wl_list_for_each_safe
(
l
,
next
,
&
surface
->
surface
.
destroy_listener_list
,
link
)
l
->
func
(
l
,
&
surface
->
surface
);
...
...
@@ -567,23 +564,18 @@ shell_resize(struct wl_client *client, struct wl_shell *shell,
wlsc_input_device_set_pointer_image
(
wd
,
pointer
);
}
struct
wlsc_drag
{
struct
wl_drag
drag
;
struct
wl_listener
listener
;
};
static
void
wl_drag_set_pointer_focus
(
struct
wl_drag
*
drag
,
struct
wl
sc
_surface
*
surface
,
uint32_t
time
,
struct
wl_surface
*
surface
,
uint32_t
time
,
int32_t
x
,
int32_t
y
,
int32_t
sx
,
int32_t
sy
);
static
void
destroy_drag
(
struct
wl_resource
*
resource
,
struct
wl_client
*
client
)
{
struct
wl
sc
_drag
*
drag
=
container_of
(
resource
,
struct
wl
sc
_drag
,
drag
.
resource
);
struct
wl_drag
*
drag
=
container_of
(
resource
,
struct
wl_drag
,
resource
);
wl_list_remove
(
&
drag
->
listener
.
link
);
wl_list_remove
(
&
drag
->
drag_focus_
listener
.
link
);
free
(
drag
);
}
...
...
@@ -594,22 +586,20 @@ static void
drag_handle_surface_destroy
(
struct
wl_listener
*
listener
,
struct
wl_surface
*
surface
)
{
struct
wl
sc
_drag
*
drag
=
container_of
(
listener
,
struct
wl
sc
_drag
,
listener
);
struct
wl_drag
*
drag
=
container_of
(
listener
,
struct
wl_drag
,
drag_focus_
listener
);
uint32_t
time
=
wl_display_get_time
(
wl_client_get_display
(
surface
->
client
));
if
(
drag
->
drag
.
pointer
_focus
==
surface
)
wl_drag_set_pointer_focus
(
&
drag
->
drag
,
NULL
,
time
,
0
,
0
,
0
,
0
);
if
(
drag
->
drag_focus
==
surface
)
wl_drag_set_pointer_focus
(
drag
,
NULL
,
time
,
0
,
0
,
0
,
0
);
}
static
void
shell_create_drag
(
struct
wl_client
*
client
,
struct
wl_shell
*
shell
,
uint32_t
id
)
{
struct
wlsc_drag
*
drag
;
struct
wlsc_compositor
*
ec
=
container_of
(
shell
,
struct
wlsc_compositor
,
shell
);
struct
wl_drag
*
drag
;
drag
=
malloc
(
sizeof
*
drag
);
if
(
drag
==
NULL
)
{
...
...
@@ -618,18 +608,17 @@ shell_create_drag(struct wl_client *client,
}
memset
(
drag
,
0
,
sizeof
*
drag
);
drag
->
drag
.
resource
.
object
.
id
=
id
;
drag
->
drag
.
resource
.
object
.
interface
=
&
wl_drag_interface
;
drag
->
drag
.
resource
.
object
.
implementation
=
drag
->
resource
.
object
.
id
=
id
;
drag
->
resource
.
object
.
interface
=
&
wl_drag_interface
;
drag
->
resource
.
object
.
implementation
=
(
void
(
**
)(
void
))
&
drag_interface
;
drag
->
drag
.
resource
.
destroy
=
destroy_drag
;
drag
->
resource
.
destroy
=
destroy_drag
;
drag
->
listener
.
func
=
drag_handle_surface_destroy
;
wl_list_insert
(
ec
->
surface_destroy_listener_list
.
prev
,
&
drag
->
listener
.
link
);
drag
->
drag_focus_listener
.
func
=
drag_handle_surface_destroy
;
wl_list_init
(
&
drag
->
drag_focus_listener
.
link
);
wl_client_add_resource
(
client
,
&
drag
->
drag
.
resource
);
wl_client_add_resource
(
client
,
&
drag
->
resource
);
}
const
static
struct
wl_shell_interface
shell_interface
=
{
...
...
@@ -795,7 +784,7 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
case
WLSC_DEVICE_GRAB_DRAG
:
es
=
pick_surface
(
device
,
&
sx
,
&
sy
);
wl_drag_set_pointer_focus
(
device
->
drag
,
es
,
time
,
x
,
y
,
sx
,
sy
);
&
es
->
surface
,
time
,
x
,
y
,
sx
,
sy
);
if
(
es
)
wl_client_post_event
(
es
->
surface
.
client
,
&
device
->
drag
->
drag_offer
.
object
,
...
...
@@ -983,46 +972,51 @@ const static struct wl_input_device_interface input_device_interface = {
static
void
wl_drag_set_pointer_focus
(
struct
wl_drag
*
drag
,
struct
wl
sc
_surface
*
surface
,
uint32_t
time
,
struct
wl_surface
*
surface
,
uint32_t
time
,
int32_t
x
,
int32_t
y
,
int32_t
sx
,
int32_t
sy
)
{
char
**
p
,
**
end
;
if
(
drag
->
pointer
_focus
==
&
surface
->
surface
)
if
(
drag
->
drag
_focus
==
surface
)
return
;
if
(
drag
->
pointer
_focus
&&
(
!
surface
||
drag
->
pointer
_focus
->
client
!=
surface
->
surface
.
client
))
wl_client_post_event
(
drag
->
pointer
_focus
->
client
,
if
(
drag
->
drag
_focus
&&
(
!
surface
||
drag
->
drag
_focus
->
client
!=
surface
->
client
))
wl_client_post_event
(
drag
->
drag
_focus
->
client
,
&
drag
->
drag_offer
.
object
,
WL_DRAG_OFFER_POINTER_FOCUS
,
time
,
NULL
,
0
,
0
,
0
,
0
);
if
(
surface
&&
(
!
drag
->
pointer
_focus
||
drag
->
pointer
_focus
->
client
!=
surface
->
surface
.
client
))
{
wl_client_post_global
(
surface
->
surface
.
client
,
(
!
drag
->
drag
_focus
||
drag
->
drag
_focus
->
client
!=
surface
->
client
))
{
wl_client_post_global
(
surface
->
client
,
&
drag
->
drag_offer
.
object
);
end
=
drag
->
types
.
data
+
drag
->
types
.
size
;
for
(
p
=
drag
->
types
.
data
;
p
<
end
;
p
++
)
wl_client_post_event
(
surface
->
surface
.
client
,
wl_client_post_event
(
surface
->
client
,
&
drag
->
drag_offer
.
object
,
WL_DRAG_OFFER_OFFER
,
*
p
);
}
if
(
surface
)
{
wl_client_post_event
(
surface
->
surface
.
client
,
wl_client_post_event
(
surface
->
client
,
&
drag
->
drag_offer
.
object
,
WL_DRAG_OFFER_POINTER_FOCUS
,
time
,
&
surface
->
surface
,
time
,
surface
,
x
,
y
,
sx
,
sy
);
}
drag
->
pointer
_focus
=
&
surface
->
surface
;
drag
->
drag
_focus
=
surface
;
drag
->
pointer_focus_time
=
time
;
drag
->
target
=
NULL
;
wl_list_remove
(
&
drag
->
drag_focus_listener
.
link
);
if
(
surface
)
wl_list_insert
(
surface
->
destroy_listener_list
.
prev
,
&
drag
->
drag_focus_listener
.
link
);
}
static
void
...
...
@@ -1120,7 +1114,7 @@ drag_activate(struct wl_client *client,
device
->
drag
=
drag
;
target
=
pick_surface
(
device
,
&
sx
,
&
sy
);
wl_drag_set_pointer_focus
(
device
->
drag
,
target
,
time
,
wl_drag_set_pointer_focus
(
device
->
drag
,
&
target
->
surface
,
time
,
device
->
x
,
device
->
y
,
sx
,
sy
);
}
...
...
@@ -1388,7 +1382,6 @@ wlsc_compositor_init(struct wlsc_compositor *ec, struct wl_display *display)
wl_list_init
(
&
ec
->
surface_list
);
wl_list_init
(
&
ec
->
input_device_list
);
wl_list_init
(
&
ec
->
output_list
);
wl_list_init
(
&
ec
->
surface_destroy_listener_list
);
create_pointer_images
(
ec
);
...
...
compositor/compositor.h
View file @
3d76e652
...
...
@@ -147,8 +147,6 @@ struct wlsc_compositor {
struct
wl_list
input_device_list
;
struct
wl_list
surface_list
;
struct
wl_list
surface_destroy_listener_list
;
/* Repaint state. */
struct
wl_event_source
*
timer_source
;
int
repaint_needed
;
...
...
wayland/wayland-server.h
View file @
3d76e652
...
...
@@ -158,13 +158,14 @@ struct wl_drag {
struct
wl_resource
resource
;
struct
wl_drag_offer
drag_offer
;
struct
wl_surface
*
source
;
struct
wl_surface
*
pointer
_focus
;
struct
wl_surface
*
drag
_focus
;
struct
wl_client
*
target
;
int32_t
x
,
y
,
sx
,
sy
;
struct
wl_input_device
*
input_device
;
struct
wl_array
types
;
const
char
*
type
;
uint32_t
pointer_focus_time
;
struct
wl_listener
drag_focus_listener
;
};
void
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment