Author: kelnos
Date: 2008-02-26 09:31:40 +0000 (Tue, 26 Feb 2008)
New Revision: 26642

Modified:
   xfce-utils/trunk/xfrun/xfrun-dialog.c
Log:
use real GtkComboBoxEntry instead of separate GtkEntry and GtkButton, patch
from Stefan Stuhr (bug 3820)


Modified: xfce-utils/trunk/xfrun/xfrun-dialog.c
===================================================================
--- xfce-utils/trunk/xfrun/xfrun-dialog.c       2008-02-26 09:24:12 UTC (rev 
26641)
+++ xfce-utils/trunk/xfrun/xfrun-dialog.c       2008-02-26 09:31:40 UTC (rev 
26642)
@@ -2,17 +2,18 @@
  * xfrun - a simple quick run dialog with saved history and completion
  *
  * Copyright (c) 2006 Brian J. Tarricone <[EMAIL PROTECTED]>
+ * Copyright (c) 2008 Stefan Stuhr <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
@@ -44,8 +45,8 @@
 
 struct _XfrunDialogPrivate
 {
+    GtkWidget *comboboxentry;
     GtkWidget *entry;
-    GtkWidget *arrow_btn;
     GtkWidget *terminal_chk;
     GtkTreeModel *completion_model;
     
@@ -94,6 +95,8 @@
 static gboolean xfrun_dialog_delete_event(GtkWidget *widget,
                                           GdkEventAny *evt);
 
+static gboolean xfrun_comboboxentry_changed(GtkComboBoxEntry *comboboxentry,
+                                            gpointer user_data);
 static gboolean xfrun_entry_check_match(GtkTreeModel *model,
                                         GtkTreePath *path,
                                         GtkTreeIter *iter,
@@ -101,11 +104,6 @@
 static gboolean xfrun_entry_focus_out(GtkWidget *widget,
                                       GdkEventFocus *evt,
                                       gpointer user_data);
-static gboolean xfrun_entry_key_press(GtkWidget *widget,
-                                      GdkEventKey *evt,
-                                      gpointer user_data);
-static void xfrun_menu_button_clicked(GtkWidget *widget,
-                                      gpointer user_data);
 static void xfrun_run_clicked(GtkWidget *widget,
                               gpointer user_data);
 static gboolean xfrun_match_selected(GtkEntryCompletion *completion,
@@ -162,9 +160,8 @@
 static void
 xfrun_dialog_init(XfrunDialog *dialog)
 {
-    GtkWidget *entry, *chk, *btn, *vbox, *bbox, *hbox, *arrow;
+    GtkWidget *entry, *comboboxentry, *chk, *btn, *vbox, *bbox;
     GtkTreeIter itr;
-    gchar *first_item = NULL;
     
     dialog->priv = G_TYPE_INSTANCE_GET_PRIVATE(dialog, XFRUN_TYPE_DIALOG,
                                                XfrunDialogPrivate);
@@ -177,46 +174,26 @@
     gtk_widget_show(vbox);
     gtk_container_add(GTK_CONTAINER(dialog), vbox);
     
-    hbox = gtk_hbox_new(FALSE, BORDER/4);
-    gtk_widget_show(hbox);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-    
-    
-    dialog->priv->entry = entry = gtk_entry_new();
+    dialog->priv->comboboxentry = comboboxentry = gtk_combo_box_entry_new();
+    dialog->priv->entry = entry = gtk_bin_get_child(GTK_BIN(comboboxentry));
     gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
     xfrun_setup_entry_completion(dialog);
-    gtk_widget_show(entry);
-    gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+    gtk_widget_show(comboboxentry);
+    gtk_box_pack_start(GTK_BOX(vbox), comboboxentry, FALSE, FALSE, 0);
+    g_signal_connect(G_OBJECT(comboboxentry), "changed",
+                     G_CALLBACK(xfrun_comboboxentry_changed), dialog);
     g_signal_connect(G_OBJECT(entry), "focus-out-event",
                      G_CALLBACK(xfrun_entry_focus_out), dialog);
-    g_signal_connect(G_OBJECT(entry), "key-press-event",
-                     G_CALLBACK(xfrun_entry_key_press), dialog);
     
-    if(gtk_tree_model_get_iter_first(dialog->priv->completion_model, &itr)) {
-        gtk_tree_model_get(dialog->priv->completion_model, &itr,
-                           XFRUN_COL_COMMAND, &first_item,
-                           -1);
-        if(first_item) {
-            gtk_entry_set_text(GTK_ENTRY(entry), first_item);
-            g_free(first_item);
-        }
-    }
-    
-    dialog->priv->arrow_btn = btn = gtk_button_new();
-    gtk_container_set_border_width(GTK_CONTAINER(btn), 0);
-    gtk_widget_show(btn);
-    gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 0);
-    g_signal_connect(G_OBJECT(btn), "clicked",
-                     G_CALLBACK(xfrun_menu_button_clicked), dialog);
-    
-    arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE);
-    gtk_widget_show(arrow);
-    gtk_container_add(GTK_CONTAINER(btn), arrow);
-    
     dialog->priv->terminal_chk = chk = 
gtk_check_button_new_with_mnemonic(_("Run in _terminal"));
     gtk_widget_show(chk);
     gtk_box_pack_start(GTK_BOX(vbox), chk, FALSE, FALSE, 0);
     
+    if(gtk_tree_model_get_iter_first(dialog->priv->completion_model, &itr)) {
+        gtk_combo_box_set_active_iter(GTK_COMBO_BOX(comboboxentry), &itr);
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), FALSE);
+    }
+    
     bbox = gtk_hbutton_box_new();
     gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
     gtk_box_set_spacing(GTK_BOX(bbox), BORDER);
@@ -337,15 +314,20 @@
 static void
 xfrun_setup_entry_completion(XfrunDialog *dialog)
 {
+    GtkComboBoxEntry *comboboxentry = 
GTK_COMBO_BOX_ENTRY(dialog->priv->comboboxentry);
     GtkEntryCompletion *completion = gtk_entry_completion_new();
     GtkTreeModel *completion_model;
     
     /* clear out the old completion and resources, if any */
     gtk_entry_set_completion(GTK_ENTRY(dialog->priv->entry), NULL);
+    gtk_combo_box_set_model(GTK_COMBO_BOX(comboboxentry), NULL);
     if(dialog->priv->completion_model)
         g_object_unref(dialog->priv->completion_model);
     
     dialog->priv->completion_model = completion_model = 
xfrun_create_completion_model(dialog);
+    gtk_combo_box_set_model(GTK_COMBO_BOX(comboboxentry), completion_model);
+    gtk_combo_box_entry_set_text_column(comboboxentry, XFRUN_COL_COMMAND);
+    
     gtk_entry_completion_set_model(completion, completion_model);
     gtk_entry_completion_set_text_column(completion, XFRUN_COL_COMMAND);
     gtk_entry_completion_set_popup_completion(completion, TRUE);
@@ -375,6 +357,27 @@
 }
 
 static gboolean
+xfrun_comboboxentry_changed(GtkComboBoxEntry *comboboxentry,
+                            gpointer user_data)
+{
+    XfrunDialog *dialog = XFRUN_DIALOG(user_data);
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    gboolean in_terminal = FALSE;
+    
+    if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboboxentry), &iter)) {
+        model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboboxentry));
+        gtk_tree_model_get(model, &iter,
+                           XFRUN_COL_IN_TERMINAL, &in_terminal,
+                           -1);
+        
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk),
+                                     in_terminal);
+    }
+    
+    return FALSE;
+}
+
+static gboolean
 xfrun_entry_check_match(GtkTreeModel *model,
                         GtkTreePath *path,
                         GtkTreeIter *iter,
@@ -390,8 +393,8 @@
                        -1);
     
     if(!g_utf8_collate(command, dialog->priv->entry_val_tmp)) {
-        
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk),
-                                     in_terminal);
+        
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dialog->priv->comboboxentry),
+                                      iter);
         ret = TRUE;
     }
     
@@ -407,143 +410,19 @@
 {
     XfrunDialog *dialog = XFRUN_DIALOG(user_data);
     
-    dialog->priv->entry_val_tmp = gtk_editable_get_chars(GTK_EDITABLE(widget),
-                                                         0, -1);
-    gtk_tree_model_foreach(dialog->priv->completion_model,
-                           xfrun_entry_check_match, dialog);
-    g_free(dialog->priv->entry_val_tmp);
-    dialog->priv->entry_val_tmp = NULL;
-    
-    return FALSE;
-}
-
-static gboolean
-xfrun_entry_key_press(GtkWidget *widget,
-                      GdkEventKey *evt,
-                      gpointer user_data)
-{
-    XfrunDialog *dialog = XFRUN_DIALOG(user_data);
-    
-    if(evt->keyval == GDK_Down || evt->keyval == GDK_KP_Down) {
-        gtk_button_clicked(GTK_BUTTON(dialog->priv->arrow_btn));
-        return TRUE;
+    if(gtk_combo_box_get_active(GTK_COMBO_BOX(dialog->priv->comboboxentry)) < 
0) {
+        dialog->priv->entry_val_tmp = 
gtk_editable_get_chars(GTK_EDITABLE(widget),
+                                                             0, -1);
+        gtk_tree_model_foreach(dialog->priv->completion_model,
+                               xfrun_entry_check_match, dialog);
+        g_free(dialog->priv->entry_val_tmp);
+        dialog->priv->entry_val_tmp = NULL;
     }
     
     return FALSE;
 }
 
 static void
-xfrun_menu_item_activated(GtkWidget *widget,
-                          gpointer user_data)
-{
-    XfrunDialog *dialog = XFRUN_DIALOG(user_data);
-    GtkWidget *lbl;
-    const gchar *command;
-    gboolean in_terminal;
-    
-    lbl = gtk_bin_get_child(GTK_BIN(widget));
-    g_return_if_fail(GTK_IS_LABEL(lbl));
-    
-    command = gtk_label_get_text(GTK_LABEL(lbl));
-    gtk_entry_set_text(GTK_ENTRY(dialog->priv->entry), command);
-    
-    in_terminal = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),
-                                                     "--xfrun-in-terminal"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk),
-                                 in_terminal);
-}
-
-static gboolean
-xfrun_populate_menu(GtkTreeModel *model,
-                    GtkTreePath *path,
-                    GtkTreeIter *iter,
-                    gpointer data)
-{
-    GtkWidget *menu = GTK_WIDGET(data), *mi;
-    XfrunDialog *dialog = g_object_get_data(G_OBJECT(menu), 
-                                                  "--xfrun-dialog");
-    gchar *command = NULL;
-    gboolean in_terminal = FALSE;
-    
-    gtk_tree_model_get(model, iter,
-                       XFRUN_COL_COMMAND, &command,
-                       XFRUN_COL_IN_TERMINAL, &in_terminal,
-                       -1);
-    
-    mi = gtk_menu_item_new_with_label(command);
-    g_object_set_data(G_OBJECT(mi), "--xfrun-in-terminal",
-                      GINT_TO_POINTER(in_terminal));
-    gtk_widget_show(mi);
-    gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-    g_signal_connect(G_OBJECT(mi), "activate",
-                     G_CALLBACK(xfrun_menu_item_activated), dialog);
-    
-    g_free(command);
-    
-    return FALSE;
-}
-
-static void
-xfrun_menu_position(GtkMenu *menu,
-                    gint *x,
-                    gint *y,
-                    gboolean *push_in,
-                    gpointer user_data)
-{
-    XfrunDialog *dialog = XFRUN_DIALOG(user_data);
-    GtkAllocation *entry_al = &dialog->priv->entry->allocation;
-    GtkAllocation *btn_al = &dialog->priv->arrow_btn->allocation;
-    gint entry_x, entry_y;
-    
-    gdk_window_get_origin(dialog->priv->entry->window, &entry_x, &entry_y);
-    
-    *x = entry_x;
-    *y = entry_y + entry_al->height;
-    *push_in = FALSE;
-    
-    gtk_widget_set_size_request(GTK_WIDGET(menu),
-                                btn_al->x - entry_al->x + btn_al->width, -1);
-}
-
-static gboolean
-xfrun_menu_destroy_idled(gpointer user_data)
-{
-    gtk_widget_destroy(GTK_WIDGET(user_data));
-    return FALSE;
-}
-
-static void
-xfrun_menu_destroy(GtkWidget *widget,
-                   gpointer user_data)
-{
-    g_idle_add(xfrun_menu_destroy_idled, widget);
-}
-
-static void
-xfrun_menu_button_clicked(GtkWidget *widget,
-                          gpointer user_data)
-{
-    XfrunDialog *dialog = XFRUN_DIALOG(user_data);
-    GtkWidget *menu;
-    
-    menu = gtk_menu_new();
-    g_object_set_data(G_OBJECT(menu), "--xfrun-dialog", dialog);
-    gtk_widget_show(menu);
-    g_signal_connect(G_OBJECT(menu), "deactivate",
-                     G_CALLBACK(xfrun_menu_destroy), menu);
-    
-    gtk_tree_model_foreach(dialog->priv->completion_model,
-                           xfrun_populate_menu, menu);
-                           
-    gtk_menu_set_screen(GTK_MENU(menu),
-                        gtk_widget_get_screen (widget));
-    
-    gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
-                   xfrun_menu_position, dialog,
-                   1, gtk_get_current_event_time());
-}
-
-static void
 xfrun_add_to_history(const gchar *command,
                      gboolean in_terminal)
 {

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to