xaizek / vide (License: GPLv2+) (since 2018-12-07)
Graphical predecessor of vifm that uses GTK+.
<root> / src / main_menu.c (c9cb8e819bde7f9790a3f2abe222d65f2d12a3bc) (8,325B) (mode 100644) [raw]
/* vide
 * Copyright (C) 2000 Ken Steen.
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "vide.h"

static void
help_cb(GtkWidget *widget, gpointer data)
{
	gchar help_command[NAME_MAX];
	g_snprintf(help_command, sizeof(help_command), "%s %s/vide%s.txt",
			cfg.vi_command, cfg.config_dir, VERSION); 
	create_zterm(help_command, TRUE);

}
void
show_hidden_cb (void)
{
	gint last_selected_row;

	last_selected_row = curr_view->row;
  if (cfg.show_hidden)
    cfg.show_hidden = FALSE;
  else
    cfg.show_hidden = TRUE;

	gtk_clist_freeze(GTK_CLIST(curr_view->clist));
	gtk_clist_freeze(GTK_CLIST(other_view->clist));

	load_dir_list(other_view);
	load_dir_list(curr_view);

  focus_on_row (curr_view,
		(last_selected_row < GTK_CLIST (curr_view->clist)->rows
			? last_selected_row
		  : GTK_CLIST (curr_view->clist)->rows - 1));
	gtk_clist_thaw(GTK_CLIST(other_view->clist));
	gtk_clist_thaw(GTK_CLIST(curr_view->clist));
}

static void
goto_bookmark (GtkWidget * menu_item, gchar *value)
{
	GList *tmp;
	gint i;
	gchar *file;

	for(tmp = cfg.bookmarks; tmp != NULL; tmp = tmp->next)
	{
		Bookmarks *bk = tmp->data;
		if(!strcmp(value, bk->mark))
		{
			change_dir(curr_view, bk->dir);
			gtk_clist_freeze(GTK_CLIST(curr_view->clist));
			for(i = 0; i < GTK_CLIST(curr_view->clist)->rows; i++)
			{
				gtk_clist_get_text(GTK_CLIST(curr_view->clist), i, 0, &file);

				if(!strcmp(bk->file, file))
				{
					focus_on_row(curr_view, i);
					gtk_clist_thaw(GTK_CLIST(curr_view->clist));
					return;
				}
			}
			focus_on_row(curr_view, 0);
			gtk_clist_thaw(GTK_CLIST(curr_view->clist));
			return;
		}
	}
	status_bar_message("Mark not found");
	return;
}

/*
 * Keypress Menu Callbacks
 */
void
bookmark_key_cb (GtkWidget * widget, GdkEventKey * event, FileView * view)
{
	if ((event->keyval == 'c') && (event->state & GDK_CONTROL_MASK))
	{
		gtk_signal_emit_by_name(GTK_OBJECT(app.vide_menu_item), "activate-item");
		return;
	}

  if ((event->keyval < 0x100)
      && (event->state == 0 || event->state & GDK_SHIFT_MASK
	  || event->state & GDK_MOD2_MASK))
    {
      switch (event->keyval)
	{

	case 'j':
	  event->keyval = GDK_Down;
	  break;
	case 'k':
	  event->keyval = GDK_Up;
	  break;

	case 'h':
	  event->keyval = GDK_Left;
	  break;
	case 'l':
	  event->keyval = GDK_Right;
	  break;

	default:
	  event->keyval = 0;
	  break;
	}
    }
  return;
}


void
root_cb (void)
{
  /* Should make this user definable for different systems */
  gchar root_command[NAME_MAX];
	g_snprintf(root_command, sizeof(root_command), "%s -e su root -c vide",
			cfg.xterm_command); 
	file_exec(root_command);


}

void
open_trash_cb (void)
{
  change_dir (curr_view, cfg.trash);

}

void
empty_trash_cb (void)
{
	gchar tmp_dir[PATH_MAX];
	g_snprintf(tmp_dir, sizeof(tmp_dir), curr_view->dir);
	
  if (!chdir (cfg.trash))
    {
			/*fix . .. */
      file_exec ("rm -f -r * *. .*");
    }
	chdir(tmp_dir);
}

static void
size_filter_cb(void)
{
	create_size_filter_dialog(curr_view);
}

static void
filename_cb(void)
{
	create_filename_filter_dialog(curr_view);
}

static void
date_filter_cb(void)
{
	create_date_filter_dialog(curr_view);
}

static void
remove_filters_cb(void)
{
	remove_filters(curr_view);
}



static void
edit_bookmarks_cb(GtkWidget *widget)
{
	create_config_dialog(2);
}

gint
sort_bookmarks(gconstpointer a, gconstpointer b)
{
	return strcmp(a, b);
}

void
load_bookmarks ()
{
  GList *tmp;
  GtkWidget *menu_item;


	/* sort marks so that they are listed alphabetically */
	cfg.bookmarks = g_list_sort(cfg.bookmarks, sort_bookmarks);

  for (tmp = cfg.bookmarks; tmp != NULL; tmp = tmp->next)
    {
			gchar bookmark[((2 * PATH_MAX)+5)];
      Bookmarks *bk = tmp->data;
			if(!strcmp(bk->file, "../"))
			{
				g_snprintf(bookmark, sizeof(bookmark), "%s       %s", bk->mark, 
					bk->dir);
			}
			else
			{
				g_snprintf(bookmark, sizeof(bookmark), "%s       %s/%s", bk->mark,
						bk->dir, bk->file);
			}

      menu_item = gtk_menu_item_new_with_label (bookmark);
      gtk_widget_set_name (GTK_WIDGET (menu_item), bookmark);
      gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
			  GTK_SIGNAL_FUNC (goto_bookmark), bk->mark);
      gtk_signal_connect (GTK_OBJECT (menu_item), "key_press_event",
			  GTK_SIGNAL_FUNC (bookmark_key_cb), NULL);
      gtk_menu_append (GTK_MENU (app.bookmark_menu), menu_item);
      gtk_widget_show (menu_item);

    }
	add_menu_separator(app.bookmark_menu);
	add_menu_item(app.bookmark_menu, "Cancel ", NULL, NULL);

}


GtkWidget *
create_main_menu_bar (void)
{

  GtkWidget *main_menu_bar;
  GtkWidget *menu;
	GtkWidget *filter_menu;
	GtkWidget *menu_item;

  main_menu_bar = gtk_menu_bar_new ();

	menu = gtk_menu_new();
	gtk_signal_connect(GTK_OBJECT(menu), "key_press_event",
			GTK_SIGNAL_FUNC(bookmark_key_cb), NULL);

	add_menu_item(menu, "Cancel ", NULL, NULL);
  add_menu_separator (menu);
  add_menu_item (menu, "Become Root", root_cb, NULL);
  add_menu_separator (menu);
  add_menu_item (menu, "Open Trash", open_trash_cb, NULL);
  add_menu_item (menu, "Empty Trash", empty_trash_cb, NULL);
  add_menu_separator (menu);
  add_menu_item (menu, "Quit   Alt Q", quit_cb, NULL);
  app.vide_menu_item = add_submenu (main_menu_bar, "_Vide", menu);

  app.bookmark_menu = gtk_menu_new ();
  gtk_signal_connect (GTK_OBJECT (app.bookmark_menu), "key_press_event",
		      GTK_SIGNAL_FUNC (bookmark_key_cb), NULL);
  add_menu_item (app.bookmark_menu, "Edit Bookmarks", edit_bookmarks_cb,
		 NULL);
  add_menu_separator (app.bookmark_menu);
  app.bookmark_menu_item =
    add_submenu (main_menu_bar, "_Bookmarks", app.bookmark_menu);


  menu = gtk_menu_new ();
  gtk_signal_connect (GTK_OBJECT (menu), "key_press_event",
		      GTK_SIGNAL_FUNC (bookmark_key_cb), NULL);
  add_menu_item(menu, "Show Dot Files", show_hidden_cb, NULL);
  add_menu_separator (menu);

	filter_menu = gtk_menu_new();
	gtk_signal_connect(GTK_OBJECT(filter_menu), "key_press_event",
			GTK_SIGNAL_FUNC(bookmark_key_cb), NULL);
	add_menu_item(filter_menu, "File Name Filter", filename_cb,
			NULL);
	add_menu_separator(filter_menu);
	add_menu_item(filter_menu, "Date Filter", date_filter_cb, NULL);
	add_menu_separator(filter_menu);
	add_menu_item(filter_menu, "Size Filter", size_filter_cb, NULL);
	menu_item = add_menu_item(menu, "Set Filters", NULL, NULL);
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), filter_menu);

	add_menu_separator(menu);
	add_menu_item(menu, "Remove Filters", remove_filters_cb, NULL);
	add_menu_separator(menu);
  add_menu_item (menu, "Configure", create_config_dialog, NULL);
	add_menu_separator(menu);
	add_menu_item(menu, "Cancel ", NULL, NULL);
  app.options_menu_item = add_submenu (main_menu_bar, "_Options", menu);

	/*
	menu = gtk_menu_new();
	gtk_signal_connect(GTK_OBJECT(menu), "key_press_event",
			GTK_SIGNAL_FUNC(bookmark_key_cb), NULL);
	add_menu_item(menu, "Open Project", NULL, NULL);
	add_menu_item(menu, "New Project", NULL, NULL);
	add_menu_item(menu, "Import Project", NULL, NULL);
	add_menu_separator(menu);
	add_menu_item(menu, "Close Project", NULL, NULL);
	app.tools_menu_item = add_submenu(main_menu_bar, "_Tools", menu);
	*/

	 
  menu = gtk_menu_new ();
  gtk_signal_connect (GTK_OBJECT (menu), "key_press_event",
		      GTK_SIGNAL_FUNC (bookmark_key_cb), NULL);
	add_menu_item(menu, "Using Vide :h", help_cb, NULL);
	add_menu_separator(menu);
	add_menu_item(menu, "Cancel ", NULL, NULL);
  app.help_menu_item = add_submenu (main_menu_bar, "_Help", menu);
  gtk_menu_item_right_justify (GTK_MENU_ITEM (app.help_menu_item));


  return main_menu_bar;



}
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vide

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vide

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master