mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 12:56:51 +03:00
213 lines
5.1 KiB
C
213 lines
5.1 KiB
C
/* Popup menus for the Midnight Commander
|
|
*
|
|
* Copyright (C) 1998 The Free Software Foundation
|
|
*
|
|
* Authors: Federico Mena <federico@nuclecu.unam.mx>
|
|
* Miguel de Icaza <miguel@nuclecu.unam.mx>
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <sys/stat.h>
|
|
#include "util.h"
|
|
#include <gnome.h>
|
|
#include "gpopup.h"
|
|
#define WANT_WIDGETS /* yuck */
|
|
#include "main.h"
|
|
#include "../vfs/vfs.h"
|
|
|
|
|
|
static void popup_open (GtkWidget *widget, gpointer data);
|
|
static void popup_open_new_window (GtkWidget *widget, gpointer data);
|
|
static void popup_open_with_program (GtkWidget *widget, gpointer data);
|
|
static void popup_open_with_arguments (GtkWidget *widget, gpointer data);
|
|
static void popup_view (GtkWidget *widget, gpointer data);
|
|
static void popup_edit (GtkWidget *widget, gpointer data);
|
|
static void popup_move (GtkWidget *widget, gpointer data);
|
|
static void popup_copy (GtkWidget *widget, gpointer data);
|
|
static void popup_link (GtkWidget *widget, gpointer data);
|
|
static void popup_delete (GtkWidget *widget, gpointer data);
|
|
static void popup_properties (GtkWidget *widget, gpointer data);
|
|
|
|
|
|
/* Keep this in sync with the popup_info array defined below, as these values are used to figure out
|
|
* which items to enable/disable as appropriate.
|
|
*/
|
|
enum {
|
|
POPUP_OPEN = 0,
|
|
POPUP_OPEN_IN_NEW_WINDOW = 1,
|
|
POPUP_OPEN_WITH_PROGRAM = 2,
|
|
POPUP_OPEN_WITH_ARGUMENTS = 3,
|
|
POPUP_VIEW = 5,
|
|
POPUP_EDIT = 6,
|
|
POPUP_VIEW_EDIT_SEPARATOR = 7
|
|
};
|
|
|
|
/* The generic popup menu */
|
|
static GnomeUIInfo popup_info[] = {
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Open"), NULL, popup_open),
|
|
GNOMEUIINFO_ITEM_NONE (N_("Open in _new window"), NULL, popup_open_new_window),
|
|
GNOMEUIINFO_ITEM_NONE (N_("Open with pro_gram..."), NULL, popup_open_with_program),
|
|
GNOMEUIINFO_ITEM_NONE (N_("Open with _arguments..."), NULL, popup_open_with_arguments),
|
|
|
|
GNOMEUIINFO_SEPARATOR,
|
|
|
|
GNOMEUIINFO_ITEM_NONE (N_("_View"), NULL, popup_view),
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Edit"), NULL, popup_edit),
|
|
|
|
GNOMEUIINFO_SEPARATOR,
|
|
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Move/rename..."), NULL, popup_move),
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Copy..."), NULL, popup_copy),
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Link..."), NULL, popup_link),
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Delete"), NULL, popup_delete),
|
|
|
|
GNOMEUIINFO_SEPARATOR,
|
|
|
|
GNOMEUIINFO_ITEM_NONE (N_("_Properties..."), NULL, popup_properties),
|
|
GNOMEUIINFO_END
|
|
};
|
|
|
|
struct popup_file_info {
|
|
char *filename;
|
|
WPanel *panel;
|
|
};
|
|
|
|
int
|
|
gpopup_do_popup (char *filename, WPanel *from_panel, GdkEventButton *event)
|
|
{
|
|
GtkWidget *popup;
|
|
struct stat s;
|
|
int result;
|
|
struct popup_file_info pfi;
|
|
|
|
if (mc_stat (filename, &s) != 0) {
|
|
g_warning ("Could not stat %s, no popup menu will be run", filename);
|
|
return -1;
|
|
}
|
|
|
|
popup = gnome_popup_menu_new (popup_info);
|
|
|
|
/* Hide the menu items that are not appropriate */
|
|
|
|
if (S_ISDIR (s.st_mode)) {
|
|
if (!from_panel)
|
|
gtk_widget_hide (popup_info[POPUP_OPEN].widget); /* Only allow "open in new window" */
|
|
|
|
gtk_widget_hide (popup_info[POPUP_OPEN_WITH_ARGUMENTS].widget);
|
|
gtk_widget_hide (popup_info[POPUP_VIEW].widget);
|
|
gtk_widget_hide (popup_info[POPUP_EDIT].widget);
|
|
gtk_widget_hide (popup_info[POPUP_VIEW_EDIT_SEPARATOR].widget);
|
|
} else {
|
|
gtk_widget_hide (popup_info[POPUP_OPEN_IN_NEW_WINDOW].widget);
|
|
|
|
if (is_exe (s.st_mode))
|
|
gtk_widget_hide (popup_info[POPUP_OPEN_WITH_PROGRAM].widget);
|
|
else
|
|
gtk_widget_hide (popup_info[POPUP_OPEN_WITH_ARGUMENTS].widget);
|
|
}
|
|
|
|
/* Go! */
|
|
|
|
pfi.filename = filename;
|
|
pfi.panel = from_panel;
|
|
|
|
result = gnome_popup_menu_do_popup_modal (popup, NULL, NULL, event, &pfi);
|
|
|
|
gtk_widget_destroy (popup);
|
|
return result;
|
|
}
|
|
|
|
static void
|
|
popup_open (GtkWidget *widget, gpointer data)
|
|
{
|
|
struct popup_file_info *pfi;
|
|
struct stat s;
|
|
|
|
pfi = data;
|
|
|
|
if (mc_stat (pfi->filename, &s) != 0) {
|
|
g_warning ("Could not stat %s", pfi->filename);
|
|
return;
|
|
}
|
|
|
|
if (S_ISDIR (s.st_mode)) {
|
|
/* Open the directory in the panel the menu was activated from */
|
|
|
|
g_assert (pfi->panel != NULL);
|
|
|
|
do_panel_cd (pfi->panel, pfi->filename, cd_exact);
|
|
}
|
|
|
|
/* FIXME: add other cases */
|
|
}
|
|
|
|
static void
|
|
popup_open_new_window (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_open_with_program (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_open_with_arguments (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_view (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_edit (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_move (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_copy (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_link (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_delete (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|
|
|
|
static void
|
|
popup_properties (GtkWidget *widget, gpointer data)
|
|
{
|
|
/* FIXME */
|
|
g_warning ("Implement this function!");
|
|
}
|