diff options
-rw-r--r-- | textscreen/guitest.c | 3 | ||||
-rw-r--r-- | textscreen/txt_button.c | 19 | ||||
-rw-r--r-- | textscreen/txt_checkbox.c | 18 | ||||
-rw-r--r-- | textscreen/txt_label.c | 13 | ||||
-rw-r--r-- | textscreen/txt_radiobutton.c | 18 | ||||
-rw-r--r-- | textscreen/txt_separator.c | 13 | ||||
-rw-r--r-- | textscreen/txt_table.c | 25 | ||||
-rw-r--r-- | textscreen/txt_table.h | 2 | ||||
-rw-r--r-- | textscreen/txt_widget.c | 26 | ||||
-rw-r--r-- | textscreen/txt_widget.h | 27 |
10 files changed, 87 insertions, 77 deletions
diff --git a/textscreen/guitest.c b/textscreen/guitest.c index 2f8c3733..f95c712c 100644 --- a/textscreen/guitest.c +++ b/textscreen/guitest.c @@ -1,3 +1,4 @@ +#include <stdio.h> #include <stdlib.h> #include <string.h> @@ -22,7 +23,7 @@ int radiobutton_value; txt_window_t *firstwin; int checkbox_value; -void CloseWindow(txt_widget_t *widget, void *user_data) +void CloseWindow(UNCAST(button), void *user_data) { TXT_CloseWindow(firstwin); } diff --git a/textscreen/txt_button.c b/textscreen/txt_button.c index e20f462d..d7dbe143 100644 --- a/textscreen/txt_button.c +++ b/textscreen/txt_button.c @@ -6,12 +6,11 @@ #include "txt_button.h" #include "txt_io.h" #include "txt_main.h" -#include "txt_widget.h" #include "txt_window.h" -static void TXT_ButtonSizeCalc(txt_widget_t *widget, int *w, int *h) +static void TXT_ButtonSizeCalc(UNCAST(button), int *w, int *h) { - txt_button_t *button = (txt_button_t *) widget; + CAST(txt_button_t, button); // Minimum width is the string length + two spaces for padding @@ -19,9 +18,9 @@ static void TXT_ButtonSizeCalc(txt_widget_t *widget, int *w, int *h) *h = 1; } -static void TXT_ButtonDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_ButtonDrawer(UNCAST(button), int w, int selected) { - txt_button_t *button = (txt_button_t *) widget; + CAST(txt_button_t, button); int i; TXT_BGColor(TXT_COLOR_BLUE, 0); @@ -41,18 +40,20 @@ static void TXT_ButtonDrawer(txt_widget_t *widget, int w, int selected) } } -static void TXT_ButtonDestructor(txt_widget_t *widget) +static void TXT_ButtonDestructor(UNCAST(button)) { - txt_button_t *button = (txt_button_t *) widget; + CAST(txt_button_t, button); free(button->label); } -static int TXT_ButtonKeyPress(txt_widget_t *widget, int key) +static int TXT_ButtonKeyPress(UNCAST(button), int key) { + CAST(txt_button_t, button); + if (key == KEY_ENTER) { - TXT_EmitSignal(widget, "pressed"); + TXT_EmitSignal(button, "pressed"); } return 0; diff --git a/textscreen/txt_checkbox.c b/textscreen/txt_checkbox.c index a61822eb..091086ea 100644 --- a/textscreen/txt_checkbox.c +++ b/textscreen/txt_checkbox.c @@ -8,9 +8,9 @@ #include "txt_main.h" #include "txt_window.h" -static void TXT_CheckBoxSizeCalc(txt_widget_t *widget, int *w, int *h) +static void TXT_CheckBoxSizeCalc(UNCAST(checkbox), int *w, int *h) { - txt_checkbox_t *checkbox = (txt_checkbox_t *) widget; + CAST(txt_checkbox_t, checkbox); // Minimum width is the string length + two spaces for padding @@ -18,9 +18,9 @@ static void TXT_CheckBoxSizeCalc(txt_widget_t *widget, int *w, int *h) *h = 1; } -static void TXT_CheckBoxDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_CheckBoxDrawer(UNCAST(checkbox), int w, int selected) { - txt_checkbox_t *checkbox = (txt_checkbox_t *) widget; + CAST(txt_checkbox_t, checkbox); int i; TXT_BGColor(TXT_COLOR_BLUE, 0); @@ -57,21 +57,21 @@ static void TXT_CheckBoxDrawer(txt_widget_t *widget, int w, int selected) } } -static void TXT_CheckBoxDestructor(txt_widget_t *widget) +static void TXT_CheckBoxDestructor(UNCAST(checkbox)) { - txt_checkbox_t *checkbox = (txt_checkbox_t *) widget; + CAST(txt_checkbox_t, checkbox); free(checkbox->label); } -static int TXT_CheckBoxKeyPress(txt_widget_t *widget, int key) +static int TXT_CheckBoxKeyPress(UNCAST(checkbox), int key) { - txt_checkbox_t *checkbox = (txt_checkbox_t *) widget; + CAST(txt_checkbox_t, checkbox); if (key == KEY_ENTER || key == ' ') { *checkbox->variable = !*checkbox->variable; - TXT_EmitSignal(widget, "changed"); + TXT_EmitSignal(checkbox, "changed"); return 1; } diff --git a/textscreen/txt_label.c b/textscreen/txt_label.c index afdf9b01..022e0480 100644 --- a/textscreen/txt_label.c +++ b/textscreen/txt_label.c @@ -4,20 +4,19 @@ #include "txt_label.h" #include "txt_io.h" #include "txt_main.h" -#include "txt_widget.h" #include "txt_window.h" -static void TXT_LabelSizeCalc(txt_widget_t *widget, int *w, int *h) +static void TXT_LabelSizeCalc(UNCAST(label), int *w, int *h) { - txt_label_t *label = (txt_label_t *) widget; + CAST(txt_label_t, label); *w = label->w; *h = label->h; } -static void TXT_LabelDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_LabelDrawer(UNCAST(label), int w, int selected) { - txt_label_t *label = (txt_label_t *) widget; + CAST(txt_label_t, label); int i; int origin_x, origin_y; @@ -33,9 +32,9 @@ static void TXT_LabelDrawer(txt_widget_t *widget, int w, int selected) } } -static void TXT_LabelDestructor(txt_widget_t *widget) +static void TXT_LabelDestructor(UNCAST(label)) { - txt_label_t *label = (txt_label_t *) widget; + CAST(txt_label_t, label); free(label->label); free(label->lines); diff --git a/textscreen/txt_radiobutton.c b/textscreen/txt_radiobutton.c index c0a87455..87501590 100644 --- a/textscreen/txt_radiobutton.c +++ b/textscreen/txt_radiobutton.c @@ -8,9 +8,9 @@ #include "txt_main.h" #include "txt_window.h" -static void TXT_RadioButtonSizeCalc(txt_widget_t *widget, int *w, int *h) +static void TXT_RadioButtonSizeCalc(UNCAST(radiobutton), int *w, int *h) { - txt_radiobutton_t *radiobutton = (txt_radiobutton_t *) widget; + CAST(txt_radiobutton_t, radiobutton); // Minimum width is the string length + two spaces for padding @@ -18,9 +18,9 @@ static void TXT_RadioButtonSizeCalc(txt_widget_t *widget, int *w, int *h) *h = 1; } -static void TXT_RadioButtonDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_RadioButtonDrawer(UNCAST(radiobutton), int w, int selected) { - txt_radiobutton_t *radiobutton = (txt_radiobutton_t *) widget; + CAST(txt_radiobutton_t, radiobutton); int i; TXT_BGColor(TXT_COLOR_BLUE, 0); @@ -57,23 +57,23 @@ static void TXT_RadioButtonDrawer(txt_widget_t *widget, int w, int selected) } } -static void TXT_RadioButtonDestructor(txt_widget_t *widget) +static void TXT_RadioButtonDestructor(UNCAST(radiobutton)) { - txt_radiobutton_t *radiobutton = (txt_radiobutton_t *) widget; + CAST(txt_radiobutton_t, radiobutton); free(radiobutton->label); } -static int TXT_RadioButtonKeyPress(txt_widget_t *widget, int key) +static int TXT_RadioButtonKeyPress(UNCAST(radiobutton), int key) { - txt_radiobutton_t *radiobutton = (txt_radiobutton_t *) widget; + CAST(txt_radiobutton_t, radiobutton); if (key == KEY_ENTER || key == ' ') { if (*radiobutton->variable != radiobutton->value) { *radiobutton->variable = radiobutton->value; - TXT_EmitSignal(widget, "selected"); + TXT_EmitSignal(radiobutton, "selected"); } return 1; } diff --git a/textscreen/txt_separator.c b/textscreen/txt_separator.c index 038fa19b..65df4214 100644 --- a/textscreen/txt_separator.c +++ b/textscreen/txt_separator.c @@ -4,12 +4,11 @@ #include "txt_separator.h" #include "txt_io.h" #include "txt_main.h" -#include "txt_widget.h" #include "txt_window.h" -static void TXT_SeparatorSizeCalc(txt_widget_t *widget, int *w, int *h) +static void TXT_SeparatorSizeCalc(UNCAST(separator), int *w, int *h) { - txt_separator_t *separator = (txt_separator_t *) widget; + CAST(txt_separator_t, separator); if (separator->label != NULL) { @@ -25,9 +24,9 @@ static void TXT_SeparatorSizeCalc(txt_widget_t *widget, int *w, int *h) *h = 1; } -static void TXT_SeparatorDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_SeparatorDrawer(UNCAST(separator), int w, int selected) { - txt_separator_t *separator = (txt_separator_t *) widget; + CAST(txt_separator_t, separator); int i; int x, y; @@ -50,9 +49,9 @@ static void TXT_SeparatorDrawer(txt_widget_t *widget, int w, int selected) } } -static void TXT_SeparatorDestructor(txt_widget_t *widget) +static void TXT_SeparatorDestructor(UNCAST(separator)) { - txt_separator_t *separator = (txt_separator_t *) widget; + CAST(txt_separator_t, separator); free(separator->label); } diff --git a/textscreen/txt_table.c b/textscreen/txt_table.c index 4e2d1f96..cc5f7117 100644 --- a/textscreen/txt_table.c +++ b/textscreen/txt_table.c @@ -33,9 +33,9 @@ #include "txt_separator.h" #include "txt_table.h" -static void TXT_TableDestructor(txt_widget_t *widget) +static void TXT_TableDestructor(UNCAST(table)) { - txt_table_t *table = (txt_table_t *) widget; + CAST(txt_table_t, table); int i; // Free all widgets @@ -90,9 +90,9 @@ static void CalcRowColSizes(txt_table_t *table, } } -static void TXT_CalcTableSize(txt_widget_t *widget, int *w, int *h) +static void TXT_CalcTableSize(UNCAST(table), int *w, int *h) { - txt_table_t *table = (txt_table_t *) widget; + CAST(txt_table_t, table); int *column_widths; int *row_heights; int x, y; @@ -123,13 +123,10 @@ static void TXT_CalcTableSize(txt_widget_t *widget, int *w, int *h) free(column_widths); } -void TXT_AddWidget(void *uncast_table, void *uncast_widget) +void TXT_AddWidget(UNCAST(table), UNCAST(widget)) { - txt_widget_t *widget; - txt_table_t *table; - - table = (txt_table_t *) uncast_table; - widget = (txt_widget_t *) uncast_widget; + CAST(txt_table_t, table); + CAST(txt_widget_t, widget); if (table->num_widgets > 0) { @@ -210,9 +207,9 @@ static int FindSelectableColumn(txt_table_t *table, int row, int start_col) return -1; } -static int TXT_TableKeyPress(txt_widget_t *widget, int key) +static int TXT_TableKeyPress(UNCAST(table), int key) { - txt_table_t *table = (txt_table_t *) widget; + CAST(txt_table_t, table); int selected; int rows; @@ -342,9 +339,9 @@ static void CheckValidSelection(txt_table_t *table) } } -static void TXT_TableDrawer(txt_widget_t *widget, int w, int selected) +static void TXT_TableDrawer(UNCAST(table), int w, int selected) { - txt_table_t *table = (txt_table_t *) widget; + CAST(txt_table_t, table); int *column_widths; int *row_heights; int origin_x, origin_y; diff --git a/textscreen/txt_table.h b/textscreen/txt_table.h index 1610b3fd..202a73ea 100644 --- a/textscreen/txt_table.h +++ b/textscreen/txt_table.h @@ -51,7 +51,7 @@ struct txt_table_s txt_table_t *TXT_NewTable(int columns); void TXT_InitTable(txt_table_t *table, int columns); -void TXT_AddWidget(void *table, void *widget); +void TXT_AddWidget(UNCAST(table), UNCAST(widget)); #endif /* #ifndef TXT_TABLE_T */ diff --git a/textscreen/txt_widget.c b/textscreen/txt_widget.c index d257ee75..35f73618 100644 --- a/textscreen/txt_widget.c +++ b/textscreen/txt_widget.c @@ -40,9 +40,9 @@ void TXT_DestroyCallbackTable(txt_callback_table_t *table) free(table); } -void TXT_InitWidget(void *uncast_widget, txt_widget_class_t *widget_class) +void TXT_InitWidget(UNCAST(widget), txt_widget_class_t *widget_class) { - txt_widget_t *widget = (txt_widget_t *) uncast_widget; + CAST(txt_widget_t, widget); widget->widget_class = widget_class; widget->callback_table = TXT_NewCallbackTable(); @@ -53,11 +53,12 @@ void TXT_InitWidget(void *uncast_widget, txt_widget_class_t *widget_class) widget->visible = 1; } -void TXT_SignalConnect(txt_widget_t *widget, +void TXT_SignalConnect(UNCAST(widget), char *signal_name, TxtWidgetSignalFunc func, void *user_data) { + CAST(txt_widget_t, widget); txt_callback_table_t *table; txt_callback_t *callback; int i; @@ -89,8 +90,9 @@ void TXT_SignalConnect(txt_widget_t *widget, callback->user_data = user_data; } -void TXT_EmitSignal(txt_widget_t *widget, char *signal_name) +void TXT_EmitSignal(UNCAST(widget), char *signal_name) { + CAST(txt_widget_t, widget); txt_callback_table_t *table; int i; @@ -106,25 +108,33 @@ void TXT_EmitSignal(txt_widget_t *widget, char *signal_name) } } -void TXT_CalcWidgetSize(txt_widget_t *widget, int *w, int *h) +void TXT_CalcWidgetSize(UNCAST(widget), int *w, int *h) { + CAST(txt_widget_t, widget); + return widget->widget_class->size_calc(widget, w, h); } -void TXT_DrawWidget(txt_widget_t *widget, int w, int selected) +void TXT_DrawWidget(UNCAST(widget), int w, int selected) { + CAST(txt_widget_t, widget); + widget->widget_class->drawer(widget, w, selected); } -void TXT_DestroyWidget(txt_widget_t *widget) +void TXT_DestroyWidget(UNCAST(widget)) { + CAST(txt_widget_t, widget); + widget->widget_class->destructor(widget); TXT_DestroyCallbackTable(widget->callback_table); free(widget); } -int TXT_WidgetKeyPress(txt_widget_t *widget, int key) +int TXT_WidgetKeyPress(UNCAST(widget), int key) { + CAST(txt_widget_t, widget); + if (widget->widget_class->key_press != NULL) { return widget->widget_class->key_press(widget, key); diff --git a/textscreen/txt_widget.h b/textscreen/txt_widget.h index a166791a..1a256c64 100644 --- a/textscreen/txt_widget.h +++ b/textscreen/txt_widget.h @@ -27,15 +27,18 @@ #ifndef TXT_WIDGET_H #define TXT_WIDGET_H +#define UNCAST(name) void *uncast_ ## name +#define CAST(type, name) type *name = (type *) uncast_ ## name + typedef struct txt_widget_class_s txt_widget_class_t; typedef struct txt_widget_s txt_widget_t; typedef struct txt_callback_table_s txt_callback_table_t; -typedef void (*TxtWidgetSizeCalc)(txt_widget_t *widget, int *w, int *h); -typedef void (*TxtWidgetDrawer)(txt_widget_t *widget, int w, int selected); -typedef void (*TxtWidgetDestroy)(txt_widget_t *widget); -typedef int (*TxtWidgetKeyPress)(txt_widget_t *widget, int key); -typedef void (*TxtWidgetSignalFunc)(txt_widget_t *widget, void *user_data); +typedef void (*TxtWidgetSizeCalc)(UNCAST(widget), int *w, int *h); +typedef void (*TxtWidgetDrawer)(UNCAST(widget), int w, int selected); +typedef void (*TxtWidgetDestroy)(UNCAST(widget)); +typedef int (*TxtWidgetKeyPress)(UNCAST(widget), int key); +typedef void (*TxtWidgetSignalFunc)(UNCAST(widget), void *user_data); struct txt_widget_class_s { @@ -53,14 +56,14 @@ struct txt_widget_s int visible; }; -void TXT_InitWidget(void *widget, txt_widget_class_t *widget_class); -void TXT_CalcWidgetSize(txt_widget_t *widget, int *w, int *h); -void TXT_DrawWidget(txt_widget_t *widget, int w, int selected); -void TXT_SignalConnect(txt_widget_t *widget, char *signal_name, +void TXT_InitWidget(UNCAST(widget), txt_widget_class_t *widget_class); +void TXT_CalcWidgetSize(UNCAST(widget), int *w, int *h); +void TXT_DrawWidget(UNCAST(widget), int w, int selected); +void TXT_SignalConnect(UNCAST(widget), char *signal_name, TxtWidgetSignalFunc func, void *user_data); -void TXT_EmitSignal(txt_widget_t *widget, char *signal_name); -int TXT_WidgetKeyPress(txt_widget_t *widget, int key); -void TXT_DestroyWidget(txt_widget_t *widget); +void TXT_EmitSignal(UNCAST(widget), char *signal_name); +int TXT_WidgetKeyPress(UNCAST(widget), int key); +void TXT_DestroyWidget(UNCAST(widget)); #endif /* #ifndef TXT_WIDGET_H */ |