Exemplo n.º 1
0
static void
popup_button_popdown (PlannerPopupButton *button,
		      gboolean            ok)
{
	PlannerPopupButtonPriv *priv;

	priv = GET_PRIV (button);

	if (!priv->popup_widget) {
		return;
	}

	gtk_widget_hide (priv->popup_window);

	g_object_ref (priv->popup_widget);
	gtk_container_remove (GTK_CONTAINER (priv->popup_window),
			      priv->popup_widget);

	g_signal_emit (button, signals[POPDOWN], 0, priv->popup_widget, ok);

	g_object_unref (priv->popup_widget);
	priv->popup_widget = NULL;

	if (gtk_widget_has_grab (priv->popup_window)) {
		gtk_grab_remove (priv->popup_window);
		gdk_keyboard_ungrab (GDK_CURRENT_TIME);
		gdk_pointer_ungrab (GDK_CURRENT_TIME);
	}
}
Exemplo n.º 2
0
/* 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;
}
Exemplo n.º 3
0
static gboolean gx_knob_pointer_motion(GtkWidget *widget, GdkEventMotion *event)
{
	g_assert(GX_IS_KNOB(widget));
	if (!gtk_widget_has_grab(widget)) {
		return FALSE;
	}
	gdk_event_request_motions (event);
	_gx_knob_pointer_event(widget, event->x, event->y, get_stock_id(widget), TRUE, event->state, 0, NULL);
	return FALSE;
}
Exemplo n.º 4
0
static gboolean gx_knob_leave_out (GtkWidget *widget, GdkEventCrossing *event)
{
	g_assert(GX_IS_KNOB(widget));
	if (gtk_widget_has_grab(widget) || gtk_widget_has_focus(widget)== TRUE) {
		return TRUE;
	}
	GdkRectangle image_rect;
	GdkPixbuf *pb = gtk_widget_render_icon(widget, get_stock_id(widget), GtkIconSize(-1), NULL);
	gint fcount;
	get_image_dimensions (widget, pb, &image_rect, &fcount);
	g_object_unref(pb);
	gdouble knobstate = _gx_regler_get_step_pos(GX_REGLER(widget), 1);
	_gx_regler_get_positions(GX_REGLER(widget), &image_rect, NULL);
	if (fcount == -1) {
		_gx_knob_expose(widget, &image_rect, knobstate, pb, fcount, FALSE);
	}
	return TRUE;
}
Exemplo n.º 5
0
void wxListBox::DoScrollToCell(int n, float alignY, float alignX)
{
    wxCHECK_RET( m_treeview, wxT("invalid listbox") );
    wxCHECK_RET( IsValid(n), wxT("invalid index"));

    //RN: I have no idea why this line is needed...
    if (gtk_widget_has_grab(GTK_WIDGET(m_treeview)))
        return;

    GtkTreeIter iter;
    if ( !GTKGetIteratorFor(n, &iter) )
        return;

    wxGtkTreePath path(
            gtk_tree_model_get_path(GTK_TREE_MODEL(m_liststore), &iter));

    // Scroll to the desired cell (0.0 == topleft alignment)
    gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
                                 TRUE, alignY, alignX);
}
Exemplo n.º 6
0
static gboolean
gail_focus_watcher (GSignalInvocationHint *ihint,
                    guint                  n_param_values,
                    const GValue          *param_values,
                    gpointer               data)
{
  GObject *object;
  GtkWidget *widget;
  GdkEvent *event;

  object = g_value_get_object (param_values + 0);
  g_return_val_if_fail (GTK_IS_WIDGET(object), FALSE);

  event = g_value_get_boxed (param_values + 1);
  widget = GTK_WIDGET (object);

  if (event->type == GDK_FOCUS_CHANGE) 
    {
      if (event->focus_change.in)
        {
          if (GTK_IS_WINDOW (widget))
            {
              GtkWidget *focus_widget;
              GtkWindow *window;
              GtkWindowType type;

              window = GTK_WINDOW (widget);
              focus_widget = gtk_window_get_focus (window);
              g_object_get (window, "type", &type, NULL);

              if (focus_widget)
                {
                  /*
                   * If we already have a potential focus widget set this
                   * windows's focus widget to focus_before_menu so that 
                   * it will be reported when menu item is unset.
                   */
                  if (next_focus_widget)
                    {
                      if (GTK_IS_MENU_ITEM (next_focus_widget) &&
                          !focus_before_menu)
                        {
                          void *vp_focus_before_menu = &focus_before_menu;
                          focus_before_menu = focus_widget;
                          g_object_add_weak_pointer (G_OBJECT (focus_before_menu), vp_focus_before_menu);
                        }

                      return TRUE;
                    }
                  widget = focus_widget;
                }
              else if (type == GTK_WINDOW_POPUP)
                {
	          if (GTK_IS_BIN (widget))
		    {
		      GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget));

		      if (GTK_IS_WIDGET (child) && gtk_widget_has_grab (child))
			{
			  if (GTK_IS_MENU_SHELL (child))
			    {
			      if (gtk_menu_shell_get_selected_item (GTK_MENU_SHELL (child)))
				{
				  /*
				   * We have a menu which has a menu item selected
				   * so we do not report focus on the menu.
				   */ 
				  return TRUE; 
				}
			    }
			  widget = child;
			} 
		    }
		  else /* popup window has no children; this edge case occurs in some custom code (OOo for instance) */
		    {
		      return TRUE;
		    }
                }
	      else /* Widget is a non-popup toplevel with no focus children; 
		      don't emit for this case either, as it's useless */
		{
		  return TRUE;
		}
            }
        }
      else
        {
          if (next_focus_widget)
            {
               GtkWidget *toplevel;

               toplevel = gtk_widget_get_toplevel (next_focus_widget);
               if (toplevel == widget)
                 next_focus_widget = NULL; 
            }
          /* focus out */
          widget = NULL;
        }
    }
  else
    {
      if (event->type == GDK_MOTION_NOTIFY && gtk_widget_has_focus (widget))
        {
          if (widget == _focus_widget)
            {
              return TRUE;
            }
        }
      else
        {
          return TRUE;
        }
    }

#ifdef GDK_WINDOWING_X11
  /*
   * If the focus widget is a GtkSocket without a plug
   * then ignore the focus notification as the embedded
   * plug will report a focus notification.
   */
  if (GTK_IS_SOCKET (widget) &&
      gtk_socket_get_plug_window (GTK_SOCKET (widget)) != NULL)
    return TRUE;
#endif

  /*
   * The widget may not yet be visible on the screen so we wait until it is.
   */
  gail_focus_notify_when_idle (widget);
  return TRUE; 
}
Exemplo n.º 7
0
static void
release_grab (GstyleEyedropper *self)
{
  gboolean has_grab = FALSE;

  g_assert (GSTYLE_IS_EYEDROPPER (self));

  if (self->key_handler_id)
    {
      g_signal_handler_disconnect (self->window, self->key_handler_id);
      self->key_handler_id = 0;
    }

  if (self->grab_broken_handler_id)
    {
      g_signal_handler_disconnect (self->window, self->grab_broken_handler_id);
      self->grab_broken_handler_id = 0;
    }

  if (self->motion_notify_handler_id)
    {
      g_signal_handler_disconnect (self->window, self->motion_notify_handler_id);
      self->motion_notify_handler_id = 0;
    }

  if (self->pointer_pressed_handler_id)
    {
      g_signal_handler_disconnect (self->window, self->pointer_pressed_handler_id);
      self->pointer_pressed_handler_id = 0;
    }

  if (self->pointer_released_handler_id)
    {
      g_signal_handler_disconnect (self->window, self->pointer_released_handler_id);
      self->pointer_released_handler_id = 0;
    }

  if (self->screen_size_changed_handler_id)
    {
      g_signal_handler_disconnect (self->screen, self->screen_size_changed_handler_id);
      self->screen_size_changed_handler_id = 0;
    }

  if (self->window != NULL)
    if (gtk_widget_has_grab (self->window))
      {
        has_grab = TRUE;
        gtk_grab_remove (self->window);
      }

  if (self->seat != NULL)
    gdk_seat_ungrab (self->seat);

  g_clear_object (&self->default_provider);
  g_clear_object (&self->seat);
  g_clear_object (&self->cursor);

  if (self->window != NULL)
    {
      gtk_widget_destroy (self->window);
      self->window = NULL;
    }

  if (has_grab)
    g_signal_emit (self, signals [GRAB_RELEASED], 0);
}