1 /* Copyright (C) 2010-2020 The RetroArch team 2 * 3 * --------------------------------------------------------------------------------------- 4 * The following license statement only applies to this file (message_queue.h). 5 * --------------------------------------------------------------------------------------- 6 * 7 * Permission is hereby granted, free of charge, 8 * to any person obtaining a copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation the rights to 10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, 11 * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 16 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 19 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 23 #ifndef __LIBRETRO_SDK_MSG_QUEUE_H 24 #define __LIBRETRO_SDK_MSG_QUEUE_H 25 26 #include <stddef.h> 27 28 #include <retro_common_api.h> 29 #include <boolean.h> 30 31 RETRO_BEGIN_DECLS 32 33 enum message_queue_icon 34 { 35 MESSAGE_QUEUE_ICON_DEFAULT = 0 /* default icon is tied to category */ 36 }; 37 38 enum message_queue_category 39 { 40 MESSAGE_QUEUE_CATEGORY_INFO = 0, 41 MESSAGE_QUEUE_CATEGORY_ERROR, 42 MESSAGE_QUEUE_CATEGORY_WARNING, 43 MESSAGE_QUEUE_CATEGORY_SUCCESS 44 }; 45 46 typedef struct queue_elem 47 { 48 char *msg; 49 char *title; 50 unsigned duration; 51 unsigned prio; 52 enum message_queue_icon icon; 53 enum message_queue_category category; 54 } queue_elem_t; 55 56 typedef struct msg_queue 57 { 58 char *tmp_msg; 59 queue_elem_t **elems; 60 size_t ptr; 61 size_t size; 62 } msg_queue_t; 63 64 typedef struct 65 { 66 unsigned duration; 67 unsigned prio; 68 enum message_queue_icon icon; 69 enum message_queue_category category; 70 char msg[1024]; 71 char title[1024]; 72 } msg_queue_entry_t; 73 74 /** 75 * msg_queue_new: 76 * @size : maximum size of message 77 * 78 * Creates a message queue with maximum size different messages. 79 * 80 * Returns: NULL if allocation error, pointer to a message queue 81 * if successful. Has to be freed manually. 82 **/ 83 msg_queue_t *msg_queue_new(size_t size); 84 85 bool msg_queue_initialize(msg_queue_t *queue, size_t size); 86 87 /** 88 * msg_queue_push: 89 * @queue : pointer to queue object 90 * @msg : message to add to the queue 91 * @prio : priority level of the message 92 * @duration : how many times the message can be pulled 93 * before it vanishes (E.g. show a message for 94 * 3 seconds @ 60fps = 180 duration). 95 * 96 * Push a new message onto the queue. 97 **/ 98 void msg_queue_push(msg_queue_t *queue, const char *msg, 99 unsigned prio, unsigned duration, 100 char *title, 101 enum message_queue_icon icon, enum message_queue_category category); 102 103 /** 104 * msg_queue_pull: 105 * @queue : pointer to queue object 106 * 107 * Pulls highest priority message in queue. 108 * 109 * Returns: NULL if no message in queue, otherwise a string 110 * containing the message. 111 **/ 112 const char *msg_queue_pull(msg_queue_t *queue); 113 114 /** 115 * msg_queue_extract: 116 * @queue : pointer to queue object 117 * @queue_entry : pointer to external queue entry struct 118 * 119 * Removes highest priority message from queue, copying 120 * contents into queue_entry struct. 121 * 122 * Returns: false if no messages in queue, otherwise true 123 **/ 124 bool msg_queue_extract(msg_queue_t *queue, msg_queue_entry_t *queue_entry); 125 126 /** 127 * msg_queue_size: 128 * @queue : pointer to queue object 129 * 130 * Fetches number of messages in queue. 131 * 132 * Returns: Number of messages in queue. 133 **/ 134 size_t msg_queue_size(msg_queue_t *queue); 135 136 /** 137 * msg_queue_clear: 138 * @queue : pointer to queue object 139 * 140 * Clears out everything in the queue. 141 **/ 142 void msg_queue_clear(msg_queue_t *queue); 143 144 /** 145 * msg_queue_free: 146 * @queue : pointer to queue object 147 * 148 * Frees message queue.. 149 **/ 150 void msg_queue_free(msg_queue_t *queue); 151 152 bool msg_queue_deinitialize(msg_queue_t *queue); 153 154 RETRO_END_DECLS 155 156 #endif 157