root / trunk / gui_base / gui_base.c @ 1897
History | View | Annotate | Download (4.9 KB)
| 1 | 
                  /* 
                 | 
              
|---|---|
| 2 | 
                  Copyright (C) 2005-2010 Erik van Pienbroek  | 
              
| 3 | 
                   | 
              
| 4 | 
                  This program is free software; you can redistribute it and/or modify  | 
              
| 5 | 
                  it under the terms of the GNU General Public License as published by  | 
              
| 6 | 
                  the Free Software Foundation; either version 2 of the License, or  | 
              
| 7 | 
                  (at your option) any later version.  | 
              
| 8 | 
                   | 
              
| 9 | 
                  This program is distributed in the hope that it will be useful,  | 
              
| 10 | 
                  but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
              
| 11 | 
                  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  | 
              
| 12 | 
                  GNU General Public License for more details.  | 
              
| 13 | 
                   | 
              
| 14 | 
                  You should have received a copy of the GNU General Public License  | 
              
| 15 | 
                  along with this program; if not, write to the Free Software  | 
              
| 16 | 
                  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  | 
              
| 17 | 
                  */  | 
              
| 18 | 
                   | 
              
| 19 | 
                  #include  | 
              
| 20 | 
                  #include "nntpgrab_gui_base.h"  | 
              
| 21 | 
                  #include "icon_64x64.xpm"  | 
              
| 22 | 
                   | 
              
| 23 | 
                  static GtkBuilder *builder = NULL;  | 
              
| 24 | 
                   | 
              
| 25 | 
                  GObject *  | 
              
| 26 | 
                  nntpgrab_gui_base_get_object(const char *name)  | 
              
| 27 | 
                  {
                 | 
              
| 28 | 
                  GObject *obj;  | 
              
| 29 | 
                   | 
              
| 30 | 
                      if (!builder) {
                 | 
              
| 31 | 
                  return NULL;  | 
              
| 32 | 
                  }  | 
              
| 33 | 
                   | 
              
| 34 | 
                  obj = gtk_builder_get_object(builder, name);  | 
              
| 35 | 
                      if (!obj) {
                 | 
              
| 36 | 
                          g_critical(_("No widget found with name '%s'\n"), name);
                 | 
              
| 37 | 
                  }  | 
              
| 38 | 
                   | 
              
| 39 | 
                      return obj;
                 | 
              
| 40 | 
                  }  | 
              
| 41 | 
                   | 
              
| 42 | 
                  GtkWidget *  | 
              
| 43 | 
                  nntpgrab_gui_base_get_widget(const char *name)  | 
              
| 44 | 
                  {
                 | 
              
| 45 | 
                      return GTK_WIDGET(nntpgrab_gui_base_get_object(name));
                 | 
              
| 46 | 
                  }  | 
              
| 47 | 
                   | 
              
| 48 | 
                  static gboolean
                 | 
              
| 49 | 
                  window_state_changed(GtkWidget *caller, GdkEvent *event, gpointer data)  | 
              
| 50 | 
                  {
                 | 
              
| 51 | 
                      if (!nntpgrab_gui_base_tray_icon_get_is_shown()) {
                 | 
              
| 52 | 
                          return FALSE;
                 | 
              
| 53 | 
                  }  | 
              
| 54 | 
                   | 
              
| 55 | 
                      if (    (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED &&
                 | 
              
| 56 | 
                              (event->window_state.changed_mask & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED) {
                 | 
              
| 57 | 
                  #ifdef WIN32
                 | 
              
| 58 | 
                  gtk_widget_hide(caller);  | 
              
| 59 | 
                  #else
                 | 
              
| 60 | 
                  gtk_window_set_skip_taskbar_hint(GTK_WINDOW(caller), TRUE);  | 
              
| 61 | 
                  #endif
                 | 
              
| 62 | 
                  }  | 
              
| 63 | 
                   | 
              
| 64 | 
                      return FALSE;
                 | 
              
| 65 | 
                  }  | 
              
| 66 | 
                   | 
              
| 67 | 
                  typedef struct _log_func_data {  | 
              
| 68 | 
                  char msg[1024];  | 
              
| 69 | 
                  GLogLevelFlags log_level;  | 
              
| 70 | 
                  } LogFuncData;  | 
              
| 71 | 
                   | 
              
| 72 | 
                  static gboolean
                 | 
              
| 73 | 
                  log_func_phase2(gpointer data)  | 
              
| 74 | 
                  {
                 | 
              
| 75 | 
                  LogFuncData *func_data = (LogFuncData*) data;  | 
              
| 76 | 
                  GtkWidget *window;  | 
              
| 77 | 
                   | 
              
| 78 | 
                      window = nntpgrab_gui_base_get_widget("windowMain");
                 | 
              
| 79 | 
                   | 
              
| 80 | 
                  nntpgrab_gui_base_dialog_show(window, func_data->msg, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK);  | 
              
| 81 | 
                   | 
              
| 82 | 
                      if (func_data->log_level & G_LOG_LEVEL_ERROR) {
                 | 
              
| 83 | 
                  gtk_main_quit();  | 
              
| 84 | 
                  }  | 
              
| 85 | 
                   | 
              
| 86 | 
                  g_slice_free(LogFuncData, func_data);  | 
              
| 87 | 
                   | 
              
| 88 | 
                      return FALSE;
                 | 
              
| 89 | 
                  }  | 
              
| 90 | 
                   | 
              
| 91 | 
                  static void  | 
              
| 92 | 
                  log_func (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)  | 
              
| 93 | 
                  {
                 | 
              
| 94 | 
                  LogFuncData *func_data = g_slice_new(LogFuncData);  | 
              
| 95 | 
                      char *msg;
                 | 
              
| 96 | 
                   | 
              
| 97 | 
                      if (log_domain) {
                 | 
              
| 98 | 
                          msg = g_strdup_printf("%s: %s", log_domain, message);
                 | 
              
| 99 | 
                      } else {
                 | 
              
| 100 | 
                  msg = g_strdup(message);  | 
              
| 101 | 
                  }  | 
              
| 102 | 
                   | 
              
| 103 | 
                  strncpy(func_data->msg, msg, sizeof(func_data->msg) - 1);  | 
              
| 104 | 
                  func_data->log_level = log_level;  | 
              
| 105 | 
                   | 
              
| 106 | 
                      g_print("%s\n", msg);
                 | 
              
| 107 | 
                   | 
              
| 108 | 
                      g_idle_add_full(G_PRIORITY_HIGH, log_func_phase2, func_data, NULL);
                 | 
              
| 109 | 
                   | 
              
| 110 | 
                  g_free(msg);  | 
              
| 111 | 
                  }  | 
              
| 112 | 
                   | 
              
| 113 | 
                  void
                 | 
              
| 114 | 
                  nntpgrab_gui_base_create_ui(const char *interface_name)  | 
              
| 115 | 
                  {
                 | 
              
| 116 | 
                  GtkWidget *windowMain;  | 
              
| 117 | 
                      char *filename;
                 | 
              
| 118 | 
                  GdkPixbuf *pixbuf;  | 
              
| 119 | 
                      GError *err = NULL;
                 | 
              
| 120 | 
                  const char *path;  | 
              
| 121 | 
                      char *interface_filename;
                 | 
              
| 122 | 
                  #if defined(WIN32)
                 | 
              
| 123 | 
                      char *dirname;
                 | 
              
| 124 | 
                  #endif
                 | 
              
| 125 | 
                   | 
              
| 126 | 
                  g_log_set_handler(NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);  | 
              
| 127 | 
                  g_log_set_handler("NNTPGrab Core", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);  | 
              
| 128 | 
                  g_log_set_handler("NNTPGrab-utils", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);  | 
              
| 129 | 
                  g_log_set_handler("NNTPGrab-automation", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);  | 
              
| 130 | 
                  g_log_set_handler("NNTPGrab-server", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);  | 
              
| 131 | 
                   | 
              
| 132 | 
                      /* load the interface */
                 | 
              
| 133 | 
                  #ifdef WIN32
                 | 
              
| 134 | 
                      dirname = g_win32_get_package_installation_directory_of_module(NULL);
                 | 
              
| 135 | 
                  path = g_build_path(G_DIR_SEPARATOR_S, dirname, "\\share\\nntpgrab", NULL);  | 
              
| 136 | 
                  g_free(dirname);  | 
              
| 137 | 
                  #else
                 | 
              
| 138 | 
                  if (g_getenv("NNTPGRAB_DATA_DIR")) {  | 
              
| 139 | 
                          path = g_getenv("NNTPGRAB_DATA_DIR");
                 | 
              
| 140 | 
                      } else {
                 | 
              
| 141 | 
                  path = SHARE_DIR;  | 
              
| 142 | 
                  }  | 
              
| 143 | 
                  #endif
                 | 
              
| 144 | 
                   | 
              
| 145 | 
                      interface_filename = g_strdup_printf("%s.ui", interface_name);
                 | 
              
| 146 | 
                      filename = g_build_filename(path, G_DIR_SEPARATOR_S, interface_filename, NULL);
                 | 
              
| 147 | 
                   | 
              
| 148 | 
                  g_free(interface_filename);  | 
              
| 149 | 
                   | 
              
| 150 | 
                  builder = gtk_builder_new();  | 
              
| 151 | 
                      if (!gtk_builder_add_from_file(builder, filename, &err)) {
                 | 
              
| 152 | 
                          builder = NULL;
                 | 
              
| 153 | 
                          g_error("%s\n", err->message);
                 | 
              
| 154 | 
                  }  | 
              
| 155 | 
                   | 
              
| 156 | 
                      gtk_builder_connect_signals(builder, NULL);
                 | 
              
| 157 | 
                   | 
              
| 158 | 
                  g_free(filename);  | 
              
| 159 | 
                   | 
              
| 160 | 
                      // Set the icon of the window
                 | 
              
| 161 | 
                      windowMain = nntpgrab_gui_base_get_widget("windowMain");
                 | 
              
| 162 | 
                  pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) &icon_64x64_xpm);  | 
              
| 163 | 
                  gtk_window_set_icon(GTK_WINDOW(windowMain), pixbuf);  | 
              
| 164 | 
                  g_object_unref(pixbuf);  | 
              
| 165 | 
                   | 
              
| 166 | 
                      g_signal_connect(G_OBJECT(windowMain), "window_state_event",
                 | 
              
| 167 | 
                                             G_CALLBACK(window_state_changed), NULL);
                 | 
              
| 168 | 
                  }  | 
              
| 169 | 
                   | 
              
| 170 | 
                  void
                 | 
              
| 171 | 
                  nntpgrab_gui_base_destroy_ui(void)
                 | 
              
| 172 | 
                  {
                 | 
              
| 173 | 
                  g_object_unref(builder);  | 
              
| 174 | 
                      builder = NULL;
                 | 
              
| 175 | 
                  }  | 
              
| 176 | 
                   | 
              
NNTPGrab

