1 /* Copyright © 2014 Manuel Bachmann */
3 #include <linux/input.h>
9 #include "text-client-protocol.h"
10 #include "libwlmessage.h"
14 struct message_window {
15 struct window *window;
16 struct widget *widget;
17 cairo_surface_t *surface;
21 int frame_type; /* for titlebuttons */
24 cairo_surface_t *icon;
27 struct wl_list button_list;
29 struct wlmessage *wlmessage;
33 struct widget *widget;
40 struct message_window *message_window;
44 struct widget *widget;
47 struct wl_text_input *text_input;
53 struct message_window *message_window;
57 struct message_window *message_window;
58 struct wl_text_input_manager *text_input_manager;
63 /* ---------------------------------------- */
65 /* -- HELPER FUNCTIONS -- */
68 get_number_of_lines (char *text)
72 gchar **lines = g_strsplit (text, "\n", -1);
74 while ((lines[lines_num] != NULL) && (lines_num < MAX_LINES))
83 get_max_length_of_lines (char *text)
88 gchar **lines = g_strsplit (text, "\n", -1);
90 while ((lines[lines_num] != NULL) && (lines_num < MAX_LINES)) {
91 if (strlen (lines[lines_num]) > length)
92 length = strlen (lines[lines_num]);
102 get_lines (char *text)
104 gchar **lines = g_strsplit (text, "\n", -1);
109 /* ---------------------------------------- */
111 /* -- VIRTUAL KEYBOARD FUNCTIONS -- */
114 text_input_enter(void *data,
115 struct wl_text_input *text_input,
116 struct wl_surface *surface)
121 text_input_leave(void *data,
122 struct wl_text_input *text_input)
127 text_input_modifiers_map(void *data,
128 struct wl_text_input *text_input,
129 struct wl_array *map)
134 text_input_input_panel_state(void *data,
135 struct wl_text_input *text_input,
141 text_input_preedit_string(void *data,
142 struct wl_text_input *text_input,
147 struct entry *entry = data;
150 if (strlen(entry->text) >= 18)
153 /* workaround to prevent using Backspace for now */
154 if (strlen(text) < entry->last_vkb_len) {
155 entry->last_vkb_len = strlen(text);
158 entry->last_vkb_len = strlen(text);
161 new_text = malloc (strlen(entry->text) + 1 + 1);
162 strncpy (new_text, entry->text, entry->cursor_pos);
163 strcpy (new_text+entry->cursor_pos, text+(strlen(text)-1));
164 strcpy (new_text+entry->cursor_pos+1, entry->text+entry->cursor_pos);
166 entry->text = new_text;
169 widget_schedule_redraw (entry->widget);
173 text_input_preedit_styling(void *data,
174 struct wl_text_input *text_input,
182 text_input_preedit_cursor(void *data,
183 struct wl_text_input *text_input,
189 text_input_commit_string(void *data,
190 struct wl_text_input *text_input,
197 text_input_cursor_position(void *data,
198 struct wl_text_input *text_input,
205 text_input_keysym(void *data,
206 struct wl_text_input *text_input,
213 struct entry *entry = data;
216 if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
219 /* use Tab as Backspace until I figure this out */
220 if (sym == XKB_KEY_Tab) {
221 if (entry->cursor_pos != 0) {
222 new_text = malloc (strlen(entry->text));
223 strncpy (new_text, entry->text, entry->cursor_pos - 1);
224 strcpy (new_text+entry->cursor_pos-1, entry->text+entry->cursor_pos);
226 entry->text = new_text;
231 if (sym == XKB_KEY_Left) {
232 if (entry->cursor_pos != 0)
236 if (sym == XKB_KEY_Right) {
237 if (entry->cursor_pos != strlen (entry->text))
241 if (sym == XKB_KEY_Return) {
242 //fprintf (stdout, entry->text);
243 wlmessage_destroy (entry->message_window->wlmessage);
244 exit (entry->message_window->wlmessage->default_value);
247 widget_schedule_redraw (entry->widget);
251 text_input_language(void *data,
252 struct wl_text_input *text_input,
254 const char *language)
259 text_input_text_direction(void *data,
260 struct wl_text_input *text_input,
266 static const struct wl_text_input_listener text_input_listener = {
269 text_input_modifiers_map,
270 text_input_input_panel_state,
271 text_input_preedit_string,
272 text_input_preedit_styling,
273 text_input_preedit_cursor,
274 text_input_commit_string,
275 text_input_cursor_position,
279 text_input_text_direction
282 /* ---------------------------------------- */
288 entry_click_handler(struct widget *widget,
289 struct input *input, uint32_t time,
291 enum wl_pointer_button_state state, void *data)
293 struct entry *entry = data;
295 widget_schedule_redraw (widget);
297 if (state == WL_POINTER_BUTTON_STATE_PRESSED && button == BTN_LEFT) {
298 if (!entry->text_input) {
299 entry->text_input = wl_text_input_manager_create_text_input (entry->message_window->wlmessage->text_input_manager);
300 wl_text_input_add_listener (entry->text_input, &text_input_listener, entry);
303 struct wl_seat *seat = input_get_seat (input);
304 struct wl_surface *surface = window_get_wl_surface (entry->message_window->window);
305 wl_text_input_show_input_panel (entry->text_input);
306 wl_text_input_activate (entry->text_input, seat, surface);
313 entry_touch_handler(struct widget *widget, struct input *input,
314 uint32_t serial, uint32_t time, int32_t id,
315 float tx, float ty, void *data)
317 struct entry *entry = data;
319 widget_schedule_redraw (widget);
321 if (!entry->text_input) {
322 entry->text_input = wl_text_input_manager_create_text_input (entry->message_window->wlmessage->text_input_manager);
323 wl_text_input_add_listener (entry->text_input, &text_input_listener, entry);
326 struct wl_seat *seat = input_get_seat (input);
327 struct wl_surface *surface = window_get_wl_surface (entry->message_window->window);
328 wl_text_input_show_input_panel (entry->text_input);
329 wl_text_input_activate (entry->text_input, seat, surface);
335 entry_motion_handler(struct widget *widget,
336 struct input *input, uint32_t time,
337 float x, float y, void *data)
343 entry_redraw_handler (struct widget *widget, void *data)
345 struct entry *entry = data;
346 struct rectangle allocation;
348 cairo_text_extents_t extents;
349 cairo_text_extents_t leftp_extents;
353 widget_get_allocation (widget, &allocation);
355 cr = widget_cairo_create (entry->message_window->widget);
356 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
362 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
364 cairo_set_line_width (cr, 1);
371 cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
373 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
374 cairo_stroke_preserve(cr);
376 cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
377 cairo_select_font_face (cr, "sans",
378 CAIRO_FONT_SLANT_NORMAL,
379 CAIRO_FONT_WEIGHT_NORMAL);
380 cairo_set_font_size (cr, 14);
381 cairo_text_extents (cr, entry->text, &extents);
382 char_pos = strlen(entry->text) -1; /* for spaces at the end */
383 while (char_pos >= 0 && entry->text[char_pos] == ' ') {
384 extents.width += 5.0;
387 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2,
388 allocation.y + (allocation.height - extents.height)/2 + 10);
389 cairo_show_text (cr, entry->text);
392 leftp_text = malloc (entry->cursor_pos + 1);
393 strncpy (leftp_text, entry->text, entry->cursor_pos);
394 leftp_text[entry->cursor_pos] = '\0';
395 cairo_text_extents (cr, leftp_text, &leftp_extents);
396 char_pos = strlen(leftp_text) -1;
397 while (char_pos >= 0 && leftp_text[char_pos] == ' ') {
398 leftp_extents.width += 5.0;
403 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2 + leftp_extents.width,
404 allocation.y + (allocation.height - extents.height)/2 + 15);
405 cairo_line_to(cr, allocation.x + (allocation.width - extents.width)/2 + leftp_extents.width,
406 allocation.y + (allocation.height - extents.height)/2 - 5);
414 button_send_activate (struct button *button, int value)
416 if (button->message_window->entry)
417 fprintf (stdout, button->message_window->entry->text);
418 wlmessage_destroy (button->message_window->wlmessage);
423 button_click_handler(struct widget *widget,
424 struct input *input, uint32_t time,
426 enum wl_pointer_button_state state, void *data)
428 struct button *button = data;
430 widget_schedule_redraw (widget);
432 if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
436 button_send_activate (button, button->value);
441 button_touch_down_handler(struct widget *widget, struct input *input,
442 uint32_t serial, uint32_t time, int32_t id,
443 float tx, float ty, void *data)
445 struct button *button = data;
448 widget_schedule_redraw (widget);
452 button_touch_up_handler(struct widget *widget, struct input *input,
453 uint32_t serial, uint32_t time, int32_t id,
456 struct button *button = data;
459 widget_schedule_redraw (widget);
461 button_send_activate (button, button->value);
465 button_enter_handler(struct widget *widget, struct input *input,
466 float x, float y, void *data)
468 struct button *button = data;
471 widget_schedule_redraw (widget);
473 return CURSOR_LEFT_PTR;
477 button_leave_handler(struct widget *widget,
478 struct input *input, void *data)
480 struct button *button = data;
483 widget_schedule_redraw (widget);
487 button_redraw_handler (struct widget *widget, void *data)
489 struct button *button = data;
490 struct rectangle allocation;
492 cairo_text_extents_t extents;
494 widget_get_allocation (widget, &allocation);
495 if (button->pressed) {
500 cr = widget_cairo_create (button->message_window->widget);
501 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
508 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
510 cairo_set_source_rgb (cr, 0.9, 0.9, 0.9);
512 cairo_set_line_width (cr, 1);
518 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
519 cairo_stroke_preserve(cr);
520 cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
521 cairo_set_font_size (cr, 14);
522 cairo_text_extents (cr, button->caption, &extents);
523 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2,
524 allocation.y + (allocation.height - extents.height)/2 + 10);
525 cairo_show_text (cr, button->caption);
530 key_handler (struct window *window, struct input *input, uint32_t time,
531 uint32_t key, uint32_t sym, enum wl_keyboard_key_state state,
534 struct message_window *message_window = data;
535 struct entry *entry = message_window->entry;
539 if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
542 if (sym == XKB_KEY_Return || sym == XKB_KEY_KP_Enter) {
545 fprintf (stdout, entry->text);
547 wlmessage_destroy (message_window->wlmessage);
548 exit (message_window->wlmessage->default_value);
551 if (entry && entry->active) {
553 case XKB_KEY_BackSpace:
554 if (entry->cursor_pos == 0)
556 new_text = malloc (strlen(entry->text));
557 strncpy (new_text, entry->text, entry->cursor_pos - 1);
558 strcpy (new_text+entry->cursor_pos-1, entry->text+entry->cursor_pos);
560 entry->text = new_text;
564 if (entry->cursor_pos == strlen (entry->text))
566 new_text = malloc (strlen(entry->text));
567 strncpy (new_text, entry->text, entry->cursor_pos);
568 strcpy (new_text+entry->cursor_pos, entry->text+entry->cursor_pos+1);
570 entry->text = new_text;
573 if (entry->cursor_pos != 0)
577 if (entry->cursor_pos != strlen (entry->text))
583 if (strlen(entry->text) >= 18)
585 if (xkb_keysym_to_utf8 (sym, text, sizeof(text)) <= 0)
587 if (strlen(text) > 1) /* dismiss non-ASCII characters for now */
589 new_text = malloc (strlen(entry->text) + strlen(text) + 1);
590 strncpy (new_text, entry->text, entry->cursor_pos);
591 strcpy (new_text+entry->cursor_pos, text);
592 strcpy (new_text+entry->cursor_pos+strlen(text), entry->text+entry->cursor_pos);
594 entry->text = new_text;
597 widget_schedule_redraw(entry->widget);
602 resize_handler (struct widget *widget, int32_t width, int32_t height, void *data)
604 struct message_window *message_window = data;
606 struct button *button;
607 struct rectangle allocation;
608 int buttons_width, extended_width;
611 widget_get_allocation (widget, &allocation);
613 x = allocation.x + (width - 240)/2;
615 if (message_window->entry) {
616 entry = message_window->entry;
617 widget_set_allocation (entry->widget, x, allocation.y + height - 16*2 - 32*2,
622 wl_list_for_each (button, &message_window->button_list, link) {
623 extended_width = strlen(button->caption) - 5;
624 if (extended_width < 0) extended_width = 0;
625 buttons_width += 60 + extended_width*10;
628 x = allocation.x + (width - buttons_width)/2
629 - (message_window->buttons_nb-1)*10;
631 wl_list_for_each (button, &message_window->button_list, link) {
632 extended_width = strlen(button->caption) - 5;
633 if (extended_width < 0) extended_width = 0;
634 widget_set_allocation (button->widget, x, allocation.y + height - 16 - 32,
635 60 + extended_width*10, 32);
636 x += 60 + extended_width*10 + 10;
641 redraw_handler (struct widget *widget, void *data)
643 struct message_window *message_window = data;
644 struct rectangle allocation;
645 cairo_surface_t *surface;
647 cairo_text_extents_t extents;
651 widget_get_allocation (message_window->widget, &allocation);
653 surface = window_get_surface (message_window->window);
654 cr = cairo_create (surface);
655 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
661 cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 1.0);
664 if (message_window->icon) {
665 cairo_set_source_surface (cr, message_window->icon,
666 allocation.x + (allocation.width - 64.0)/2,
668 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
670 cairo_set_source_surface (cr, surface, 0.0, 0.0);
673 cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
674 cairo_select_font_face (cr, "sans",
675 CAIRO_FONT_SLANT_NORMAL,
676 CAIRO_FONT_WEIGHT_NORMAL);
677 cairo_set_font_size (cr, 18);
679 lines_nb = get_number_of_lines (message_window->message);
680 lines = get_lines (message_window->message);
683 for (i = 0; i < lines_nb; i++) {
684 cairo_text_extents (cr, lines[i], &extents);
685 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2,
686 allocation.y + (allocation.height - lines_nb * extents.height)/2
687 + i*(extents.height+10)
688 + (!message_window->icon ? 0 : 32)
689 - (!message_window->entry ? 0 : 32)
690 - (!message_window->buttons_nb ? 0 : 32));
691 cairo_show_text (cr, lines[i]);
700 global_handler(struct display *display, uint32_t name,
701 const char *interface, uint32_t version, void *data)
703 struct wlmessage *wlmessage = data;
705 if (!strcmp(interface, "wl_text_input_manager")) {
706 wlmessage->text_input_manager = display_bind (display, name,
707 &wl_text_input_manager_interface, 1);
711 /* ---------------------------------------- */
714 wlmessage_set_title (struct wlmessage *wlmessage, char *title)
716 if ((!wlmessage) || (!title))
719 struct message_window *message_window = wlmessage->message_window;
721 if (message_window->title)
722 free (message_window->title);
724 message_window->title = strdup (title);
728 wlmessage_get_title (struct wlmessage *wlmessage)
733 struct message_window *message_window = wlmessage->message_window;
735 return message_window->title;
739 wlmessage_set_titlebuttons (struct wlmessage *wlmessage, enum wlmessage_titlebutton titlebuttons)
744 struct message_window *message_window = wlmessage->message_window;
746 message_window->frame_type = FRAME_NONE;
748 if (titlebuttons && WLMESSAGE_TITLEBUTTON_MINIMIZE)
749 message_window->frame_type = message_window->frame_type | FRAME_MINIMIZE;
750 if (titlebuttons && WLMESSAGE_TITLEBUTTON_MAXIMIZE)
751 message_window->frame_type = message_window->frame_type | FRAME_MAXIMIZE;
752 if (titlebuttons && WLMESSAGE_TITLEBUTTON_CLOSE)
753 message_window->frame_type = message_window->frame_type | FRAME_CLOSE;
756 enum wlmessage_titlebutton
757 wlmessage_get_titlebuttons (struct wlmessage *wlmessage)
762 struct message_window *message_window = wlmessage->message_window;
763 enum wlmessage_titlebutton titlebuttons;
765 titlebuttons = WLMESSAGE_TITLEBUTTON_NONE;
767 if (message_window->frame_type && FRAME_MINIMIZE)
768 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_MINIMIZE;
769 if (message_window->frame_type && FRAME_MAXIMIZE)
770 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_MAXIMIZE;
771 if (message_window->frame_type && FRAME_CLOSE)
772 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_CLOSE;
778 wlmessage_set_noresize (struct wlmessage *wlmessage, unsigned int not_resizable)
783 struct message_window *message_window = wlmessage->message_window;
785 message_window->resizable = !not_resizable;
789 wlmessage_get_noresize (struct wlmessage *wlmessage)
794 struct message_window *message_window = wlmessage->message_window;
796 return !message_window->resizable;
800 wlmessage_set_icon (struct wlmessage *wlmessage, char *icon_path)
802 if ((!wlmessage) || (!icon_path))
805 struct message_window *message_window = wlmessage->message_window;
806 cairo_surface_t *icon;
807 cairo_status_t status;
809 icon = cairo_image_surface_create_from_png (icon_path);
810 status = cairo_surface_status (icon);
812 if (status == CAIRO_STATUS_SUCCESS) {
813 message_window->icon = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 64, 64);
814 cairo_t *icon_cr = cairo_create (message_window->icon);
815 /* rescale to 64x64 */
816 int width = cairo_image_surface_get_width (icon);
817 int height = cairo_image_surface_get_height (icon);
818 if (width != height != 64) {
819 double ratio = ((64.0/width) < (64.0/height) ? (64.0/width) : (64.0/height));
820 cairo_scale (icon_cr, ratio, ratio);
822 cairo_set_source_surface (icon_cr, icon, 0.0, 0.0);
823 cairo_paint (icon_cr);
824 cairo_destroy (icon_cr);
825 cairo_surface_destroy (icon);
831 wlmessage_set_message (struct wlmessage *wlmessage, char *message)
833 if ((!wlmessage) || (!message))
836 struct message_window *message_window = wlmessage->message_window;
838 if (message_window->message)
839 free (message_window->message);
841 message_window->message = strdup (message);
845 wlmessage_get_message (struct wlmessage *wlmessage)
850 struct message_window *message_window = wlmessage->message_window;
852 return message_window->message;
856 wlmessage_set_message_file (struct wlmessage *wlmessage, char *file_path)
858 if ((!wlmessage) || (!file_path))
861 struct message_window *message_window = wlmessage->message_window;
866 file = fopen (file_path, "r");
871 text = malloc (sizeof(char));
875 realloc (text, (i+1)*sizeof(char));
880 realloc (text, (i+1)*sizeof(char));
885 if (message_window->message)
886 free (message_window->message);
888 message_window->message = text;
892 wlmessage_add_button (struct wlmessage *wlmessage, int index, char *caption)
894 if ((!wlmessage) || (!caption))
897 struct message_window *message_window = wlmessage->message_window;
898 struct button *button;
900 button = xzalloc (sizeof *button);
901 button->caption = strdup (caption);
902 button->value = index;
903 button->message_window = message_window;
905 message_window->buttons_nb++;
906 wl_list_insert (message_window->button_list.prev, &button->link);
910 wlmessage_delete_button (struct wlmessage *wlmessage, int index)
915 struct message_window *message_window = wlmessage->message_window;
917 struct button *button, *tmp;
918 wl_list_for_each_safe (button, tmp, &message_window->button_list, link) {
919 if (button->value == index) {
920 wl_list_remove (&button->link);
921 widget_destroy (button->widget);
922 free (button->caption);
924 message_window->buttons_nb--;
930 wlmessage_set_default_button (struct wlmessage *wlmessage, int index)
935 struct message_window *message_window = wlmessage->message_window;
936 struct button *button;
938 wl_list_for_each (button, &message_window->button_list, link) {
939 if (button->value == index)
940 wlmessage->default_value = button->value;
945 wlmessage_set_textfield (struct wlmessage *wlmessage, char *default_text)
947 if ((!wlmessage) || (!default_text))
950 struct message_window *message_window = wlmessage->message_window;
953 entry = xzalloc (sizeof *entry);
954 entry->text = strdup (default_text);
955 entry->cursor_pos = strlen (entry->text);
956 entry->cursor_anchor = entry->cursor_pos;
957 entry->last_vkb_len = 0;
959 entry->message_window = message_window;
961 message_window->entry = entry;
965 wlmessage_get_textfield (struct wlmessage *wlmessage)
970 struct message_window *message_window = wlmessage->message_window;
972 if (!message_window->entry)
975 return message_window->entry->text;
979 wlmessage_set_timeout (struct wlmessage *wlmessage, unsigned int timeout)
984 wlmessage->timeout = timeout;
988 wlmessage_get_timeout (struct wlmessage *wlmessage)
993 return wlmessage->timeout;
997 wlmessage_show (struct wlmessage *wlmessage, char **input_text)
1002 struct message_window *message_window = wlmessage->message_window;
1003 struct display *display = NULL;
1004 struct entry *entry;
1005 struct button *button;
1006 int extended_width = 0;
1009 display = display_create (NULL, NULL);
1011 fprintf (stderr, "Failed to connect to a Wayland compositor !\n");
1015 if (wlmessage->timeout)
1016 display_set_timeout (display, wlmessage->timeout);
1018 message_window->window = window_create (display);
1019 message_window->widget = window_frame_create (message_window->window,
1020 message_window->frame_type,
1021 message_window->resizable, message_window);
1022 window_set_title (message_window->window, message_window->title);
1025 if (message_window->entry) {
1026 entry = message_window->entry;
1027 entry->widget = widget_add_widget (message_window->widget, entry);
1028 widget_set_redraw_handler (entry->widget, entry_redraw_handler);
1029 widget_set_motion_handler (entry->widget, entry_motion_handler);
1030 widget_set_button_handler (entry->widget, entry_click_handler);
1031 widget_set_touch_down_handler (entry->widget, entry_touch_handler);
1035 wl_list_for_each (button, &message_window->button_list, link) {
1036 button->widget = widget_add_widget (message_window->widget, button);
1037 widget_set_redraw_handler (button->widget, button_redraw_handler);
1038 widget_set_enter_handler (button->widget, button_enter_handler);
1039 widget_set_leave_handler (button->widget, button_leave_handler);
1040 widget_set_button_handler (button->widget, button_click_handler);
1041 widget_set_touch_down_handler (button->widget, button_touch_down_handler);
1042 widget_set_touch_up_handler (button->widget, button_touch_up_handler);
1045 extended_width = (get_max_length_of_lines (message_window->message)) - 35;
1046 if (extended_width < 0) extended_width = 0;
1047 lines_nb = get_number_of_lines (message_window->message);
1049 window_set_user_data (message_window->window, message_window);
1050 window_set_key_handler (message_window->window, key_handler);
1051 widget_set_redraw_handler (message_window->widget, redraw_handler);
1052 widget_set_resize_handler (message_window->widget, resize_handler);
1054 window_schedule_resize (message_window->window,
1055 480 + extended_width*10,
1056 280 + lines_nb*16 + (!message_window->entry ? 0 : 1)*32
1057 + (!message_window->buttons_nb ? 0 : 1)*32);
1059 display_set_user_data (display, wlmessage);
1060 display_set_global_handler (display, global_handler);
1061 display_run (display);
1069 struct wlmessage *wlmessage;
1071 wlmessage = xzalloc (sizeof *wlmessage);
1072 wlmessage->default_value = 0;
1073 wlmessage->timeout = 0;
1075 wlmessage->message_window = xzalloc (sizeof *wlmessage->message_window);
1076 wlmessage->message_window->title = strdup ("wlmessage");
1077 wlmessage->message_window->frame_type = FRAME_ALL;
1078 wlmessage->message_window->resizable = 1;
1079 wlmessage->message_window->icon = NULL;
1080 wlmessage->message_window->message = NULL;
1081 wlmessage->message_window->entry = NULL;
1082 wlmessage->message_window->buttons_nb = 0;
1083 wl_list_init (&wlmessage->message_window->button_list);
1084 wlmessage->message_window->wlmessage = wlmessage;
1090 wlmessage_destroy (struct wlmessage *wlmessage)
1095 struct message_window *message_window = wlmessage->message_window;
1097 if (message_window->surface)
1098 cairo_surface_destroy (message_window->surface);
1099 if (message_window->icon)
1100 cairo_surface_destroy (message_window->icon);
1101 widget_destroy (message_window->widget);
1102 window_destroy (message_window->window);
1103 free (message_window->title);
1104 free (message_window->message);
1105 free (message_window);
1110 /* ---------------------------------------- */