summaryrefslogtreecommitdiff
path: root/mini-commander/src/command_line.c
diff options
context:
space:
mode:
Diffstat (limited to 'mini-commander/src/command_line.c')
-rw-r--r--mini-commander/src/command_line.c598
1 files changed, 0 insertions, 598 deletions
diff --git a/mini-commander/src/command_line.c b/mini-commander/src/command_line.c
deleted file mode 100644
index 004a897d..00000000
--- a/mini-commander/src/command_line.c
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Mini-Commander Applet
- * Copyright (C) 1998, 1999 Oliver Maruhn <[email protected]>
- *
- * Author: Oliver Maruhn <[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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <config.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-
-#include <mate-panel-applet.h>
-
-#include "mini-commander_applet.h"
-#include "command_line.h"
-#include "preferences.h"
-#include "exec.h"
-#include "cmd_completion.h"
-#include "history.h"
-
-static gint file_browser_response_signal(GtkWidget *widget, gint response, gpointer mc_data);
-static gint history_popup_clicked_cb(GtkWidget *widget, gpointer data);
-static gint history_popup_clicked_inside_cb(GtkWidget *widget, gpointer data);
-static gchar* history_auto_complete(GtkWidget *widget, GdkEventKey *event);
-
-
-static int history_position = MC_HISTORY_LIST_LENGTH;
-static gchar *browsed_folder = NULL;
-
-static gboolean
-button_press_cb (GtkEntry *entry,
- GdkEventButton *event,
- MCData *mc)
-{
- const gchar *str;
-
- mate_panel_applet_request_focus (mc->applet, event->time);
-
- if (mc->error) {
- mc->error = FALSE;
- str = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
- gtk_entry_set_text (entry, (gchar *) str + 3);
- }
- return FALSE;
-}
-
-static gboolean
-command_key_event (GtkEntry *entry,
- GdkEventKey *event,
- MCData *mc)
-{
- guint key = event->keyval;
- char *command;
- static char current_command[MC_MAX_COMMAND_LENGTH];
- char buffer[MC_MAX_COMMAND_LENGTH];
- gboolean propagate_event = TRUE;
- const gchar *str;
-
- if (mc->error) {
- mc->error = FALSE;
- str = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
- gtk_entry_set_text (entry, (gchar *) str + 3);
- gtk_editable_set_position (GTK_EDITABLE (entry), strlen (str));
- }
- if(key == GDK_Tab
- || key == GDK_KP_Tab
- || key == GDK_ISO_Left_Tab)
- {
- if(event->state == GDK_CONTROL_MASK)
- {
- /*
- * Move focus to the next widget (browser) button.
- */
- gtk_widget_child_focus (GTK_WIDGET (mc->applet), GTK_DIR_TAB_FORWARD);
- propagate_event = FALSE;
- }
- else if(event->state != GDK_SHIFT_MASK)
- {
- /* tab key pressed */
- strcpy(buffer, (char *) gtk_entry_get_text(GTK_ENTRY(entry)));
- mc_cmd_completion (mc, buffer);
- gtk_entry_set_text(GTK_ENTRY(entry), (gchar *) buffer);
-
- propagate_event = FALSE;
- }
- }
- else if(key == GDK_Up
- || key == GDK_KP_Up
- || key == GDK_ISO_Move_Line_Up
- || key == GDK_Pointer_Up)
- {
- /* up key pressed */
- if(history_position == MC_HISTORY_LIST_LENGTH)
- {
- /* store current command line */
- strcpy(current_command, (char *) gtk_entry_get_text(entry));
- }
- if(history_position > 0 && exists_history_entry(history_position - 1))
- {
- gtk_entry_set_text(entry, (gchar *) get_history_entry(--history_position));
- }
-
- propagate_event = FALSE;
- }
- else if(key == GDK_Down
- || key == GDK_KP_Down
- || key == GDK_ISO_Move_Line_Down
- || key == GDK_Pointer_Down)
- {
- /* down key pressed */
- if(history_position < MC_HISTORY_LIST_LENGTH - 1)
- {
- gtk_entry_set_text(entry, (gchar *) get_history_entry(++history_position));
- }
- else if(history_position == MC_HISTORY_LIST_LENGTH - 1)
- {
- gtk_entry_set_text(entry, (gchar *) current_command);
- ++history_position;
- }
-
- propagate_event = FALSE;
- }
- else if(key == GDK_Return
- || key == GDK_KP_Enter
- || key == GDK_ISO_Enter
- || key == GDK_3270_Enter)
- {
- /* enter pressed -> exec command */
- command = (char *) malloc(sizeof(char) * MC_MAX_COMMAND_LENGTH);
- strcpy(command, (char *) gtk_entry_get_text(entry));
- mc_exec_command(mc, command);
-
- history_position = MC_HISTORY_LIST_LENGTH;
- free(command);
-
- strcpy(current_command, "");
- propagate_event = FALSE;
- }
- else if (mc->preferences.auto_complete_history && key >= GDK_space && key <= GDK_asciitilde )
- {
- char *completed_command;
- gint current_position = gtk_editable_get_position(GTK_EDITABLE(entry));
-
- if(current_position != 0)
- {
- gtk_editable_delete_text( GTK_EDITABLE(entry), current_position, -1 );
- completed_command = history_auto_complete(GTK_WIDGET (entry), event);
-
- if(completed_command != NULL)
- {
- gtk_entry_set_text(entry, completed_command);
- gtk_editable_set_position(GTK_EDITABLE(entry), current_position + 1);
- propagate_event = FALSE;
- }
- }
- }
-
- return !propagate_event;
-}
-
-static gint
-history_popup_clicked_cb(GtkWidget *widget, gpointer data)
-{
- gdk_pointer_ungrab(GDK_CURRENT_TIME);
- gdk_keyboard_ungrab(GDK_CURRENT_TIME);
- gtk_grab_remove(GTK_WIDGET(widget));
- gtk_widget_destroy(GTK_WIDGET(widget));
- widget = NULL;
-
- /* go on */
- return (FALSE);
-}
-
-static gint
-history_popup_clicked_inside_cb(GtkWidget *widget, gpointer data)
-{
- /* eat signal (prevent that popup will be destroyed) */
- return(TRUE);
-}
-
-static gboolean
-history_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
- if (event->keyval == GDK_Escape) {
- gdk_pointer_ungrab(GDK_CURRENT_TIME);
- gdk_keyboard_ungrab(GDK_CURRENT_TIME);
- gtk_grab_remove(GTK_WIDGET(widget));
- gtk_widget_destroy(GTK_WIDGET(widget));
- widget = NULL;
- }
-
- return FALSE;
-
-}
-
-static gboolean
-history_list_key_press_cb (GtkWidget *widget,
- GdkEventKey *event,
- MCData *mc)
-{
- GtkTreeView *tree = g_object_get_data (G_OBJECT (mc->applet), "tree");
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *command;
-
- switch (event->keyval) {
- case GDK_KP_Enter:
- case GDK_ISO_Enter:
- case GDK_3270_Enter:
- case GDK_Return:
- case GDK_space:
- case GDK_KP_Space:
- if ((event->state & GDK_CONTROL_MASK) &&
- (event->keyval == GDK_space || event->keyval == GDK_KP_Space))
- break;
-
- if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree),
- &model,
- &iter))
- return FALSE;
- gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
- 0, &command, -1);
- mc_exec_command (mc, command);
- g_free (command);
- gtk_widget_destroy(GTK_WIDGET(widget->parent->parent->parent));
-
- return TRUE;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-static gboolean
-history_list_button_press_cb (GtkWidget *widget,
- GdkEventButton *event,
- MCData *mc)
-{
- GtkTreeView *tree = g_object_get_data (G_OBJECT (mc->applet), "tree");
- GtkTreeIter iter;
- GtkTreeModel *model;
- gchar *command;
-
- if (event->type == GDK_2BUTTON_PRESS) {
- if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree),
- &model,
- &iter))
- return FALSE;
- gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
- 0, &command, -1);
- mc_exec_command(mc, command);
- g_free (command);
- gtk_widget_destroy(GTK_WIDGET(widget->parent->parent->parent));
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-int
-mc_show_history (GtkWidget *widget,
- MCData *mc)
-{
- GtkWidget *window;
- GtkWidget *frame;
- GtkWidget *scrolled_window;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkWidget *treeview;
- GtkCellRenderer *cell_renderer;
- GtkTreeViewColumn *column;
- GtkRequisition req;
- gchar *command_list[1];
- int i, j;
- gint x, y, width, height, screen_width, screen_height;
-
- /* count commands stored in history list */
- for(i = 0, j = 0; i < MC_HISTORY_LIST_LENGTH; i++)
- if(exists_history_entry(i))
- j++;
-
- window = gtk_window_new(GTK_WINDOW_POPUP);
- gtk_window_set_screen (GTK_WINDOW (window),
- gtk_widget_get_screen (GTK_WIDGET (mc->applet)));
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
- gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_COMBO);
- /* cb */
- g_signal_connect_after(GTK_OBJECT(window),
- "button_press_event",
- G_CALLBACK(history_popup_clicked_cb),
- NULL);
- g_signal_connect_after (G_OBJECT (window), "key_press_event",
- G_CALLBACK (history_key_press_cb), NULL);
-
- /* size */
- gtk_widget_set_size_request(GTK_WIDGET(window), 200, 350);
-
-
- /* frame */
- frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
- gtk_widget_show(frame);
- gtk_container_add(GTK_CONTAINER(window), frame);
-
- /* scrollbars */
- /* create scrolled window to put the Gtk_list widget inside */
- scrolled_window=gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- g_signal_connect(GTK_OBJECT(scrolled_window),
- "button_press_event",
- G_CALLBACK(history_popup_clicked_inside_cb),
- NULL);
- gtk_container_add(GTK_CONTAINER(frame), scrolled_window);
- gtk_container_set_border_width (GTK_CONTAINER(scrolled_window), 2);
- gtk_widget_show(scrolled_window);
-
- store = gtk_list_store_new (1, G_TYPE_STRING);
-
- /* add history entries to list */
- if (j == 0) {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,0, _("No items in history"), -1);
- }
- else {
- for(i = 0; i < MC_HISTORY_LIST_LENGTH; i++)
- {
- if(exists_history_entry(i))
- {
- command_list[0] = get_history_entry(i);
- gtk_list_store_prepend (store, &iter);
- gtk_list_store_set (store, &iter,0,command_list[0],-1);
- }
- }
- }
- model = GTK_TREE_MODEL(store);
- treeview = gtk_tree_view_new_with_model (model);
- g_object_set_data (G_OBJECT (mc->applet), "tree", treeview);
- cell_renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (NULL, cell_renderer,
- "text", 0, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
- if (j == 0) {
- gtk_tree_selection_set_mode( (GtkTreeSelection *)gtk_tree_view_get_selection
- (GTK_TREE_VIEW (treeview)),
- GTK_SELECTION_NONE);
- }
- else {
- gtk_tree_selection_set_mode( (GtkTreeSelection *)gtk_tree_view_get_selection
- (GTK_TREE_VIEW (treeview)),
- GTK_SELECTION_SINGLE);
- g_signal_connect (G_OBJECT (treeview), "button_press_event",
- G_CALLBACK (history_list_button_press_cb), mc);
- g_signal_connect (G_OBJECT (treeview), "key_press_event",
- G_CALLBACK (history_list_key_press_cb), mc);
- }
-
- g_object_unref (G_OBJECT (model));
- gtk_container_add(GTK_CONTAINER(scrolled_window),treeview);
- gtk_widget_show (treeview);
-
- gtk_widget_size_request (window, &req);
- gdk_window_get_origin (GTK_WIDGET (mc->applet)->window, &x, &y);
- gdk_window_get_geometry (GTK_WIDGET (mc->applet)->window, NULL, NULL,
- &width, &height, NULL);
-
- switch (mate_panel_applet_get_orient (mc->applet)) {
- case MATE_PANEL_APPLET_ORIENT_DOWN:
- y += height;
- break;
- case MATE_PANEL_APPLET_ORIENT_UP:
- y -= req.height;
- break;
- case MATE_PANEL_APPLET_ORIENT_LEFT:
- x -= req.width;
- break;
- case MATE_PANEL_APPLET_ORIENT_RIGHT:
- x += width;
- break;
- }
-
- screen_width = gdk_screen_width ();
- screen_height = gdk_screen_height ();
- x = CLAMP (x - 2, 0, MAX (0, screen_width - req.width));
- y = CLAMP (y - 2, 0, MAX (0, screen_height - req.height));
- gtk_window_move (GTK_WINDOW (window), x, y);
- gtk_widget_show(window);
-
- /* grab focus */
- gdk_pointer_grab (window->window,
- TRUE,
- GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_POINTER_MOTION_MASK,
- NULL,
- NULL,
- GDK_CURRENT_TIME);
- gdk_keyboard_grab (window->window, TRUE, GDK_CURRENT_TIME);
- gtk_grab_add(window);
- gtk_widget_grab_focus (treeview);
-
- return FALSE;
-}
-
-static gint
-file_browser_response_signal(GtkWidget *widget, gint response, gpointer mc_data)
-{
- MCData *mc = mc_data;
- gchar *filename;
-
- if (response == GTK_RESPONSE_OK) {
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(mc->file_select));
-
- if (filename != NULL) {
- if (browsed_folder)
- g_free (browsed_folder);
-
- browsed_folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(mc->file_select));
-
- mc_exec_command(mc, filename);
- g_free(filename);
- }
- }
-
- /* destroy file select dialog */
- gtk_widget_destroy (mc->file_select);
- mc->file_select = NULL;
-
- /* go on */
- return FALSE;
-}
-
-int
-mc_show_file_browser (GtkWidget *widget,
- MCData *mc)
-{
- if(mc->file_select && GTK_WIDGET_VISIBLE(mc->file_select)) {
- gtk_window_present (GTK_WINDOW (mc->file_select));
- return TRUE;
- }
-
- /* build file select dialog */
- mc->file_select = gtk_file_chooser_dialog_new((gchar *) _("Start program"),
- NULL,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_EXECUTE, GTK_RESPONSE_OK,
- NULL);
-
- g_signal_connect(G_OBJECT(mc->file_select),
- "response",
- G_CALLBACK(file_browser_response_signal),
- mc);
-
- /* set path to last selected path */
- if (browsed_folder)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(mc->file_select),
- (gchar *) browsed_folder);
-
- /* Set as modal */
- gtk_window_set_modal(GTK_WINDOW(mc->file_select),TRUE);
-
- gtk_window_set_screen (GTK_WINDOW (mc->file_select),
- gtk_widget_get_screen (GTK_WIDGET (mc->applet)));
- gtk_window_set_position (GTK_WINDOW (mc->file_select), GTK_WIN_POS_CENTER);
-
- gtk_widget_show(mc->file_select);
-
- return FALSE;
-}
-
-void
-mc_create_command_entry (MCData *mc)
-{
- mc->entry = gtk_entry_new ();
- gtk_entry_set_max_length (GTK_ENTRY (mc->entry), MC_MAX_COMMAND_LENGTH);
-
- g_signal_connect (mc->entry, "key_press_event",
- G_CALLBACK (command_key_event), mc);
-
- g_signal_connect (mc->entry, "button_press_event",
- G_CALLBACK (button_press_cb), mc);
-
- if (!mc->preferences.show_default_theme)
- {
- gtk_widget_set_name (mc->entry, "minicommander-applet-entry");
- mc_command_update_entry_color (mc);
- }
- else
- gtk_widget_set_name (mc->entry,
- "minicommander-applet-entry-default");
-
- mc_command_update_entry_size (mc);
-
- set_atk_name_description (mc->entry,
- _("Command line"),
- _("Type a command here and Mate will execute it for you"));
-}
-
-void
-mc_command_update_entry_color (MCData *mc)
-{
- GdkColor fg;
- GdkColor bg;
- char *rc_string;
-
- fg.red = mc->preferences.cmd_line_color_fg_r;
- fg.green = mc->preferences.cmd_line_color_fg_g;
- fg.blue = mc->preferences.cmd_line_color_fg_b;
-
- /* FIXME: wish we had an API for this, see bug #79585 */
- rc_string = g_strdup_printf (
- "\n"
- " style \"minicommander-applet-entry-style\"\n"
- " {\n"
- " GtkWidget::cursor-color=\"#%04x%04x%04x\"\n"
- " }\n"
- " widget \"*.minicommander-applet-entry\" "
- "style \"minicommander-applet-entry-style\"\n"
- "\n",
- fg.red, fg.green, fg.blue);
- gtk_rc_parse_string (rc_string);
- g_free (rc_string);
-
- gtk_widget_modify_text (mc->entry, GTK_STATE_NORMAL, &fg);
- gtk_widget_modify_text (mc->entry, GTK_STATE_PRELIGHT, &fg);
-
- bg.red = mc->preferences.cmd_line_color_bg_r;
- bg.green = mc->preferences.cmd_line_color_bg_g;
- bg.blue = mc->preferences.cmd_line_color_bg_b;
-
- gtk_widget_modify_base (mc->entry, GTK_STATE_NORMAL, &bg);
- gtk_widget_modify_base (mc->entry, GTK_STATE_PRELIGHT, &bg);
-}
-
-void
-mc_command_update_entry_size (MCData *mc)
-{
- int size_x = -1;
-
- size_x = mc->preferences.normal_size_x - 17;
- if ((mc->orient == MATE_PANEL_APPLET_ORIENT_LEFT) || (mc->orient == MATE_PANEL_APPLET_ORIENT_RIGHT)) {
- size_x = MIN(size_x, mc->preferences.panel_size_x - 17);
- gtk_widget_set_size_request (GTK_WIDGET (mc->entry), size_x, -1);
- } else {
- gtk_widget_set_size_request (GTK_WIDGET (mc->entry), size_x, mc->preferences.normal_size_y+2);
- }
-}
-
-
-/* Thanks to Halfline <[email protected]> for his initial version
- of history_auto_complete */
-gchar *
-history_auto_complete(GtkWidget *widget, GdkEventKey *event)
-{
- gchar current_command[MC_MAX_COMMAND_LENGTH];
- gchar* completed_command;
- int i;
-
- g_snprintf(current_command, sizeof(current_command), "%s%s",
- gtk_entry_get_text(GTK_ENTRY(widget)), event->string);
- for(i = MC_HISTORY_LIST_LENGTH - 1; i >= 0; i--)
- {
- if(!exists_history_entry(i))
- break;
- completed_command = get_history_entry(i);
- if(!strncmp(completed_command, current_command, strlen(current_command)))
- return completed_command;
- }
-
- return NULL;
-}