From: <kr_...@us...> - 2004-05-12 20:42:50
|
Update of /cvsroot/htoolkit/port/src/cbits/GTK In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5356/port/src/cbits/GTK Modified Files: Internals.h Menu.c ToolBar.c Util.c Added Files: Action.c Log Message: This is a major rewrite of menu and toolbar support. The main feature is that the new API provides action based menu and toolbar. The another advantage is that now the code is more simpler and shorter. The low lever API is implemented only under Linux for now. --- NEW FILE: Action.c --- #include "Action.h" #include "Internals.h" #include "Handlers_stub.h" #include "Window.h" #include <gdk/gdkkeysyms.h> // The pointer to the first live action. All actions are linked together using the "next_action" field static ActionHandle first_action = NULL; static ActionHandle create_action(enum ActionType type) { ActionHandle action = malloc(sizeof(struct ActionHandle)); action->type = type; action->title = NULL; action->short_title = NULL; action->tooltip = NULL; action->bitmap = NULL; action->enabled = TRUE; action->checked = FALSE; action->busy = FALSE; action->key = 0; action->keyMods = 0; action->menu = NULL; action->proxies = NULL; // link the action action->next_action = first_action; first_action = action; // by default the action is in its own group action->next_action_in_group = action; return action; } static gboolean find_accel_by_widget(GtkAccelKey *key, GClosure *closure, gpointer data) { return (closure->data == data); } void menu_item_set_accel(GtkWidget *item, ActionHandle action) { int key; GdkModifierType modifier; GtkAccelKey *accel_key; GtkAccelGroup *accel_group = (GtkAccelGroup *) gtk_accel_groups_from_object (G_OBJECT(gFrameWidget))->data; accel_key = gtk_accel_group_find(accel_group, find_accel_by_widget, item); if (accel_key) gtk_widget_remove_accelerator(item, accel_group, accel_key->accel_key, accel_key->accel_mods); if (action->key == 0) return; modifier = 0; if (action->keyMods & shiftBIT) modifier |= GDK_SHIFT_MASK; if (action->keyMods & ctrlBIT) modifier |= GDK_CONTROL_MASK; if (action->keyMods & altBIT) modifier |= GDK_MOD1_MASK; switch (action->key) { case kbBackSpace: key = GDK_BackSpace; break; case kbTab: key = GDK_Tab; break; case kbEnter: key = GDK_Return; break; case kbEscape: key = GDK_Escape; break; case kbBegin: key = GDK_Begin; break; case kbClear: key = GDK_Clear; break; case kbDelete: key = GDK_Delete; break; case kbDown: key = GDK_Down; break; case kbEnd: key = GDK_End; break; case kbF1: key = GDK_F1; break; case kbF2: key = GDK_F2; break; case kbF3: key = GDK_F3; break; case kbF4: key = GDK_F4; break; case kbF5: key = GDK_F5; break; case kbF6: key = GDK_F6; break; case kbF7: key = GDK_F7; break; case kbF8: key = GDK_F8; break; case kbF9: key = GDK_F9; break; case kbF10: key = GDK_F10; break; case kbF11: key = GDK_F11; break; case kbF12: key = GDK_F12; break; case kbF13: key = GDK_F13; break; case kbF14: key = GDK_F14; break; case kbF15: key = GDK_F15; break; case kbHelp: key = GDK_Help; break; case kbLeft: key = GDK_Left; break; case kbPgDown: key = GDK_Page_Down; break; case kbPgUp: key = GDK_Page_Up; break; case kbRight: key = GDK_Right; break; case kbUp: key = GDK_Up; break; default: if (action->key >= 256) { key = action->key - 256; modifier = GDK_MOD1_MASK; } if (iscntrl(action->key)) { key = action->key + '@'; modifier |= GDK_CONTROL_MASK; } else if (isupper(action->key)) modifier |= GDK_SHIFT_MASK; else key = toupper(action->key); break; } gtk_widget_add_accelerator(item, "activate", accel_group, key, modifier, GTK_ACCEL_VISIBLE); }; void destroy_all_actions() { while (first_action) osDestroyAction(first_action); } ActionHandle osCreateAction() { return create_action(ACTION_NORMAL); } ActionHandle osCreateCheckAction() { return create_action(ACTION_CHECK); } ActionHandle osCreateRadioAction() { return create_action(ACTION_RADIO); } ActionHandle osCreateDropDownAction(MenuHandle menu) { ActionHandle action = create_action(ACTION_DROPDOWN); action->menu = menu; return action; } void osSetActionRadioGroup(ActionHandle *handles) { ActionHandle *phandle, handle, child; if (!handles || *handles == NULL) return; phandle=handles; for (;;) { handle = *phandle; child = handle->next_action_in_group; while (child->next_action_in_group != handle) child = child->next_action_in_group; child->next_action_in_group = handle->next_action_in_group; phandle++; if (*phandle) handle->next_action_in_group = *phandle; else { handle->next_action_in_group = *handles; break; } } } void osSetActionBitmap(ActionHandle action, BitmapHandle bitmap) { GSList *list; GtkWidget *proxy, *image; action->bitmap = bitmap; for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_IMAGE_MENU_ITEM(proxy)) { image = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(proxy)); if (action->bitmap) { if (!image) { image = gtk_image_new_from_pixbuf(action->bitmap->pixbuf); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(proxy), image); } else gtk_image_set_from_pixbuf(GTK_IMAGE(image),action->bitmap->pixbuf); } else { if (image) { gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(proxy), NULL); } } } else if (GTK_IS_TOOL_BUTTON(proxy)) { image = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON(proxy)); gtk_image_set_from_pixbuf(GTK_IMAGE(image), action->bitmap->pixbuf); } } } void osSetActionEnabled(ActionHandle action, BOOL enabled) { GSList *list; GtkWidget *proxy; action->enabled = enabled; for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; gtk_widget_set_sensitive(proxy,action->enabled); } } BOOL osGetActionEnabled(ActionHandle action) { return action->enabled; } void osSetActionTip(ActionHandle action, char *text) { GSList *list; GtkWidget *proxy; action->tooltip = strdup(text); for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_TOOL_BUTTON(proxy)) { GtkWidget *toolbar = gtk_widget_get_parent(proxy); gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(proxy), GTK_TOOLBAR(toolbar)->tooltips, text, NULL); } } } char *osGetActionTip(ActionHandle action) { return strdup(action->tooltip); } void osSetActionText(ActionHandle action, char *text) { GSList *list; GtkWidget *proxy; char *short_text; action->title = strdup(text); text = toMnemonicString(action->title); short_text = toMnemonicString(action->short_title); for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_MENU_ITEM(proxy)) gtk_label_set_text_with_mnemonic(GTK_LABEL(GTK_BIN(proxy)->child), text); else if (GTK_IS_TOOL_BUTTON(proxy)) gtk_tool_button_set_label(GTK_TOOL_BUTTON(proxy), short_text ? short_text : text); } rfree(short_text); rfree(text); } char *osGetActionText(ActionHandle action) { return strdup(action->title); } void osSetActionShortText(ActionHandle action, char *text) { GSList *list; GtkWidget *proxy; action->short_title = (text && *text) ? strdup(text) : NULL; text = toMnemonicString(action->short_title ? action->short_title : action->title); for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_TOOL_BUTTON(proxy)) gtk_tool_button_set_label(GTK_TOOL_BUTTON(proxy), text); } rfree(text); } char *osGetActionShortText(ActionHandle action) { return strdup(action->short_title); } void osSetActionChecked(ActionHandle action, BOOL checked) { GSList *list; GtkWidget *proxy; ActionHandle action_in_group; action_in_group = action; do { action_in_group->busy = TRUE; action_in_group->checked = checked; for (list = action_in_group->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_CHECK_MENU_ITEM(proxy)) gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM (proxy), action_in_group->checked); else if (GTK_IS_TOGGLE_TOOL_BUTTON(proxy)) gtk_toggle_tool_button_set_active ( GTK_TOGGLE_TOOL_BUTTON(proxy), action_in_group->checked); } action_in_group->busy = FALSE; action_in_group = action_in_group->next_action_in_group; checked = FALSE; } while (action_in_group != action); handleActionCommand(action); }; BOOL osGetActionChecked(ActionHandle action) { return action->checked; }; void osSetActionAccel(ActionHandle action, int key, unsigned int mods) { GSList *list; GtkWidget *proxy; action->key = key; action->keyMods = mods; for (list = action->proxies; list != NULL; list=list->next) { proxy = (GtkWidget *) list->data; if (GTK_IS_MENU_ITEM(proxy)) menu_item_set_accel(proxy, action); } }; void osGetActionAccel(ActionHandle action, int *key, unsigned int *mods) { *key = action->key; *mods = action->keyMods; }; void osDestroyAction(ActionHandle action) { ActionHandle act; if (action->menu) gtk_widget_destroy(action->menu); // destroy all proxies associated with the action while (action->proxies) gtk_widget_destroy((GtkWidget *) action->proxies->data); handleActionDestroy(action); if (first_action == action) first_action = action->next_action; else { for (act = first_action; act != NULL; act=act->next_action) { if (act->next_action == action) { act->next_action = action->next_action; break; } } } free(action->title); free(action->short_title); free(action->tooltip); free(action); } Index: Internals.h =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/Internals.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Internals.h 8 May 2004 09:21:09 -0000 1.7 --- Internals.h 12 May 2004 20:42:34 -0000 1.8 *************** *** 5,8 **** --- 5,37 ---- #include "LayoutContainer.h" + enum ActionType { ACTION_NORMAL, ACTION_CHECK, ACTION_RADIO, ACTION_DROPDOWN }; + + struct ActionHandle + { + // chain; + ActionHandle next_action; + ActionHandle next_action_in_group; + + // Attributes + enum ActionType type; // the action type + char *title; + char *short_title; + char *tooltip; + BitmapHandle bitmap; + BOOL enabled : 1; // TRUE if the action is enabled + BOOL checked : 1; // TRUE if the action is checked + BOOL busy : 1; // TRUE if we currently update the proxies state + + GtkWidget *menu; + + // Accelerator + int key; + unsigned int keyMods; + + GSList *proxies; // the collection of all proxies (menu items or toolbar buttons) associated to this action + }; + + extern void menu_item_set_accel(GtkWidget *item, ActionHandle action); + extern BOOL gInKey; extern int gCurChar; Index: Menu.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/Menu.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** Menu.c 5 May 2004 21:06:56 -0000 1.14 --- Menu.c 12 May 2004 20:42:34 -0000 1.15 *************** *** 1,4 **** --- 1,5 ---- #include "Menu.h" #include "Window.h" + #include "Action.h" #include "Internals.h" #include "Handlers_stub.h" *************** *** 17,31 **** } ! static void menu_put_hint_in_statusbar(GtkWidget *menuitem, gpointer data) { ! gchar* hint = g_object_get_data(G_OBJECT(menuitem), apphelper_statusbar_hint); ! // if (GNOME_APP(gFrameWidget)->statusbar) ! // gnome_appbar_push(GNOME_APPBAR(GNOME_APP(gFrameWidget)->statusbar), hint); } ! static void menu_remove_hint_from_statusbar(GtkWidget *menu) { ! // if (GNOME_APP(gFrameWidget)->statusbar) ! // gnome_appbar_pop(GNOME_APPBAR(GNOME_APP(gFrameWidget)->statusbar)); } --- 18,64 ---- } ! static void menu_item_put_hint_in_statusbar(GtkWidget *menuitem, ActionHandle action) { ! if (action && action->tooltip) ! { ! if (GNOME_APP(gFrameWidget)->statusbar) ! gnome_appbar_push(GNOME_APPBAR(GNOME_APP(gFrameWidget)->statusbar), action->tooltip); ! } } ! static void menu_item_remove_hint_from_statusbar(GtkWidget *menu, ActionHandle action) { ! if (action && action->tooltip) ! { ! if (GNOME_APP(gFrameWidget)->statusbar) ! gnome_appbar_pop(GNOME_APPBAR(GNOME_APP(gFrameWidget)->statusbar)); ! } ! } ! ! static void menu_item_activate(GtkMenuItem *menuitem, ActionHandle action) ! { ! if (action->busy) ! return; ! ! switch (action->type) ! { ! case ACTION_NORMAL: ! handleActionCommand(action); ! break; ! case ACTION_CHECK: ! osSetActionChecked(action, !action->checked); ! break; ! case ACTION_RADIO: ! osSetActionChecked(action, TRUE); ! break; ! case ACTION_DROPDOWN: ! break; ! } ! } ! ! static void menu_item_destroy(GtkWidget *menu, ActionHandle action) ! { ! handleMenuDestroy(menu); ! action->proxies = g_slist_remove(action->proxies, menu); } *************** *** 78,101 **** } - static void menu_show(GtkWidget *widget, gpointer user_data) - { - GtkWidget *menuItem; - GList *child = GTK_MENU_SHELL(widget)->children; - - while (child) - { - menuItem = (GtkWidget *) child->data; - - if (GTK_IS_IMAGE_MENU_ITEM(menuItem) || - GTK_IS_CHECK_MENU_ITEM(menuItem) || - GTK_IS_RADIO_MENU_ITEM(menuItem)) - { - handleMenuUpdate(menuItem); - } - - child = child->next; - } - } - MenuHandle osCreatePopupMenu() { --- 111,114 ---- *************** *** 104,110 **** GTK_SIGNAL_FUNC(menu_destroy), NULL); - gtk_signal_connect (GTK_OBJECT(popUpMenu), "show", - GTK_SIGNAL_FUNC(menu_show), - NULL); return popUpMenu; } --- 117,120 ---- *************** *** 138,142 **** } ! MenuHandle osInsertMenu(MenuHandle parent, int pos) { GtkWidget *menu; --- 148,152 ---- } ! MenuHandle osInsertMenu(MenuHandle hmenu, int pos) { GtkWidget *menu; *************** *** 148,156 **** GTK_SIGNAL_FUNC(menu_destroy), NULL); - gtk_signal_connect (GTK_OBJECT(popUpMenu), "show", - GTK_SIGNAL_FUNC(menu_show), - NULL); ! menu = getMenu(parent); pos = recalcPos(menu, pos); --- 158,163 ---- GTK_SIGNAL_FUNC(menu_destroy), NULL); ! menu = getMenu(hmenu); pos = recalcPos(menu, pos); *************** *** 160,216 **** }; ! MenuHandle osInsertMenuItem(MenuHandle parent, int pos) { ! GtkWidget *menu; GtkWidget *label, *menuItem; ! menuItem = gtk_image_menu_item_new(); ! label = gtk_accel_label_new(""); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); ! ! gtk_signal_connect (GTK_OBJECT(menuItem), "activate", ! GTK_SIGNAL_FUNC(handleMenuCommand), ! NULL); ! gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(menu_destroy), ! NULL); ! gtk_signal_connect (GTK_OBJECT(menuItem), "select", ! GTK_SIGNAL_FUNC(menu_put_hint_in_statusbar), ! NULL); ! gtk_signal_connect (GTK_OBJECT(menuItem), "deselect", ! GTK_SIGNAL_FUNC(menu_remove_hint_from_statusbar), ! NULL); ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); ! gtk_widget_show_all(menuItem); ! return menuItem; ! }; ! MenuHandle osInsertMenuCheckItem(MenuHandle parent, int pos) ! { ! GtkWidget *menu; ! GtkWidget *label, *menuItem; ! menuItem = gtk_check_menu_item_new(); ! label = gtk_accel_label_new(""); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); - gtk_signal_connect (GTK_OBJECT(menuItem), "activate", - GTK_SIGNAL_FUNC(handleMenuCommand), - NULL); gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(menu_destroy), ! NULL); gtk_signal_connect (GTK_OBJECT(menuItem), "select", ! GTK_SIGNAL_FUNC(menu_put_hint_in_statusbar), ! NULL); gtk_signal_connect (GTK_OBJECT(menuItem), "deselect", ! GTK_SIGNAL_FUNC(menu_remove_hint_from_statusbar), ! NULL); menu = getMenu(parent); --- 167,229 ---- }; ! MenuHandle osInsertMenuItem(ActionHandle action, MenuHandle parent, int pos) { ! GtkWidget *menu, *popUpMenu; GtkWidget *label, *menuItem; + gchar *text; ! switch (action->type) ! { ! case ACTION_NORMAL: ! menuItem = gtk_image_menu_item_new(); ! if (action->bitmap) ! gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuItem), ! gtk_image_new_from_pixbuf(action->bitmap->pixbuf)); ! break; ! case ACTION_CHECK: ! menuItem = gtk_check_menu_item_new(); ! gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menuItem), action->checked); ! break; ! case ACTION_RADIO: ! menuItem = gtk_check_menu_item_new(); ! gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(menuItem), TRUE); ! gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menuItem), action->checked); ! break; ! case ACTION_DROPDOWN: ! text = toMnemonicString(action->title ? action->title : ""); ! menuItem = gtk_menu_item_new_with_mnemonic(text); ! rfree(text); ! if (action->menu) ! gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), action->menu); ! break; ! } ! gtk_widget_set_sensitive(menuItem,action->enabled); ! if (action->type != ACTION_DROPDOWN) ! { ! label = gtk_accel_label_new(""); ! text = toMnemonicString(action->title ? action->title : ""); ! gtk_label_set_text_with_mnemonic(GTK_LABEL(label) , text); ! rfree(text); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); ! menu_item_set_accel(menuItem, action); ! gtk_signal_connect (GTK_OBJECT(menuItem), "activate", ! GTK_SIGNAL_FUNC(menu_item_activate), ! action); ! } gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(menu_item_destroy), ! action); gtk_signal_connect (GTK_OBJECT(menuItem), "select", ! GTK_SIGNAL_FUNC(menu_item_put_hint_in_statusbar), ! action); gtk_signal_connect (GTK_OBJECT(menuItem), "deselect", ! GTK_SIGNAL_FUNC(menu_item_remove_hint_from_statusbar), ! action); menu = getMenu(parent); *************** *** 219,222 **** --- 232,239 ---- gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); gtk_widget_show_all(menuItem); + + // add the item to the list of all menu items associated to this action + action->proxies = g_slist_append(action->proxies, menuItem); + return menuItem; }; *************** *** 227,231 **** GtkWidget *item = gtk_separator_menu_item_new(); gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(menu_destroy), NULL); --- 244,248 ---- GtkWidget *item = gtk_separator_menu_item_new(); gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), NULL); *************** *** 238,292 **** } - static void handleRadioMenuCommand(GtkMenuItem *menuitem) - { - if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) - handleMenuCommand(menuitem); - } - - MenuHandle osInsertMenuRadioItem(MenuHandle parent, int pos) - { - GtkWidget *menu; - GtkWidget *menuItem, *label; - - menuItem = gtk_radio_menu_item_new(NULL); - GTK_CHECK_MENU_ITEM (menuItem)->active = FALSE; - label = gtk_accel_label_new(""); - gtk_container_add(GTK_CONTAINER(menuItem), label); - gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); - - gtk_signal_connect (GTK_OBJECT(menuItem), "activate", - GTK_SIGNAL_FUNC(handleRadioMenuCommand), - NULL); - gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", - GTK_SIGNAL_FUNC(menu_destroy), - NULL); - gtk_signal_connect (GTK_OBJECT(menuItem), "select", - GTK_SIGNAL_FUNC(menu_put_hint_in_statusbar), - NULL); - gtk_signal_connect (GTK_OBJECT(menuItem), "deselect", - GTK_SIGNAL_FUNC(menu_remove_hint_from_statusbar), - NULL); - - - menu = getMenu(parent); - pos = recalcPos(menu, pos); - - gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); - gtk_widget_show_all(menuItem); - return menuItem; - } - - void osSetMenuRadioGroup(MenuHandle *handles) - { - MenuHandle *phandle; - GSList *group = NULL; - - for (phandle = handles; *phandle; phandle++) - { - gtk_radio_menu_item_set_group(GTK_RADIO_MENU_ITEM(*phandle), group); - group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM(*phandle)); - } - } - void osDestroyMenu(MenuHandle handle) { --- 255,258 ---- *************** *** 324,337 **** }; - void osSetMenuItemChecked(MenuHandle item, BOOL bState) - { - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), bState); - }; - - BOOL osGetMenuItemChecked(MenuHandle item) - { - return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)); - }; - void osSetMenuLabel(MenuHandle item, char* title) { --- 290,293 ---- *************** *** 352,537 **** }; - void osSetMenuTip(MenuHandle item, char* title) - { - gchar *hint = g_object_get_data(G_OBJECT(item), apphelper_statusbar_hint); - if (hint) free(hint); - - g_object_set_data(G_OBJECT(item), apphelper_statusbar_hint, strdup(title)); - } - - char *osGetMenuTip(MenuHandle item) - { - return g_object_get_data(G_OBJECT(item), apphelper_statusbar_hint); - }; - - static gboolean find_accel_by_widget(GtkAccelKey *key, GClosure *closure, gpointer data) - { - return (closure->data == data); - } - - void osSetMenuItemAccel(MenuHandle item, int key, unsigned int mods) - { - GdkModifierType modifier; - GtkAccelKey *accel_key; - GtkAccelGroup *accel_group = (GtkAccelGroup *) gtk_accel_groups_from_object (G_OBJECT(gFrameWidget))->data; - - accel_key = gtk_accel_group_find(accel_group, find_accel_by_widget, item); - if (accel_key) gtk_widget_remove_accelerator(item, accel_group, accel_key->accel_key, accel_key->accel_mods); - - if (!key) return; - - modifier = 0; - if (mods & shiftBIT) modifier |= GDK_SHIFT_MASK; - if (mods & ctrlBIT) modifier |= GDK_CONTROL_MASK; - if (mods & altBIT) modifier |= GDK_MOD1_MASK; - - switch (key) - { - case kbBackSpace: key = GDK_BackSpace; break; - case kbTab: key = GDK_Tab; break; - case kbEnter: key = GDK_Return; break; - case kbEscape: key = GDK_Escape; break; - case kbBegin: key = GDK_Begin; break; - case kbClear: key = GDK_Clear; break; - case kbDelete: key = GDK_Delete; break; - case kbDown: key = GDK_Down; break; - case kbEnd: key = GDK_End; break; - case kbF1: key = GDK_F1; break; - case kbF2: key = GDK_F2; break; - case kbF3: key = GDK_F3; break; - case kbF4: key = GDK_F4; break; - case kbF5: key = GDK_F5; break; - case kbF6: key = GDK_F6; break; - case kbF7: key = GDK_F7; break; - case kbF8: key = GDK_F8; break; - case kbF9: key = GDK_F9; break; - case kbF10: key = GDK_F10; break; - case kbF11: key = GDK_F11; break; - case kbF12: key = GDK_F12; break; - case kbF13: key = GDK_F13; break; - case kbF14: key = GDK_F14; break; - case kbF15: key = GDK_F15; break; - case kbHelp: key = GDK_Help; break; - case kbLeft: key = GDK_Left; break; - case kbPgDown: key = GDK_Page_Down; break; - case kbPgUp: key = GDK_Page_Up; break; - case kbRight: key = GDK_Right; break; - case kbUp: key = GDK_Up; break; - default: - if (key >= 256) - { - key -= 256; - modifier = GDK_MOD1_MASK; - } - - if (iscntrl(key)) - { - key += '@'; - modifier |= GDK_CONTROL_MASK; - } - else - if (isupper(key)) - modifier |= GDK_SHIFT_MASK; - else - key = toupper(key); - break; - } - - gtk_widget_add_accelerator(item, "activate", - accel_group, - key, - modifier, - GTK_ACCEL_VISIBLE); - }; - - void osGetMenuItemAccel(MenuHandle item, int *key, unsigned int *mods) - { - GtkAccelKey *accel_key; - GtkAccelGroup *accel_group = (GtkAccelGroup *) gtk_accel_groups_from_object (G_OBJECT(gFrameWidget))->data; - - accel_key = gtk_accel_group_find(accel_group, find_accel_by_widget, item); - - if (accel_key) - { - *mods = 0; - if (accel_key->accel_mods & GDK_SHIFT_MASK) *mods |= shiftBIT; - if (accel_key->accel_mods & GDK_CONTROL_MASK) *mods |= ctrlBIT; - if (accel_key->accel_mods & GDK_MOD1_MASK) *mods |= altBIT; - - switch (accel_key->accel_key) - { - case GDK_Up: *key = kbUp; break; - case GDK_Down: *key = kbDown; break; - case GDK_Left: *key = kbLeft; break; - case GDK_Right: *key = kbRight; break; - case GDK_Page_Up: *key = kbPgUp; break; - case GDK_Page_Down:*key = kbPgDown; break; - case GDK_End: *key = kbEnd; break; - case GDK_Begin: *key = kbBegin; break; - case GDK_BackSpace:*key = kbBackSpace; break; - case GDK_Delete: *key = kbDelete; break; - case GDK_Tab: *key = kbTab; break; - case GDK_Return: *key = kbEnter; break; - case GDK_Escape: *key = kbEscape; break; - case GDK_Help: *key = kbHelp; break; - case GDK_F1: *key = kbF1; break; - case GDK_F2: *key = kbF2; break; - case GDK_F3: *key = kbF3; break; - case GDK_F4: *key = kbF4; break; - case GDK_F5: *key = kbF5; break; - case GDK_F6: *key = kbF6; break; - case GDK_F7: *key = kbF7; break; - case GDK_F8: *key = kbF8; break; - case GDK_F9: *key = kbF9; break; - case GDK_F10: *key = kbF10; break; - case GDK_F11: *key = kbF11; break; - case GDK_F12: *key = kbF12; break; - case GDK_Clear: *key = kbClear; break; - default: - *mods = 0; - - *key = accel_key->accel_key; - if (accel_key->accel_mods & GDK_CONTROL_MASK) - *key = toupper(accel_key->accel_key) - '@'; - else - if (accel_key->accel_mods & GDK_SHIFT_MASK) - *key = toupper(accel_key->accel_key); - - if (accel_key->accel_mods & GDK_MOD1_MASK) - *key += 256; - break; - } - } - else - { - *key = 0; - *mods = 0; - } - }; - - void osSetMenuItemBitmap(MenuHandle item, BitmapHandle bitmap) - { - GtkWidget *image = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(item)); - - if (bitmap) - { - if (!image) - { - image = gtk_image_new_from_pixbuf(bitmap->pixbuf); - gtk_widget_show(image); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); - } - else - gtk_image_set_from_pixbuf(GTK_IMAGE(image),bitmap->pixbuf); - } - else - { - if (image) - { - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), NULL); - } - } - }; - int osGetMenuItemPos(MenuHandle handle) { --- 308,311 ---- Index: ToolBar.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/ToolBar.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ToolBar.c 5 May 2004 22:10:16 -0000 1.12 --- ToolBar.c 12 May 2004 20:42:34 -0000 1.13 *************** *** 1,7 **** --- 1,35 ---- #include "ToolBar.h" + #include "Action.h" #include "Internals.h" #include "Handlers_stub.h" #include "gtkdropdowntoolbutton.h" + static void tool_item_clicked(GtkWidget *widget, ActionHandle action) + { + if (action->busy) + return; + + switch (action->type) + { + case ACTION_NORMAL: + handleActionCommand(action); + break; + case ACTION_CHECK: + osSetActionChecked(action, !action->checked); + break; + case ACTION_RADIO: + osSetActionChecked(action, TRUE); + break; + case ACTION_DROPDOWN: + break; + } + } + + static void tool_item_destroy(GtkWidget *tool, ActionHandle action) + { + handleToolDestroy(tool); + action->proxies = g_slist_remove(action->proxies, tool); + } + WindowHandle osCreateToolBar(char *name, PositionType place, int band_num, int band_position, int offset) { *************** *** 10,14 **** toolbar = gtk_toolbar_new(); ! gtk_toolbar_set_show_arrow(toolbar,FALSE); gtk_signal_connect (GTK_OBJECT(toolbar), "destroy", GTK_SIGNAL_FUNC(handleWindowDestroy), --- 38,42 ---- toolbar = gtk_toolbar_new(); ! gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar),FALSE); gtk_signal_connect (GTK_OBJECT(toolbar), "destroy", GTK_SIGNAL_FUNC(handleWindowDestroy), *************** *** 46,125 **** } ! ToolHandle osInsertToolButton(WindowHandle toolbar, int pos) { ! GtkToolItem *item = gtk_tool_button_new(gtk_image_new(), ""); ! gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON(item), TRUE); ! gtk_signal_connect (GTK_OBJECT(item), "clicked", ! GTK_SIGNAL_FUNC(handleToolCommand), ! NULL); ! gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleToolDestroy), ! NULL); ! gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, pos); ! gtk_widget_show_all(GTK_WIDGET(item)); ! return GTK_WIDGET(item); ! } ! ToolHandle osInsertToolCheckButton(WindowHandle toolbar, int pos) ! { ! GtkToolItem *item = gtk_toggle_tool_button_new(); ! gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON(item), TRUE); ! gtk_signal_connect (GTK_OBJECT(item), "clicked", ! GTK_SIGNAL_FUNC(handleToolCommand), ! NULL); ! gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleToolDestroy), ! NULL); ! gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), gtk_image_new()); ! gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, pos); ! gtk_widget_show_all(GTK_WIDGET(item)); ! return GTK_WIDGET(item); ! } ! static void tool_radio_button_clicked(GtkWidget *widget, gpointer user_data) ! { ! if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))) ! handleToolCommand(widget); ! } - ToolHandle osInsertToolRadioButton(WindowHandle toolbar, int pos) - { - GtkToolItem *item = gtk_radio_tool_button_new(NULL); gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON(item), TRUE); ! gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON (item), FALSE); ! gtk_signal_connect (GTK_OBJECT(item), "clicked", ! GTK_SIGNAL_FUNC(tool_radio_button_clicked), ! NULL); ! gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleToolDestroy), ! NULL); ! gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), gtk_image_new()); ! gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, pos); ! gtk_widget_show_all(GTK_WIDGET(item)); ! return GTK_WIDGET(item); ! } ! void osSetToolRadioGroup(ToolHandle *handles) ! { ! ToolHandle *phandle; ! GSList *group = NULL; ! for (phandle = handles; *phandle; phandle++) { ! gtk_radio_tool_button_set_group(GTK_RADIO_TOOL_BUTTON(*phandle), group); ! group = gtk_radio_tool_button_get_group(GTK_RADIO_TOOL_BUTTON(*phandle)); } - } - ToolHandle osInsertToolDropDownButton(WindowHandle toolbar, MenuHandle hmenu, int pos) - { - GtkToolItem *item = gtk_drop_down_tool_button_new(gtk_image_new(), "", NULL); - gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON(item), TRUE); - gtk_drop_down_tool_button_set_menu(GTK_DROP_DOWN_TOOL_BUTTON(item), hmenu); gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleToolDestroy), ! NULL); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, pos); gtk_widget_show_all(GTK_WIDGET(item)); return GTK_WIDGET(item); } --- 74,132 ---- } ! ToolHandle osInsertToolButton(ActionHandle action, WindowHandle toolbar, int pos) { ! GtkToolItem *item; ! GtkWidget *image; ! char *text; ! image = gtk_image_new(); ! if (action->bitmap) ! gtk_image_set_from_pixbuf(GTK_IMAGE(image), action->bitmap->pixbuf); ! switch (action->type) ! { ! case ACTION_NORMAL: ! item = gtk_tool_button_new(image, ""); ! break; ! case ACTION_CHECK: ! case ACTION_RADIO: ! item = gtk_toggle_tool_button_new(); ! gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), image); ! gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(item), action->checked); ! break; ! case ACTION_DROPDOWN: ! item = gtk_drop_down_tool_button_new(image, "", NULL); ! if (action->menu) ! gtk_drop_down_tool_button_set_menu(GTK_DROP_DOWN_TOOL_BUTTON(item), action->menu); ! break; ! } ! ! gtk_widget_set_sensitive(GTK_WIDGET(item),action->enabled); gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON(item), TRUE); ! text = toMnemonicString(action->short_title ? action->short_title : action->title ? action->title : ""); ! gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), text); ! rfree(text); ! if (action->tooltip) ! gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLBAR(toolbar)->tooltips, action->tooltip, NULL); ! if (action->type != ACTION_DROPDOWN) { ! gtk_signal_connect (GTK_OBJECT(item), "clicked", ! GTK_SIGNAL_FUNC(tool_item_clicked), ! action); } gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(tool_item_destroy), ! action); ! gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, pos); gtk_widget_show_all(GTK_WIDGET(item)); + + // add the button to the list of all menu items associated to this action + action->proxies = g_slist_append(action->proxies, item); + return GTK_WIDGET(item); } *************** *** 136,188 **** } - void osSetToolButtonBitmap(ToolHandle toolButton, BitmapHandle bitmap) - { - gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON(toolButton))), bitmap->pixbuf); - } - - void osSetToolButtonEnabled(ToolHandle toolButton, BOOL enabled) - { - gtk_widget_set_sensitive(toolButton,enabled); - } - - BOOL osGetToolButtonEnabled(ToolHandle toolButton) - { - return GTK_WIDGET_SENSITIVE(toolButton); - } - - void osSetToolButtonTip(ToolHandle toolButton, char *text) - { - GtkWidget *toolbar = gtk_widget_get_parent(toolButton); - gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolButton), GTK_TOOLBAR(toolbar)->tooltips, text, NULL); - } - - char *osGetToolButtonTip(ToolHandle toolButton) - { - GtkTooltipsData *tips_data = gtk_tooltips_data_get(GTK_BIN (toolButton)->child); - return strdup(tips_data->tip_text); - } - - void osSetToolButtonText(ToolHandle toolButton, char *text) - { - gchar *szText = toMnemonicString(text); - gtk_tool_button_set_label(GTK_TOOL_BUTTON(toolButton), szText); - rfree(szText); - } - - char *osGetToolButtonText(ToolHandle toolButton) - { - return fromMnemonicString(gtk_tool_button_get_label(GTK_TOOL_BUTTON(toolButton))); - } - - void osSetToolButtonChecked(ToolHandle toolButton, BOOL bState) - { - gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(toolButton), bState); - }; - - BOOL osGetToolButtonChecked(ToolHandle toolButton) - { - return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toolButton)); - }; - void osDestroyToolItem(ToolHandle toolItem) { --- 143,146 ---- Index: Util.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/Util.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** Util.c 8 May 2004 09:21:09 -0000 1.20 --- Util.c 12 May 2004 20:42:34 -0000 1.21 *************** *** 24,28 **** void rfree (void *ptr) { ! free(ptr); } --- 24,29 ---- void rfree (void *ptr) { ! if (ptr) ! free(ptr); } *************** *** 99,102 **** --- 100,104 ---- { gtk_main(); + destroy_all_actions(); handleProcessDestroy(); free(gAppTitle); gAppTitle = NULL; *************** *** 114,119 **** gchar *toMnemonicString(const gchar *source) { ! gchar *dest = (gchar *) rmalloc(strlen(source)*2+1); ! gchar *s = dest; while (*source) --- 116,126 ---- gchar *toMnemonicString(const gchar *source) { ! gchar *dest, *s; ! ! if (!source) ! return NULL; ! ! dest = (gchar *) rmalloc(strlen(source)*2+1); ! s = dest; while (*source) |