static gboolean gx_selector_value_entry(GxRegler *regler, GdkRectangle *rect, GdkEventButton *event) { GxSelector *selector = GX_SELECTOR(regler); GxSelectorPrivate *priv = selector->priv; GtkMenu *m = priv->menu; if (!m) { GtkTreeIter iter; gboolean found; char *s; m = GTK_MENU(gtk_menu_new()); //gtk_menu_set_reserve_toggle_size(m, false); // for narrow menus gtk_widget_set_name(GTK_WIDGET(m), "selector-value-popup"); g_signal_connect(m, "selection-done", G_CALLBACK(selection_done), selector); found = gtk_tree_model_get_iter_first(selector->model, &iter); while (found) { gtk_tree_model_get(selector->model, &iter, 0, &s, -1); GtkWidget *item = gtk_menu_item_new_with_label(s); gtk_menu_append(m, item); gtk_widget_show(item); g_free(s); found = gtk_tree_model_iter_next(selector->model, &iter); } priv->menu = m; } gtk_menu_set_active(m, get_selector_state(selector)); gtk_menu_popup(m, NULL, NULL, posfunc, regler, event->button, event->time); return TRUE; }
void on_select_blit(char *name) { if(menu_blit) gtk_menu_set_active(menu_blit,0); Layer *lay = (Layer*) env->layers.selected(); if(!lay) { error("no layer selected to change blit to %s",name); return; } lay->blitter.set_blit(name); }
void GtkPopupMenu::popUp(const IntSize& menuSize, const IntPoint& menuPosition, int itemCount, int selectedItem, const GdkEvent* event) { resetTypeAheadFindState(); m_menuPosition = menuPosition; gtk_menu_set_active(GTK_MENU(m_popup.get()), selectedItem); // This approach follows the one in gtkcombobox.c. GtkRequisition requisition; gtk_widget_set_size_request(m_popup.get(), -1, -1); #ifdef GTK_API_VERSION_2 gtk_widget_size_request(m_popup.get(), &requisition); #else gtk_widget_get_preferred_size(m_popup.get(), &requisition, 0); #endif gtk_widget_set_size_request(m_popup.get(), std::max(menuSize.width(), requisition.width), -1); GList* children = gtk_container_get_children(GTK_CONTAINER(m_popup.get())); GList* p = children; if (itemCount) { for (int i = 0; i < itemCount; i++) { if (i > selectedItem) break; GtkWidget* item = reinterpret_cast<GtkWidget*>(p->data); GtkRequisition itemRequisition; #ifdef GTK_API_VERSION_2 gtk_widget_get_child_requisition(item, &itemRequisition); #else gtk_widget_get_preferred_size(item, &itemRequisition, 0); #endif m_menuPosition.setY(m_menuPosition.y() - itemRequisition.height); p = g_list_next(p); } } else { // Center vertically the empty popup in the combo box area. m_menuPosition.setY(m_menuPosition.y() - menuSize.height() / 2); } g_list_free(children); guint button; guint32 activateTime; if (event) { button = event->type == GDK_BUTTON_PRESS ? event->button.button : 1; activateTime = gdk_event_get_time(event); } else { button = 1; activateTime = GDK_CURRENT_TIME; } #ifdef GTK_API_VERSION_2 gtk_menu_popup(GTK_MENU(m_popup.get()), 0, 0, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, button, activateTime); #else gtk_menu_popup_for_device(GTK_MENU(m_popup.get()), event ? gdk_event_get_device(event) : 0, 0, 0, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, 0, button, activateTime); #endif }
void WebPopupMenuProxyGtk::showPopupMenu(const IntRect& rect, TextDirection, double /* pageScaleFactor */, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) { populatePopupMenu(items); gtk_menu_set_active(GTK_MENU(m_popup), selectedIndex); resetTypeAheadFindState(); IntPoint menuPosition = convertWidgetPointToScreenPoint(m_webView, rect.location()); menuPosition.move(0, rect.height()); // This approach follows the one in gtkcombobox.c. GtkRequisition requisition; gtk_widget_set_size_request(m_popup, -1, -1); gtk_widget_get_preferred_size(m_popup, &requisition, nullptr); gtk_widget_set_size_request(m_popup, std::max(rect.width(), requisition.width), -1); if (int itemCount = items.size()) { GUniquePtr<GList> children(gtk_container_get_children(GTK_CONTAINER(m_popup))); int i; GList* child; for (i = 0, child = children.get(); i < itemCount; i++, child = g_list_next(child)) { if (i > selectedIndex) break; GtkWidget* item = GTK_WIDGET(child->data); GtkRequisition itemRequisition; gtk_widget_get_preferred_size(item, &itemRequisition, nullptr); menuPosition.setY(menuPosition.y() - itemRequisition.height); } } else { // Center vertically the empty popup in the combo box area. menuPosition.setY(menuPosition.y() - rect.height() / 2); } const GdkEvent* event = m_client->currentlyProcessedMouseDownEvent() ? m_client->currentlyProcessedMouseDownEvent()->nativeEvent() : nullptr; gtk_menu_popup_for_device(GTK_MENU(m_popup), event ? gdk_event_get_device(event) : nullptr, nullptr, nullptr, [](GtkMenu*, gint* x, gint* y, gboolean* pushIn, gpointer userData) { // We can pass a pointer to the menuPosition local variable because the nested main loop ensures this is called in the function context. IntPoint* menuPosition = static_cast<IntPoint*>(userData); *x = menuPosition->x(); *y = menuPosition->y(); *pushIn = menuPosition->y() < 0; }, &menuPosition, nullptr, event && event->type == GDK_BUTTON_PRESS ? event->button.button : 1, event ? gdk_event_get_time(event) : GDK_CURRENT_TIME); // Now that the menu has a position, schedule a resize to make sure it's resized to fit vertically in the work area. gtk_widget_queue_resize(m_popup); // PopupMenu can fail to open when there is no mouse grab. // Ensure WebCore does not go into some pesky state. if (!gtk_widget_get_visible(m_popup)) { m_client->failedToShowPopupMenu(); return; } }
static void gtkItemSelect(GtkWidget *widget, Ihandle* ih) { Icallback cb = IupGetCallback(ih, "HIGHLIGHT_CB"); if (cb) cb(ih); cb = IupGetCallback(ih, "HELP_CB"); if (cb) gtk_menu_set_active((GtkMenu*)ih->parent->handle, IupGetChildPos(ih->parent, ih)); (void)widget; }
int clip_GTK_MENUSETACTIVE(ClipMachine * ClipMachineMemory) { C_widget *cmnu = _fetch_cw_arg(ClipMachineMemory); int index = _clip_parni(ClipMachineMemory, 2); CHECKCWID(cmnu, GTK_IS_MENU); CHECKOPT(2, NUMERIC_type_of_ClipVarType); gtk_menu_set_active(GTK_MENU(cmnu->widget), index); return 0; err: return 1; }
void PopupMenu::show(const IntRect& rect, FrameView* view, int index) { ASSERT(client()); if (!m_popup) { m_popup = GTK_MENU(gtk_menu_new()); g_object_ref(G_OBJECT(m_popup)); gtk_object_sink(GTK_OBJECT(m_popup)); g_signal_connect(m_popup, "unmap", G_CALLBACK(menuUnmapped), this); } else gtk_container_foreach(GTK_CONTAINER(m_popup), reinterpret_cast<GtkCallback>(menuRemoveItem), this); int x, y; gdk_window_get_origin(GTK_WIDGET(view->containingWindow())->window, &x, &y); m_menuPosition = view->contentsToWindow(rect.location()); m_menuPosition = IntPoint(m_menuPosition.x() + x, m_menuPosition.y() + y + rect.height()); m_indexMap.clear(); const int size = client()->listSize(); for (int i = 0; i < size; ++i) { GtkWidget* item; if (client()->itemIsSeparator(i)) item = gtk_separator_menu_item_new(); else item = gtk_menu_item_new_with_label(client()->itemText(i).utf8().data()); m_indexMap.add(item, i); g_signal_connect(item, "activate", G_CALLBACK(menuItemActivated), this); // FIXME: Apply the RenderStyle from client()->itemStyle(i) gtk_widget_set_sensitive(item, client()->itemIsEnabled(i)); gtk_menu_shell_append(GTK_MENU_SHELL(m_popup), item); gtk_widget_show(item); } gtk_menu_set_active(m_popup, index); // The size calls are directly copied from gtkcombobox.c which is LGPL GtkRequisition requisition; gtk_widget_set_size_request(GTK_WIDGET(m_popup), -1, -1); gtk_widget_size_request(GTK_WIDGET(m_popup), &requisition); gtk_widget_set_size_request(GTK_WIDGET(m_popup), MAX(rect.width(), requisition.width), -1); gtk_menu_popup(m_popup, NULL, NULL, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, 0, gtk_get_current_event_time()); }
static void fill_menu (GtkWidget *menu) { struct dirent *e; char *dname = gnome_unconditional_pixmap_file ("same-gnome"); DIR *dir; int itemno = 0; dir = opendir (dname); if (!dir) return; while ((e = readdir (dir)) != NULL){ GtkWidget *item; char *s = strdup (e->d_name); if (!strstr (e->d_name, ".png")) { free (s); continue; } item = gtk_menu_item_new_with_label (s); gtk_widget_show (item); gtk_menu_append (GTK_MENU(menu), item); gtk_signal_connect (GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC (set_selection), s); gtk_signal_connect (GTK_OBJECT(item), "destroy", GTK_SIGNAL_FUNC (free_str), s); if (!strcmp(scenario, s)) { gtk_menu_set_active(GTK_MENU(menu), itemno); } itemno++; } closedir (dir); }
void on_add_effect(char *name) { gtk_menu_set_active(menu_effect,0); Layer *laysel = (Layer*) env->layers.selected(); Filter *filt; if(!laysel) { error("no layer selected for effect %s",name); return; } /* TODO plugin selection by name inside plugger i don't do this now, will develop LiViDO and come back later */ for(int c=0; (filt = (Filter*)env->plugger.plugs[c]) ; c++) { if(filt->list) continue; if(strcasecmp(filt->getname(),name)==0) { if(!filt->init(&laysel->geo)) { error("Filter %s can't initialize",filt->getname()); continue; } laysel->filters.append(filt); /* filter is automatically selected */ laysel->filters.sel(0); filt->sel(true); } } }
void layer_dialog_update_diagram_list(void) { GtkWidget *new_menu; GtkWidget *menu_item; GList *dia_list; Diagram *dia; char *filename; int i; int current_nr; if (layer_dialog == NULL || layer_dialog->dialog == NULL) { if (!dia_open_diagrams()) return; /* shortcut; maybe session end w/o this dialog */ else layer_dialog_create(); } g_assert(layer_dialog != NULL); /* must be valid now */ /* oh this options: here integrated UI ;( */ if (!layer_dialog->diagram_omenu) return; new_menu = gtk_menu_new(); current_nr = -1; i = 0; dia_list = dia_open_diagrams(); while (dia_list != NULL) { dia = (Diagram *) dia_list->data; if (dia == layer_dialog->diagram) { current_nr = i; } filename = strrchr(dia->filename, G_DIR_SEPARATOR); if (filename==NULL) { filename = dia->filename; } else { filename++; } menu_item = gtk_menu_item_new_with_label(filename); g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (layer_dialog_select_diagram_callback), dia); gtk_menu_append( GTK_MENU(new_menu), menu_item); gtk_widget_show (menu_item); dia_list = g_list_next(dia_list); i++; } if (dia_open_diagrams()==NULL) { menu_item = gtk_menu_item_new_with_label (_("none")); g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (layer_dialog_select_diagram_callback), NULL); gtk_menu_append( GTK_MENU(new_menu), menu_item); gtk_widget_show (menu_item); } gtk_option_menu_remove_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu)); gtk_option_menu_set_menu(GTK_OPTION_MENU(layer_dialog->diagram_omenu), new_menu); gtk_option_menu_set_history(GTK_OPTION_MENU(layer_dialog->diagram_omenu), current_nr); gtk_menu_set_active(GTK_MENU(new_menu), current_nr); if (current_nr == -1) { dia = NULL; if (dia_open_diagrams()!=NULL) { dia = (Diagram *) dia_open_diagrams()->data; } layer_dialog_set_diagram(dia); } }
void WebPopupMenuProxyGtk::showPopupMenu(const IntRect& rect, TextDirection, double /* pageScaleFactor */, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex) { populatePopupMenu(items); gtk_menu_set_active(GTK_MENU(m_popup), selectedIndex); resetTypeAheadFindState(); IntPoint menuPosition = convertWidgetPointToScreenPoint(m_webView, rect.location()); menuPosition.move(0, rect.height()); // This approach follows the one in gtkcombobox.c. GtkRequisition requisition; gtk_widget_set_size_request(m_popup, -1, -1); gtk_widget_get_preferred_size(m_popup, &requisition, nullptr); gtk_widget_set_size_request(m_popup, std::max(rect.width(), requisition.width), -1); if (int itemCount = items.size()) { GUniquePtr<GList> children(gtk_container_get_children(GTK_CONTAINER(m_popup))); int i; GList* child; for (i = 0, child = children.get(); i < itemCount; i++, child = g_list_next(child)) { if (i > selectedIndex) break; GtkWidget* item = GTK_WIDGET(child->data); GtkRequisition itemRequisition; gtk_widget_get_preferred_size(item, &itemRequisition, nullptr); menuPosition.setY(menuPosition.y() - itemRequisition.height); } } else { // Center vertically the empty popup in the combo box area. menuPosition.setY(menuPosition.y() - rect.height() / 2); } gulong unmapHandler = g_signal_connect(m_popup, "unmap", G_CALLBACK(menuUnmapped), this); const GdkEvent* event = m_client->currentlyProcessedMouseDownEvent() ? m_client->currentlyProcessedMouseDownEvent()->nativeEvent() : nullptr; gtk_menu_popup_for_device(GTK_MENU(m_popup), event ? gdk_event_get_device(event) : nullptr, nullptr, nullptr, [](GtkMenu*, gint* x, gint* y, gboolean* pushIn, gpointer userData) { // We can pass a pointer to the menuPosition local variable because the nested main loop ensures this is called in the function context. IntPoint* menuPosition = static_cast<IntPoint*>(userData); *x = menuPosition->x(); *y = menuPosition->y(); *pushIn = TRUE; }, &menuPosition, nullptr, event && event->type == GDK_BUTTON_PRESS ? event->button.button : 1, event ? gdk_event_get_time(event) : GDK_CURRENT_TIME); // Now that the menu has a position, schedule a resize to make sure it's resized to fit vertically in the work area. gtk_widget_queue_resize(m_popup); // PopupMenu can fail to open when there is no mouse grab. // Ensure WebCore does not go into some pesky state. if (!gtk_widget_get_visible(m_popup)) { m_client->failedToShowPopupMenu(); return; } // WebPageProxy expects the menu to run in a nested run loop, since it invalidates the // menu right after calling WebPopupMenuProxy::showPopupMenu(). m_runLoop = adoptGRef(g_main_loop_new(nullptr, FALSE)); // This is to suppress warnings about gdk_threads_leave and gdk_threads_enter. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" gdk_threads_leave(); g_main_loop_run(m_runLoop.get()); gdk_threads_enter(); #pragma GCC diagnostic pop m_runLoop.clear(); g_signal_handler_disconnect(m_popup, unmapHandler); if (!m_client) return; m_client->valueChangedForPopupMenu(this, m_activeItem); }
void PopupMenuGtk::show(const IntRect& rect, FrameView* view, int index) { ASSERT(client()); if (!m_popup) { m_popup = GTK_MENU(gtk_menu_new()); g_signal_connect(m_popup.get(), "unmap", G_CALLBACK(menuUnmapped), this); } else gtk_container_foreach(GTK_CONTAINER(m_popup.get()), reinterpret_cast<GtkCallback>(menuRemoveItem), this); int x, y; gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(view->hostWindow()->platformPageClient())), &x, &y); m_menuPosition = view->contentsToWindow(rect.location()); m_menuPosition = IntPoint(m_menuPosition.x() + x, m_menuPosition.y() + y + rect.height()); m_indexMap.clear(); const int size = client()->listSize(); for (int i = 0; i < size; ++i) { GtkWidget* item; if (client()->itemIsSeparator(i)) item = gtk_separator_menu_item_new(); else item = gtk_menu_item_new_with_label(client()->itemText(i).utf8().data()); m_indexMap.add(item, i); g_signal_connect(item, "activate", G_CALLBACK(menuItemActivated), this); // FIXME: Apply the PopupMenuStyle from client()->itemStyle(i) gtk_widget_set_sensitive(item, client()->itemIsEnabled(i)); gtk_menu_shell_append(GTK_MENU_SHELL(m_popup.get()), item); gtk_widget_show(item); } gtk_menu_set_active(m_popup.get(), index); // The size calls are directly copied from gtkcombobox.c which is LGPL GtkRequisition requisition; gtk_widget_set_size_request(GTK_WIDGET(m_popup.get()), -1, -1); gtk_widget_size_request(GTK_WIDGET(m_popup.get()), &requisition); gtk_widget_set_size_request(GTK_WIDGET(m_popup.get()), std::max(rect.width(), requisition.width), -1); GList* children = gtk_container_get_children(GTK_CONTAINER(m_popup.get())); GList* p = children; if (size) for (int i = 0; i < size; i++) { if (i > index) break; GtkWidget* item = reinterpret_cast<GtkWidget*>(p->data); GtkRequisition itemRequisition; gtk_widget_get_child_requisition(item, &itemRequisition); m_menuPosition.setY(m_menuPosition.y() - itemRequisition.height); p = g_list_next(p); } else // Center vertically the empty popup in the combo box area m_menuPosition.setY(m_menuPosition.y() - rect.height() / 2); g_list_free(children); gtk_menu_popup(m_popup.get(), 0, 0, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, 0, gtk_get_current_event_time()); }
void PopupMenu::show(const IntRect& rect, FrameView* view, int index) { ASSERT(client()); if (!m_popup) { m_popup = GTK_MENU(gtk_menu_new()); g_object_ref_sink(G_OBJECT(m_popup)); g_signal_connect(m_popup, "unmap", G_CALLBACK(menuUnmapped), this); // <lab126> g_signal_emit_by_name(view->hostWindow()->platformWindow(), "drop-down-menu", m_popup); // </lab126> } else gtk_container_foreach(GTK_CONTAINER(m_popup), reinterpret_cast<GtkCallback>(menuRemoveItem), this); int x, y, wHeight; gdk_window_get_origin(GTK_WIDGET(view->hostWindow()->platformWindow())->window, &x, &y); gdk_window_get_geometry(GTK_WIDGET(view->hostWindow()->platformWindow())->window, NULL, NULL, NULL, &wHeight, NULL); m_menuPosition = view->contentsToWindow(rect.location()); // m_menuPosition = IntPoint(m_menuPosition.x() + x, m_menuPosition.y() + y + rect.height()); m_indexMap.clear(); const int size = client()->listSize(); for (int i = 0; i < size; ++i) { GtkWidget* item; if (client()->itemIsSeparator(i)) { item = gtk_separator_menu_item_new(); } else { item = gtk_menu_item_new_with_label(client()->itemText(i).utf8().data()); } m_indexMap.add(item, i); g_signal_connect(item, "activate", G_CALLBACK(menuItemActivated), this); // FIXME: Apply the PopupMenuStyle from client()->itemStyle(i) gtk_widget_set_sensitive(item, client()->itemIsEnabled(i)); gtk_menu_shell_append(GTK_MENU_SHELL(m_popup), item); gtk_widget_show(item); } gtk_menu_set_active(m_popup, index); // The size calls are directly copied from gtkcombobox.c which is LGPL GtkRequisition requisition; gtk_widget_set_size_request(GTK_WIDGET(m_popup), -1, -1); gtk_widget_size_request(GTK_WIDGET(m_popup), &requisition); gtk_widget_set_size_request(GTK_WIDGET(m_popup), MAX(rect.width(), requisition.width), -1); // <lab126>: Position the menu items such that there are no empty spaces and also make sure that // the previously selected item stays visible. if ( requisition.height > wHeight) { GList* children = GTK_MENU_SHELL(m_popup)->children; GtkWidget* item = reinterpret_cast<GtkWidget*>(children->data); GtkRequisition itemRequisition; gtk_widget_get_child_requisition(item, &itemRequisition); int itemHeight = itemRequisition.height; // Move the items up until the indexed item fits in to the visible part of the window // Count out the two scoll items from the window height if ( ( itemHeight * ( index + 1 ) ) > ( wHeight - (2 * itemHeight ) ) ) { int itemsToRemove = ( ( (itemHeight * index ) - ( wHeight - (2 * itemHeight ) ) ) / itemHeight ); if (size) m_menuPosition.setY(y - ( ( itemsToRemove + 1 ) * itemHeight ) ); } else // Place the first item at the top of window m_menuPosition.setY(y); } // </lab126> gtk_menu_popup(m_popup, NULL, NULL, reinterpret_cast<GtkMenuPositionFunc>(menuPositionFunction), this, 0, gtk_get_current_event_time()); }