Implemented popup menu on the desktop
This commit is contained in:
parent
af31e5686d
commit
bcf904f82d
147
src/desktop.c
147
src/desktop.c
@ -25,6 +25,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
#include "mime.h"
|
#include "mime.h"
|
||||||
@ -53,9 +54,11 @@ struct _Desktop
|
|||||||
DIR * refresh_dir;
|
DIR * refresh_dir;
|
||||||
time_t refresh_mti;
|
time_t refresh_mti;
|
||||||
|
|
||||||
|
GdkWindow * root;
|
||||||
GtkIconTheme * theme;
|
GtkIconTheme * theme;
|
||||||
GdkPixbuf * file;
|
GdkPixbuf * file;
|
||||||
GdkPixbuf * folder;
|
GdkPixbuf * folder;
|
||||||
|
GtkWidget * menu;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _DesktopIcon
|
struct _DesktopIcon
|
||||||
@ -614,6 +617,8 @@ static void _new_add_home(Desktop * desktop);
|
|||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
/* FIXME implement desktop resizing callback */
|
/* FIXME implement desktop resizing callback */
|
||||||
|
static GdkFilterReturn _new_on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
Desktop * desktop_new(void)
|
Desktop * desktop_new(void)
|
||||||
{
|
{
|
||||||
@ -658,6 +663,14 @@ Desktop * desktop_new(void)
|
|||||||
return _new_error(desktop, "Creating desktop");
|
return _new_error(desktop, "Creating desktop");
|
||||||
_new_add_home(desktop);
|
_new_add_home(desktop);
|
||||||
desktop_refresh(desktop);
|
desktop_refresh(desktop);
|
||||||
|
/* manage root window events */
|
||||||
|
desktop->menu = NULL;
|
||||||
|
desktop->root = gdk_screen_get_root_window(
|
||||||
|
gdk_display_get_default_screen(
|
||||||
|
gdk_display_get_default()));
|
||||||
|
gdk_window_set_events(desktop->root, gdk_window_get_events(
|
||||||
|
desktop->root) | GDK_BUTTON_PRESS_MASK);
|
||||||
|
gdk_window_add_filter(desktop->root, _new_on_root_event, desktop);
|
||||||
return desktop;
|
return desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -709,6 +722,140 @@ static void _new_add_home(Desktop * desktop)
|
|||||||
desktopicon_set_icon(desktopicon, icon);
|
desktopicon_set_icon(desktopicon, icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
|
||||||
|
Desktop * desktop);
|
||||||
|
static void _on_popup_new_folder(GtkWidget * widget, gpointer data);
|
||||||
|
static void _on_popup_new_text_file(GtkWidget * widget, gpointer data);
|
||||||
|
static void _on_popup_paste(GtkWidget * widget, gpointer data);
|
||||||
|
static void _on_popup_preferences(GtkWidget * widget, gpointer data);
|
||||||
|
|
||||||
|
static GdkFilterReturn _new_on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
Desktop * desktop = data;
|
||||||
|
XEvent * xev = xevent;
|
||||||
|
|
||||||
|
if(xev->type == ButtonPress)
|
||||||
|
return _event_button_press(xevent, desktop);
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
|
||||||
|
Desktop * desktop)
|
||||||
|
{
|
||||||
|
GtkWidget * menuitem;
|
||||||
|
GtkWidget * submenu;
|
||||||
|
GtkWidget * image;
|
||||||
|
|
||||||
|
if(xbev->button != 3 || desktop->menu != NULL)
|
||||||
|
{
|
||||||
|
if(desktop->menu != NULL)
|
||||||
|
{
|
||||||
|
gtk_widget_destroy(desktop->menu);
|
||||||
|
desktop->menu = NULL;
|
||||||
|
}
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
desktop->menu = gtk_menu_new();
|
||||||
|
menuitem = gtk_menu_item_new_with_label("New");
|
||||||
|
submenu = gtk_menu_new();
|
||||||
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(desktop->menu), menuitem);
|
||||||
|
/* submenu for new documents */
|
||||||
|
menuitem = gtk_image_menu_item_new_with_label("Text file");
|
||||||
|
image = gtk_image_new_from_icon_name("stock_new-text",
|
||||||
|
GTK_ICON_SIZE_MENU);
|
||||||
|
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(
|
||||||
|
_on_popup_new_text_file), desktop);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
|
||||||
|
menuitem = gtk_image_menu_item_new_with_label("Folder");
|
||||||
|
image = gtk_image_new_from_icon_name("folder-new", GTK_ICON_SIZE_MENU);
|
||||||
|
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(
|
||||||
|
_on_popup_new_folder), desktop);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
|
||||||
|
/* edition */
|
||||||
|
menuitem = gtk_separator_menu_item_new();
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(desktop->menu), menuitem);
|
||||||
|
menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL);
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(
|
||||||
|
_on_popup_paste), desktop);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(desktop->menu), menuitem);
|
||||||
|
/* preferences */
|
||||||
|
menuitem = gtk_separator_menu_item_new();
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(desktop->menu), menuitem);
|
||||||
|
menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES,
|
||||||
|
NULL);
|
||||||
|
g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(
|
||||||
|
_on_popup_preferences), desktop);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(desktop->menu), menuitem);
|
||||||
|
gtk_widget_show_all(desktop->menu);
|
||||||
|
gtk_menu_popup(GTK_MENU(desktop->menu), NULL, NULL, NULL, NULL, 3,
|
||||||
|
xbev->time);
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _on_popup_new_folder(GtkWidget * widget, gpointer data)
|
||||||
|
{
|
||||||
|
static char const newfolder[] = "New folder";
|
||||||
|
Desktop * desktop = data;
|
||||||
|
char * path;
|
||||||
|
|
||||||
|
gtk_widget_destroy(desktop->menu);
|
||||||
|
desktop->menu = NULL;
|
||||||
|
if((path = malloc(strlen(desktop->path) + sizeof(newfolder) + 1))
|
||||||
|
== NULL)
|
||||||
|
{
|
||||||
|
desktop_error(desktop, "malloc", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sprintf(path, "%s/%s", desktop->path, newfolder);
|
||||||
|
if(mkdir(path, 0777) != 0)
|
||||||
|
desktop_error(desktop, path, 0);
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _on_popup_new_text_file(GtkWidget * widget, gpointer data)
|
||||||
|
{
|
||||||
|
static char const newtext[] = "New text file.txt";
|
||||||
|
Desktop * desktop = data;
|
||||||
|
char * path;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
gtk_widget_destroy(desktop->menu);
|
||||||
|
desktop->menu = NULL;
|
||||||
|
if((path = malloc(strlen(desktop->path) + sizeof(newtext) + 1)) == NULL)
|
||||||
|
{
|
||||||
|
desktop_error(desktop, "malloc", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sprintf(path, "%s/%s", desktop->path, newtext);
|
||||||
|
if((fd = creat(path, 0666)) < 0)
|
||||||
|
desktop_error(desktop, path, 0);
|
||||||
|
else
|
||||||
|
close(fd);
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _on_popup_paste(GtkWidget * widget, gpointer data)
|
||||||
|
{
|
||||||
|
Desktop * desktop = data;
|
||||||
|
|
||||||
|
/* FIXME implement */
|
||||||
|
gtk_widget_destroy(desktop->menu);
|
||||||
|
desktop->menu = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _on_popup_preferences(GtkWidget * widget, gpointer data)
|
||||||
|
{
|
||||||
|
Desktop * desktop = data;
|
||||||
|
|
||||||
|
/* FIXME implement */
|
||||||
|
gtk_widget_destroy(desktop->menu);
|
||||||
|
desktop->menu = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* desktop_delete */
|
/* desktop_delete */
|
||||||
void desktop_delete(Desktop * desktop)
|
void desktop_delete(Desktop * desktop)
|
||||||
|
Loading…
Reference in New Issue
Block a user