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 */
23 cairo_surface_t *icon;
26 struct wl_list button_list;
28 struct wlmessage *wlmessage;
32 struct widget *widget;
39 struct message_window *message_window;
43 struct widget *widget;
46 struct wl_text_input *text_input;
52 struct message_window *message_window;
56 struct display *display;
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);
75 while ((lines[lines_num] != NULL) && (lines_num < MAX_LINES))
84 get_max_length_of_lines (char *text)
89 gchar **lines = g_strsplit (text, "\n", -1);
92 while ((lines[lines_num] != NULL) && (lines_num < MAX_LINES)) {
93 if (strlen (lines[lines_num]) > length)
94 length = strlen (lines[lines_num]);
104 get_lines (char *text)
106 gchar **lines = g_strsplit (text, "\n", -1);
111 /* ---------------------------------------- */
113 /* -- VIRTUAL KEYBOARD FUNCTIONS -- */
116 text_input_enter(void *data,
117 struct wl_text_input *text_input,
118 struct wl_surface *surface)
123 text_input_leave(void *data,
124 struct wl_text_input *text_input)
129 text_input_modifiers_map(void *data,
130 struct wl_text_input *text_input,
131 struct wl_array *map)
136 text_input_input_panel_state(void *data,
137 struct wl_text_input *text_input,
143 text_input_preedit_string(void *data,
144 struct wl_text_input *text_input,
149 struct entry *entry = data;
152 if (strlen(entry->text) >= 18)
155 /* workaround to prevent using Backspace for now */
156 if (strlen(text) < entry->last_vkb_len) {
157 entry->last_vkb_len = strlen(text);
160 entry->last_vkb_len = strlen(text);
163 new_text = malloc (strlen(entry->text) + 1 + 1);
164 strncpy (new_text, entry->text, entry->cursor_pos);
165 strcpy (new_text+entry->cursor_pos, text+(strlen(text)-1));
166 strcpy (new_text+entry->cursor_pos+1, entry->text+entry->cursor_pos);
168 entry->text = new_text;
171 widget_schedule_redraw (entry->widget);
175 text_input_preedit_styling(void *data,
176 struct wl_text_input *text_input,
184 text_input_preedit_cursor(void *data,
185 struct wl_text_input *text_input,
191 text_input_commit_string(void *data,
192 struct wl_text_input *text_input,
199 text_input_cursor_position(void *data,
200 struct wl_text_input *text_input,
207 text_input_keysym(void *data,
208 struct wl_text_input *text_input,
215 struct entry *entry = data;
218 if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
221 /* use Tab as Backspace until I figure this out */
222 if (sym == XKB_KEY_Tab) {
223 if (entry->cursor_pos != 0) {
224 new_text = malloc (strlen(entry->text));
225 strncpy (new_text, entry->text, entry->cursor_pos - 1);
226 strcpy (new_text+entry->cursor_pos-1, entry->text+entry->cursor_pos);
228 entry->text = new_text;
233 if (sym == XKB_KEY_Left) {
234 if (entry->cursor_pos != 0)
238 if (sym == XKB_KEY_Right) {
239 if (entry->cursor_pos != strlen (entry->text))
243 if (sym == XKB_KEY_Return) {
244 display_exit (entry->message_window->wlmessage->display);
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)
416 button->message_window->wlmessage->return_value = button->value;
418 display_exit (button->message_window->wlmessage->display);
422 button_click_handler(struct widget *widget,
423 struct input *input, uint32_t time,
425 enum wl_pointer_button_state state, void *data)
427 struct button *button = data;
429 widget_schedule_redraw (widget);
431 if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
435 button_send_activate (button);
440 button_touch_down_handler(struct widget *widget, struct input *input,
441 uint32_t serial, uint32_t time, int32_t id,
442 float tx, float ty, void *data)
444 struct button *button = data;
447 widget_schedule_redraw (widget);
451 button_touch_up_handler(struct widget *widget, struct input *input,
452 uint32_t serial, uint32_t time, int32_t id,
455 struct button *button = data;
458 widget_schedule_redraw (widget);
460 button_send_activate (button);
464 button_enter_handler(struct widget *widget, struct input *input,
465 float x, float y, void *data)
467 struct button *button = data;
470 widget_schedule_redraw (widget);
472 return CURSOR_LEFT_PTR;
476 button_leave_handler(struct widget *widget,
477 struct input *input, void *data)
479 struct button *button = data;
482 widget_schedule_redraw (widget);
486 button_redraw_handler (struct widget *widget, void *data)
488 struct button *button = data;
489 struct rectangle allocation;
491 cairo_text_extents_t extents;
493 widget_get_allocation (widget, &allocation);
494 if (button->pressed) {
499 cr = widget_cairo_create (button->message_window->widget);
500 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
507 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
509 cairo_set_source_rgb (cr, 0.9, 0.9, 0.9);
511 cairo_set_line_width (cr, 1);
517 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
518 cairo_stroke_preserve(cr);
519 cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
520 cairo_set_font_size (cr, 14);
521 cairo_text_extents (cr, button->caption, &extents);
522 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2,
523 allocation.y + (allocation.height - extents.height)/2 + 10);
524 cairo_show_text (cr, button->caption);
529 keyboard_focus_handler(struct window *window, struct input *input, void *data)
531 struct message_window *message_window = data;
533 window_schedule_redraw(message_window->window);
537 key_handler (struct window *window, struct input *input, uint32_t time,
538 uint32_t key, uint32_t sym, enum wl_keyboard_key_state state,
541 struct message_window *message_window = data;
542 struct entry *entry = message_window->entry;
546 if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
549 if (sym == XKB_KEY_Return || sym == XKB_KEY_KP_Enter)
550 display_exit (message_window->wlmessage->display);
552 if (entry && entry->active) {
554 case XKB_KEY_BackSpace:
555 if (entry->cursor_pos == 0)
557 new_text = malloc (strlen(entry->text));
558 strncpy (new_text, entry->text, entry->cursor_pos - 1);
559 strcpy (new_text+entry->cursor_pos-1, entry->text+entry->cursor_pos);
561 entry->text = new_text;
565 if (entry->cursor_pos == strlen (entry->text))
567 new_text = malloc (strlen(entry->text));
568 strncpy (new_text, entry->text, entry->cursor_pos);
569 strcpy (new_text+entry->cursor_pos, entry->text+entry->cursor_pos+1);
571 entry->text = new_text;
574 if (entry->cursor_pos != 0)
578 if (entry->cursor_pos != strlen (entry->text))
584 if (strlen(entry->text) >= 18)
586 if (xkb_keysym_to_utf8 (sym, text, sizeof(text)) <= 0)
588 if (strlen(text) > 1) /* dismiss non-ASCII characters for now */
590 new_text = malloc (strlen(entry->text) + strlen(text) + 1);
591 strncpy (new_text, entry->text, entry->cursor_pos);
592 strcpy (new_text+entry->cursor_pos, text);
593 strcpy (new_text+entry->cursor_pos+strlen(text), entry->text+entry->cursor_pos);
595 entry->text = new_text;
598 widget_schedule_redraw(entry->widget);
603 resize_handler (struct widget *widget, int32_t width, int32_t height, void *data)
605 struct message_window *message_window = data;
607 struct button *button;
608 struct rectangle allocation;
609 int buttons_width, extended_width;
612 widget_get_allocation (widget, &allocation);
614 x = allocation.x + (width - 240)/2;
616 if (message_window->entry) {
617 entry = message_window->entry;
618 widget_set_allocation (entry->widget, x, allocation.y + height - 16*2 - 32*2,
623 wl_list_for_each (button, &message_window->button_list, link) {
624 extended_width = strlen(button->caption) - 5;
625 if (extended_width < 0) extended_width = 0;
626 buttons_width += 60 + extended_width*10;
629 x = allocation.x + (width - buttons_width)/2
630 - (message_window->buttons_nb-1)*10;
632 wl_list_for_each (button, &message_window->button_list, link) {
633 extended_width = strlen(button->caption) - 5;
634 if (extended_width < 0) extended_width = 0;
635 widget_set_allocation (button->widget, x, allocation.y + height - 16 - 32,
636 60 + extended_width*10, 32);
637 x += 60 + extended_width*10 + 10;
642 redraw_handler (struct widget *widget, void *data)
644 struct message_window *message_window = data;
645 struct rectangle allocation;
646 cairo_surface_t *surface;
648 cairo_text_extents_t extents;
652 widget_get_allocation (message_window->widget, &allocation);
654 surface = window_get_surface (message_window->window);
655 cr = cairo_create (surface);
656 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
662 cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 1.0);
665 if (message_window->icon) {
666 cairo_set_source_surface (cr, message_window->icon,
667 allocation.x + (allocation.width - 64.0)/2,
669 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
671 cairo_set_source_surface (cr, surface, 0.0, 0.0);
674 cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
675 cairo_select_font_face (cr, "sans",
676 CAIRO_FONT_SLANT_NORMAL,
677 CAIRO_FONT_WEIGHT_NORMAL);
678 cairo_set_font_size (cr, 18);
680 lines_nb = get_number_of_lines (message_window->message);
681 lines = get_lines (message_window->message);
684 for (i = 0; i < lines_nb; i++) {
685 cairo_text_extents (cr, lines[i], &extents);
686 cairo_move_to (cr, allocation.x + (allocation.width - extents.width)/2,
687 allocation.y + (allocation.height - lines_nb * extents.height)/2
688 + i*(extents.height+10)
689 + (!message_window->icon ? 0 : 32)
690 - (!message_window->entry ? 0 : 32)
691 - (!message_window->buttons_nb ? 0 : 32));
692 cairo_show_text (cr, lines[i]);
701 global_handler(struct display *display, uint32_t name,
702 const char *interface, uint32_t version, void *data)
704 struct wlmessage *wlmessage = data;
706 if (!strcmp(interface, "wl_text_input_manager")) {
707 wlmessage->text_input_manager = display_bind (display, name,
708 &wl_text_input_manager_interface, 1);
712 /* ---------------------------------------- */
715 wlmessage_set_title (struct wlmessage *wlmessage, char *title)
717 if ((!wlmessage) || (!title))
720 struct message_window *message_window = wlmessage->message_window;
722 if (message_window->title)
723 free (message_window->title);
725 message_window->title = strdup (title);
729 wlmessage_get_title (struct wlmessage *wlmessage)
734 struct message_window *message_window = wlmessage->message_window;
736 return message_window->title;
740 wlmessage_set_titlebuttons (struct wlmessage *wlmessage, enum wlmessage_titlebutton titlebuttons)
745 struct message_window *message_window = wlmessage->message_window;
747 message_window->frame_type = FRAME_NONE;
749 if (titlebuttons && WLMESSAGE_TITLEBUTTON_MINIMIZE)
750 message_window->frame_type = message_window->frame_type | FRAME_MINIMIZE;
751 if (titlebuttons && WLMESSAGE_TITLEBUTTON_MAXIMIZE)
752 message_window->frame_type = message_window->frame_type | FRAME_MAXIMIZE;
753 if (titlebuttons && WLMESSAGE_TITLEBUTTON_CLOSE)
754 message_window->frame_type = message_window->frame_type | FRAME_CLOSE;
757 enum wlmessage_titlebutton
758 wlmessage_get_titlebuttons (struct wlmessage *wlmessage)
763 struct message_window *message_window = wlmessage->message_window;
764 enum wlmessage_titlebutton titlebuttons;
766 titlebuttons = WLMESSAGE_TITLEBUTTON_NONE;
768 if (message_window->frame_type && FRAME_MINIMIZE)
769 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_MINIMIZE;
770 if (message_window->frame_type && FRAME_MAXIMIZE)
771 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_MAXIMIZE;
772 if (message_window->frame_type && FRAME_CLOSE)
773 titlebuttons = titlebuttons | WLMESSAGE_TITLEBUTTON_CLOSE;
779 wlmessage_set_noresize (struct wlmessage *wlmessage, unsigned int not_resizable)
784 struct message_window *message_window = wlmessage->message_window;
786 message_window->resizable = !not_resizable;
790 wlmessage_get_noresize (struct wlmessage *wlmessage)
795 struct message_window *message_window = wlmessage->message_window;
797 return !message_window->resizable;
801 wlmessage_set_icon (struct wlmessage *wlmessage, char *icon_path)
803 if ((!wlmessage) || (!icon_path))
806 struct message_window *message_window = wlmessage->message_window;
807 cairo_surface_t *icon;
808 cairo_status_t status;
810 icon = cairo_image_surface_create_from_png (icon_path);
811 status = cairo_surface_status (icon);
813 if (status == CAIRO_STATUS_SUCCESS) {
814 message_window->icon = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 64, 64);
815 cairo_t *icon_cr = cairo_create (message_window->icon);
816 /* rescale to 64x64 */
817 int width = cairo_image_surface_get_width (icon);
818 int height = cairo_image_surface_get_height (icon);
819 if (width != height != 64) {
820 double ratio = ((64.0/width) < (64.0/height) ? (64.0/width) : (64.0/height));
821 cairo_scale (icon_cr, ratio, ratio);
823 cairo_set_source_surface (icon_cr, icon, 0.0, 0.0);
824 cairo_paint (icon_cr);
825 cairo_destroy (icon_cr);
826 cairo_surface_destroy (icon);
832 wlmessage_set_message (struct wlmessage *wlmessage, char *message)
834 if ((!wlmessage) || (!message))
837 struct message_window *message_window = wlmessage->message_window;
839 if (message_window->message)
840 free (message_window->message);
842 message_window->message = strdup (message);
846 wlmessage_get_message (struct wlmessage *wlmessage)
851 struct message_window *message_window = wlmessage->message_window;
853 return message_window->message;
857 wlmessage_set_message_file (struct wlmessage *wlmessage, char *file_path)
859 if ((!wlmessage) || (!file_path))
862 struct message_window *message_window = wlmessage->message_window;
867 file = fopen (file_path, "r");
872 text = malloc (sizeof(char));
876 realloc (text, (i+1)*sizeof(char));
881 realloc (text, (i+1)*sizeof(char));
886 if (message_window->message)
887 free (message_window->message);
889 message_window->message = text;
893 wlmessage_add_button (struct wlmessage *wlmessage, unsigned int index, char *caption)
895 if ((!wlmessage) || (!caption))
898 struct message_window *message_window = wlmessage->message_window;
899 struct button *button;
901 button = xzalloc (sizeof *button);
902 button->caption = strdup (caption);
903 button->value = index;
904 button->message_window = message_window;
906 message_window->buttons_nb++;
907 wl_list_insert (message_window->button_list.prev, &button->link);
911 wlmessage_delete_button (struct wlmessage *wlmessage, unsigned int index)
916 struct message_window *message_window = wlmessage->message_window;
918 struct button *button, *tmp;
919 wl_list_for_each_safe (button, tmp, &message_window->button_list, link) {
920 if (button->value == index) {
921 wl_list_remove (&button->link);
922 widget_destroy (button->widget);
923 free (button->caption);
925 message_window->buttons_nb--;
931 wlmessage_set_default_button (struct wlmessage *wlmessage, unsigned int index)
936 struct message_window *message_window = wlmessage->message_window;
937 struct button *button;
939 wl_list_for_each (button, &message_window->button_list, link) {
940 if (button->value == index)
941 wlmessage->return_value = button->value;
946 wlmessage_set_textfield (struct wlmessage *wlmessage, char *default_text)
948 if ((!wlmessage) || (!default_text))
951 struct message_window *message_window = wlmessage->message_window;
954 entry = xzalloc (sizeof *entry);
955 entry->text = strdup (default_text);
956 entry->cursor_pos = strlen (entry->text);
957 entry->cursor_anchor = entry->cursor_pos;
958 entry->last_vkb_len = 0;
960 entry->message_window = message_window;
962 message_window->entry = entry;
966 wlmessage_get_textfield (struct wlmessage *wlmessage)
971 struct message_window *message_window = wlmessage->message_window;
973 if (!message_window->entry)
976 return message_window->entry->text;
980 wlmessage_set_timeout (struct wlmessage *wlmessage, unsigned int timeout)
985 wlmessage->timeout = timeout;
989 wlmessage_get_timeout (struct wlmessage *wlmessage)
994 return wlmessage->timeout;
998 wlmessage_show (struct wlmessage *wlmessage, char **input_text)
1003 struct message_window *message_window = wlmessage->message_window;
1004 struct entry *entry;
1005 struct button *button;
1006 int extended_width = 0;
1009 wlmessage->display = NULL;
1010 wlmessage->display = display_create (NULL, NULL);
1011 if (!wlmessage->display) {
1012 fprintf (stderr, "Failed to connect to a Wayland compositor !\n");
1016 if (wlmessage->timeout)
1017 display_set_timeout (wlmessage->display, wlmessage->timeout);
1019 message_window->window = window_create (wlmessage->display);
1020 message_window->widget = window_frame_create (message_window->window,
1021 message_window->frame_type,
1022 message_window->resizable, message_window);
1023 window_set_title (message_window->window, message_window->title);
1026 if (message_window->entry) {
1027 entry = message_window->entry;
1028 entry->widget = widget_add_widget (message_window->widget, entry);
1029 widget_set_redraw_handler (entry->widget, entry_redraw_handler);
1030 widget_set_motion_handler (entry->widget, entry_motion_handler);
1031 widget_set_button_handler (entry->widget, entry_click_handler);
1032 widget_set_touch_down_handler (entry->widget, entry_touch_handler);
1036 wl_list_for_each (button, &message_window->button_list, link) {
1037 button->widget = widget_add_widget (message_window->widget, button);
1038 widget_set_redraw_handler (button->widget, button_redraw_handler);
1039 widget_set_enter_handler (button->widget, button_enter_handler);
1040 widget_set_leave_handler (button->widget, button_leave_handler);
1041 widget_set_button_handler (button->widget, button_click_handler);
1042 widget_set_touch_down_handler (button->widget, button_touch_down_handler);
1043 widget_set_touch_up_handler (button->widget, button_touch_up_handler);
1046 extended_width = (get_max_length_of_lines (message_window->message)) - 35;
1047 if (extended_width < 0) extended_width = 0;
1048 lines_nb = get_number_of_lines (message_window->message);
1050 window_set_user_data (message_window->window, message_window);
1051 window_set_keyboard_focus_handler(message_window->window, keyboard_focus_handler);
1052 window_set_key_handler (message_window->window, key_handler);
1053 widget_set_redraw_handler (message_window->widget, redraw_handler);
1054 widget_set_resize_handler (message_window->widget, resize_handler);
1056 window_schedule_resize (message_window->window,
1057 480 + extended_width*10,
1058 280 + lines_nb*16 + (!message_window->entry ? 0 : 1)*32
1059 + (!message_window->buttons_nb ? 0 : 1)*32);
1061 display_set_user_data (wlmessage->display, wlmessage);
1062 display_set_global_handler (wlmessage->display, global_handler);
1063 display_run (wlmessage->display);
1065 display_destroy (wlmessage->display);
1067 if (input_text && message_window->entry)
1068 *input_text = strdup (message_window->entry->text);
1069 return wlmessage->return_value;
1075 struct wlmessage *wlmessage;
1077 wlmessage = xzalloc (sizeof *wlmessage);
1078 wlmessage->return_value = 0;
1079 wlmessage->timeout = 0;
1081 wlmessage->message_window = xzalloc (sizeof *wlmessage->message_window);
1082 wlmessage->message_window->title = strdup ("wlmessage");
1083 wlmessage->message_window->frame_type = FRAME_ALL;
1084 wlmessage->message_window->resizable = 1;
1085 wlmessage->message_window->icon = NULL;
1086 wlmessage->message_window->message = NULL;
1087 wlmessage->message_window->entry = NULL;
1088 wlmessage->message_window->buttons_nb = 0;
1089 wl_list_init (&wlmessage->message_window->button_list);
1090 wlmessage->message_window->wlmessage = wlmessage;
1096 wlmessage_destroy (struct wlmessage *wlmessage)
1101 struct message_window *message_window = wlmessage->message_window;
1103 if (message_window->surface)
1104 cairo_surface_destroy (message_window->surface);
1105 if (message_window->icon)
1106 cairo_surface_destroy (message_window->icon);
1107 if (message_window->widget)
1108 widget_destroy (message_window->widget);
1109 if (message_window->window)
1110 window_destroy (message_window->window);
1111 if (message_window->title)
1112 free (message_window->title);
1113 if (message_window->message)
1114 free (message_window->message);
1115 free (message_window);
1120 /* ---------------------------------------- */