static void popup_callback(GtkButton *button, dt_lib_module_t *module) { static dt_lib_module_info_t mi; int size = 0; g_strlcpy(mi.plugin_name, module->plugin_name, sizeof(mi.plugin_name)); mi.version = module->version(); mi.module = module; void *params = module->get_params(module, &size); // make sure that we have enough space for params if(params && (size <= sizeof(mi.params))) { memcpy(mi.params, params, size); mi.params_size = size; free(params); } else { mi.params_size = 0; fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", ¶ms, size); } dt_lib_presets_popup_menu_show(&mi); gtk_menu_popup(darktable.gui->presets_popup_menu, NULL, NULL, _preset_popup_posistion, button, 0, gtk_get_current_event_time()); gtk_widget_show_all(GTK_WIDGET(darktable.gui->presets_popup_menu)); gtk_menu_reposition(GTK_MENU(darktable.gui->presets_popup_menu)); }
static void matewnck_selector_window_closed (MatewnckScreen *screen, MatewnckWindow *window, MatewnckSelector *selector) { window_hash_item *item; if (window == selector->priv->icon_window) matewnck_selector_set_active_window (selector, NULL); if (!selector->priv->menu || !gtk_widget_get_visible (selector->priv->menu)) return; if (!selector->priv->window_hash) return; item = g_hash_table_lookup (selector->priv->window_hash, window); if (!item) return; g_object_set_data (G_OBJECT (item->item), "matewnck-selector-window", NULL); gtk_widget_hide (item->item); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); }
static void matewnck_selector_window_workspace_changed (MatewnckWindow *window, MatewnckSelector *selector) { window_hash_item *item; item = NULL; if (!selector->priv->menu || !gtk_widget_get_visible (selector->priv->menu)) return; if (!selector->priv->window_hash) return; item = g_hash_table_lookup (selector->priv->window_hash, window); if (!item) return; /* destroy the item and recreate one so it's at the right position */ gtk_widget_destroy (item->item); g_hash_table_remove (selector->priv->window_hash, window); matewnck_selector_insert_window (selector, window); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); }
static void matewnck_selector_window_state_changed (MatewnckWindow *window, MatewnckWindowState changed_mask, MatewnckWindowState new_state, MatewnckSelector *selector) { window_hash_item *item; char *window_name; if (! (changed_mask & (MATEWNCK_WINDOW_STATE_MINIMIZED | MATEWNCK_WINDOW_STATE_SHADED | MATEWNCK_WINDOW_STATE_SKIP_TASKLIST | MATEWNCK_WINDOW_STATE_DEMANDS_ATTENTION | MATEWNCK_WINDOW_STATE_URGENT))) return; item = NULL; window_name = NULL; if (!selector->priv->window_hash) return; item = g_hash_table_lookup (selector->priv->window_hash, window); if (item == NULL) return; if (changed_mask & MATEWNCK_WINDOW_STATE_SKIP_TASKLIST) { if (matewnck_window_is_skip_tasklist (window)) gtk_widget_hide (item->item); else gtk_widget_show (item->item); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); } if (changed_mask & (MATEWNCK_WINDOW_STATE_DEMANDS_ATTENTION | MATEWNCK_WINDOW_STATE_URGENT)) { if (matewnck_window_or_transient_needs_attention (window)) _make_gtk_label_bold (GTK_LABEL (item->label)); else _make_gtk_label_normal (GTK_LABEL (item->label)); } if (changed_mask & (MATEWNCK_WINDOW_STATE_MINIMIZED | MATEWNCK_WINDOW_STATE_SHADED)) { window_name = _matewnck_window_get_name_for_display (window, FALSE, TRUE); gtk_label_set_text (GTK_LABEL (item->label), window_name); g_free (window_name); } }
int clip_GTK_MENUREPOSITION(ClipMachine * ClipMachineMemory) { C_widget *cmnu = _fetch_cw_arg(ClipMachineMemory); CHECKCWID(cmnu, GTK_IS_MENU); gtk_menu_reposition(GTK_MENU(cmnu->widget)); return 0; err: return 1; }
static void popup_callback(GtkButton *button, dt_lib_module_t *module) { static dt_lib_module_info_t mi; int size = 0; g_strlcpy(mi.plugin_name, module->plugin_name, sizeof(mi.plugin_name)); mi.version = module->version(module); mi.module = module; void *params = module->get_params(module, &size); // make sure that we have enough space for params if(params && (size <= sizeof(mi.params))) { memcpy(mi.params, params, size); mi.params_size = size; free(params); } else { mi.params_size = 0; fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", ¶ms, size); } dt_lib_presets_popup_menu_show(&mi); #if GTK_CHECK_VERSION(3, 22, 0) int c = module->container(module); GdkGravity widget_gravity, menu_gravity; if((c == DT_UI_CONTAINER_PANEL_LEFT_TOP) || (c == DT_UI_CONTAINER_PANEL_LEFT_CENTER) || (c == DT_UI_CONTAINER_PANEL_LEFT_BOTTOM)) { // FIXME: these should be _EAST, but then it goes out of the sidepanel... widget_gravity = GDK_GRAVITY_SOUTH; menu_gravity = GDK_GRAVITY_NORTH; } else { widget_gravity = GDK_GRAVITY_SOUTH_WEST; menu_gravity = GDK_GRAVITY_NORTH_WEST; } gtk_menu_popup_at_widget(darktable.gui->presets_popup_menu, dtgtk_expander_get_header(DTGTK_EXPANDER(module->expander)), widget_gravity, menu_gravity, NULL); #else gtk_menu_popup(darktable.gui->presets_popup_menu, NULL, NULL, _preset_popup_posistion, button, 0, gtk_get_current_event_time()); #endif gtk_widget_show_all(GTK_WIDGET(darktable.gui->presets_popup_menu)); gtk_menu_reposition(GTK_MENU(darktable.gui->presets_popup_menu)); }
static void refill_submenu_workspace (WnckActionMenu *menu) { GtkWidget *submenu; GList *children; GList *l; int num_workspaces, window_space, i; WnckWorkspace *workspace; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu->priv->workspace_item)); /* Remove existing items */ children = gtk_container_get_children (GTK_CONTAINER (submenu)); for (l = children; l; l = l->next) gtk_container_remove (GTK_CONTAINER (submenu), l->data); g_list_free (children); workspace = wnck_window_get_workspace (menu->priv->window); num_workspaces = wnck_screen_get_workspace_count (wnck_window_get_screen (menu->priv->window)); if (workspace) window_space = wnck_workspace_get_number (workspace); else window_space = -1; for (i = 0; i < num_workspaces; i++) { char *name; GtkWidget *item; name = get_workspace_name_with_accel (menu->priv->window, i); item = make_menu_item (MOVE_TO_WORKSPACE); g_object_set_data (G_OBJECT (item), "workspace", GINT_TO_POINTER (i)); if (i == window_space) gtk_widget_set_sensitive (item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item); set_item_text (item, name); set_item_stock (item, NULL); g_free (name); } gtk_menu_reposition (GTK_MENU (submenu)); }
static void matewnck_selector_window_opened (MatewnckScreen *screen, MatewnckWindow *window, MatewnckSelector *selector) { matewnck_selector_connect_to_window (selector, window); if (!selector->priv->menu || !gtk_widget_get_visible (selector->priv->menu)) return; if (!selector->priv->window_hash) return; matewnck_selector_insert_window (selector, window); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); }
static void matewnck_selector_workspace_created (MatewnckScreen *screen, MatewnckWorkspace *workspace, MatewnckSelector *selector) { if (!selector->priv->menu || !gtk_widget_get_visible (selector->priv->menu)) return; /* this is assuming that the new workspace will have a higher number * than all the old workspaces, which is okay since the old workspaces * didn't disappear in the meantime */ matewnck_selector_add_workspace (selector, screen, matewnck_workspace_get_number (workspace)); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); }
static void matewnck_selector_workspace_destroyed (MatewnckScreen *screen, MatewnckWorkspace *workspace, MatewnckSelector *selector) { GList *l, *children; GtkWidget *destroy; int i; if (!selector->priv->menu || !gtk_widget_get_visible (selector->priv->menu)) return; destroy = NULL; i = matewnck_workspace_get_number (workspace); /* search for the item of this workspace so that we destroy it */ children = gtk_container_get_children (GTK_CONTAINER (selector->priv->menu)); for (l = children; l; l = l->next) { int j; j = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (l->data), "matewnck-selector-workspace-n")); if (j - 1 == i) destroy = GTK_WIDGET (l->data); else if (j - 1 > i) /* shift the following workspaces */ g_object_set_data (G_OBJECT (l->data), "matewnck-selector-workspace-n", GINT_TO_POINTER (j - 1)); } g_list_free (children); if (destroy) gtk_widget_destroy (destroy); matewnck_selector_make_menu_consistent (selector); gtk_menu_reposition (GTK_MENU (selector->priv->menu)); }
static void popup_callback(GtkButton *button, dt_lib_module_t *module) { static dt_lib_module_info_t mi; int32_t size = 0; g_strlcpy(mi.plugin_name, module->plugin_name, 128); mi.version = module->version(); mi.module = module; void *params = module->get_params(module, &size); if(params) { g_assert(size <= 4096); memcpy(mi.params, params, size); mi.params_size = size; free(params); } else mi.params_size = 0; dt_lib_presets_popup_menu_show(&mi); gtk_menu_popup(darktable.gui->presets_popup_menu, NULL, NULL, _preset_popup_posistion, button, 0, gtk_get_current_event_time()); gtk_widget_show_all(GTK_WIDGET(darktable.gui->presets_popup_menu)); gtk_menu_reposition(GTK_MENU(darktable.gui->presets_popup_menu)); }
static void refill_submenu_viewport (WnckActionMenu *menu) { GtkWidget *submenu; GList *children; GList *l; WnckScreen *screen; WnckWorkspace *workspace; int window_x, window_y; int viewport_x, viewport_y; int viewport_width, viewport_height; int screen_width, screen_height; int x, y; int number; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu->priv->workspace_item)); /* Remove existing items */ children = gtk_container_get_children (GTK_CONTAINER (submenu)); for (l = children; l; l = l->next) gtk_container_remove (GTK_CONTAINER (submenu), l->data); g_list_free (children); screen = wnck_window_get_screen (menu->priv->window); workspace = wnck_screen_get_workspace (screen, 0); wnck_window_get_geometry (menu->priv->window, &window_x, &window_y, NULL, NULL); viewport_x = wnck_workspace_get_viewport_x (workspace); viewport_y = wnck_workspace_get_viewport_y (workspace); window_x += viewport_x; window_y += viewport_y; viewport_width = wnck_workspace_get_width (workspace); viewport_height = wnck_workspace_get_height (workspace); screen_width = wnck_screen_get_width (screen); screen_height = wnck_screen_get_height (screen); number = 1; for (y = 0; y < viewport_height; y += screen_height) { char *label; GtkWidget *item; for (x = 0; x < viewport_width; x += screen_width) { /* Keep this in sync with what is in get_workspace_name_with_accel() */ if (number == 10) label = g_strdup_printf (_("Workspace 1_0")); else label = g_strdup_printf (_("Workspace %s%d"), number < 10 ? "_" : "", number); number++; item = make_menu_item (MOVE_TO_WORKSPACE); g_object_set_data (G_OBJECT (item), "viewport_x", GINT_TO_POINTER (x)); g_object_set_data (G_OBJECT (item), "viewport_y", GINT_TO_POINTER (y)); if (window_x >= x && window_x < x + screen_width && window_y >= y && window_y < y + screen_height) gtk_widget_set_sensitive (item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item); set_item_text (item, label); set_item_stock (item, NULL); g_free (label); } } gtk_menu_reposition (GTK_MENU (submenu)); }
static gboolean update_menu_state (WnckActionMenu *menu) { WnckActionMenuPrivate *priv; WnckWindowActions actions; WnckScreen *screen; WnckWorkspace *workspace; gboolean viewport_mode; gboolean move_workspace_sensitive; priv = menu->priv; priv->idle_handler = 0; actions = wnck_window_get_actions (priv->window); screen = wnck_window_get_screen (priv->window); viewport_mode = wnck_screen_get_workspace_count (screen) == 1 && wnck_workspace_is_virtual (wnck_screen_get_workspace (screen, 0)); move_workspace_sensitive = viewport_mode || (actions & WNCK_WINDOW_ACTION_CHANGE_WORKSPACE) != 0; if (wnck_window_is_minimized (priv->window)) { set_item_text (priv->minimize_item, _("Unmi_nimize")); set_item_stock (priv->minimize_item, NULL); gtk_widget_set_sensitive (priv->minimize_item, (actions & WNCK_WINDOW_ACTION_UNMINIMIZE) != 0); } else { set_item_text (priv->minimize_item, _("Mi_nimize")); set_item_stock (priv->minimize_item, WNCK_STOCK_MINIMIZE); gtk_widget_set_sensitive (priv->minimize_item, (actions & WNCK_WINDOW_ACTION_MINIMIZE) != 0); } if (wnck_window_is_maximized (priv->window)) { set_item_text (priv->maximize_item, _("Unma_ximize")); set_item_stock (priv->maximize_item, NULL); gtk_widget_set_sensitive (priv->maximize_item, (actions & WNCK_WINDOW_ACTION_UNMAXIMIZE) != 0); } else { set_item_text (priv->maximize_item, _("Ma_ximize")); set_item_stock (priv->maximize_item, WNCK_STOCK_MAXIMIZE); gtk_widget_set_sensitive (priv->maximize_item, (actions & WNCK_WINDOW_ACTION_MAXIMIZE) != 0); } g_signal_handlers_block_by_func (G_OBJECT (priv->above_item), item_activated_callback, GINT_TO_POINTER (ABOVE)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->above_item), wnck_window_is_above (priv->window)); g_signal_handlers_unblock_by_func (G_OBJECT (priv->above_item), item_activated_callback, GINT_TO_POINTER (ABOVE)); gtk_widget_set_sensitive (priv->above_item, (actions & WNCK_WINDOW_ACTION_ABOVE) != 0); g_signal_handlers_block_by_func (G_OBJECT (priv->pin_item), item_activated_callback, GINT_TO_POINTER (PIN)); g_signal_handlers_block_by_func (G_OBJECT (priv->unpin_item), item_activated_callback, GINT_TO_POINTER (UNPIN)); if ((viewport_mode && wnck_window_is_sticky (priv->window)) || (!viewport_mode && wnck_window_is_pinned (priv->window))) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->pin_item), TRUE); else gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (priv->unpin_item), TRUE); g_signal_handlers_unblock_by_func (G_OBJECT (priv->pin_item), item_activated_callback, GINT_TO_POINTER (PIN)); g_signal_handlers_unblock_by_func (G_OBJECT (priv->unpin_item), item_activated_callback, GINT_TO_POINTER (UNPIN)); gtk_widget_set_sensitive (priv->pin_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->unpin_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->close_item, (actions & WNCK_WINDOW_ACTION_CLOSE) != 0); gtk_widget_set_sensitive (priv->move_item, (actions & WNCK_WINDOW_ACTION_MOVE) != 0); gtk_widget_set_sensitive (priv->resize_item, (actions & WNCK_WINDOW_ACTION_RESIZE) != 0); gtk_widget_set_sensitive (priv->workspace_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->left_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->right_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->up_item, move_workspace_sensitive); gtk_widget_set_sensitive (priv->down_item, move_workspace_sensitive); workspace = wnck_window_get_workspace (priv->window); if (viewport_mode && !wnck_window_is_sticky (priv->window)) { int window_x, window_y; int viewport_x, viewport_y; int viewport_width, viewport_height; int screen_width, screen_height; if (!workspace) workspace = wnck_screen_get_workspace (screen, 0); wnck_window_get_geometry (priv->window, &window_x, &window_y, NULL, NULL); viewport_x = wnck_workspace_get_viewport_x (workspace); viewport_y = wnck_workspace_get_viewport_y (workspace); window_x += viewport_x; window_y += viewport_y; viewport_width = wnck_workspace_get_width (workspace); viewport_height = wnck_workspace_get_height (workspace); screen_width = wnck_screen_get_width (screen); screen_height = wnck_screen_get_height (screen); if (window_x >= screen_width) gtk_widget_show (priv->left_item); else gtk_widget_hide (priv->left_item); if (window_x < viewport_width - screen_width) gtk_widget_show (priv->right_item); else gtk_widget_hide (priv->right_item); if (window_y >= screen_height) gtk_widget_show (priv->up_item); else gtk_widget_hide (priv->up_item); if (window_y < viewport_height - screen_height) gtk_widget_show (priv->down_item); else gtk_widget_hide (priv->down_item); } else if (!viewport_mode && workspace && !wnck_window_is_pinned (priv->window)) { if (wnck_workspace_get_neighbor (workspace, WNCK_MOTION_LEFT)) gtk_widget_show (priv->left_item); else gtk_widget_hide (priv->left_item); if (wnck_workspace_get_neighbor (workspace, WNCK_MOTION_RIGHT)) gtk_widget_show (priv->right_item); else gtk_widget_hide (priv->right_item); if (wnck_workspace_get_neighbor (workspace, WNCK_MOTION_UP)) gtk_widget_show (priv->up_item); else gtk_widget_hide (priv->up_item); if (wnck_workspace_get_neighbor (workspace, WNCK_MOTION_DOWN)) gtk_widget_show (priv->down_item); else gtk_widget_hide (priv->down_item); } else { gtk_widget_hide (priv->left_item); gtk_widget_hide (priv->right_item); gtk_widget_hide (priv->up_item); gtk_widget_hide (priv->down_item); } if (viewport_mode) { int viewport_width, viewport_height; int screen_width, screen_height; viewport_width = wnck_workspace_get_width (workspace); viewport_height = wnck_workspace_get_height (workspace); screen_width = wnck_screen_get_width (screen); screen_height = wnck_screen_get_height (screen); gtk_widget_show (priv->workspace_separator); gtk_widget_show (priv->pin_item); gtk_widget_show (priv->unpin_item); if (viewport_width >= 2 * screen_width || viewport_height >= 2 * screen_height) { gtk_widget_show (priv->workspace_item); refill_submenu_viewport (menu); } else { gtk_widget_hide (priv->workspace_item); gtk_menu_popdown (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (priv->workspace_item)))); } } else if (wnck_screen_get_workspace_count (screen) > 1) { gtk_widget_show (priv->workspace_separator); gtk_widget_show (priv->pin_item); gtk_widget_show (priv->unpin_item); gtk_widget_show (priv->workspace_item); refill_submenu_workspace (menu); } else { gtk_widget_hide (priv->workspace_separator); gtk_widget_hide (priv->pin_item); gtk_widget_hide (priv->unpin_item); gtk_widget_hide (priv->workspace_item); gtk_menu_popdown (GTK_MENU (gtk_menu_item_get_submenu (GTK_MENU_ITEM (priv->workspace_item)))); } gtk_menu_reposition (GTK_MENU (menu)); return FALSE; }
static VALUE rg_reposition(VALUE self) { gtk_menu_reposition(_SELF(self)); return self; }