From 8b80a7ea57d818510ef386e296676b3356aecbf5 Mon Sep 17 00:00:00 2001 From: Manuel Bachmann Date: Thu, 29 Jan 2015 19:00:15 +0100 Subject: [PATCH] Handle up to 6 buttons All backends (Wayland and X11) now handle up to 6 buttons, aligned and centered at the bottom of the window. Change-Id: I7985b5246653a7fe95e5e8a1b34252d0cd861536 Signed-off-by: Manuel Bachmann --- libwlmessage-wl.c | 83 +++++++++++++++++++++++++++++++++++++++++++++--------- libwlmessage-x11.c | 51 +++++++++++++++++++++++++-------- 2 files changed, 109 insertions(+), 25 deletions(-) diff --git a/libwlmessage-wl.c b/libwlmessage-wl.c index fedeeb4..4ef2f51 100644 --- a/libwlmessage-wl.c +++ b/libwlmessage-wl.c @@ -9,6 +9,7 @@ #include "text-client-protocol.h" #include "libwlmessage.h" #define MAX_LINES 6 +#define MAX_BUTTONS 6 struct message_window { @@ -674,19 +675,23 @@ resize_handler (struct widget *widget, int32_t width, int32_t height, void *data struct message_window *message_window = data; struct progressbar *progressbar; struct entry *entry; - struct button *button; + struct button *button, *button_sub; struct rectangle allocation; - int buttons_width, extended_width; - int x; + int buttons_width, extended_width, extended_height; + int x, i, j; widget_get_allocation (widget, &allocation); x = allocation.x + (width - 240)/2; + extended_height = 0; + if (message_window->buttons_nb >= 4) + extended_height = 38; + if (message_window->progressbar) { progressbar = message_window->progressbar; - widget_set_allocation (progressbar->widget, x - 20, allocation.y + height - 16*2 - 32*2 - 28, - 280, 24); + widget_set_allocation (progressbar->widget, x - 20, allocation.y + height - extended_height + - 16*2 - 32*2 - 28, 280, 24); /* do not draw the entry and buttons if there is a callback */ if (message_window->wlmessage->progress_callback) return; @@ -694,26 +699,69 @@ resize_handler (struct widget *widget, int32_t width, int32_t height, void *data if (message_window->entry) { entry = message_window->entry; - widget_set_allocation (entry->widget, x, allocation.y + height - 16*2 - 32*2, - 240, 32); + widget_set_allocation (entry->widget, x, allocation.y + height - extended_height + - 16*2 - 32*2, 240, 32); } + i = 0; buttons_width = 0; wl_list_for_each (button, &message_window->button_list, link) { extended_width = strlen(button->caption) - 5; if (extended_width < 0) extended_width = 0; buttons_width += 60 + extended_width*10; + if (((message_window->buttons_nb == 6)&&(i == 2)) || + ((message_window->buttons_nb == 5)&&(i == 1)) || + ((message_window->buttons_nb == 4)&&(i == 1))) + break; + i++; } - x = allocation.x + (width - buttons_width)/2 - - (message_window->buttons_nb-1)*10; + if (message_window->buttons_nb <= 3) + x = allocation.x + (width - buttons_width)/2 + - (message_window->buttons_nb-1)*10; + else if (message_window->buttons_nb == 4) + x = allocation.x + (width - buttons_width)/2 - 1*10; + else + x = allocation.x + (width - buttons_width)/2 - 2*10; + i = 0; wl_list_for_each (button, &message_window->button_list, link) { extended_width = strlen(button->caption) - 5; if (extended_width < 0) extended_width = 0; - widget_set_allocation (button->widget, x, allocation.y + height - 16 - 32, - 60 + extended_width*10, 32); - x += 60 + extended_width*10 + 10; + if (((message_window->buttons_nb == 6)&&((i <= 2))) || + ((message_window->buttons_nb == 5)&&((i <= 1))) || + ((message_window->buttons_nb == 4)&&((i <= 1)))) + widget_set_allocation (button->widget, x, allocation.y + height - extended_height - 16 - 32, + 60 + extended_width*10, 32); + else + widget_set_allocation (button->widget, x, allocation.y + height - 16 - 32, + 60 + extended_width*10, 32); + if ((message_window->buttons_nb == 6)&&(i == 2)) { + j = buttons_width = 0; + wl_list_for_each (button_sub, &message_window->button_list, link) { + j++; + if (j <= 3) + continue; + extended_width = strlen(button_sub->caption) - 5; + if (extended_width < 0) extended_width = 0; + buttons_width += 60 + extended_width*10; + } + x = allocation.x + (width - buttons_width)/2 - 2*10; + } else if (((message_window->buttons_nb == 4)&&(i == 1)) || + ((message_window->buttons_nb == 5)&&(i == 1))) { + j = buttons_width = 0; + wl_list_for_each (button_sub, &message_window->button_list, link) { + j++; + if (j <= 2) + continue; + extended_width = strlen(button_sub->caption) - 5; + if (extended_width < 0) extended_width = 0; + buttons_width += 60 + extended_width*10; + } + x = allocation.x + (width - buttons_width)/2 - 1*10; + } else + x += 60 + extended_width*10 + 10; + i++; } } @@ -986,6 +1034,9 @@ wlmessage_add_button (struct wlmessage *wlmessage, unsigned int index, char *cap struct message_window *message_window = wlmessage->message_window; struct button *button; + if (message_window->buttons_nb == MAX_BUTTONS) + return; + button = xzalloc (sizeof *button); button->caption = strdup (caption); button->value = index; @@ -1141,6 +1192,7 @@ wlmessage_show (struct wlmessage *wlmessage, char **input_text) struct entry *entry = NULL; struct button *button = NULL; int extended_width = 0; + int extended_height = 0; int lines_nb = 0; wlmessage->display = NULL; @@ -1199,6 +1251,10 @@ wlmessage_show (struct wlmessage *wlmessage, char **input_text) if (extended_width < 0) extended_width = 0; lines_nb = get_number_of_lines (message_window->message); + extended_height = 0; + if (message_window->buttons_nb >= 4) + extended_height = 32; + window_set_user_data (message_window->window, message_window); window_set_keyboard_focus_handler(message_window->window, keyboard_focus_handler); window_set_key_handler (message_window->window, key_handler); @@ -1209,7 +1265,8 @@ wlmessage_show (struct wlmessage *wlmessage, char **input_text) 480 + extended_width*10, 280 + lines_nb*24 + (!message_window->progressbar ? 0 : 1)*24 + (!message_window->entry ? 0 : 1)*32 - + (!message_window->buttons_nb ? 0 : 1)*32); + + (!message_window->buttons_nb ? 0 : 1)*32 + + extended_height); display_set_user_data (wlmessage->display, wlmessage); display_set_global_handler (wlmessage->display, global_handler); diff --git a/libwlmessage-x11.c b/libwlmessage-x11.c index 12b37a1..5714334 100644 --- a/libwlmessage-x11.c +++ b/libwlmessage-x11.c @@ -17,7 +17,7 @@ #include "libwlmessage.h" #define MAX_LINES 6 -#define MAX_BUTTONS 3 +#define MAX_BUTTONS 6 struct message_window { @@ -201,6 +201,10 @@ resize_handler (Widget widget, XtPointer data, XEvent *event, Boolean *d) exit (0); } + height = 0; + if ((message_window->buttons_nb == 4) || (message_window->buttons_nb == 6)) + height = 32; + if (event->type == ConfigureNotify) { XtConfigureWidget (message_window->label, (event->xconfigure.width - (event->xconfigure.width-100)) / 2, (!message_window->icon ? 10 : 80), @@ -209,20 +213,34 @@ resize_handler (Widget widget, XtPointer data, XEvent *event, Boolean *d) 1); if (message_window->entry) XtConfigureWidget (message_window->entry, (event->xconfigure.width - (event->xconfigure.width-150)) /2, - event->xconfigure.height - 80, + event->xconfigure.height - 80 - height, event->xconfigure.width - 150, 20, 1); XtConfigureWidget (message_window->form_b, ((event->xconfigure.width-280) / 2) - 10, - event->xconfigure.height - 55, - 290, 50, + event->xconfigure.height - 55 - height, + 290, 50 + height, 1); for (i = 0; i < message_window->buttons_nb; i++) { - XtConfigureWidget (message_window->button_list[i]->button, - (280-(message_window->buttons_nb*80))/(message_window->buttons_nb+1) + i*80 + (i+1)*10, - 10, - 80, 30, - 1); + if (message_window->buttons_nb <= 3) + XtConfigureWidget (message_window->button_list[i]->button, + (280-(message_window->buttons_nb*80))/(message_window->buttons_nb+1) + i*80 + (i+1)*10, + 10, 80, 30, 1); + else if (message_window->buttons_nb == 4) { + if (i <= 1) + XtConfigureWidget (message_window->button_list[i]->button, + (280-(2*80))/(2+1) + i*80 + (i+1)*10, 10, 80, 30, 1); + else + XtConfigureWidget (message_window->button_list[i]->button, + (280-(2*80))/(2+1) + (i-2)*80 + (i-2+1)*10, 10 + 38, 80, 30, 1); + } else if (message_window->buttons_nb == 6) { + if (i <= 2) + XtConfigureWidget (message_window->button_list[i]->button, + (280-(3*80))/(3+1) + i*80 + (i+1)*10, 10, 80, 30, 1); + else + XtConfigureWidget (message_window->button_list[i]->button, + (280-(3*80))/(3+1) + (i-3)*80 + (i-3+1)*10, 10 + 38, 80, 30, 1); + } } /* force redraw */ @@ -722,7 +740,15 @@ form: XtVaSetValues (button->button, XtVaTypedArg, XtNbackground, XtRString, "light gray", strlen("light gray")+1, NULL); XtVaSetValues (button->button, XtNhighlightThickness, 0, NULL); if (prev_button) { - XtVaSetValues (button->button, XtNfromHoriz, prev_button->button, NULL); + if ((message_window->buttons_nb <= 3) + || (message_window->buttons_nb == 5) + || ((message_window->buttons_nb == 4)&&((i == 1)||(i == 3))) + || ((message_window->buttons_nb == 6)&&((i == 1)||(i == 2)||(i == 4)||(i == 5)))) + XtVaSetValues (button->button, XtNfromHoriz, prev_button->button, NULL); + if ((message_window->buttons_nb == 4)&&(i > 1)) + XtVaSetValues (button->button, XtNfromVert, message_window->button_list[i-2]->button, NULL); + if ((message_window->buttons_nb == 6)&&(i > 2)) + XtVaSetValues (button->button, XtNfromVert, message_window->button_list[i-3]->button, NULL); } XtAddEventHandler (button->button, ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask, @@ -754,8 +780,9 @@ form: XStoreName (wlmessage->display, XtWindow(message_window->window), message_window->title); wc.width = 420 + extended_width*10; - wc.height = 240 + lines_nb*20; /*+ (!message_window->entry ? 0 : 1)*32 - + (!message_window->buttons_nb ? 0 : 1)*32);*/ + wc.height = 240 + lines_nb*20; + if ((message_window->buttons_nb == 4) || (message_window->buttons_nb == 6)) + wc.height += 32; XConfigureWindow (wlmessage->display, XtWindow(message_window->window), CWWidth | CWHeight, &wc); sh.flags = PMinSize; -- 2.7.4