32#include "oslib/osbyte.h"
33#include "oslib/osgbpb.h"
34#include "oslib/territory.h"
35#include "oslib/wimp.h"
78 wimp_menu_entry *parent_entry,
79 int first,
int last,
const char *prefix,
int prefix_length);
90#define DEFAULT_FLAGS (wimp_ICON_TEXT | wimp_ICON_FILLED | \
91 (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | \
92 (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT))
111#define IS_MENU(menu) !((int)(menu) & 1)
124 static struct ns_menu search_provider_definition = {
171 unsigned int provider = 0;
174 while ((iter != -1) &&
175 (search_provider_definition.
entries[provider].
text != NULL)) {
180 search_provider_definition.
entries[provider].
text = NULL;
188 static const struct ns_menu images_definition = {
200 static const struct ns_menu proxy_type_definition = {
215 static const struct ns_menu lang_definition = {
304 error = xwimp_create_menu(
menu, x - 64, y);
306 NSLOG(netsurf, INFO,
"xwimp_create_menu: 0x%x: %s",
307 error->errnum, error->errmess);
324 wimp_window_state state;
325 wimp_icon_state icon_state;
331 error = xwimp_get_window_state(&state);
333 NSLOG(netsurf, INFO,
"xwimp_get_window_state: 0x%x: %s",
334 error->errnum, error->errmess);
339 error = xwimp_get_icon_state(&icon_state);
341 NSLOG(netsurf, INFO,
"xwimp_get_icon_state: 0x%x: %s",
342 error->errnum, error->errmess);
348 state.visible.x0 + icon_state.icon.extent.x1 + 64,
349 state.visible.y1 + icon_state.icon.extent.y1 -
366 error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0);
368 NSLOG(netsurf, INFO,
"xwimp_create_menu: 0x%x: %s",
369 error->errnum, error->errmess);
400 wimp_menu_entry *menu_entry;
402 wimp_pointer pointer;
416 for (i = 1;
selection->items[i] != -1; i++)
417 menu_entry = &menu_entry->sub_menu->
430 error = xwimp_get_pointer_info(&pointer);
432 NSLOG(netsurf, INFO,
"xwimp_get_pointer_info: 0x%x: %s",
433 error->errnum, error->errmess);
439 if (pointer.buttons != wimp_CLICK_ADJUST) {
456 wimp_menu_entry *menu_entry;
463 if (warning->selection.items[0] == -1)
465 menu_entry = &
current_menu->entries[warning->selection.items[0]];
466 for (i = 1; warning->selection.items[i] != -1; i++)
467 menu_entry = &menu_entry->sub_menu->
468 entries[warning->selection.items[i]];
479 if (
IS_MENU(menu_entry->sub_menu)) {
483 menu_entry->sub_menu);
489 menu_entry->sub_menu,
490 wimp_WINDOW_CLOSE_ICON | wimp_WINDOW_BACK_ICON,
496 error = xwimp_create_sub_menu(menu_entry->sub_menu,
497 warning->pos.x, warning->pos.y);
499 NSLOG(netsurf, INFO,
"xwimp_create_sub_menu: 0x%x: %s",
500 error->errnum, error->errmess);
565 NSLOG(netsurf, INFO,
"xwimp_create_menu: 0x%x: %s",
566 error->errnum, error->errmess);
588 die(
"No memory to create menu definition.");
597 for (entry = 0;
menu->entries[entry].text; entry++)
606 die(
"No memory to translate menu.");
608 return definition->
menu;
628 wimp_menu_entry *parent_entry,
int first,
int last,
629 const char *prefix,
int prefix_length)
633 int matches[last - first + 1];
634 const char *
text, *menu_text;
639 for (entry = first; entry < last; entry++) {
645 while (!isalnum(*match))
649 if ((prefix) && (strncmp(match, prefix, prefix_length)))
657 if (depth == cur_depth)
658 matches[entries++] = entry;
660 matches[entries] = last;
668 new_menu = (wimp_menu *)malloc(wimp_SIZEOF_MENU(entries));
670 die(
"No memory to create menu.");
674 parent_entry->sub_menu = new_menu;
679 definition->
menu = new_menu;
683 new_menu->title_data.indirected_text.text = NULL;
689 for (entry = 0; entry < entries; entry++) {
691 int id = matches[entry];
696 new_menu->entries[entry].menu_flags = 0;
697 while (!isalnum(*
text)) {
699 new_menu->entries[entry].menu_flags |=
705 menu_text = strrchr(
text,
'.');
714 new_menu->entries[entry].sub_menu =
718 new_menu->entries[entry].data.indirected_text.text = NULL;
723 if (!definition_entry)
724 die(
"Unable to create menu definition entry");
726 definition_entry->
menu_entry = &new_menu->entries[entry];
729 definition->
entries = definition_entry;
732 if (new_menu->entries[entry].sub_menu == wimp_NO_SUB_MENU) {
734 depth + 1, &new_menu->
entries[entry],
735 matches[entry], matches[entry + 1],
740 if (new_menu->entries[entry].sub_menu != wimp_NO_SUB_MENU)
741 new_menu->entries[entry].menu_flags |=
742 wimp_MENU_GIVE_WARNING;
744 new_menu->entries[0].menu_flags |= wimp_MENU_TITLE_INDIRECTED;
745 new_menu->entries[entries - 1].menu_flags |= wimp_MENU_LAST;
757 menu->title_fg = wimp_COLOUR_BLACK;
758 menu->title_bg = wimp_COLOUR_LIGHT_GREY;
759 menu->work_fg = wimp_COLOUR_BLACK;
760 menu->work_bg = wimp_COLOUR_WHITE;
762 menu->height = wimp_MENU_ITEM_HEIGHT;
763 menu->gap = wimp_MENU_ITEM_GAP;
765 for (i = 0; i < entries; i++) {
766 menu->entries[i].menu_flags = 0;
767 menu->entries[i].sub_menu = wimp_NO_SUB_MENU;
768 menu->entries[i].icon_flags =
770 menu->entries[i].data.indirected_text.validation =
773 menu->entries[0].menu_flags |= wimp_MENU_TITLE_INDIRECTED;
774 menu->entries[i - 1].menu_flags |= wimp_MENU_LAST;
792 definition = definition->
next)
807 const char *translated)
815 for (entry = definition->
entries; entry; entry = entry->
next)
816 if (!strcmp(entry->
menu_entry->data.indirected_text.text, translated))
838 for (entry = definition->
entries; entry; entry = entry->
next)
839 if (entry->
action == action)
860 for (entry = definition->
entries; entry; entry = entry->
next) {
885 for (entry = definition->
entries; entry; entry = entry->
next)
886 if (entry->
action == action) {
888 entry->
menu_entry->icon_flags |= wimp_ICON_SHADED;
890 entry->
menu_entry->icon_flags &= ~wimp_ICON_SHADED;
909 entry->
menu_entry->menu_flags |= wimp_MENU_TICKED;
911 entry->
menu_entry->menu_flags &= ~wimp_MENU_TICKED;
921 wimp_selection menu_tree;
922 int i = 0, j, checksum = 0;
929 error = xwimp_get_menu_state((wimp_menu_state_flags)0,
932 NSLOG(netsurf, INFO,
"xwimp_get_menu_state: 0x%x: %s",
933 error->errnum, error->errmess);
942 if (menu->entries[j].icon_flags & wimp_ICON_SHADED)
943 checksum ^= (1 << (i + j * 2));
944 if (menu->entries[j].menu_flags & wimp_MENU_TICKED)
945 checksum ^= (2 << (i + j * 2));
946 }
while (!(menu->entries[j++].menu_flags & wimp_MENU_LAST));
948 j = menu_tree.items[i++];
950 menu = menu->entries[j].sub_menu;
951 if ((!menu) || (menu == wimp_NO_SUB_MENU) || (!
IS_MENU(menu)))
974 error = xosbyte1(osbyte_ALPHABET_NUMBER, 127, 0, &alphabet);
976 NSLOG(netsurf, INFO,
"failed reading alphabet: 0x%x: %s",
977 error->errnum, error->errmess);
979 alphabet = territory_ALPHABET_LATIN1;
987 free(menu->
menu->title_data.indirected_text.text);
992 NSLOG(netsurf, INFO,
"utf8_to_enc failed");
997 menu->
menu->title_data.indirected_text.text = translated;
1000 for (entry = menu->
entries; entry; entry = entry->
next) {
1001 wimp_menu *submenu = entry->
menu_entry->sub_menu;
1004 free(entry->
menu_entry->data.indirected_text.text);
1009 NSLOG(netsurf, INFO,
"utf8_to_enc failed");
1014 entry->
menu_entry->data.indirected_text.text = translated;
1015 entry->
menu_entry->data.indirected_text.validation =
1017 entry->
menu_entry->data.indirected_text.size =
1022 if (submenu != wimp_NO_SUB_MENU &&
IS_MENU(submenu)) {
1023 submenu->title_data.indirected_text.text =
void die(const char *error)
Cause an abnormal program termination.
Cookie Manager (interface).
ssize_t search_web_iterate_providers(ssize_t iter, const char **name)
Iterate the search providers, returning their names.
nserror
Enumeration of error codes.
@ NSERROR_BAD_ENCODING
The character set is unknown.
nserror utf8_to_local_encoding(const char *string, size_t len, char **result)
RISc OS global history interface.
#define NSLOG(catname, level, logmsg, args...)
nserror messages_add_key_value(const char *key, const char *value)
Add a single message.
const char * messages_get(const char *key)
Fast lookup of a message by key from the standard Messages hash.
Localised message support (interface).
Interface to riscos cookie viewing using riscos core window.
nserror ro_warn_user(const char *warning, const char *detail)
Display a warning for a serious problem (eg memory exhaustion).
Interactive help (interface).
File/object/selection saving (Interface).
core web search facilities interface.
Interface to utility string handling.
Tinct SWI numbers and flags for version 0.11.
UCS conversion tables (interface) This is only used if nothing claims Service_International,...
URL Suggestion Menu (interface).
bool ro_gui_url_suggest_init(void)
Option reading and saving interface.
char from[32]
Encoding name to convert from.
char to[32]
Encoding name to convert to.
UTF-8 manipulation functions (interface).
void ro_gui_wimp_update_window_furniture(wimp_w w, wimp_window_flags bic_mask, wimp_window_flags xor_mask)
Sets whether a piece of window furniture is present for a window.
General RISC OS WIMP/OS library functions (interface).
bool ro_gui_wimp_event_prepare_menu(wimp_w w, wimp_i i, wimp_menu *menu)
Trigger a window's Prepare Menu event.
void ro_gui_wimp_event_register_submenu(wimp_w w)
Register a submenu as being opened.
void ro_gui_wimp_event_menus_closed(wimp_w w, wimp_i i, wimp_menu *menu)
Handle menus being closed.
bool ro_gui_wimp_event_submenu_warning(wimp_w w, wimp_i i, wimp_menu *menu, wimp_selection *selection, menu_action action)
bool ro_gui_wimp_event_menu_selection(wimp_w w, wimp_i i, wimp_menu *menu, wimp_selection *selection, menu_action action)
Handles a menu selection event.
Automated RISC OS WIMP event handling (interface).
static nserror text(const struct redraw_context *ctx, const struct plot_font_style *fstyle, int x, int y, const char *text, size_t length)
Text plotting.