present_notify.c revision 35c4bbdf
1/* 2 * Copyright © 2013 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that copyright 7 * notice and this permission notice appear in supporting documentation, and 8 * that the name of the copyright holders not be used in advertising or 9 * publicity pertaining to distribution of the software without specific, 10 * written prior permission. The copyright holders make no representations 11 * about the suitability of this software for any purpose. It is provided "as 12 * is" without express or implied warranty. 13 * 14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 * OF THIS SOFTWARE. 21 */ 22 23#ifdef HAVE_XORG_CONFIG_H 24#include <xorg-config.h> 25#endif 26 27#include "present_priv.h" 28 29/* 30 * Mark all pending notifies for 'window' as invalid when 31 * the window is destroyed 32 */ 33 34void 35present_clear_window_notifies(WindowPtr window) 36{ 37 present_notify_ptr notify; 38 present_window_priv_ptr window_priv = present_window_priv(window); 39 40 if (!window_priv) 41 return; 42 43 xorg_list_for_each_entry(notify, &window_priv->notifies, window_list) { 44 notify->window = NULL; 45 } 46} 47 48/* 49 * 'notify' is being freed; remove it from the window's notify list 50 */ 51 52void 53present_free_window_notify(present_notify_ptr notify) 54{ 55 xorg_list_del(¬ify->window_list); 56} 57 58/* 59 * 'notify' is new; add it to the specified window 60 */ 61 62int 63present_add_window_notify(present_notify_ptr notify) 64{ 65 WindowPtr window = notify->window; 66 present_window_priv_ptr window_priv = present_get_window_priv(window, TRUE); 67 68 if (!window_priv) 69 return BadAlloc; 70 71 xorg_list_add(¬ify->window_list, &window_priv->notifies); 72 return Success; 73} 74 75int 76present_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_notifies, present_notify_ptr *p_notifies) 77{ 78 present_notify_ptr notifies; 79 int i; 80 int added = 0; 81 int status; 82 83 notifies = calloc (num_notifies, sizeof (present_notify_rec)); 84 if (!notifies) 85 return BadAlloc; 86 87 for (i = 0; i < num_notifies; i++) { 88 status = dixLookupWindow(¬ifies[i].window, x_notifies[i].window, client, DixGetAttrAccess); 89 if (status != Success) 90 goto bail; 91 92 notifies[i].serial = x_notifies[i].serial; 93 status = present_add_window_notify(¬ifies[i]); 94 if (status != Success) 95 goto bail; 96 97 added = i; 98 } 99 return Success; 100 101bail: 102 present_destroy_notifies(notifies, added); 103 return status; 104} 105 106void 107present_destroy_notifies(present_notify_ptr notifies, int num_notifies) 108{ 109 int i; 110 for (i = 0; i < num_notifies; i++) 111 present_free_window_notify(¬ifies[i]); 112 113 free(notifies); 114} 115