diff --git a/gnome/ChangeLog b/gnome/ChangeLog index d89a814bf..8871f056f 100644 --- a/gnome/ChangeLog +++ b/gnome/ChangeLog @@ -1,3 +1,12 @@ +1998-03-18 Federico Mena Quintero + + * gprop.h: New files gprop.[ch]. These create the property pages + for desktop entries. + + * Makefile.in: Added gprop.[ch] to the rules. + + * glayout.c: Put gnome_about_cmd as a callback for the About menu item. + Tue Mar 17 22:40:36 1998 Miguel de Icaza * gdesktop.c (desktop_setup_icon): Lots of changes to accomodate diff --git a/gnome/Makefile.in b/gnome/Makefile.in index 4b474fe37..19df33bdb 100644 --- a/gnome/Makefile.in +++ b/gnome/Makefile.in @@ -29,6 +29,7 @@ GNOMESRCS = \ gtrans.c \ gview.c \ gcmd.c \ + gprop.c \ gmc-chargrid.c GNOMEHDRS = \ @@ -38,6 +39,7 @@ GNOMEHDRS = \ gdesktop.h \ gconf.h \ gcmd.h \ + gprop.h \ gmc-chargrid.h ICONS = \ @@ -77,7 +79,8 @@ OBJS = $(LOBJS) $(OOBJS) \ gutil.o \ gcmd.o \ gmc-chargrid.o \ - gview.o + gview.o \ + gprop.o # # Distribution variables diff --git a/gnome/glayout.c b/gnome/glayout.c index 668269273..7231a3421 100644 --- a/gnome/glayout.c +++ b/gnome/glayout.c @@ -248,7 +248,7 @@ GnomeUIInfo gnome_panel_commands_menu [] = { }; GnomeUIInfo gnome_panel_about_menu [] = { - { GNOME_APP_UI_ITEM, "About", "Information on this program", gnome_quit_cmd, NULL, NULL, + { GNOME_APP_UI_ITEM, "About", "Information on this program", gnome_about_cmd, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT }, GNOMEUIINFO_HELP ("midnight-commander"), GNOMEUIINFO_END diff --git a/gnome/gprop.c b/gnome/gprop.c new file mode 100644 index 000000000..57563d469 --- /dev/null +++ b/gnome/gprop.c @@ -0,0 +1,393 @@ +/* Properties dialog for the Gnome edition of the Midnight Commander + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena + */ + +#include +#include "gprop.h" + + +static GtkWidget * +label_new (char *text, double xalign, double yalign) +{ + GtkWidget *label; + + label = gtk_label_new (text); + gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign); + gtk_widget_show (label); + return label; +} + +/***** General *****/ + +GpropGeneral * +gprop_general_new (char *complete_filename, char *filename) +{ + GpropGeneral *gpg; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *hbox; + char *s; + + g_return_val_if_fail (complete_filename != NULL, NULL); + g_return_val_if_fail (filename != NULL, NULL); + + gpg = g_new (GpropGeneral, 1); + + gpg->top = gtk_vbox_new (FALSE, 6); + + frame = gtk_frame_new ("Name"); + gtk_box_pack_start (GTK_BOX (gpg->top), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + s = g_copy_strings ("Full name: ", complete_filename, NULL); + gtk_box_pack_start (GTK_BOX (vbox), label_new (s, 0.0, 0.5), FALSE, FALSE, 0); + g_free (s); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + gtk_box_pack_start (GTK_BOX (hbox), label_new ("Name", 0.0, 0.5), FALSE, FALSE, 0); + + gpg->filename = gnome_entry_new ("gprop_general_filename"); + gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (gpg->filename))), filename); + gtk_box_pack_start (GTK_BOX (hbox), gpg->filename, TRUE, TRUE, 0); + gtk_widget_show (gpg->filename); + + return gpg; +} + +void +gprop_general_get_data (GpropGeneral *gpg, char **filename) +{ + GtkWidget *entry; + + g_return_if_fail (gpg != NULL); + + if (filename) { + entry = gnome_entry_gtk_entry (GNOME_ENTRY (gpg->filename)); + *filename = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + } +} + +/***** Permissions *****/ + +static umode_t +perm_get_umode (GpropPerm *gpp) +{ + umode_t umode; + +#define SETBIT(widget, flag) umode |= GTK_TOGGLE_BUTTON (widget)->active ? flag : 0 + + umode = 0; + + SETBIT (gpp->suid, S_ISUID); + SETBIT (gpp->sgid, S_ISGID); + SETBIT (gpp->svtx, S_ISVTX); + + SETBIT (gpp->rusr, S_IRUSR); + SETBIT (gpp->wusr, S_IWUSR); + SETBIT (gpp->xusr, S_IXUSR); + + SETBIT (gpp->rgrp, S_IRGRP); + SETBIT (gpp->wgrp, S_IWGRP); + SETBIT (gpp->xgrp, S_IXGRP); + + SETBIT (gpp->roth, S_IROTH); + SETBIT (gpp->woth, S_IWOTH); + SETBIT (gpp->xoth, S_IXOTH); + + return umode; + +#undef SETBIT +} + +static void +perm_set_mode_label (GtkWidget *widget, gpointer data) +{ + umode_t umode; + GpropPerm *gpp; + char s_mode[5]; + + gpp = data; + + umode = perm_get_umode (gpp); + + s_mode[0] = '0' + ((umode & (S_ISUID | S_ISGID | S_ISVTX)) >> 9); + s_mode[1] = '0' + ((umode & (S_IRUSR | S_IWUSR | S_IXUSR)) >> 6); + s_mode[2] = '0' + ((umode & (S_IRGRP | S_IWGRP | S_IXGRP)) >> 3); + s_mode[3] = '0' + ((umode & (S_IROTH | S_IWOTH | S_IXOTH)) >> 0); + s_mode[4] = 0; + + gtk_label_set (GTK_LABEL (gpp->mode_label), s_mode); +} + +static GtkWidget * +perm_check_new (char *text, int state, GpropPerm *gpp) +{ + GtkWidget *check; + + if (text) + check = gtk_check_button_new_with_label (text); + else + check = gtk_check_button_new (); + + gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (check), FALSE); + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (check), state ? TRUE : FALSE); + + gtk_signal_connect (GTK_OBJECT (check), "toggled", + (GtkSignalFunc) perm_set_mode_label, + gpp); + + gtk_widget_show (check); + return check; +} + +#define ATTACH(table, widget, left, right, top, bottom) \ +gtk_table_attach (GTK_TABLE (table), widget, \ + left, right, top, bottom, \ + GTK_FILL | GTK_SHRINK, \ + GTK_FILL | GTK_SHRINK, \ + 0, 0); + +#define PERMSET(name, r, w, x, rmask, wmask, xmask, y) do { \ + r = perm_check_new (NULL, umode & rmask, gpp); \ + w = perm_check_new (NULL, umode & wmask, gpp); \ + x = perm_check_new (NULL, umode & xmask, gpp); \ + \ + ATTACH (table, label_new (name, 0.0, 0.5), 0, 1, y, y + 1); \ + ATTACH (table, r, 1, 2, y, y + 1); \ + ATTACH (table, w, 2, 3, y, y + 1); \ + ATTACH (table, x, 3, 4, y, y + 1); \ +} while (0); + +static GtkWidget * +perm_mode_new (GpropPerm *gpp, umode_t umode) +{ + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *table; + + frame = gtk_frame_new ("File mode (permissions)"); + + vbox = gtk_vbox_new (FALSE, 4); + gtk_container_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + gtk_box_pack_start (GTK_BOX (hbox), label_new ("Current mode: ", 0.0, 0.5), FALSE, FALSE, 0); + + gpp->mode_label = label_new ("0000", 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (hbox), gpp->mode_label, FALSE, FALSE, 0); + + table = gtk_table_new (4, 5, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + /* Headings */ + + ATTACH (table, label_new ("Read", 0.0, 0.5), 1, 2, 0, 1); + ATTACH (table, label_new ("Write", 0.0, 0.5), 2, 3, 0, 1); + ATTACH (table, label_new ("Exec", 0.0, 0.5), 3, 4, 0, 1); + ATTACH (table, label_new ("Special", 0.0, 0.5), 4, 5, 0, 1); + + /* Permissions */ + + PERMSET ("User", gpp->rusr, gpp->wusr, gpp->xusr, S_IRUSR, S_IWUSR, S_IXUSR, 1); + PERMSET ("Group", gpp->rgrp, gpp->wgrp, gpp->xgrp, S_IRGRP, S_IWGRP, S_IXGRP, 2); + PERMSET ("Other", gpp->roth, gpp->woth, gpp->xoth, S_IROTH, S_IWOTH, S_IXOTH, 3); + + /* Special */ + + gpp->suid = perm_check_new ("Set UID", umode & S_ISUID, gpp); + gpp->sgid = perm_check_new ("Set GID", umode & S_ISGID, gpp); + gpp->svtx = perm_check_new ("Sticky", umode & S_ISVTX, gpp); + + ATTACH (table, gpp->suid, 4, 5, 1, 2); + ATTACH (table, gpp->sgid, 4, 5, 2, 3); + ATTACH (table, gpp->svtx, 4, 5, 3, 4); + + perm_set_mode_label (NULL, gpp); + + return frame; +} + +#undef ATTACH +#undef PERMSET + +static GtkWidget * +perm_owner_new (char *owner) +{ + GtkWidget *gentry; + GtkWidget *entry; + + /* FIXME: this should be a nice pull-down list of user names, as in achown.c */ + + gentry = gnome_entry_new ("gprop_perm_owner"); + entry = gnome_entry_gtk_entry (GNOME_ENTRY (gentry)); + gtk_entry_set_text (GTK_ENTRY (entry), owner); + + return gentry; +} + +static GtkWidget * +perm_group_new (char *group) +{ + GtkWidget *gentry; + GtkWidget *entry; + + /* FIXME: this should be a nice pull-down list of group names, as in achown.c */ + + gentry = gnome_entry_new ("gprop_perm_group"); + entry = gnome_entry_gtk_entry (GNOME_ENTRY (gentry)); + gtk_entry_set_text (GTK_ENTRY (entry), group); + + return gentry; +} + +static GtkWidget * +perm_ownership_new (GpropPerm *gpp, char *owner, char *group) +{ + GtkWidget *frame; + GtkWidget *table; + + frame = gtk_frame_new ("File ownership"); + + table = gtk_table_new (2, 2, FALSE); + gtk_container_border_width (GTK_CONTAINER (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + gtk_table_set_row_spacings (GTK_TABLE (table), 4); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + /* Owner */ + + gtk_table_attach (GTK_TABLE (table), label_new ("Owner", 0.0, 0.5), + 0, 1, 0, 1, + GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, + 0, 0); + + gpp->owner = perm_owner_new (owner); + gtk_table_attach (GTK_TABLE (table), gpp->owner, + 1, 2, 0, 1, + GTK_EXPAND | GTK_FILL | GTK_SHRINK, + GTK_FILL | GTK_SHRINK, + 0, 0); + gtk_widget_show (gpp->owner); + + /* Group */ + + gtk_table_attach (GTK_TABLE (table), label_new ("Group", 0.0, 0.5), + 0, 1, 1, 2, + GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, + 0, 0); + + gpp->group = perm_group_new (group); + gtk_table_attach (GTK_TABLE (table), gpp->group, + 1, 2, 1, 2, + GTK_EXPAND | GTK_FILL | GTK_SHRINK, + GTK_FILL | GTK_SHRINK, + 0, 0); + gtk_widget_show (gpp->group); + + return frame; +} + +GpropPerm * +gprop_perm_new (umode_t umode, char *owner, char *group) +{ + GpropPerm *gpp; + GtkWidget *w; + + g_return_val_if_fail (owner != NULL, NULL); + g_return_val_if_fail (group != NULL, NULL); + + gpp = g_new (GpropPerm, 1); + + gpp->top = gtk_vbox_new (FALSE, 6); + + w = perm_mode_new (gpp, umode); + gtk_box_pack_start (GTK_BOX (gpp->top), w, FALSE, FALSE, 0); + gtk_widget_show (w); + + w = perm_ownership_new (gpp, owner, group); + gtk_box_pack_start (GTK_BOX (gpp->top), w, FALSE, FALSE, 0); + gtk_widget_show (w); + + return gpp; +} + +void +gprop_perm_get_data (GpropPerm *gpp, umode_t *umode, char **owner, char **group) +{ + g_return_if_fail (gpp != NULL); + + if (umode) + *umode = perm_get_umode (gpp); + + if (owner) + *owner = g_strdup (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (gpp->owner))))); + + if (group) + *group = g_strdup (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (gpp->group))))); +} + +/***** Directory *****/ + +GpropDir * +gprop_dir_new (char *icon_filename) +{ + GpropDir *gpd; + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *entry; + + gpd = g_new (GpropDir, 1); + + gpd->top = gtk_vbox_new (FALSE, 6); + + frame = gtk_frame_new ("Directory icon"); + gtk_box_pack_start (GTK_BOX (gpd->top), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_container_border_width (GTK_CONTAINER (vbox), 6); + gtk_container_add(GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + gpd->icon_filename = gnome_file_entry_new ("gprop_dir_icon_filename", "Select directory icon"); + entry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (gpd->icon_filename)); + gtk_entry_set_text (GTK_ENTRY (entry), icon_filename ? icon_filename : ""); + gtk_box_pack_start (GTK_BOX (vbox), gpd->icon_filename, FALSE, FALSE, 0); + gtk_widget_show (gpd->icon_filename); + + return gpd; +} + +void +gprop_dir_get_data (GpropDir *gpd, char **icon_filename) +{ + GtkWidget *entry; + + g_return_if_fail (gpd != NULL); + + entry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (gpd->icon_filename)); + + if (icon_filename) + *icon_filename = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); +} diff --git a/gnome/gprop.h b/gnome/gprop.h new file mode 100644 index 000000000..af9e2d6fd --- /dev/null +++ b/gnome/gprop.h @@ -0,0 +1,58 @@ +/* Properties dialog for the Gnome edition of the Midnight Commander + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena + */ + +#ifndef GPROP_H +#define GPROP_H + + +#include +#include +#include "config.h" + + +/***** General *****/ + +typedef struct { + GtkWidget *top; + + GtkWidget *filename; +} GpropGeneral; + +GpropGeneral *gprop_general_new (char *complete_filename, char *filename); +void gprop_general_get_data (GpropGeneral *gpg, char **filename); + +/***** Permissions *****/ + +typedef struct { + GtkWidget *top; + + GtkWidget *mode_label; + + GtkWidget *suid, *sgid, *svtx; + GtkWidget *rusr, *wusr, *xusr; + GtkWidget *rgrp, *wgrp, *xgrp; + GtkWidget *roth, *woth, *xoth; + + GtkWidget *owner; + GtkWidget *group; +} GpropPerm; + +GpropPerm *gprop_perm_new (umode_t umode, char *owner, char *group); +void gprop_perm_get_data (GpropPerm *gpp, umode_t *umode, char **owner, char **group); + +/***** Directory *****/ + +typedef struct { + GtkWidget *top; + + GtkWidget *icon_filename; +} GpropDir; + +GpropDir *gprop_dir_new (char *icon_filename); +void gprop_dir_get_data (GpropDir *gpd, char **icon_filename); + +#endif diff --git a/gnome/gscreen.c b/gnome/gscreen.c index 655708f1b..8bcbc6304 100644 --- a/gnome/gscreen.c +++ b/gnome/gscreen.c @@ -30,6 +30,7 @@ #include "dir.h" #include "dialog.h" #include "gdesktop.h" +#include "gprop.h" /* The pixmaps */ #include "directory.xpm" @@ -467,6 +468,33 @@ file_popup_add_context (GtkMenu *menu, WPanel *panel, char *filename) } } +static void +test_it (void) +{ + GtkWidget *window; + GpropGeneral *gpg; + GpropPerm *gpp; + GpropDir *gpd; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gpg = gprop_general_new ("/hola/mundo/como/estas.txt", "estas.txt"); + gtk_container_add (GTK_CONTAINER (window), gpg->top); + gtk_widget_show (gpg->top); + gtk_widget_show (window); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gpp = gprop_perm_new (0, "yomero", "migrupo"); + gtk_container_add (GTK_CONTAINER (window), gpp->top); + gtk_widget_show (gpp->top); + gtk_widget_show (window); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gpd = gprop_dir_new ("/da/share/gnome-install/share/pixmaps/cards/10club.xpm"); + gtk_container_add (GTK_CONTAINER (window), gpd->top); + gtk_widget_show (gpd->top); + gtk_widget_show (window); +} + static void file_popup (GdkEvent *event, WPanel *panel, int row, char *filename) { @@ -482,9 +510,16 @@ file_popup (GdkEvent *event, WPanel *panel, int row, char *filename) gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu); file_popup_add_context (GTK_MENU (menu), panel, filename); + + item = gtk_menu_item_new_with_label ("Chingado"); + gtk_signal_connect (GTK_OBJECT (item), "activate", + (GtkSignalFunc) test_it, + NULL); + gtk_widget_show (item); + gtk_menu_append (GTK_MENU (menu), item); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, event->button.time); - gtk_widget_show (menu); +/* gtk_widget_show (menu);*/ } static void