void hookEvents() { super.hookEvents(); if ((style & SWT.SEPARATOR) != 0) return; OS.g_signal_connect_closure(handle, OS.clicked, display.closures[CLICKED], false); /* * Feature in GTK. GtkToolItem does not respond to basic listeners * such as button-press, enter-notify to it. The fix is to assign * the listener to child (GtkButton) of the tool-item. */ eventHandle = OS.gtk_bin_get_child(handle); if ((style & SWT.DROP_DOWN) != 0 && OS.GTK_VERSION >= OS.VERSION(2, 6, 0)) { long /*int*/ list = OS.gtk_container_get_children(eventHandle); eventHandle = OS.g_list_nth_data(list, 0); if (arrowHandle != 0) OS.g_signal_connect_closure(arrowHandle, OS.clicked, display.closures[CLICKED], false); } OS.g_signal_connect_closure( handle, OS.create_menu_proxy, display.closures[CREATE_MENU_PROXY], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[ENTER_NOTIFY_EVENT], 0, display.closures[ENTER_NOTIFY_EVENT], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[LEAVE_NOTIFY_EVENT], 0, display.closures[LEAVE_NOTIFY_EVENT], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[FOCUS_IN_EVENT], 0, display.closures[FOCUS_IN_EVENT], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[FOCUS_OUT_EVENT], 0, display.closures[FOCUS_OUT_EVENT], false); /* * Feature in GTK. Usually, GTK widgets propagate all events to their * parent when they are done their own processing. However, in contrast * to other widgets, the buttons that make up the tool items, do not propagate * the mouse up/down events. It is interesting to note that they DO propagate * mouse motion events. The fix is to explicitly forward mouse up/down events * to the parent. */ int mask = OS.GDK_EXPOSURE_MASK | OS.GDK_POINTER_MOTION_MASK | OS.GDK_BUTTON_PRESS_MASK | OS.GDK_BUTTON_RELEASE_MASK | OS.GDK_ENTER_NOTIFY_MASK | OS.GDK_LEAVE_NOTIFY_MASK | OS.GDK_KEY_PRESS_MASK | OS.GDK_KEY_RELEASE_MASK | OS.GDK_FOCUS_CHANGE_MASK; OS.gtk_widget_add_events(eventHandle, mask); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[BUTTON_PRESS_EVENT], 0, display.closures[BUTTON_PRESS_EVENT], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[BUTTON_RELEASE_EVENT], 0, display.closures[BUTTON_RELEASE_EVENT], false); OS.g_signal_connect_closure_by_id( eventHandle, display.signalIds[EVENT_AFTER], 0, display.closures[EVENT_AFTER], false); long /*int*/ topHandle = topHandle(); OS.g_signal_connect_closure_by_id( topHandle, display.signalIds[MAP], 0, display.closures[MAP], true); }
void createHandle(int index) { state |= HANDLE; int bits = SWT.SEPARATOR | SWT.RADIO | SWT.CHECK | SWT.PUSH | SWT.DROP_DOWN; if ((style & SWT.SEPARATOR) == 0) { labelHandle = OS.gtk_label_new_with_mnemonic(null); if (labelHandle == 0) error(SWT.ERROR_NO_HANDLES); imageHandle = OS.gtk_image_new_from_pixbuf(0); if (imageHandle == 0) error(SWT.ERROR_NO_HANDLES); } switch (style & bits) { case SWT.SEPARATOR: handle = OS.gtk_separator_tool_item_new(); if (handle == 0) error(SWT.ERROR_NO_HANDLES); OS.gtk_separator_tool_item_set_draw(handle, true); break; case SWT.DROP_DOWN: if (OS.GTK_VERSION >= OS.VERSION(2, 6, 0)) { handle = OS.gtk_menu_tool_button_new(0, null); if (handle == 0) error(SWT.ERROR_NO_HANDLES); /* * Feature in GTK. The arrow button of DropDown tool-item is * disabled when it does not contain menu. The fix is to * find the arrow button handle and enable it. */ long /*int*/ child = OS.gtk_bin_get_child(handle); long /*int*/ list = OS.gtk_container_get_children(child); arrowHandle = OS.g_list_nth_data(list, 1); OS.gtk_widget_set_sensitive(arrowHandle, true); OS.gtk_widget_set_size_request(OS.gtk_bin_get_child(arrowHandle), 8, 6); } else { /* * GTK does not support GtkMenuToolButton until 2.6. * So, we try to emulate it on the un-supported version. */ handle = OS.gtk_tool_button_new(0, null); if (handle == 0) error(SWT.ERROR_NO_HANDLES); arrowBoxHandle = OS.gtk_hbox_new(false, 0); if (arrowBoxHandle == 0) error(SWT.ERROR_NO_HANDLES); arrowHandle = OS.gtk_arrow_new(OS.GTK_ARROW_DOWN, OS.GTK_SHADOW_NONE); if (arrowHandle == 0) error(SWT.ERROR_NO_HANDLES); OS.gtk_widget_set_size_request(arrowHandle, 8, 6); OS.gtk_container_add(arrowBoxHandle, labelHandle); OS.gtk_container_add(arrowBoxHandle, arrowHandle); /* * As we are try to emulate GtkMenuToolButton and in order * to display both the label and image, it is required * the set the toolitem as important. This will entitle * to display the label all the times. */ OS.gtk_tool_item_set_is_important(handle, true); } break; case SWT.RADIO: /* * Because GTK enforces radio behavior in a button group * a radio group is not created for each set of contiguous * buttons, each radio button will not draw unpressed. * The fix is to use toggle buttons instead. */ case SWT.CHECK: handle = OS.gtk_toggle_tool_button_new(); if (handle == 0) error(SWT.ERROR_NO_HANDLES); break; case SWT.PUSH: default: handle = OS.gtk_tool_button_new(0, null); if (handle == 0) error(SWT.ERROR_NO_HANDLES); break; } if (labelHandle != 0) { OS.gtk_tool_button_set_label_widget(handle, labelHandle); } if (imageHandle != 0) { OS.gtk_tool_button_set_icon_widget(handle, imageHandle); } if ((parent.state & FOREGROUND) != 0) { setForegroundColor(parent.getForegroundColor()); } if ((parent.state & FONT) != 0) { setFontDescription(parent.getFontDescription()); } /* * Feature in GTK. GtkToolButton class uses this property to * determine whether to show or hide its label when the toolbar * style is GTK_TOOLBAR_BOTH_HORIZ (or SWT.RIGHT). */ if ((parent.style & SWT.RIGHT) != 0) OS.gtk_tool_item_set_is_important(handle, true); if ((style & SWT.SEPARATOR) == 0) OS.gtk_tool_button_set_use_underline(handle, true); }