]> git.0d.be Git - empathy.git/commitdiff
Add popup-individual-menu signal
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Fri, 1 Jun 2012 13:00:35 +0000 (15:00 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 14 Jun 2012 07:21:49 +0000 (09:21 +0200)
libempathy-gtk/empathy-roster-view.c
tests/interactive/test-empathy-roster-view.c

index dadc044c8d3dac31052f7c987b04fbcfffb401cc..28aac164cc827eed220c8c62191d6f819a9a17df 100644 (file)
@@ -21,6 +21,7 @@ enum
 enum
 {
   SIG_INDIVIDUAL_ACTIVATED,
+  SIG_POPUP_INDIVIDUAL_MENU,
   LAST_SIGNAL
 };
 
@@ -814,12 +815,74 @@ empathy_roster_view_child_activated (EggListBox *box,
   g_signal_emit (box, signals[SIG_INDIVIDUAL_ACTIVATED], 0, individual);
 }
 
+static void
+fire_popup_individual_menu (EmpathyRosterView *self,
+    GtkWidget *child,
+    guint button,
+    guint time)
+{
+  EmpathyRosterContact *contact;
+  FolksIndividual *individual;
+
+  if (!EMPATHY_IS_ROSTER_CONTACT (child))
+    return;
+
+  contact = EMPATHY_ROSTER_CONTACT (child);
+  individual = empathy_roster_contact_get_individual (contact);
+
+  g_signal_emit (self, signals[SIG_POPUP_INDIVIDUAL_MENU], 0,
+      individual, button, time);
+}
+
+static gboolean
+empathy_roster_view_button_press_event (GtkWidget *widget,
+    GdkEventButton *event)
+{
+  EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (widget);
+  gboolean (*chain_up) (GtkWidget *, GdkEventButton *) =
+      ((GtkWidgetClass *) empathy_roster_view_parent_class)->button_press_event;
+
+  if (event->button == 3)
+    {
+      GtkWidget *child;
+
+      child = egg_list_box_get_child_at_y (EGG_LIST_BOX (self), event->y);
+
+      if (child != NULL)
+        fire_popup_individual_menu (self, child, event->button, event->time);
+    }
+
+  return chain_up (widget, event);
+}
+
+static gboolean
+empathy_roster_view_key_press_event (GtkWidget *widget,
+    GdkEventKey *event)
+{
+  EmpathyRosterView *self = EMPATHY_ROSTER_VIEW (widget);
+  gboolean (*chain_up) (GtkWidget *, GdkEventKey *) =
+      ((GtkWidgetClass *) empathy_roster_view_parent_class)->key_press_event;
+
+  if (event->keyval == GDK_KEY_Menu)
+    {
+      GtkWidget *child;
+
+      child = egg_list_box_get_selected_child (EGG_LIST_BOX (self));
+
+      if (child != NULL)
+        fire_popup_individual_menu (self, child, 0, event->time);
+    }
+
+  return chain_up (widget, event);
+}
+
 static void
 empathy_roster_view_class_init (
     EmpathyRosterViewClass *klass)
 {
   GObjectClass *oclass = G_OBJECT_CLASS (klass);
   EggListBoxClass *box_class = EGG_LIST_BOX_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GParamSpec *spec;
 
   oclass->get_property = empathy_roster_view_get_property;
@@ -828,6 +891,9 @@ empathy_roster_view_class_init (
   oclass->dispose = empathy_roster_view_dispose;
   oclass->finalize = empathy_roster_view_finalize;
 
+  widget_class->button_press_event = empathy_roster_view_button_press_event;
+  widget_class->key_press_event = empathy_roster_view_key_press_event;
+
   box_class->child_activated = empathy_roster_view_child_activated;
 
   spec = g_param_spec_object ("manager", "Manager",
@@ -855,6 +921,13 @@ empathy_roster_view_class_init (
       G_TYPE_NONE,
       1, FOLKS_TYPE_INDIVIDUAL);
 
+  signals[SIG_POPUP_INDIVIDUAL_MENU] = g_signal_new ("popup-individual-menu",
+      G_OBJECT_CLASS_TYPE (klass),
+      G_SIGNAL_RUN_LAST,
+      0, NULL, NULL, NULL,
+      G_TYPE_NONE,
+      3, FOLKS_TYPE_INDIVIDUAL, G_TYPE_UINT, G_TYPE_UINT);
+
   g_type_class_add_private (klass, sizeof (EmpathyRosterViewPriv));
 }
 
index fd9457d53d7b6eaee427f30fea8288fd563bb23a..c76f670c80ee0c3d639cb9223a474a86bf373b01 100644 (file)
@@ -24,6 +24,34 @@ individual_activated_cb (EmpathyRosterView *self,
       folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
 }
 
+static void
+popup_individual_menu_cb (EmpathyRosterView *self,
+    FolksIndividual *individual,
+    guint button,
+    guint time,
+    gpointer user_data)
+{
+  GtkWidget *menu, *item;
+
+  g_print ("'%s' popup menu\n",
+      folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
+
+  menu = gtk_menu_new ();
+
+  g_signal_connect (menu, "deactivate",
+      G_CALLBACK (gtk_widget_destroy), NULL);
+
+  item = gtk_menu_item_new_with_label (folks_alias_details_get_alias (
+          FOLKS_ALIAS_DETAILS (individual)));
+  gtk_widget_show (item);
+
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+  gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (self), NULL);
+
+  gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, time);
+}
+
 int
 main (int argc,
     char **argv)
@@ -57,6 +85,8 @@ main (int argc,
 
   g_signal_connect (view, "individual-activated",
       G_CALLBACK (individual_activated_cb), NULL);
+  g_signal_connect (view, "popup-individual-menu",
+      G_CALLBACK (popup_individual_menu_cb), NULL);
 
   empathy_roster_view_show_offline (EMPATHY_ROSTER_VIEW (view), show_offline);
   empathy_roster_view_show_groups (EMPATHY_ROSTER_VIEW (view), show_groups);