/* This is called when the grab is broken for * either the dock, or the scale itself */ static void gtk_scale_button_grab_notify (GtkScaleButton *button, gboolean was_grabbed) { GdkDisplay *display; GtkScaleButtonPrivate *priv; if (was_grabbed != FALSE) return; priv = button->priv; if (!GTK_WIDGET_HAS_GRAB (priv->dock)) return; if (gtk_widget_is_ancestor (gtk_grab_get_current (), priv->dock)) return; display = gtk_widget_get_display (priv->dock); gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); gtk_grab_remove (priv->dock); /* hide again */ gtk_widget_hide (priv->dock); priv->timeout = FALSE; }
static gboolean gimp_histogram_view_button_release (GtkWidget *widget, GdkEventButton *bevent) { GimpHistogramView *view = GIMP_HISTOGRAM_VIEW (widget); if (bevent->button == 1) { gint start, end; gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (view)), bevent->time); start = view->start; end = view->end; view->start = MIN (start, end); view->end = MAX (start, end); g_signal_emit (view, histogram_view_signals[RANGE_CHANGED], 0, view->start, view->end); } return TRUE; }
static void go_combo_box_popup_hide_unconditional (GOComboBox *combo_box) { gboolean popup_info_destroyed = FALSE; g_return_if_fail (combo_box != NULL); g_return_if_fail (IS_GO_COMBO_BOX (combo_box)); gtk_widget_hide (combo_box->priv->toplevel); gtk_widget_hide (combo_box->priv->popup); if (combo_box->priv->torn_off) { GTK_TEAROFF_MENU_ITEM (combo_box->priv->tearable)->torn_off = FALSE; go_combo_set_tearoff_state (combo_box, FALSE); } do_focus_change (combo_box->priv->toplevel, FALSE); gtk_grab_remove (combo_box->priv->toplevel); gdk_display_pointer_ungrab (gtk_widget_get_display (combo_box->priv->toplevel), GDK_CURRENT_TIME); g_object_ref (combo_box->priv->popdown_container); g_signal_emit (combo_box, go_combo_box_signals [POP_DOWN_DONE], 0, combo_box->priv->popdown_container, &popup_info_destroyed); if (popup_info_destroyed){ gtk_container_remove ( GTK_CONTAINER (combo_box->priv->frame), combo_box->priv->popdown_container); combo_box->priv->popdown_container = NULL; } g_object_unref (combo_box->priv->popdown_container); set_arrow_state (combo_box, FALSE); }
static void gtk_scale_button_release_grab (GtkScaleButton *button, GdkEventButton *event) { GdkEventButton *e; GdkDisplay *display; GtkScaleButtonPrivate *priv; priv = button->priv; /* ungrab focus */ display = gtk_widget_get_display (GTK_WIDGET (button)); gdk_display_keyboard_ungrab (display, event->time); gdk_display_pointer_ungrab (display, event->time); gtk_grab_remove (priv->dock); /* hide again */ gtk_widget_hide (priv->dock); priv->timeout = FALSE; e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event); e->window = GTK_WIDGET (button)->window; e->type = GDK_BUTTON_RELEASE; gtk_widget_event (GTK_WIDGET (button), (GdkEvent *) e); e->window = event->window; gdk_event_free ((GdkEvent *) e); }
static gboolean matecomponent_plug_button_event (GtkWidget *widget, GdkEventButton *event) { #if defined (GDK_WINDOWING_X11) XEvent xevent; #endif g_return_val_if_fail (MATECOMPONENT_IS_PLUG (widget), FALSE); if (!MATECOMPONENT_PLUG (widget)->priv->forward_events || !GTK_WIDGET_TOPLEVEL (widget)) return FALSE; #if defined (GDK_WINDOWING_X11) if (event->type == GDK_BUTTON_PRESS) { xevent.xbutton.type = ButtonPress; /* X does an automatic pointer grab on button press * if we have both button press and release events * selected. * We don't want to hog the pointer on our parent. */ gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME); } else xevent.xbutton.type = ButtonRelease; xevent.xbutton.display = GDK_WINDOW_XDISPLAY (widget->window); xevent.xbutton.window = GDK_WINDOW_XWINDOW (GTK_PLUG (widget)->socket_window); xevent.xbutton.root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (gdk_drawable_get_screen (widget->window))); /* * FIXME: the following might cause * big problems for non-GTK apps */ xevent.xbutton.x = 0; xevent.xbutton.y = 0; xevent.xbutton.x_root = 0; xevent.xbutton.y_root = 0; xevent.xbutton.state = event->state; xevent.xbutton.button = event->button; xevent.xbutton.same_screen = TRUE; /* FIXME ? */ gdk_error_trap_push (); XSendEvent (GDK_WINDOW_XDISPLAY (widget->window), GDK_WINDOW_XWINDOW (GTK_PLUG (widget)->socket_window), False, NoEventMask, &xevent); gdk_flush (); gdk_error_trap_pop (); #elif defined (GDK_WINDOWING_WIN32) /* FIXME: Need to do something? */ #endif return TRUE; }
/** * go_combo_popup_tear_off * @combo: Combo box * @set_position: Set to position of popup shell if true * * Tear off the popup * * FIXME: * Gtk popup menus are toplevel windows, not dialogs. I think this is wrong, * and make the popups dialogs. But may be there should be a way to make * them toplevel. We can do this after creating: * GTK_WINDOW (tearoff)->type = GTK_WINDOW_TOPLEVEL; */ static void go_combo_popup_tear_off (GOComboBox *combo, gboolean set_position) { int x, y; if (!combo->priv->tearoff_window) { GtkWidget *tearoff; gchar const *title; /* FIXME: made this a toplevel, not a dialog ! */ tearoff = gtk_window_new (GTK_WINDOW_TOPLEVEL); #if GLIB_CHECK_VERSION(2,10,0) && GTK_CHECK_VERSION(2,8,14) g_object_ref_sink (tearoff); #else g_object_ref (tearoff); gtk_object_sink (GTK_OBJECT (tearoff)); #endif combo->priv->tearoff_window = tearoff; gtk_widget_set_app_paintable (tearoff, TRUE); g_signal_connect (tearoff, "key_press_event", G_CALLBACK (cb_combo_keypress), combo); gtk_widget_realize (tearoff); title = go_combo_box_get_title (combo); if (title) gdk_window_set_title (tearoff->window, title); g_object_set (G_OBJECT (tearoff), "allow-shrink", FALSE, "allow-grow", TRUE, NULL); gtk_window_set_transient_for (GTK_WINDOW (tearoff), GTK_WINDOW (gtk_widget_get_toplevel GTK_WIDGET (combo))); } if (GTK_WIDGET_VISIBLE (combo->priv->popup)) { gtk_widget_hide (combo->priv->toplevel); gtk_grab_remove (combo->priv->toplevel); gdk_display_pointer_ungrab (gtk_widget_get_display (combo->priv->toplevel), GDK_CURRENT_TIME); } go_combo_popup_reparent (combo->priv->popup, combo->priv->tearoff_window, FALSE); /* It may have got confused about size */ gtk_widget_queue_resize (GTK_WIDGET (combo->priv->popup)); if (set_position) { go_combo_box_get_pos (combo, &x, &y); gtk_window_move (GTK_WINDOW (combo->priv->tearoff_window), x, y); } gtk_widget_show (GTK_WIDGET (combo->priv->popup)); gtk_widget_show (combo->priv->tearoff_window); }
/*# @method pointer_ungrab GdkDisplay @brief Release any pointer grab. @param time a timestamp (e.g. GDK_CURRENT_TIME). Warning: gdk_display_pointer_ungrab has been deprecated since version 3.0 and should not be used in newly-written code. Use gdk_device_ungrab(), together with gdk_device_grab() instead */ FALCON_FUNC Display::pointer_ungrab( VMARG ) { Item* i_t = vm->param( 0 ); #ifndef NO_PARAMETER_CHECK if ( !i_t || !i_t->isInteger() ) throw_inv_params( "I" ); #endif gdk_display_pointer_ungrab( GET_DISPLAY( vm->self() ), i_t->asInteger() ); }
static void gui_ungrab (Gimp *gimp) { GdkDisplay *display = gdk_display_get_default (); if (display) { gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); } }
static void gimp_pick_button_shutdown (GimpPickButton *button) { GdkDisplay *display = gtk_widget_get_display (button->grab_widget); guint32 timestamp = gtk_get_current_event_time (); gdk_display_keyboard_ungrab (display, timestamp); gdk_display_pointer_ungrab (display, timestamp); gtk_grab_remove (button->grab_widget); }
static gboolean gimp_context_help_idle_start (gpointer widget) { if (! gtk_grab_get_current ()) { GtkWidget *invisible; GdkCursor *cursor; GdkGrabStatus status; invisible = gtk_invisible_new_for_screen (gtk_widget_get_screen (widget)); gtk_widget_show (invisible); cursor = gdk_cursor_new_for_display (gtk_widget_get_display (invisible), GDK_QUESTION_ARROW); status = gdk_pointer_grab (gtk_widget_get_window (invisible), TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK, NULL, cursor, GDK_CURRENT_TIME); g_object_unref (cursor); if (status != GDK_GRAB_SUCCESS) { gtk_widget_destroy (invisible); return FALSE; } if (gdk_keyboard_grab (gtk_widget_get_window (invisible), TRUE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) { gdk_display_pointer_ungrab (gtk_widget_get_display (invisible), GDK_CURRENT_TIME); gtk_widget_destroy (invisible); return FALSE; } gtk_grab_add (invisible); g_signal_connect (invisible, "button-press-event", G_CALLBACK (gimp_context_help_button_press), NULL); g_signal_connect (invisible, "key-press-event", G_CALLBACK (gimp_context_help_key_press), NULL); } return FALSE; }
void gimp_display_shell_pointer_ungrab (GimpDisplayShell *shell, const GdkEvent *event) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); g_return_if_fail (event != NULL); g_return_if_fail (shell->pointer_grabbed == TRUE); gdk_display_pointer_ungrab (gtk_widget_get_display (shell->canvas), gdk_event_get_time (event)); shell->pointer_grabbed = FALSE; }
static void ungrab_stuff (GtkWidget *widget, GtkCellRendererAccel *accel) { GdkDisplay *display = gtk_widget_get_display (widget); gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); g_signal_handlers_disconnect_by_func (G_OBJECT (accel->grab_widget), G_CALLBACK (grab_key_callback), accel); }
static gboolean gimp_context_help_key_press (GtkWidget *widget, GdkEventKey *kevent, gpointer data) { if (kevent->keyval == GDK_KEY_Escape) { GdkDisplay *display = gtk_widget_get_display (widget); gtk_grab_remove (widget); gdk_display_keyboard_ungrab (display, kevent->time); gdk_display_pointer_ungrab (display, kevent->time); gtk_widget_destroy (widget); } return TRUE; }
/* from GtkMenu sources */ gboolean popup_grab_on_window (GdkWindow * window, guint32 activate_time) { if ((gdk_pointer_grab (window, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, activate_time) == 0)) { if (gdk_keyboard_grab (window, TRUE, activate_time) == 0) return TRUE; else { gdk_display_pointer_ungrab (gdk_drawable_get_display (window), activate_time); return FALSE; } } return FALSE; }
static gboolean on_widget_button_release (GtkWidget *widget, GdkEventButton *event, char *item_id) { g_print ("%s received 'button-release' signal\n", item_id); if (strstr (item_id, "explicit")) { GdkDisplay *display; display = gtk_widget_get_display (widget); gdk_display_pointer_ungrab (display, event->time); g_print ("released pointer grab\n"); } return TRUE; }
static void gtk_scale_button_popdown (GtkWidget *widget) { GtkScaleButton *button; GtkScaleButtonPrivate *priv; GdkDisplay *display; button = GTK_SCALE_BUTTON (widget); priv = button->priv; /* ungrab focus */ display = gtk_widget_get_display (widget); gdk_display_keyboard_ungrab (display, GDK_CURRENT_TIME); gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); gtk_grab_remove (priv->dock); /* hide again */ gtk_widget_hide (priv->dock); priv->timeout = FALSE; }
static void gimp_popup_map (GtkWidget *widget) { GTK_WIDGET_CLASS (parent_class)->map (widget); /* grab with owner_events == TRUE so the popup's widgets can * receive events. we filter away events outside this toplevel * away in button_press() */ if (gdk_pointer_grab (gtk_widget_get_window (widget), TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME) == 0) { if (gdk_keyboard_grab (gtk_widget_get_window (widget), TRUE, GDK_CURRENT_TIME) == 0) { gtk_grab_add (widget); g_signal_connect (widget, "grab-notify", G_CALLBACK (gimp_popup_grab_notify), widget); g_signal_connect (widget, "grab-broken-event", G_CALLBACK (gimp_popup_grab_broken_event), widget); return; } else { gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME); } } /* if we could not grab, destroy the popup instead of leaving it * around uncloseable. */ g_signal_emit (widget, popup_signals[CANCEL], 0); }
static gboolean gimp_context_help_button_press (GtkWidget *widget, GdkEventButton *bevent, gpointer data) { GtkWidget *event_widget = gtk_get_event_widget ((GdkEvent *) bevent); if (event_widget && bevent->button == 1 && bevent->type == GDK_BUTTON_PRESS) { GdkDisplay *display = gtk_widget_get_display (widget); gtk_grab_remove (widget); gdk_display_keyboard_ungrab (display, bevent->time); gdk_display_pointer_ungrab (display, bevent->time); gtk_widget_destroy (widget); if (event_widget != widget) g_idle_add (gimp_context_help_idle_show_help, event_widget); } return TRUE; }
/** * gdk_pointer_ungrab: * @time_: a timestamp from a #GdkEvent, or %GDK_CURRENT_TIME if no * timestamp is available. * * Ungrabs the pointer on the default display, if it is grabbed by this * application. * * Deprecated: 3.0: Use gdk_device_ungrab(), together with gdk_device_grab() * instead. **/ void gdk_pointer_ungrab (guint32 time) { gdk_display_pointer_ungrab (gdk_display_get_default (), time); }
static gboolean gtk_scale_popup (GtkWidget *widget, GdkEvent *event, guint32 time) { GtkScaleButton *button; GtkScaleButtonPrivate *priv; GtkAdjustment *adj; gint x, y, m, dx, dy, sx, sy, startoff; gdouble v; GdkDisplay *display; GdkScreen *screen; button = GTK_SCALE_BUTTON (widget); priv = button->priv; adj = priv->adjustment; display = gtk_widget_get_display (widget); screen = gtk_widget_get_screen (widget); /* position roughly */ gtk_window_set_screen (GTK_WINDOW (priv->dock), screen); gdk_window_get_origin (widget->window, &x, &y); x += widget->allocation.x; y += widget->allocation.y; if (priv->orientation == GTK_ORIENTATION_VERTICAL) gtk_window_move (GTK_WINDOW (priv->dock), x, y - (SCALE_SIZE / 2)); else gtk_window_move (GTK_WINDOW (priv->dock), x - (SCALE_SIZE / 2), y); gtk_widget_show_all (priv->dock); gdk_window_get_origin (priv->dock->window, &dx, &dy); dx += priv->dock->allocation.x; dy += priv->dock->allocation.y; gdk_window_get_origin (priv->scale->window, &sx, &sy); sx += priv->scale->allocation.x; sy += priv->scale->allocation.y; priv->timeout = TRUE; /* position (needs widget to be shown already) */ v = gtk_scale_button_get_value (button) / (adj->upper - adj->lower); if (priv->orientation == GTK_ORIENTATION_VERTICAL) { startoff = sy - dy; x += (widget->allocation.width - priv->dock->allocation.width) / 2; y -= startoff; y -= GTK_RANGE (priv->scale)->min_slider_size / 2; m = priv->scale->allocation.height - GTK_RANGE (priv->scale)->min_slider_size; y -= m * (1.0 - v); } else { startoff = sx - dx; x -= startoff; y += (widget->allocation.height - priv->dock->allocation.height) / 2; x -= GTK_RANGE (priv->scale)->min_slider_size / 2; m = priv->scale->allocation.width - GTK_RANGE (priv->scale)->min_slider_size; x -= m * v; } /* Make sure the dock stays inside the monitor */ if (event->type == GDK_BUTTON_PRESS) { int monitor; GdkEventButton *button_event = (GdkEventButton *) event; GdkRectangle rect; GtkWidget *d; d = GTK_WIDGET (priv->dock); monitor = gdk_screen_get_monitor_at_point (screen, button_event->x_root, button_event->y_root); gdk_screen_get_monitor_geometry (screen, monitor, &rect); if (priv->orientation == GTK_ORIENTATION_VERTICAL) y += button_event->y; else x += button_event->x; if (y < rect.y) y = rect.y; else if (y + d->allocation.height > rect.height + rect.y) y = rect.y + rect.height - d->allocation.height; if (x < rect.x) x = rect.x; else if (x + d->allocation.width > rect.width + rect.x) x = rect.x + rect.width - d->allocation.width; } gtk_window_move (GTK_WINDOW (priv->dock), x, y); if (event->type == GDK_BUTTON_PRESS) GTK_WIDGET_CLASS (gtk_scale_button_parent_class)->button_press_event (widget, (GdkEventButton *) event); /* grab focus */ gtk_grab_add (priv->dock); if (gdk_pointer_grab (priv->dock->window, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, time) != GDK_GRAB_SUCCESS) { gtk_grab_remove (priv->dock); gtk_widget_hide (priv->dock); return FALSE; } if (gdk_keyboard_grab (priv->dock->window, TRUE, time) != GDK_GRAB_SUCCESS) { gdk_display_pointer_ungrab (display, time); gtk_grab_remove (priv->dock); gtk_widget_hide (priv->dock); return FALSE; } gtk_widget_grab_focus (priv->dock); if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *e; GdkEventButton *button_event = (GdkEventButton *) event; /* forward event to the slider */ e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event); e->window = priv->scale->window; /* position: the X position isn't relevant, halfway will work just fine. * The vertical position should be *exactly* in the middle of the slider * of the scale; if we don't do that correctly, it'll move from its current * position, which means a position change on-click, which is bad. */ if (priv->orientation == GTK_ORIENTATION_VERTICAL) { e->x = priv->scale->allocation.width / 2; m = priv->scale->allocation.height - GTK_RANGE (priv->scale)->min_slider_size; e->y = ((1.0 - v) * m) + GTK_RANGE (priv->scale)->min_slider_size / 2; } else { e->y = priv->scale->allocation.height / 2; m = priv->scale->allocation.width - GTK_RANGE (priv->scale)->min_slider_size; e->x = (v * m) + GTK_RANGE (priv->scale)->min_slider_size / 2; } gtk_widget_event (priv->scale, (GdkEvent *) e); e->window = button_event->window; gdk_event_free ((GdkEvent *) e); } gtk_widget_grab_focus (priv->scale); priv->pop_time = time; return TRUE; }
/** \brief Control redirection input events to window. \author William J Giddings \date 12-Apr-09 \note Gdk Documentation for the implemented features. http://library.gnome.org/devel/gdk/stable/gdk-General.html **/ int gnoclGrabCmd ( ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj * const objv[] ) { static const char *cmd[] = { "pointer", "keyboard", "release", "status", NULL }; enum optIdx { PointerIdx, KeyboardIdx, ReleaseIdx, StatusIdx }; int idx; if ( objc != 3 ) { Tcl_WrongNumArgs ( interp, 1, objv, "option widgetid " ); return TCL_ERROR; } if ( Tcl_GetIndexFromObj ( interp, objv[1], cmd, "option", TCL_EXACT, &idx ) != TCL_OK ) { return TCL_ERROR; } /* g_print ( "opt = %s id = %s\n", Tcl_GetString ( objv[1] ), Tcl_GetString ( objv[2] ) ); */ switch ( idx ) { /* deny any pointer events, ie. grab all pointer inputs */ case PointerIdx: { GtkWidget *widget; guint32 activate_time; widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); gdk_pointer_grab ( widget->window , TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME ); break; } /* deny any keyboard events, ie. grab all keyboard inputs */ case KeyboardIdx: { GtkWidget *widget; guint32 activate_time; widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); gdk_keyboard_grab ( widget->window , TRUE, GDK_CURRENT_TIME ); break; } /* relase all grabs applied to the current display */ case ReleaseIdx: { GtkWidget *widget; guint32 activate_time; widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); gdk_display_pointer_ungrab ( gdk_drawable_get_display ( widget->window ), GDK_CURRENT_TIME ); gdk_keyboard_ungrab ( GDK_CURRENT_TIME ); } break; /* give status on pointer input grab, no equivalent for the keyboard */ case StatusIdx: { char buffer[5]; sprintf ( buffer, "%s", gdk_pointer_is_grabbed ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } } return TCL_OK; }
static gboolean gimp_scrolled_preview_area_event (GtkWidget *area, GdkEvent *event, GimpScrolledPreview *preview) { GimpScrolledPreviewPrivate *priv = GIMP_SCROLLED_PREVIEW_GET_PRIVATE (preview); GdkEventButton *button_event = (GdkEventButton *) event; GdkCursor *cursor; switch (event->type) { case GDK_BUTTON_PRESS: switch (button_event->button) { case 1: case 2: cursor = gdk_cursor_new_for_display (gtk_widget_get_display (area), GDK_FLEUR); if (gdk_pointer_grab (gtk_widget_get_window (area), TRUE, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK, NULL, cursor, gdk_event_get_time (event)) == GDK_GRAB_SUCCESS) { gtk_widget_get_pointer (area, &priv->drag_x, &priv->drag_y); priv->drag_xoff = GIMP_PREVIEW (preview)->xoff; priv->drag_yoff = GIMP_PREVIEW (preview)->yoff; priv->in_drag = TRUE; gtk_grab_add (area); } gdk_cursor_unref (cursor); break; case 3: return TRUE; } break; case GDK_BUTTON_RELEASE: if (priv->in_drag && (button_event->button == 1 || button_event->button == 2)) { gdk_display_pointer_ungrab (gtk_widget_get_display (area), gdk_event_get_time (event)); gtk_grab_remove (area); priv->in_drag = FALSE; } break; case GDK_MOTION_NOTIFY: if (priv->in_drag) { GdkEventMotion *mevent = (GdkEventMotion *) event; GtkAdjustment *hadj; GtkAdjustment *vadj; gint x, y; hadj = gtk_range_get_adjustment (GTK_RANGE (preview->hscr)); vadj = gtk_range_get_adjustment (GTK_RANGE (preview->vscr)); gtk_widget_get_pointer (area, &x, &y); x = priv->drag_xoff - (x - priv->drag_x); y = priv->drag_yoff - (y - priv->drag_y); x = CLAMP (x, gtk_adjustment_get_lower (hadj), gtk_adjustment_get_upper (hadj) - gtk_adjustment_get_page_size (hadj)); y = CLAMP (y, gtk_adjustment_get_lower (vadj), gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_page_size (vadj)); if (GIMP_PREVIEW (preview)->xoff != x || GIMP_PREVIEW (preview)->yoff != y) { gtk_adjustment_set_value (hadj, x); gtk_adjustment_set_value (vadj, y); gimp_preview_draw (GIMP_PREVIEW (preview)); gimp_preview_invalidate (GIMP_PREVIEW (preview)); } gdk_event_request_motions (mevent); } break; case GDK_SCROLL: { GdkEventScroll *sevent = (GdkEventScroll *) event; GdkScrollDirection direction = sevent->direction; GtkAdjustment *adj; gfloat value; /* Ctrl-Scroll is reserved for zooming */ if (sevent->state & GDK_CONTROL_MASK) return FALSE; if (sevent->state & GDK_SHIFT_MASK) switch (direction) { case GDK_SCROLL_UP: direction = GDK_SCROLL_LEFT; break; case GDK_SCROLL_DOWN: direction = GDK_SCROLL_RIGHT; break; case GDK_SCROLL_LEFT: direction = GDK_SCROLL_UP; break; case GDK_SCROLL_RIGHT: direction = GDK_SCROLL_DOWN; break; } switch (direction) { case GDK_SCROLL_UP: case GDK_SCROLL_DOWN: default: adj = gtk_range_get_adjustment (GTK_RANGE (preview->vscr)); break; case GDK_SCROLL_RIGHT: case GDK_SCROLL_LEFT: adj = gtk_range_get_adjustment (GTK_RANGE (preview->hscr)); break; } value = gtk_adjustment_get_value (adj); switch (direction) { case GDK_SCROLL_UP: case GDK_SCROLL_LEFT: value -= gtk_adjustment_get_page_increment (adj) / 2; break; case GDK_SCROLL_DOWN: case GDK_SCROLL_RIGHT: value += gtk_adjustment_get_page_increment (adj) / 2; break; } gtk_adjustment_set_value (adj, CLAMP (value, gtk_adjustment_get_lower (adj), gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj))); } break; default: break; } return FALSE; }
static gboolean gimp_tag_popup_border_event (GtkWidget *widget, GdkEvent *event) { GimpTagPopup *popup = GIMP_TAG_POPUP (widget); if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *button_event = (GdkEventButton *) event; GtkAllocation allocation; gint x; gint y; if (button_event->window == gtk_widget_get_window (widget) && gimp_tag_popup_button_scroll (popup, button_event)) { return TRUE; } gtk_widget_get_allocation (widget, &allocation); gdk_window_get_pointer (gtk_widget_get_window (widget), &x, &y, NULL); if (button_event->window != gtk_widget_get_window (popup->tag_area) && (x < allocation.y || y < allocation.x || x > allocation.x + allocation.width || y > allocation.y + allocation.height)) { /* user has clicked outside the popup area, * which means it should be hidden. */ gtk_grab_remove (widget); gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME); gtk_widget_destroy (widget); } } else if (event->type == GDK_MOTION_NOTIFY) { GdkEventMotion *motion_event = (GdkEventMotion *) event; gint x, y; gdk_window_get_pointer (gtk_widget_get_window (widget), &x, &y, NULL); gimp_tag_popup_handle_scrolling (popup, x, y, motion_event->window == gtk_widget_get_window (widget), TRUE); } else if (event->type == GDK_BUTTON_RELEASE) { GdkEventButton *button_event = (GdkEventButton *) event; popup->single_select_disabled = TRUE; if (button_event->window == gtk_widget_get_window (widget) && gimp_tag_popup_button_scroll (popup, button_event)) { return TRUE; } } else if (event->type == GDK_GRAB_BROKEN) { gtk_grab_remove (widget); gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME); gtk_widget_destroy (widget); } else if (event->type == GDK_KEY_PRESS) { gtk_grab_remove (widget); gdk_display_pointer_ungrab (gtk_widget_get_display (widget), GDK_CURRENT_TIME); gtk_widget_destroy (widget); } else if (event->type == GDK_SCROLL) { GdkEventScroll *scroll_event = (GdkEventScroll *) event; switch (scroll_event->direction) { case GDK_SCROLL_RIGHT: case GDK_SCROLL_DOWN: gimp_tag_popup_scroll_by (popup, MENU_SCROLL_STEP2); return TRUE; case GDK_SCROLL_LEFT: case GDK_SCROLL_UP: gimp_tag_popup_scroll_by (popup, - MENU_SCROLL_STEP2); return TRUE; } } return FALSE; }
static gboolean gimp_scrolled_preview_nav_popup_event (GtkWidget *widget, GdkEvent *event, GimpScrolledPreview *preview) { switch (event->type) { case GDK_BUTTON_RELEASE: { GdkEventButton *button_event = (GdkEventButton *) event; if (button_event->button == 1) { gtk_grab_remove (widget); gdk_display_pointer_ungrab (gtk_widget_get_display (widget), button_event->time); gtk_widget_destroy (preview->nav_popup); preview->nav_popup = NULL; } } break; case GDK_MOTION_NOTIFY: { GdkEventMotion *mevent = (GdkEventMotion *) event; GtkAdjustment *hadj; GtkAdjustment *vadj; GtkAllocation allocation; gint cx, cy; gdouble x, y; hadj = gtk_range_get_adjustment (GTK_RANGE (preview->hscr)); vadj = gtk_range_get_adjustment (GTK_RANGE (preview->vscr)); gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_pointer (widget, &cx, &cy); x = cx * (gtk_adjustment_get_upper (hadj) - gtk_adjustment_get_lower (hadj)) / allocation.width; y = cy * (gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_lower (vadj)) / allocation.height; x += (gtk_adjustment_get_lower (hadj) - gtk_adjustment_get_page_size (hadj) / 2); y += (gtk_adjustment_get_lower (vadj) - gtk_adjustment_get_page_size (vadj) / 2); gtk_adjustment_set_value (hadj, CLAMP (x, gtk_adjustment_get_lower (hadj), gtk_adjustment_get_upper (hadj) - gtk_adjustment_get_page_size (hadj))); gtk_adjustment_set_value (vadj, CLAMP (y, gtk_adjustment_get_lower (vadj), gtk_adjustment_get_upper (vadj) - gtk_adjustment_get_page_size (vadj))); gtk_widget_queue_draw (widget); gdk_window_process_updates (gtk_widget_get_window (widget), FALSE); gdk_event_request_motions (mevent); } break; default: break; } return FALSE; }
static gboolean grab_key_callback (GtkWidget *widget, GdkEventKey *event, GtkCellRendererAccel *accel) { GdkModifierType accel_mods = 0; guint accel_key; gchar *path; gboolean edited; gboolean cleared; GdkModifierType consumed_modifiers; GdkDisplay *display; display = gtk_widget_get_display (widget); if (event->is_modifier) return TRUE; edited = FALSE; cleared = FALSE; gdk_keymap_translate_keyboard_state (gdk_keymap_get_for_display (display), event->hardware_keycode, event->state, event->group, NULL, NULL, NULL, &consumed_modifiers); accel_key = gdk_keyval_to_lower (event->keyval); if (accel_key == GDK_ISO_Left_Tab) accel_key = GDK_Tab; accel_mods = event->state & gtk_accelerator_get_default_mod_mask (); /* Filter consumed modifiers */ if (accel->accel_mode == GTK_CELL_RENDERER_ACCEL_MODE_GTK) accel_mods &= ~consumed_modifiers; /* Put shift back if it changed the case of the key, not otherwise. */ if (accel_key != event->keyval) accel_mods |= GDK_SHIFT_MASK; if (accel_mods == 0) { switch (event->keyval) { case GDK_Escape: goto out; /* cancel */ case GDK_BackSpace: /* clear the accelerator on Backspace */ cleared = TRUE; goto out; default: break; } } if (accel->accel_mode == GTK_CELL_RENDERER_ACCEL_MODE_GTK) { if (!gtk_accelerator_valid (accel_key, accel_mods)) { gtk_widget_error_bell (widget); return TRUE; } } edited = TRUE; out: gdk_display_keyboard_ungrab (display, event->time); gdk_display_pointer_ungrab (display, event->time); path = g_strdup (g_object_get_data (G_OBJECT (accel->edit_widget), "gtk-cell-renderer-text")); gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (accel->edit_widget)); gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (accel->edit_widget)); accel->edit_widget = NULL; accel->grab_widget = NULL; if (edited) g_signal_emit (accel, signals[ACCEL_EDITED], 0, path, accel_key, accel_mods, event->hardware_keycode); else if (cleared) g_signal_emit (accel, signals[ACCEL_CLEARED], 0, path); g_free (path); return TRUE; }
static gchar* passphrase_mbox(const gchar *uid_hint, const gchar *pass_hint, gint prev_bad) { gchar *the_passphrase = NULL; GtkWidget *vbox; GtkWidget *confirm_box; GtkWidget *window; GtkWidget *pass_entry; GtkWidget *ok_button; GtkWidget *cancel_button; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), _("Passphrase")); gtk_widget_set_size_request(window, 450, -1); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_modal(GTK_WINDOW(window), TRUE); gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(passphrase_deleted), NULL); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(passphrase_key_pressed), NULL); MANAGE_WINDOW_SIGNALS_CONNECT(window); manage_window_set_transient(GTK_WINDOW(window)); vbox = gtk_vbox_new(FALSE, 8); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); if (uid_hint || pass_hint) { GtkWidget *label; label = create_description (uid_hint, pass_hint, prev_bad); gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0); } pass_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox), pass_entry, FALSE, FALSE, 0); gtk_entry_set_visibility(GTK_ENTRY(pass_entry), FALSE); gtk_widget_grab_focus(pass_entry); gtkut_stock_button_set_create(&confirm_box, &ok_button, GTK_STOCK_OK, &cancel_button, GTK_STOCK_CANCEL, NULL, NULL); gtk_box_pack_end(GTK_BOX(vbox), confirm_box, FALSE, FALSE, 0); gtk_widget_grab_default(ok_button); g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(passphrase_ok_cb), NULL); g_signal_connect(G_OBJECT(pass_entry), "activate", G_CALLBACK(passphrase_ok_cb), NULL); g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(passphrase_cancel_cb), NULL); gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); if (grab_all) gtk_window_set_policy (GTK_WINDOW(window), FALSE, FALSE, TRUE); gtk_widget_show_all(window); if (grab_all) { /* make sure that window is viewable * FIXME: this is still not enough */ gtk_widget_show_now(window); gdk_flush(); #ifdef GDK_WINDOWING_X11 gdk_x11_display_grab(gdk_display_get_default()); #endif /* GDK_WINDOWING_X11 */ if (gdk_pointer_grab(window->window, TRUE, 0, window->window, NULL, GDK_CURRENT_TIME)) { #ifdef GDK_WINDOWING_X11 gdk_x11_display_ungrab(gdk_display_get_default()); #endif /* GDK_WINDOWING_X11 */ g_warning("OOPS: Could not grab mouse\n"); gtk_widget_destroy(window); return NULL; } if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) { gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME); #ifdef GDK_WINDOWING_X11 gdk_x11_display_ungrab(gdk_display_get_default()); #endif /* GDK_WINDOWING_X11 */ g_warning("OOPS: Could not grab keyboard\n"); gtk_widget_destroy(window); return NULL; } } gtk_main(); if (grab_all) { gdk_display_keyboard_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME); gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME); #ifdef GDK_WINDOWING_X11 gdk_x11_display_ungrab(gdk_display_get_default()); #endif /* GDK_WINDOWING_X11 */ gdk_flush(); } manage_window_focus_out(window, NULL, NULL); if (pass_ack) { const gchar *entry_text; entry_text = gtk_entry_get_text(GTK_ENTRY(pass_entry)); the_passphrase = g_locale_from_utf8(entry_text, -1, NULL, NULL, NULL); if (!the_passphrase) the_passphrase = g_strdup(entry_text); } gtk_widget_destroy(window); return the_passphrase; }
static gboolean vik_print_preview_event (GtkWidget *widget, GdkEvent *event, VikPrintPreview *preview) { static gdouble orig_offset_x = 0.0; static gdouble orig_offset_y = 0.0; static gint start_x = 0; static gint start_y = 0; gdouble offset_x; gdouble offset_y; gdouble scale; switch (event->type) { case GDK_BUTTON_PRESS: gdk_pointer_grab (gtk_widget_get_window(widget), FALSE, (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), NULL, NULL, event->button.time); orig_offset_x = preview->image_offset_x; orig_offset_y = preview->image_offset_y; start_x = event->button.x; start_y = event->button.y; preview->dragging = TRUE; break; case GDK_MOTION_NOTIFY: scale = vik_print_preview_get_scale (preview); offset_x = (orig_offset_x + (event->motion.x - start_x) / scale); offset_y = (orig_offset_y + (event->motion.y - start_y) / scale); offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max); offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max); if (preview->image_offset_x != offset_x || preview->image_offset_y != offset_y) { vik_print_preview_set_image_offsets (preview, offset_x, offset_y); g_signal_emit (preview, vik_print_preview_signals[OFFSETS_CHANGED], 0, preview->image_offset_x, preview->image_offset_y); } break; case GDK_BUTTON_RELEASE: gdk_display_pointer_ungrab (gtk_widget_get_display (widget), event->button.time); start_x = start_y = 0; preview->dragging = FALSE; print_preview_queue_draw (preview); break; default: break; } return FALSE; }
static VALUE rg_pointer_ungrab(VALUE self, VALUE time) { gdk_display_pointer_ungrab(_SELF(self), NUM2ULONG(time)); return self; }