Author: kelnos
Date: 2006-07-16 01:30:04 +0000 (Sun, 16 Jul 2006)
New Revision: 22457
Added:
xfce-utils/trunk/xfrun/xfrun-dialog.c
xfce-utils/trunk/xfrun/xfrun-dialog.h
Modified:
xfce-utils/trunk/configure.in.in
xfce-utils/trunk/xfrun/Makefile.am
xfce-utils/trunk/xfrun/xfrun.c
Log:
first reorg for dbus support for xfrun. no actual changes yet; need to write
xfrun-dbus.c
Modified: xfce-utils/trunk/configure.in.in
===================================================================
--- xfce-utils/trunk/configure.in.in 2006-07-15 21:12:26 UTC (rev 22456)
+++ xfce-utils/trunk/configure.in.in 2006-07-16 01:30:04 UTC (rev 22457)
@@ -93,8 +93,12 @@
XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.3.90.2])
XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.3.90.2])
+XDT_CHECK_OPTIONAL_PACKAGE([DBUS], [dbus-glib-1],
+ [0.33], [dbus], [D-BUS support])
+
dnl configure the mcs plugin
XDT_XFCE_MCS_PLUGIN([XFCE_MCS_MANAGER], [4.3.90.2])
+AM_CONDITIONAL([HAVE_DBUS], [test "x$DBUS_FOUND" = "xyes"])
dnl Check for debugging support
XDT_FEATURE_DEBUG
Modified: xfce-utils/trunk/xfrun/Makefile.am
===================================================================
--- xfce-utils/trunk/xfrun/Makefile.am 2006-07-15 21:12:26 UTC (rev 22456)
+++ xfce-utils/trunk/xfrun/Makefile.am 2006-07-16 01:30:04 UTC (rev 22457)
@@ -1,12 +1,35 @@
bin_PROGRAMS = xfrun4
-xfrun4_SOURCES = xfrun.c
+xfrun4_SOURCES = \
+ xfrun-dialog.c \
+ xfrun-dialog.h
+#if HAVE_DBUS
+
+#xfrun4_SOURCES += \
+# xfrun-dbus.c
+
+#else
+
+xfrun4_SOURCES += \
+ xfrun.c
+
+#endif
+
xfrun4_CFLAGS = \
+ -DLOCALEDIR=\"$(localedir)\" \
@LIBXFCE4UTIL_CFLAGS@ \
+ @LIBXFCEGUI4_CFLAGS@ \
@GTK_CFLAGS@ \
- -DLOCALEDIR=\"$(localedir)\"
+ @DBUS_CFLAGS@
xfrun4_LDADD = \
@LIBXFCE4UTIL_LIBS@ \
- @GTK_LIBS@
+ @LIBXFCEGUI4_LIBS@ \
+ @GTK_LIBS@ \
+ @DBUS_LIBS@
+
+EXTRA_DIST = \
+ xfrun.c \
+
+# xfrun-dbus.c
Added: xfce-utils/trunk/xfrun/xfrun-dialog.c
===================================================================
--- xfce-utils/trunk/xfrun/xfrun-dialog.c (rev 0)
+++ xfce-utils/trunk/xfrun/xfrun-dialog.c 2006-07-16 01:30:04 UTC (rev
22457)
@@ -0,0 +1,690 @@
+/*
+ * xfrun - a simple quick run dialog with saved history and completion
+ *
+ * Copyright (c) 2006 Brian J. Tarricone <[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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include <libxfcegui4/libxfcegui4.h>
+
+#include "xfrun-dialog.h"
+
+#define BORDER 8
+#define MAX_ENTRIES 20
+
+struct _XfrunDialogPrivate
+{
+ GtkWidget *entry;
+ GtkWidget *arrow_btn;
+ GtkWidget *terminal_chk;
+ GtkTreeModel *completion_model;
+
+ gchar *run_argument;
+ gboolean destroy_on_close;
+
+ gchar *entry_val_tmp;
+};
+
+enum
+{
+ PROP0,
+ PROP_RUN_ARGUMENT,
+};
+
+enum
+{
+ SIG_CLOSED,
+ N_SIGS,
+};
+
+enum
+{
+ XFRUN_COL_COMMAND = 0,
+ XFRUN_COL_IN_TERMINAL,
+ XFRUN_N_COLS,
+};
+
+static void xfrun_dialog_class_init(XfrunDialogClass *klass);
+static void xfrun_dialog_init(XfrunDialog *dialog);
+
+static void xfrun_dialog_set_property(GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void xfrun_dialog_get_property(GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void xfrun_dialog_finalize(GObject *object);
+
+static gboolean xfrun_dialog_key_press_event(GtkWidget *widget,
+ GdkEventKey *evt);
+static gboolean xfrun_dialog_delete_event(GtkWidget *widget,
+ GdkEventAny *evt);
+
+static gboolean xfrun_entry_check_match(GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data);
+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,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data);
+static GtkTreeModel *xfrun_create_completion_model(XfrunDialog *dialog);
+
+guint __signals[N_SIGS] = { 0, };
+
+
+G_DEFINE_TYPE(XfrunDialog, xfrun_dialog, GTK_TYPE_WINDOW)
+
+
+static void
+xfrun_dialog_class_init(XfrunDialogClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *)klass;
+ GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
+
+ gobject_class->set_property = xfrun_dialog_set_property;
+ gobject_class->get_property = xfrun_dialog_get_property;
+ gobject_class->finalize = xfrun_dialog_finalize;
+
+ widget_class->key_press_event = xfrun_dialog_key_press_event;
+ widget_class->delete_event = xfrun_dialog_delete_event;
+
+ __signals[SIG_CLOSED] = g_signal_new("closed", XFRUN_TYPE_DIALOG,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(XfrunDialogClass,
+ closed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ g_object_class_install_property(gobject_class, PROP_RUN_ARGUMENT,
+ g_param_spec_string("run-argument",
+ "Run argument",
+ "1st argument to pass
to the program run",
+ NULL,
+ G_PARAM_READWRITE));
+}
+
+static void
+xfrun_dialog_init(XfrunDialog *dialog)
+{
+ GtkWidget *entry, *chk, *btn, *vbox, *bbox, *hbox, *arrow;
+ GtkEntryCompletion *completion;
+ GtkTreeModel *completion_model;
+ GtkTreeIter itr;
+ gchar *first_item = NULL;
+
+ dialog->priv = g_new0(XfrunDialogPrivate, 1);
+ GTK_WINDOW(dialog)->type = GTK_WINDOW_TOPLEVEL;
+
+ gtk_widget_set_size_request(GTK_WIDGET(dialog), 400, -1);
+
+ vbox = gtk_vbox_new(FALSE, BORDER/2);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER);
+ 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);
+
+ completion = gtk_entry_completion_new();
+ dialog->priv->completion_model = completion_model =
xfrun_create_completion_model(dialog);
+ 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);
+ gtk_entry_completion_set_inline_completion(completion, TRUE);
+ g_signal_connect(G_OBJECT(completion), "match-selected",
+ G_CALLBACK(xfrun_match_selected), dialog);
+
+ dialog->priv->entry = entry = gtk_entry_new();
+ gtk_entry_set_completion(GTK_ENTRY(entry), completion);
+ gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+ gtk_widget_show(entry);
+ gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+ 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(completion_model, &itr)) {
+ gtk_tree_model_get(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);
+
+ 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);
+ gtk_widget_show(bbox);
+ gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+ btn = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ gtk_widget_show(btn);
+ gtk_box_pack_end(GTK_BOX(bbox), btn, FALSE, FALSE, 0);
+ g_signal_connect_swapped(G_OBJECT(btn), "clicked",
+ G_CALLBACK(xfrun_dialog_delete_event), dialog);
+
+ btn = xfce_create_mixed_button(GTK_STOCK_EXECUTE, _("_Run"));
+ gtk_widget_show(btn);
+ gtk_box_pack_end(GTK_BOX(bbox), btn, FALSE, FALSE, 0);
+ GTK_WIDGET_SET_FLAGS(btn, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default(btn);
+ g_signal_connect(G_OBJECT(btn), "clicked",
+ G_CALLBACK(xfrun_run_clicked), dialog);
+}
+
+static void
+xfrun_dialog_set_property(GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(object);
+
+ switch(property_id) {
+ case PROP_RUN_ARGUMENT:
+ xfrun_dialog_set_run_argument(dialog, g_value_get_string(value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+xfrun_dialog_get_property(GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(object);
+
+ switch(property_id) {
+ case PROP_RUN_ARGUMENT:
+ g_value_set_string(value, xfrun_dialog_get_run_argument(dialog));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+xfrun_dialog_finalize(GObject *object)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(object);
+
+ g_free(dialog->priv->run_argument);
+ g_free(dialog->priv->entry_val_tmp);
+
+ g_free(dialog->priv);
+}
+
+static gboolean
+xfrun_dialog_key_press_event(GtkWidget *widget,
+ GdkEventKey *evt)
+{
+ if(evt->keyval == GDK_Escape) {
+ xfrun_dialog_delete_event(widget, NULL);
+ return TRUE;
+ }
+
+ return
GTK_WIDGET_CLASS(xfrun_dialog_parent_class)->key_press_event(widget, evt);
+}
+
+static gboolean
+xfrun_dialog_delete_event(GtkWidget *widget,
+ GdkEventAny *evt)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(widget);
+
+ if(dialog->priv->destroy_on_close)
+ gtk_widget_destroy(widget);
+ else
+ gtk_widget_hide(widget);
+
+ g_signal_emit(G_OBJECT(widget), __signals[SIG_CLOSED], 0);
+
+ return TRUE;
+}
+
+static gchar **
+xfrun_get_histfile_content()
+{
+ gchar **lines = NULL, *histfile, *contents = NULL;
+ gsize length = 0;
+
+ histfile = xfce_resource_lookup(XFCE_RESOURCE_CACHE,
"xfce4/xfrun4/history");
+ if(histfile && g_file_get_contents(histfile, &contents, &length, NULL)) {
+ lines = g_strsplit(contents, "\n", -1);
+ g_free(contents);
+ }
+
+ return lines;
+}
+
+static gboolean
+xfrun_entry_check_match(GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(data);
+ gchar *command = NULL;
+ gboolean in_terminal = FALSE, ret = FALSE;
+
+ gtk_tree_model_get(model, iter,
+ XFRUN_COL_COMMAND, &command,
+ XFRUN_COL_IN_TERMINAL, &in_terminal,
+ -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);
+ ret = TRUE;
+ }
+
+ g_free(command);
+
+ return ret;
+}
+
+static gboolean
+xfrun_entry_focus_out(GtkWidget *widget,
+ GdkEventFocus *evt,
+ gpointer user_data)
+{
+ 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;
+ }
+
+ 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_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)
+{
+ gchar *histfile, *histfile1, **lines = xfrun_get_histfile_content();
+ gint i;
+ FILE *fp = NULL;
+ GList *new_lines = NULL, *l;
+
+ histfile = xfce_resource_save_location(XFCE_RESOURCE_CACHE,
+ "xfce4/xfrun4/history.new", TRUE);
+ if(!histfile) {
+ g_critical("Unable to write to history file.");
+ return;
+ }
+
+ if(!lines) {
+ fp = fopen(histfile, "w");
+ fprintf(fp, "%d:%s\n", in_terminal ? 1 : 0, command);
+ fclose(fp);
+ } else {
+ for(i = 0; lines[i]; ++i) {
+ if(strlen(lines[i]) < 3 || lines[i][1] != ':')
+ continue;
+
+ if(g_utf8_collate(lines[i] + 2, command))
+ new_lines = g_list_append(new_lines, lines[i]);
+ }
+
+ new_lines = g_list_prepend(new_lines, g_strdup_printf("%d:%s",
+ in_terminal ? 1
: 0,
+ command));
+
+ fp = fopen(histfile, "w");
+ for(l = new_lines, i = 0; l && i < MAX_ENTRIES; l = l->next, ++i)
+ fprintf(fp, "%s\n", (char *)l->data);
+ fclose(fp);
+ }
+
+ histfile1 = g_strdup(histfile);
+ histfile1[strlen(histfile1)-4] = 0;
+
+ if(rename(histfile, histfile1))
+ g_critical("Unable to rename '%s' to '%s'", histfile, histfile1);
+ unlink(histfile);
+
+ g_free(histfile1);
+ g_free(histfile);
+ g_strfreev(lines);
+}
+
+static void
+xfrun_run_clicked(GtkWidget *widget,
+ gpointer user_data)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(user_data);
+ gchar *entry_str, *display_name, *command;
+ gboolean in_terminal;
+ GdkScreen *gscreen;
+ GError *error = NULL;
+
+ entry_str = gtk_editable_get_chars(GTK_EDITABLE(dialog->priv->entry), 0,
-1);
+ in_terminal =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->priv->terminal_chk));
+
+ gscreen = gtk_widget_get_screen(widget);
+ display_name = gdk_screen_make_display_name(gscreen);
+
+ if(dialog->priv->run_argument) {
+ command = g_strdup_printf("env DISPLAY=\"%s\" \"%s\" \"%s\"",
+ display_name, entry_str,
+ dialog->priv->run_argument);
+ } else {
+ command = g_strdup_printf("env DISPLAY=\"%s\" \"%s\"", display_name,
+ entry_str);
+ }
+
+ if(xfce_exec(command, in_terminal, FALSE, &error)) {
+ xfrun_add_to_history(entry_str, in_terminal);
+ xfrun_dialog_delete_event(GTK_WIDGET(dialog), NULL);
+ } else {
+ gchar *primary = g_strdup_printf(_("The command \"%s\" failed to
run:"),
+ command);
+ xfce_message_dialog(GTK_WINDOW(dialog), _("Run Error"),
+ GTK_STOCK_DIALOG_ERROR, primary, error->message,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+ g_free(primary);
+ g_error_free(error);
+ }
+
+ g_free(entry_str);
+ g_free(command);
+}
+
+static gboolean
+xfrun_match_selected(GtkEntryCompletion *completion,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ XfrunDialog *dialog = XFRUN_DIALOG(user_data);
+ gboolean in_terminal = FALSE;
+
+ 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 GtkTreeModel *
+xfrun_create_completion_model(XfrunDialog *dialog)
+{
+ GtkListStore *ls;
+ gchar **lines = NULL;
+ gchar *histfile = NULL;
+
+ ls = gtk_list_store_new(XFRUN_N_COLS, G_TYPE_STRING, G_TYPE_BOOLEAN);
+
+ lines = xfrun_get_histfile_content();
+ if(lines) {
+ GtkTreeIter itr;
+ gint i;
+
+ for(i = 0; lines[i]; ++i) {
+ if(strlen(lines[i]) < 3 || lines[i][1] != ':')
+ continue;
+
+ gtk_list_store_append(ls, &itr);
+ gtk_list_store_set(ls, &itr,
+ XFRUN_COL_COMMAND, lines[i] + 2,
+ XFRUN_COL_IN_TERMINAL,
+ lines[i][0] == '1' ? TRUE : FALSE,
+ -1);
+ }
+
+ g_strfreev(lines);
+ }
+
+ g_free(histfile);
+
+ return GTK_TREE_MODEL(ls);
+}
+
+
+
+
+GtkWidget *
+xfrun_dialog_new(const gchar *run_argument)
+{
+ return g_object_new(XFRUN_TYPE_DIALOG,
+ "run-argument", run_argument,
+ NULL);
+}
+
+void
+xfrun_dialog_set_run_argument(XfrunDialog *dialog,
+ const gchar *run_argument)
+{
+ g_return_if_fail(XFRUN_IS_DIALOG(dialog));
+
+ g_free(dialog->priv->run_argument);
+ dialog->priv->run_argument = g_strdup(run_argument);
+
+ if(run_argument) {
+ gchar *title = g_strdup_printf(_("Open %s with what program?"),
+ run_argument);
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
+ g_free(title);
+ } else
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Run program"));
+}
+
+G_CONST_RETURN gchar *
+xfrun_dialog_get_run_argument(XfrunDialog *dialog)
+{
+ g_return_val_if_fail(XFRUN_IS_DIALOG(dialog), NULL);
+ return dialog->priv->run_argument;
+}
+
+void
+xfrun_dialog_set_destroy_on_close(XfrunDialog *dialog,
+ gboolean destroy_on_close)
+{
+ g_return_if_fail(XFRUN_IS_DIALOG(dialog));
+ dialog->priv->destroy_on_close = destroy_on_close;
+}
+
+gboolean
+xfrun_dialog_get_destroy_on_close(XfrunDialog *dialog)
+{
+ g_return_val_if_fail(XFRUN_IS_DIALOG(dialog), FALSE);
+ return dialog->priv->destroy_on_close;
+}
Added: xfce-utils/trunk/xfrun/xfrun-dialog.h
===================================================================
--- xfce-utils/trunk/xfrun/xfrun-dialog.h (rev 0)
+++ xfce-utils/trunk/xfrun/xfrun-dialog.h 2006-07-16 01:30:04 UTC (rev
22457)
@@ -0,0 +1,64 @@
+/*
+ * xfrun - a simple quick run dialog with saved history and completion
+ *
+ * Copyright (c) 2006 Brian J. Tarricone <[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.
+ */
+
+#ifndef __XFRUN_DIALOG_H__
+#define __XFRUN_DIALOG_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define XFRUN_TYPE_DIALOG (xfrun_dialog_get_type())
+#define XFRUN_DIALOG(object) (G_TYPE_CHECK_INSTANCE_CAST((object),
XFRUN_TYPE_DIALOG, XfrunDialog))
+#define XFRUN_IS_DIALOG(object) (G_TYPE_CHECK_INSTANCE_TYPE((object),
XFRUN_TYPE_DIALOG))
+
+typedef struct _XfrunDialog XfrunDialog;
+typedef struct _XfrunDialogClass XfrunDialogClass;
+typedef struct _XfrunDialogPrivate XfrunDialogPrivate;
+
+struct _XfrunDialog
+{
+ GtkWindow parent;
+
+ /*< private >*/
+ XfrunDialogPrivate *priv;
+};
+
+struct _XfrunDialogClass
+{
+ GtkWindowClass parent_class;
+
+ /*< signals >*/
+ void (*closed)(XfrunDialog *dialog);
+};
+
+GtkWidget *xfrun_dialog_new (const gchar *run_argument);
+
+void xfrun_dialog_set_run_argument (XfrunDialog *dialog,
+ const gchar *run_argument);
+G_CONST_RETURN gchar *xfrun_dialog_get_run_argument(XfrunDialog *dialog);
+
+void xfrun_dialog_set_destroy_on_close (XfrunDialog *dialog,
+ gboolean destroy_on_close);
+gboolean xfrun_dialog_get_destroy_on_close (XfrunDialog *dialog);
+
+G_END_DECLS
+
+#endif /* __XFRUN_DIALOG_H__ */
Modified: xfce-utils/trunk/xfrun/xfrun.c
===================================================================
--- xfce-utils/trunk/xfrun/xfrun.c 2006-07-15 21:12:26 UTC (rev 22456)
+++ xfce-utils/trunk/xfrun/xfrun.c 2006-07-16 01:30:04 UTC (rev 22457)
@@ -37,649 +37,41 @@
#include <libxfce4util/libxfce4util.h>
-#define BORDER 8
-#define MAX_ENTRIES 20
+#include "xfrun-dialog.h"
-typedef struct
-{
- GtkWidget *window;
- GtkWidget *entry;
- GtkWidget *arrow_btn;
- GtkWidget *terminal_chk;
- GtkTreeModel *completion_model;
- const gchar *run_argument;
-
- gchar *entry_val_tmp;
-} XfrunDialog;
-
-enum
-{
- XFRUN_COL_COMMAND = 0,
- XFRUN_COL_IN_TERMINAL,
- XFRUN_N_COLS,
-};
-
-
-/* this stuff is here so i don't have to link to libxfcegui4 */
-
-static void
-xfrun_gtk_window_center_on_monitor_with_pointer(GtkWindow *window)
-{
- GtkWidget *widget = GTK_WIDGET(window);
- GdkScreen *gscreen = NULL;
- gint ptr_x, ptr_y, new_x, new_y;
- GdkModifierType mask;
- gint i, nmonitors, monitor = -1;
- GdkRectangle geom;
- GtkRequisition req;
-
- g_return_if_fail(GTK_IS_WINDOW(window));
-
- gdk_display_get_pointer(gdk_display_get_default(), &gscreen,
- &ptr_x, &ptr_y, &mask);
- g_return_if_fail(GDK_IS_SCREEN(gscreen));
- gtk_window_set_screen(window, gscreen);
-
- nmonitors = gdk_screen_get_n_monitors(gscreen);
- for(i = 0; i < nmonitors; ++i) {
- gdk_screen_get_monitor_geometry(gscreen, i, &geom);
- if(ptr_x >= geom.x && ptr_x < geom.x + geom.width
- && ptr_y >= geom.y && ptr_y < geom.y + geom.height)
- {
- monitor = i;
- break;
- }
- }
-
- g_return_if_fail(monitor >= 0);
-
- if(!GTK_WIDGET_REALIZED(widget))
- gtk_widget_realize(widget);
-
- gtk_widget_size_request(widget, &req);
-
- //g_print("geom.x=%d, geom.y=%d, geom.width=%d
-
- new_x = geom.x + (geom.width - widget->allocation.width) / 2;
- new_y = geom.y + (geom.height - widget->allocation.height) / 2;
-
- gtk_window_move(window, new_x, new_y);
-}
-
-static void
-xfrun_exec_child_setup(gpointer data)
-{
-#if !defined(G_OS_WIN32) && defined(HAVE_SETSID)
- setsid();
-#endif
-}
-
-static gboolean
-xfrun_exec_on_screen(GdkScreen *screen,
- const gchar *command,
- gboolean in_terminal,
- GError **error)
-{
- gboolean ret = FALSE, do_freev = FALSE;
- gint argc = 0;
- gchar **argv = NULL;
-
- if(in_terminal) {
- argv = g_new(gchar *, 4);
- argv[0] = "xfterm4";
- argv[1] = "-e";
- argv[2] = (gchar *)command;
- argv[3] = NULL;
- } else {
- g_shell_parse_argv(command, &argc, &argv, error);
- do_freev = TRUE;
- }
-
- if(argv
- && gdk_spawn_on_screen(screen, NULL, argv, NULL, G_SPAWN_SEARCH_PATH,
- xfrun_exec_child_setup, NULL, NULL, error))
- {
- ret = TRUE;
- }
-
- if(do_freev)
- g_strfreev(argv);
- else
- g_free(argv);
-
- return ret;
-}
-
-GtkWidget *
-xfrun_create_mixed_button(const gchar *stock_id,
- const gchar *label)
-{
- GtkWidget *btn, *align, *hbox, *img, *lbl;
-
- btn = gtk_button_new();
-
- align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
- gtk_widget_show(align);
- gtk_container_add(GTK_CONTAINER(btn), align);
-
- hbox = gtk_hbox_new(FALSE, BORDER/4);
- gtk_widget_show(hbox);
- gtk_container_add(GTK_CONTAINER(align), hbox);
-
- img = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON);
- gtk_widget_show(img);
- gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
-
- lbl = gtk_label_new_with_mnemonic(label);
- gtk_widget_show(lbl);
- gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, FALSE, 0);
- gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), btn);
-
- return btn;
-}
-
-void
-xfrun_simple_message_dialog(GtkWindow *parent,
- const gchar *title,
- const gchar *icon_id,
- const gchar *primary_text,
- const gchar *secondary_text)
-{
- GtkWidget *tophbox, *vbox, *dlg, *lbl, *spacer, *img;
- gchar *primary_text_escaped, *secondary_text_escaped, *markup;
-
- dlg = gtk_dialog_new_with_buttons(title, parent, GTK_DIALOG_NO_SEPARATOR,
- GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_window_set_resizable(GTK_WINDOW(dlg), FALSE);
-
- tophbox = gtk_hbox_new(FALSE, BORDER);
- gtk_container_set_border_width(GTK_CONTAINER(tophbox), BORDER);
- gtk_widget_show(tophbox);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), tophbox, TRUE, TRUE, 0);
-
- vbox = gtk_vbox_new(FALSE, BORDER);
- gtk_widget_show(vbox);
- gtk_box_pack_start(GTK_BOX(tophbox), vbox, FALSE, FALSE, 0);
-
- img = gtk_image_new_from_stock(icon_id, GTK_ICON_SIZE_DIALOG);
- gtk_widget_show(img);
- gtk_box_pack_start(GTK_BOX(vbox), img, FALSE, FALSE, 0);
-
- spacer = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
- gtk_widget_show(spacer);
- gtk_box_pack_start(GTK_BOX(vbox), spacer, TRUE, TRUE, 0);
-
- primary_text_escaped = g_markup_escape_text(primary_text,
- g_utf8_strlen(primary_text,
- -1));
- secondary_text_escaped = g_markup_escape_text(secondary_text,
- g_utf8_strlen(secondary_text,
- -1));
- markup = g_strdup_printf("<span size='larger'
weight='bold'>%s</span>\n\n%s",
- primary_text_escaped, secondary_text_escaped);
-
- lbl = gtk_label_new("");
- gtk_label_set_markup(GTK_LABEL(lbl), markup);
- gtk_label_set_use_markup(GTK_LABEL(lbl), TRUE);
- gtk_label_set_line_wrap(GTK_LABEL(lbl), TRUE);
- gtk_misc_set_alignment(GTK_MISC(lbl), 0.0, 0.0);
- gtk_widget_show(lbl);
- gtk_box_pack_start(GTK_BOX(tophbox), lbl, TRUE, TRUE, 0);
-
- gtk_dialog_run(GTK_DIALOG(dlg));
- gtk_widget_destroy(dlg);
-
- g_free(primary_text_escaped);
- g_free(secondary_text_escaped);
- g_free(markup);
-}
-
-/* end libxfcegui4 semi-duplication */
-
-static gchar **
-xfrun_get_histfile_content()
-{
- gchar **lines = NULL, *histfile, *contents = NULL;
- gsize length = 0;
-
- histfile = xfce_resource_lookup(XFCE_RESOURCE_CACHE,
"xfce4/xfrun4/history");
- if(histfile && g_file_get_contents(histfile, &contents, &length, NULL)) {
- lines = g_strsplit(contents, "\n", -1);
- g_free(contents);
- }
-
- return lines;
-}
-
-static gboolean
-xfrun_key_press(GtkWidget *widget,
- GdkEventKey *evt,
- gpointer user_data)
-{
- if(evt->keyval == GDK_Escape) {
- gtk_main_quit();
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-xfrun_entry_check_match(GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)data;
- gchar *command = NULL;
- gboolean in_terminal = FALSE, ret = FALSE;
-
- gtk_tree_model_get(model, iter,
- XFRUN_COL_COMMAND, &command,
- XFRUN_COL_IN_TERMINAL, &in_terminal,
- -1);
-
- if(!g_utf8_collate(command, xfrun_dialog->entry_val_tmp)) {
-
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xfrun_dialog->terminal_chk),
- in_terminal);
- ret = TRUE;
- }
-
- g_free(command);
-
- return ret;
-}
-
-static gboolean
-xfrun_entry_focus_out(GtkWidget *widget,
- GdkEventFocus *evt,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)user_data;
-
- xfrun_dialog->entry_val_tmp = gtk_editable_get_chars(GTK_EDITABLE(widget),
- 0, -1);
- gtk_tree_model_foreach(xfrun_dialog->completion_model,
- xfrun_entry_check_match, xfrun_dialog);
- g_free(xfrun_dialog->entry_val_tmp);
- xfrun_dialog->entry_val_tmp = NULL;
-
- return FALSE;
-}
-
-static gboolean
-xfrun_entry_key_press(GtkWidget *widget,
- GdkEventKey *evt,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)user_data;
-
- if(evt->keyval == GDK_Down || evt->keyval == GDK_KP_Down) {
- gtk_button_clicked(GTK_BUTTON(xfrun_dialog->arrow_btn));
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-xfrun_menu_item_activated(GtkWidget *widget,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)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(xfrun_dialog->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(xfrun_dialog->terminal_chk),
- in_terminal);
-}
-
-static gboolean
-xfrun_populate_menu(GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data)
-{
- GtkWidget *menu = GTK_WIDGET(data), *mi;
- XfrunDialog *xfrun_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), xfrun_dialog);
-
- g_free(command);
-
- return FALSE;
-}
-
-static void
-xfrun_menu_position(GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)user_data;
- GtkAllocation *entry_al = &xfrun_dialog->entry->allocation;
- GtkAllocation *btn_al = &xfrun_dialog->arrow_btn->allocation;
- gint entry_x, entry_y;
-
- gdk_window_get_origin(xfrun_dialog->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 *xfrun_dialog = (XfrunDialog *)user_data;
- GtkWidget *menu;
-
- menu = gtk_menu_new();
- g_object_set_data(G_OBJECT(menu), "--xfrun-dialog", xfrun_dialog);
- gtk_widget_show(menu);
- g_signal_connect(G_OBJECT(menu), "deactivate",
- G_CALLBACK(xfrun_menu_destroy), menu);
-
- gtk_tree_model_foreach(xfrun_dialog->completion_model,
- xfrun_populate_menu, menu);
-
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
- xfrun_menu_position, xfrun_dialog,
- 1, gtk_get_current_event_time());
-}
-
-static void
-xfrun_add_to_history(const gchar *command,
- gboolean in_terminal)
-{
- gchar *histfile, *histfile1, **lines = xfrun_get_histfile_content();
- gint i;
- FILE *fp = NULL;
- GList *new_lines = NULL, *l;
-
- histfile = xfce_resource_save_location(XFCE_RESOURCE_CACHE,
- "xfce4/xfrun4/history.new", TRUE);
- if(!histfile) {
- g_critical("Unable to write to history file.");
- return;
- }
-
- if(!lines) {
- fp = fopen(histfile, "w");
- fprintf(fp, "%d:%s\n", in_terminal ? 1 : 0, command);
- fclose(fp);
- } else {
- for(i = 0; lines[i]; ++i) {
- if(strlen(lines[i]) < 3 || lines[i][1] != ':')
- continue;
-
- if(g_utf8_collate(lines[i] + 2, command))
- new_lines = g_list_append(new_lines, lines[i]);
- }
-
- new_lines = g_list_prepend(new_lines, g_strdup_printf("%d:%s",
- in_terminal ? 1
: 0,
- command));
-
- fp = fopen(histfile, "w");
- for(l = new_lines, i = 0; l && i < MAX_ENTRIES; l = l->next, ++i)
- fprintf(fp, "%s\n", (char *)l->data);
- fclose(fp);
- }
-
- histfile1 = g_strdup(histfile);
- histfile1[strlen(histfile1)-4] = 0;
-
- if(rename(histfile, histfile1))
- g_critical("Unable to rename '%s' to '%s'", histfile, histfile1);
- unlink(histfile);
-
- g_free(histfile1);
- g_free(histfile);
- g_strfreev(lines);
-}
-
-static void
-xfrun_run_clicked(GtkWidget *widget,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)user_data;
- gchar *entry_str, *command;
- gboolean in_terminal;
- GdkScreen *gscreen;
- GError *error = NULL;
-
- entry_str = gtk_editable_get_chars(GTK_EDITABLE(xfrun_dialog->entry), 0,
-1);
- in_terminal =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(xfrun_dialog->terminal_chk));
-
- if(xfrun_dialog->run_argument) {
- command = g_strdup_printf("%s \"%s\"", entry_str,
- xfrun_dialog->run_argument);
- g_free(entry_str);
- } else
- command = entry_str;
-
- gscreen = gtk_widget_get_screen(widget);
- if(xfrun_exec_on_screen(gscreen, command, in_terminal, &error)) {
- xfrun_add_to_history(command, in_terminal);
- gtk_main_quit();
- } else {
- gchar *primary = g_strdup_printf(_("The command \"%s\" failed to
run:"),
- command);
- xfrun_simple_message_dialog(GTK_WINDOW(xfrun_dialog->window),
- _("Run Error"),
- GTK_STOCK_DIALOG_ERROR,
- primary, error->message);
- g_free(primary);
- g_error_free(error);
- }
-
- g_free(command);
-}
-
-static gboolean
-xfrun_match_selected(GtkEntryCompletion *completion,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- XfrunDialog *xfrun_dialog = (XfrunDialog *)user_data;
- gboolean in_terminal = FALSE;
-
- gtk_tree_model_get(model, iter,
- XFRUN_COL_IN_TERMINAL, &in_terminal,
- -1);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xfrun_dialog->terminal_chk),
- in_terminal);
-
- return FALSE;
-}
-
-static GtkTreeModel *
-xfrun_create_completion_model(XfrunDialog *xfrun_dialog)
-{
- GtkListStore *ls;
- gchar **lines = NULL;
- gchar *histfile = NULL;
-
- ls = gtk_list_store_new(XFRUN_N_COLS, G_TYPE_STRING, G_TYPE_BOOLEAN);
-
- lines = xfrun_get_histfile_content();
- if(lines) {
- GtkTreeIter itr;
- gint i;
-
- for(i = 0; lines[i]; ++i) {
- if(strlen(lines[i]) < 3 || lines[i][1] != ':')
- continue;
-
- gtk_list_store_append(ls, &itr);
- gtk_list_store_set(ls, &itr,
- XFRUN_COL_COMMAND, lines[i] + 2,
- XFRUN_COL_IN_TERMINAL,
- lines[i][0] == '1' ? TRUE : FALSE,
- -1);
- }
-
- g_strfreev(lines);
- }
-
- g_free(histfile);
-
- return GTK_TREE_MODEL(ls);
-}
-
int
main(int argc,
char **argv)
{
XfrunDialog xfrun_dialog;
gchar title[8192], *first_item;
- GtkWidget *win, *entry, *chk, *btn, *vbox, *bbox, *hbox, *arrow;
- GtkEntryCompletion *completion;
- GtkTreeModel *completion_model;
- GtkTreeIter itr;
+ GtkWidget *dialog;
+ const gchar *run_argument = NULL;
xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
gtk_init(&argc, &argv);
- if(argc >= 2) {
- g_snprintf(title, 8192, _("Open %s with what program?"), argv[1]);
- xfrun_dialog.run_argument = argv[1];
- } else {
- g_strlcpy(title, _("Run program"), 8192);
- xfrun_dialog.run_argument = NULL;
+ if(argc > 1) {
+ if(!strcmp(argv[1], "--daemon")) {
+ /* we don't support daemon mode */
+ xfce_message_dialog(NULL, _("Daemon Mode"),
+ GTK_STOCK_DIALOG_ERROR,
+ _("Daemon mode is not supported."),
+ _("Xfrun must be compiled with D-BUS support
to enable daemon mode."),
+ GTK_STOCK_QUIT, GTK_RESPONSE_ACCEPT, NULL);
+ return 1;
+ } else
+ run_argument = argv[1];
}
- xfrun_dialog.window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(win), title);
- gtk_widget_set_size_request(win, 400, -1);
- g_signal_connect(G_OBJECT(win), "delete-event",
+ dialog = xfrun_dialog_new(run_argument);
+ xfce_gtk_window_center_on_monitor_with_pointer(GTK_WINDOW(dialog));
+ gtk_widget_show(dialog);
+ g_signal_connect(G_OBJECT(dialog), "closed",
G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(G_OBJECT(win), "key-press-event",
- G_CALLBACK(xfrun_key_press), NULL);
+ gtk_widget_set_size_request(dialog, -1, -1);
- vbox = gtk_vbox_new(FALSE, BORDER/2);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), BORDER);
- gtk_widget_show(vbox);
- gtk_container_add(GTK_CONTAINER(win), vbox);
-
- hbox = gtk_hbox_new(FALSE, BORDER/4);
- gtk_widget_show(hbox);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
- completion = gtk_entry_completion_new();
- xfrun_dialog.completion_model = completion_model =
xfrun_create_completion_model(&xfrun_dialog);
- 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);
- gtk_entry_completion_set_inline_completion(completion, TRUE);
- g_signal_connect(G_OBJECT(completion), "match-selected",
- G_CALLBACK(xfrun_match_selected), &xfrun_dialog);
-
- xfrun_dialog.entry = entry = gtk_entry_new();
- gtk_entry_set_completion(GTK_ENTRY(entry), completion);
- gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
- gtk_widget_show(entry);
- gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
- g_signal_connect(G_OBJECT(entry), "focus-out-event",
- G_CALLBACK(xfrun_entry_focus_out), &xfrun_dialog);
- g_signal_connect(G_OBJECT(entry), "key-press-event",
- G_CALLBACK(xfrun_entry_key_press), &xfrun_dialog);
-
- if(gtk_tree_model_get_iter_first(completion_model, &itr)) {
- gtk_tree_model_get(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);
- }
- }
-
- xfrun_dialog.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), &xfrun_dialog);
-
- arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE);
- gtk_widget_show(arrow);
- gtk_container_add(GTK_CONTAINER(btn), arrow);
-
- xfrun_dialog.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);
-
- 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);
- gtk_widget_show(bbox);
- gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
-
- btn = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_widget_show(btn);
- gtk_box_pack_end(GTK_BOX(bbox), btn, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(btn), "clicked",
- G_CALLBACK(gtk_main_quit), NULL);
-
- btn = xfrun_create_mixed_button(GTK_STOCK_EXECUTE, _("_Run"));
- gtk_widget_show(btn);
- gtk_box_pack_end(GTK_BOX(bbox), btn, FALSE, FALSE, 0);
- GTK_WIDGET_SET_FLAGS(btn, GTK_CAN_DEFAULT);
- gtk_widget_grab_default(btn);
- g_signal_connect(G_OBJECT(btn), "clicked",
- G_CALLBACK(xfrun_run_clicked), &xfrun_dialog);
-
- xfrun_gtk_window_center_on_monitor_with_pointer(GTK_WINDOW(win));
- gtk_widget_show(win);
- gtk_widget_set_size_request(win, -1, -1);
-
gtk_main();
return 0;
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits