Added support for geometry option (not fully tested).
[hvgrip.git] / src / grip.c
index f475b74..8d65a3e 100644 (file)
@@ -30,7 +30,6 @@
 #include <X11/Xlib.h>
 #include <time.h>
 #include "grip.h"
-#include <libgnomeui/gnome-window-icon.h>
 #include "discdb.h"
 #include "cdplay.h"
 #include "discedit.h"
@@ -42,7 +41,7 @@
 #include "parsecfg.h"
 #include "tray.h"
 
-static void ReallyDie(gint reply,gpointer data);
+static void ReallyDie(gpointer data);
 static void MakeStatusPage(GripInfo *ginfo);
 static void DoHelp(GtkWidget *widget,gpointer data);
 static void MakeHelpPage(GripInfo *ginfo);
@@ -53,6 +52,9 @@ static void LoadImages(GripGUI *uinfo);
 static void DoLoadConfig(GripInfo *ginfo);
 void DoSaveConfig(GripInfo *ginfo);
 
+#define GRIP_URL "http://www.hugovil.com/hvgrip"
+#define GRIP_HTML_DOC_URL "file://"DOCDIR"/grip.html"
+
 #define BASE_CFG_ENTRIES \
 {"grip_version",CFG_ENTRY_STRING,256,ginfo->version},\
 {"cd_device",CFG_ENTRY_STRING,256,ginfo->cd_device},\
@@ -124,11 +126,13 @@ void DoSaveConfig(GripInfo *ginfo);
 {"selected_ripper",CFG_ENTRY_INT,0,&ginfo->selected_ripper},\
 {"play_mode",CFG_ENTRY_INT,0,&ginfo->play_mode},\
 {"playloop",CFG_ENTRY_BOOL,0,&ginfo->playloop},\
-{"win_width",CFG_ENTRY_INT,0,&uinfo->win_width},\
-{"win_height",CFG_ENTRY_INT,0,&uinfo->win_height},\
+{"win_width",CFG_ENTRY_INT,0,&uinfo->size_hints.base_width},\
+{"win_height",CFG_ENTRY_INT,0,&uinfo->size_hints.base_height},\
 {"win_height_edit",CFG_ENTRY_INT,0,&uinfo->win_height_edit},\
-{"win_width_min",CFG_ENTRY_INT,0,&uinfo->win_width_min},\
-{"win_height_min",CFG_ENTRY_INT,0,&uinfo->win_height_min},\
+{"win_width_min",CFG_ENTRY_INT,0,&uinfo->size_hints.min_width},\
+{"win_height_min",CFG_ENTRY_INT,0,&uinfo->size_hints.min_height},\
+{"win_pos_x",CFG_ENTRY_INT,0,&uinfo->x},\
+{"win_pos_y",CFG_ENTRY_INT,0,&uinfo->y},\
 {"vol_vis",CFG_ENTRY_BOOL,0,&uinfo->volvis},\
 {"track_edit_vis",CFG_ENTRY_BOOL,0,&uinfo->track_edit_visible},\
 {"track_prog_vis",CFG_ENTRY_BOOL,0,&uinfo->track_prog_visible},\
@@ -152,7 +156,7 @@ gboolean AppWindowStateCB(GtkWidget *widget, GdkEventWindowState *event, gpointe
   GripInfo *ginfo = (GripInfo*)data;
   GripGUI *uinfo = &(ginfo->gui_info);
   GdkWindowState state = event->new_window_state;
-       
+
   if ((state & GDK_WINDOW_STATE_WITHDRAWN) || (state & GDK_WINDOW_STATE_ICONIFIED)) {
     ginfo->app_visible = FALSE;
     return TRUE;
@@ -176,10 +180,8 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
   int major,minor,point;
   char buf[256];
 
-  gnome_window_icon_set_default_from_file(GNOME_ICONDIR"/gripicon.png");
+  app = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
-  app=gnome_app_new(PACKAGE,_("Grip"));
   ginfo=g_new0(GripInfo,1);
 
   gtk_object_set_user_data(GTK_OBJECT(app),(gpointer)ginfo);
@@ -191,31 +193,39 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
   uinfo->encode_status_window=NULL;
   uinfo->track_list=NULL;
 
-  uinfo->win_width=WINWIDTH;
-  uinfo->win_height=WINHEIGHT;
+  /* Size hints */
+  uinfo->size_hints.min_width = MIN_WINWIDTH;
+  uinfo->size_hints.min_height = MIN_WINHEIGHT;
+  uinfo->size_hints.base_width = WINWIDTH;
+  uinfo->size_hints.base_height = WINHEIGHT;
+  uinfo->size_hints.width_inc = 10;
+  uinfo->size_hints.height_inc = 10;
+
   uinfo->win_height_edit=WINHEIGHTEDIT;
-  uinfo->win_width_min=MIN_WINWIDTH;
-  uinfo->win_height_min=MIN_WINHEIGHT;
-
-  /*  if(geometry != NULL) {
-    gint x,y,w,h;
-    
-    if(gnome_parse_geometry(geometry, 
-                           &x,&y,&w,&h)) {
-      if(x != -1) {
-       gtk_widget_set_uposition(app,x,y);
-      }
-      
-      if(w != -1) {
-        uinfo->win_width=w;
-        uinfo->win_height=h;
-      }
-    }
-    else {
-      g_error(_("Could not parse geometry string `%s'"), geometry);
+
+  gtk_window_set_geometry_hints(GTK_WINDOW(app), app,
+                               &uinfo->size_hints,
+                               GDK_HINT_MIN_SIZE |
+                               GDK_HINT_BASE_SIZE |
+                               GDK_HINT_RESIZE_INC);
+
+  if(geometry != NULL) {
+    /*
+      If either a size or a position can be extracted from the geometry string,
+      gtk-window-parse-geometry returns â€˜#t’ and calls
+      gtk-window-set-default-size and/or gtk-window-move to resize/move the
+      window.
+    */
+    if (!gtk_window_parse_geometry(GTK_WINDOW(app), geometry)) {
+      fprintf (stderr, "Failed to parse geometry string '%s'\n", geometry);
+    } else {
+      /* For saving the position */
+      gtk_window_get_position(GTK_WINDOW(uinfo->app), &uinfo->x, &uinfo->y);
     }
   }
-  */
+
+  Debug("X = %d\n", uinfo->x);
+  Debug("Y = %d\n", uinfo->y);
 
   if(config_filename && *config_filename)
     g_snprintf(ginfo->config_filename,256,"%s",config_filename);
@@ -237,7 +247,7 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
   if(!CDInitDevice(ginfo->cd_device,&(ginfo->disc))) {
     sprintf(buf,_("Error: Unable to initialize [%s]\n"),ginfo->cd_device);
 
-    DisplayMsg(buf);
+    DisplayErrorMsg(GTK_WINDOW(app), buf);
   }
 
   CDStat(&(ginfo->disc),TRUE);
@@ -251,23 +261,30 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
     gtk_widget_set_size_request(GTK_WIDGET(app),MIN_WINWIDTH,
                                 MIN_WINHEIGHT);
 
-    gtk_window_resize(GTK_WINDOW(app),uinfo->win_width_min,
-                                uinfo->win_height_min);
+    gtk_window_resize(GTK_WINDOW(app),uinfo->size_hints.min_width,
+                                uinfo->size_hints.min_height);
   }
   else {
     gtk_widget_set_size_request(GTK_WIDGET(app),WINWIDTH,
                                 WINHEIGHT);
 
     if(uinfo->track_edit_visible) {
-      gtk_window_resize(GTK_WINDOW(app),uinfo->win_width,
+      gtk_window_resize(GTK_WINDOW(app),uinfo->size_hints.base_width,
                         uinfo->win_height_edit);
     }
     else {
-      gtk_window_resize(GTK_WINDOW(app),uinfo->win_width,
-                        uinfo->win_height);
+      gtk_window_resize(GTK_WINDOW(app),uinfo->size_hints.base_width,
+                        uinfo->size_hints.base_height);
     }
   }
 
+  Debug("X = %d\n", uinfo->x);
+  Debug("Y = %d\n", uinfo->y);
+  gtk_window_move(GTK_WINDOW(app), uinfo->x, uinfo->y);
+
+  /* Position window from values in config file. */
+  gtk_window_move(GTK_WINDOW(app),uinfo->x, uinfo->y);
+
   gtk_widget_realize(app);
 
   uinfo->winbox=gtk_vbox_new(FALSE,3);
@@ -299,17 +316,19 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
   uinfo->playopts=MakePlayOpts(ginfo);
   gtk_box_pack_start(GTK_BOX(uinfo->winbox),uinfo->playopts,FALSE,FALSE,0);
   if(uinfo->track_prog_visible) gtk_widget_show(uinfo->playopts);
+
   uinfo->controls=MakeControls(ginfo);
   if(uinfo->minimized)
     gtk_box_pack_start(GTK_BOX(uinfo->winbox),uinfo->controls,TRUE,TRUE,0);
   else
     gtk_box_pack_start(GTK_BOX(uinfo->winbox),uinfo->controls,FALSE,FALSE,0);
   gtk_widget_show(uinfo->controls);
-  
-  gnome_app_set_contents(GNOME_APP(app),uinfo->winbox);
+
+  gtk_container_add(GTK_CONTAINER(app), uinfo->winbox);
   gtk_widget_show(uinfo->winbox);
 
+  gtk_window_set_icon_from_file(GTK_WINDOW(app), GNOME_ICONDIR"/gripicon.png", NULL);
+
   CheckNewDisc(ginfo,FALSE);
 
   /* Check if we're running this version for the first time */
@@ -320,7 +339,7 @@ GtkWidget *GripNew(const gchar* geometry,char *device,char *scsi_device,
 
     /* Check if we have a dev release */
     if(minor%2) {
-      gnome_app_warning((GnomeApp *)ginfo->gui_info.app,
+      DisplayWarningMsg(GTK_WINDOW(ginfo->gui_info.app),
                         _("This is a development version of Grip. If you encounter problems, you are encouraged to revert to the latest stable version."));
     }
   }
@@ -340,22 +359,22 @@ void GripDie(GtkWidget *widget,gpointer data)
   
 #ifndef GRIPCD
   if(ginfo->ripping_a_disc || ginfo->encoding)
-    gnome_app_ok_cancel_modal((GnomeApp *)ginfo->gui_info.app,
+    DisplayOkCancelDialog(GTK_WINDOW(ginfo->gui_info.app),
                              _("Work is in progress.\nReally shut down?"),
                              ReallyDie,(gpointer)ginfo);
-  else ReallyDie(0,ginfo);
+  else ReallyDie(ginfo);
 #else
-  ReallyDie(0,ginfo);
+  ReallyDie(ginfo);
 #endif
 }
 
-static void ReallyDie(gint reply,gpointer data)
+static void ReallyDie(gpointer data)
 {
   GripInfo *ginfo;
-
-  if(reply) return;
+  GripGUI *uinfo;
 
   ginfo=(GripInfo *)data;
+  uinfo = &(ginfo->gui_info);
 
 #ifndef GRIPCD
   if(ginfo->ripping_a_disc) KillRip(NULL,ginfo);
@@ -365,6 +384,9 @@ static void ReallyDie(gint reply,gpointer data)
   if(!ginfo->no_interrupt)
     CDStop(&(ginfo->disc));
 
+  /* For saving the window position */
+  gtk_window_get_position(GTK_WINDOW(uinfo->app), &uinfo->x, &uinfo->y);
+
   DoSaveConfig(ginfo);
 
   gtk_main_quit();
@@ -470,10 +492,23 @@ void LogStatus(GripInfo *ginfo,char *fmt,...)
 static void DoHelp(GtkWidget *widget,gpointer data)
 {
   char *section;
+  char *uri;
 
   section=(char *)data;
 
-  gnome_help_display("grip.xml",section,NULL);
+  if (section) {
+    /*
+     * This doesn't work for the moment: the "#section" seems to be
+     * ignored by g_app_info_launch_default_for_uri().
+     */
+    uri = g_strdup_printf("%s#%s", GRIP_HTML_DOC_URL, section);
+  }
+  else {
+    uri = g_strdup_printf("%s", GRIP_HTML_DOC_URL);
+  }
+
+  g_app_info_launch_default_for_uri(uri, NULL, NULL);
+  g_free (uri);
 }
 
 static void MakeHelpPage(GripInfo *ginfo)
@@ -582,7 +617,7 @@ void MakeAboutPage(GripGUI *uinfo)
 
   hbox=gtk_hbox_new(TRUE,0);
 
-  button=gtk_button_new_with_label("http://www.nostatic.org/grip");
+  button=gtk_button_new_with_label(GRIP_URL);
   gtk_widget_set_style(button,uinfo->style_dark_grey);
   gtk_widget_set_style(GTK_BIN(button)->child,
                       uinfo->style_dark_grey);
@@ -625,7 +660,7 @@ static void MakeStyles(GripGUI *uinfo)
 
 static void Homepage(void)
 {
-  system("gnome-moz-remote http://www.nostatic.org/grip");
+  g_app_info_launch_default_for_uri(GRIP_URL, NULL, NULL);
 }
 
 static void LoadImages(GripGUI *uinfo)
@@ -918,7 +953,7 @@ static void DoLoadConfig(GripInfo *ginfo)
   if(confret<0) {
     /* Check if the config is out of date */
     if(confret==-2) {
-      gnome_app_warning((GnomeApp *)ginfo->gui_info.app,
+      DisplayWarningMsg(GTK_WINDOW(ginfo->gui_info.app),
                         _("Your config file is out of date -- "
                           "resetting to defaults.\n"
                           "You will need to re-configure Grip.\n"
@@ -1012,7 +1047,7 @@ void DoSaveConfig(GripInfo *ginfo)
   g_snprintf(filename,256,"%s/%s",getenv("HOME"),ginfo->config_filename);
 
   if(!SaveConfig(filename,"GRIP",2,cfg_entries))
-    gnome_app_warning((GnomeApp *)ginfo->gui_info.app,
+    DisplayWarningMsg(GTK_WINDOW(ginfo->gui_info.app),
                       _("Error: Unable to save config file."));
 
   SaveRipperConfig(ginfo,ginfo->selected_ripper);