/************************************************************************** Comparison function for qsort; i1 and i2 are pointers to an event (enum event_type). **************************************************************************/ static int compar_event_message_texts(const void *i1, const void *i2) { const enum event_type *j1 = i1; const enum event_type *j2 = i2; return mystrcasecmp(get_event_message_text(*j1), get_event_message_text(*j2)); }
void fc_mysql_log_chat(const char *message, const struct tile* ptile, enum event_type event, int conn_id) { fc_mysql_query( "INSERT INTO `" FC__MYSQL_CHATLOG_TABLE "` " "(" "created," "tile_x," "tile_y," "message," "event) " "VALUES (" "NOW()," "%d," "%d," "%s," "%s)", TILE_XY(ptile), message, get_event_message_text(event) ); }
/************************************************************************** ... **************************************************************************/ Widget create_messageopt_dialog(void) { Widget shell, form, title, scrolled, explanation, ok, cancel, col; Widget colhead, space_head; Widget label[E_LAST]; Widget longest_label = 0; Widget toggle = 0; int i, longest_len = 0; Dimension width; shell = I_T(XtCreatePopupShell("messageoptpopup", transientShellWidgetClass, toplevel, NULL, 0)); form = XtVaCreateManagedWidget("messageoptform", formWidgetClass, shell, NULL); title = I_L(XtVaCreateManagedWidget("messageopttitle", labelWidgetClass, form, NULL)); explanation = I_L(XtVaCreateManagedWidget("messageoptexpl", labelWidgetClass, form, NULL)); scrolled = XtVaCreateManagedWidget("messageoptscroll", viewportWidgetClass, form, NULL); col = XtVaCreateManagedWidget("messageoptcol", formWidgetClass, scrolled, NULL); /* space_head labels are "empty" labels in column heading which are * used so that we can arrange the constraints without loops. * They essentially act as vertical filler. */ space_head = XtVaCreateManagedWidget("messageoptspacehead", labelWidgetClass, col, NULL); colhead = I_L(XtVaCreateManagedWidget("messageoptcolhead", labelWidgetClass, col, NULL)); for(i = 0; i < E_LAST; i++) { const char *text = get_event_message_text(sorted_events[i]); int len = strlen(text); label[i] = XtVaCreateManagedWidget("label", labelWidgetClass, col, XtNlabel, text, XtNfromVert, (i == 0) ? space_head : label[i - 1], NULL); if (len > longest_len) { longest_len = len; longest_label = label[i]; } /* * The addition of a scrollbar screws things up. There must be a * better way to do this. */ XtVaGetValues(label[i], XtNwidth, &width, NULL); XtVaSetValues(label[i], XtNwidth, width + 15, NULL); } XtVaGetValues(longest_label, XtNwidth, &width, NULL); XtVaSetValues(space_head, XtNwidth, width + 15, NULL); XtVaSetValues(colhead, XtNfromHoriz, space_head, NULL); for (i = 0; i < E_LAST; i++) { int j; for (j = 0; j < NUM_MW; j++) { toggle = XtVaCreateManagedWidget("toggle", toggleWidgetClass, col, XtNfromHoriz, (j == 0 ? space_head : toggle), XtNfromVert, (i == 0) ? space_head : label[i - 1], NULL); XtAddCallback(toggle, XtNcallback, toggle_callback, NULL); messageopt_toggles[sorted_events[i]][j] = toggle; } } ok = I_L(XtVaCreateManagedWidget("messageoptokcommand", commandWidgetClass, form, NULL)); cancel = I_L(XtVaCreateManagedWidget("messageoptcancelcommand", commandWidgetClass, form, NULL)); XtAddCallback(ok, XtNcallback, messageopt_ok_command_callback, (XtPointer)shell); XtAddCallback(cancel, XtNcallback, messageopt_cancel_command_callback, (XtPointer)shell); XtRealizeWidget(shell); xaw_horiz_center(title); xaw_horiz_center(explanation); return shell; }