Beispiel #1
0
static void
gtk_search_bar_set_entry (GtkSearchBar *bar,
                          GtkEntry     *entry)
{
  GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);

  if (priv->entry != NULL)
    {
      if (GTK_IS_SEARCH_ENTRY (priv->entry))
        g_signal_handlers_disconnect_by_func (priv->entry, stop_search_cb, bar);
      else
        g_signal_handlers_disconnect_by_func (priv->entry, entry_key_pressed_event_cb, bar);
      g_object_remove_weak_pointer (G_OBJECT (priv->entry), (gpointer *) &priv->entry);
    }

  priv->entry = GTK_WIDGET (entry);

  if (priv->entry != NULL)
    {
      g_object_add_weak_pointer (G_OBJECT (priv->entry), (gpointer *) &priv->entry);
      if (GTK_IS_SEARCH_ENTRY (priv->entry))
        g_signal_connect (priv->entry, "stop-search",
                          G_CALLBACK (stop_search_cb), bar);
      else
        g_signal_connect (priv->entry, "key-press-event",
                          G_CALLBACK (entry_key_pressed_event_cb), bar);
    }
}
Beispiel #2
0
static gboolean
ide_editor_frame__replace_key_press_event (IdeEditorFrame *self,
                                           GdkEventKey    *event,
                                           GtkSearchEntry *entry)
{
  g_assert (IDE_IS_EDITOR_FRAME (self));
  g_assert (GTK_IS_SEARCH_ENTRY (entry));

  switch (event->keyval)
    {
    case GDK_KEY_Escape:
      ide_widget_action (GTK_WIDGET (self->search_frame), "search-entry", "exit-search", NULL);
      return GDK_EVENT_STOP;

    case GDK_KEY_KP_Enter:
    case GDK_KEY_Return:
      ide_widget_action (GTK_WIDGET (self->search_frame), "search-entry", "replace", NULL);
      return GDK_EVENT_STOP;

    case GDK_KEY_Down:
      ide_widget_action (GTK_WIDGET (self), "frame", "next-search-result", NULL);
      return GDK_EVENT_STOP;

    case GDK_KEY_Up:
      ide_widget_action (GTK_WIDGET (self), "frame", "previous-search-result", NULL);
      return GDK_EVENT_STOP;

    default:
      break;
    }

  return GDK_EVENT_PROPAGATE;
}
Beispiel #3
0
/**
 * gtk_search_bar_handle_event:
 * @bar: a #GtkSearchBar
 * @event: a #GdkEvent containing key press events
 *
 * This function should be called when the top-level
 * window which contains the search bar received a key event.
 *
 * If the key event is handled by the search bar, the bar will
 * be shown, the entry populated with the entered text and %GDK_EVENT_STOP
 * will be returned. The caller should ensure that events are
 * not propagated further.
 *
 * If no entry has been connected to the search bar, using
 * gtk_search_bar_connect_entry(), this function will return
 * immediately with a warning.
 *
 * ## Showing the search bar on key presses
 *
 * |[<!-- language="C" -->
 * static gboolean
 * on_key_press_event (GtkWidget *widget,
 *                     GdkEvent  *event,
 *                     gpointer   user_data)
 * {
 *   GtkSearchBar *bar = GTK_SEARCH_BAR (user_data);
 *   return gtk_search_bar_handle_event (bar, event);
 * }
 *
 * g_signal_connect (window,
 *                  "key-press-event",
 *                   G_CALLBACK (on_key_press_event),
 *                   search_bar);
 * ]|
 *
 * Returns: %GDK_EVENT_STOP if the key press event resulted
 *     in text being entered in the search entry (and revealing
 *     the search bar if necessary), %GDK_EVENT_PROPAGATE otherwise.
 *
 * Since: 3.10
 */
gboolean
gtk_search_bar_handle_event (GtkSearchBar *bar,
                             GdkEvent     *event)
{
  GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
  gboolean handled;

  if (priv->reveal_child)
    return GDK_EVENT_PROPAGATE;

  if (priv->entry == NULL)
    {
      g_warning ("The search bar does not have an entry connected to it. Call gtk_search_bar_connect_entry() to connect one.");
      return GDK_EVENT_PROPAGATE;
    }

  if (GTK_IS_SEARCH_ENTRY (priv->entry))
    handled = gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->entry), event);
  else
    handled = gtk_search_bar_handle_event_for_entry (bar, event);

  if (handled == GDK_EVENT_STOP)
    gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);

  return handled;
}
static void
egg_search_bar__entry_activate (EggSearchBar   *self,
                                GtkSearchEntry *entry)
{
  g_assert (EGG_IS_SEARCH_BAR (self));
  g_assert (GTK_IS_SEARCH_ENTRY (entry));

  g_signal_emit (self, signals [ACTIVATE], 0);
}
static void
gb_search_box_entry_activate (GbSearchBox    *self,
                              GtkSearchEntry *entry)
{
  g_return_if_fail (GB_IS_SEARCH_BOX (self));
  g_return_if_fail (GTK_IS_SEARCH_ENTRY (entry));

  gb_search_display_activate (self->display);
  gtk_entry_set_text (GTK_ENTRY (self->entry), "");
}
Beispiel #6
0
static void
on_replace_text_changed (IdeEditorFrame *self,
                         GParamSpec     *pspec,
                         GtkSearchEntry *replace_entry)
{
  g_assert (IDE_IS_EDITOR_FRAME (self));
  g_assert (GTK_IS_SEARCH_ENTRY (replace_entry));

  check_replace_text (self);
  update_replace_actions_sensitivity (self);
}
static void
gb_shortcuts_dialog__entry__changed (GbShortcutsDialog *self,
                                     GtkSearchEntry    *search_entry)
{
  GbShortcutsDialogPrivate *priv = gb_shortcuts_dialog_get_instance_private (self);
  g_autoptr(IdePatternSpec) spec = NULL;
  g_autofree gchar *downcase = NULL;
  GHashTableIter iter;
  const gchar *text;
  const gchar *last_view_name;
  gpointer key;
  gpointer value;

  g_assert (GB_IS_SHORTCUTS_DIALOG (self));
  g_assert (GTK_IS_SEARCH_ENTRY (search_entry));

  text = gtk_entry_get_text (GTK_ENTRY (search_entry));

  if (!text || !*text)
    {
      if (priv->last_view_name != NULL)
        {
          gtk_stack_set_visible_child_name (priv->stack, priv->last_view_name);
          return;
        }
    }

  last_view_name = gtk_stack_get_visible_child_name (priv->stack);

  if (g_strcmp0 (last_view_name, "internal-search") != 0)
    {
      g_free (priv->last_view_name);
      priv->last_view_name = g_strdup (last_view_name);
    }

  gtk_stack_set_visible_child_name (priv->stack, "internal-search");

  downcase = g_utf8_strdown (text, -1);
  spec = ide_pattern_spec_new (downcase);

  g_hash_table_iter_init (&iter, priv->keywords);

  while (g_hash_table_iter_next (&iter, &key, &value))
    {
      GtkWidget *widget = key;
      const gchar *keywords = value;

      gtk_widget_set_visible (widget, ide_pattern_spec_match (spec, keywords));
    }
}
static gboolean
gb_search_box_entry_key_press_event (GbSearchBox    *self,
                                     GdkEventKey    *key,
                                     GtkSearchEntry *entry)
{
  g_return_val_if_fail (GB_IS_SEARCH_BOX (self), GDK_EVENT_PROPAGATE);
  g_return_val_if_fail (key, GDK_EVENT_PROPAGATE);
  g_return_val_if_fail (GTK_IS_SEARCH_ENTRY (entry), GDK_EVENT_PROPAGATE);

  switch (key->keyval)
    {
    case GDK_KEY_Escape:
      {
        gb_search_box_popover_set_visible (self, FALSE);
        gtk_widget_grab_focus (gtk_widget_get_toplevel (GTK_WIDGET (entry)));

        return GDK_EVENT_STOP;
      }
      break;

    case GDK_KEY_Tab:
    case GDK_KEY_KP_Tab:
      if ((key->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) != 0)
        break;
      /* Fall through */
    case GDK_KEY_Down:
    case GDK_KEY_KP_Down:
      if (gtk_widget_get_visible (GTK_WIDGET (self->popover)))
        {
          gtk_widget_grab_focus (GTK_WIDGET (self->display));
          return GDK_EVENT_STOP;
        }
      break;

    default:
      break;
    }

  return GDK_EVENT_PROPAGATE;
}
static void
gb_search_box_entry_changed (GbSearchBox    *self,
                             GtkSearchEntry *entry)
{
  GtkWidget *button;
  gboolean active;
  gboolean sensitive;
  guint delay_msec = SHORT_DELAY_TIMEOUT_MSEC;

  g_return_if_fail (GB_IS_SEARCH_BOX (self));
  g_return_if_fail (GTK_IS_SEARCH_ENTRY (entry));

  button = GTK_WIDGET (self->button);
  active = gtk_widget_has_focus (GTK_WIDGET (entry)) || (self->delay_timeout != 0);
  sensitive = !!(gtk_entry_get_text_length (GTK_ENTRY (self->entry)));

  if (gtk_widget_get_sensitive (button) != sensitive)
    gtk_widget_set_sensitive (button, sensitive);

  if (active)
    gb_search_box_popover_set_visible (self, TRUE);

  if (!self->delay_timeout)
    {
      const gchar *search_text;

      search_text = gtk_entry_get_text (GTK_ENTRY (entry));
      if (search_text)
        {
          if (strlen (search_text) < 3)
            delay_msec = LONG_DELAY_TIMEOUT_MSEC;
          self->delay_timeout = g_timeout_add (delay_msec,
                                               gb_search_box_delay_cb,
                                               self);
        }
    }
}