Statistics
| Branch: | Tag: | Revision:

root / gui_base / gui_base.c @ master

History | View | Annotate | Download (6.4 KB)

1 ca689ea2 Erik van Pienbroek
/* 
2 7af40dae Erik van Pienbroek
    Copyright (C) 2005-2012  Erik van Pienbroek
3 ca689ea2 Erik van Pienbroek

                
4 ca689ea2 Erik van Pienbroek
    This program is free software; you can redistribute it and/or modify
5 ca689ea2 Erik van Pienbroek
    it under the terms of the GNU General Public License as published by
6 ca689ea2 Erik van Pienbroek
    the Free Software Foundation; either version 2 of the License, or
7 ca689ea2 Erik van Pienbroek
    (at your option) any later version.
8 ca689ea2 Erik van Pienbroek

                
9 ca689ea2 Erik van Pienbroek
    This program is distributed in the hope that it will be useful,
10 ca689ea2 Erik van Pienbroek
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ca689ea2 Erik van Pienbroek
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ca689ea2 Erik van Pienbroek
    GNU General Public License for more details.
13 ca689ea2 Erik van Pienbroek

                
14 ca689ea2 Erik van Pienbroek
    You should have received a copy of the GNU General Public License
15 ca689ea2 Erik van Pienbroek
    along with this program; if not, write to the Free Software
16 ca689ea2 Erik van Pienbroek
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 ca689ea2 Erik van Pienbroek
*/
18 ca689ea2 Erik van Pienbroek

                
19 062043e0 Erik van Pienbroek
#include 
20 ca689ea2 Erik van Pienbroek
#include "nntpgrab_gui_base.h"
21 ca689ea2 Erik van Pienbroek
#include "icon_64x64.xpm"
22 ca689ea2 Erik van Pienbroek

                
23 ca689ea2 Erik van Pienbroek
static GtkBuilder *builder = NULL;
24 ca689ea2 Erik van Pienbroek

                
25 ca689ea2 Erik van Pienbroek
GObject *
26 ca689ea2 Erik van Pienbroek
nntpgrab_gui_base_get_object(const char *name)
27 ca689ea2 Erik van Pienbroek
{
28 ca689ea2 Erik van Pienbroek
    GObject *obj;
29 ca689ea2 Erik van Pienbroek

                
30 ca689ea2 Erik van Pienbroek
    if (!builder) {
31 ca689ea2 Erik van Pienbroek
        return NULL;
32 ca689ea2 Erik van Pienbroek
    }
33 ca689ea2 Erik van Pienbroek

                
34 ca689ea2 Erik van Pienbroek
    obj = gtk_builder_get_object(builder, name);
35 ca689ea2 Erik van Pienbroek
    if (!obj) {
36 44b392d1 Erik van Pienbroek
        g_critical(_("No widget found with name '%s'\n"), name);
37 ca689ea2 Erik van Pienbroek
    }
38 ca689ea2 Erik van Pienbroek

                
39 ca689ea2 Erik van Pienbroek
    return obj;
40 ca689ea2 Erik van Pienbroek
}
41 ca689ea2 Erik van Pienbroek

                
42 ca689ea2 Erik van Pienbroek
GtkWidget *
43 ca689ea2 Erik van Pienbroek
nntpgrab_gui_base_get_widget(const char *name)
44 ca689ea2 Erik van Pienbroek
{
45 ca689ea2 Erik van Pienbroek
    return GTK_WIDGET(nntpgrab_gui_base_get_object(name));
46 ca689ea2 Erik van Pienbroek
}
47 ca689ea2 Erik van Pienbroek

                
48 ca689ea2 Erik van Pienbroek
static gboolean
49 ca689ea2 Erik van Pienbroek
window_state_changed(GtkWidget *caller, GdkEvent *event, gpointer data)
50 ca689ea2 Erik van Pienbroek
{
51 f750709b Erik van Pienbroek
    if (!nntpgrab_gui_base_tray_icon_get_is_shown()) {
52 f9078126 Erik van Pienbroek
        return FALSE;
53 f9078126 Erik van Pienbroek
    }
54 f9078126 Erik van Pienbroek

                
55 ca689ea2 Erik van Pienbroek
    if (    (event->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED &&
56 ca689ea2 Erik van Pienbroek
            (event->window_state.changed_mask & GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED) {
57 f750709b Erik van Pienbroek
#ifdef WIN32
58 f750709b Erik van Pienbroek
        gtk_widget_hide(caller);
59 f750709b Erik van Pienbroek
#else
60 ca689ea2 Erik van Pienbroek
        gtk_window_set_skip_taskbar_hint(GTK_WINDOW(caller), TRUE);
61 f750709b Erik van Pienbroek
#endif
62 ca689ea2 Erik van Pienbroek
    }
63 ca689ea2 Erik van Pienbroek

                
64 ca689ea2 Erik van Pienbroek
    return FALSE;
65 ca689ea2 Erik van Pienbroek
}
66 ca689ea2 Erik van Pienbroek

                
67 062043e0 Erik van Pienbroek
typedef struct _log_func_data {
68 062043e0 Erik van Pienbroek
    char msg[1024];
69 062043e0 Erik van Pienbroek
    GLogLevelFlags log_level;
70 062043e0 Erik van Pienbroek
} LogFuncData;
71 062043e0 Erik van Pienbroek

                
72 062043e0 Erik van Pienbroek
static gboolean
73 062043e0 Erik van Pienbroek
log_func_phase2(gpointer data)
74 062043e0 Erik van Pienbroek
{
75 062043e0 Erik van Pienbroek
    LogFuncData *func_data = (LogFuncData*) data;
76 062043e0 Erik van Pienbroek
    GtkWidget *window;
77 062043e0 Erik van Pienbroek

                
78 062043e0 Erik van Pienbroek
    window = nntpgrab_gui_base_get_widget("windowMain");
79 062043e0 Erik van Pienbroek

                
80 062043e0 Erik van Pienbroek
    nntpgrab_gui_base_dialog_show(window, func_data->msg, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK);
81 062043e0 Erik van Pienbroek

                
82 062043e0 Erik van Pienbroek
    if (func_data->log_level & G_LOG_LEVEL_ERROR) {
83 062043e0 Erik van Pienbroek
        gtk_main_quit();
84 062043e0 Erik van Pienbroek
    }
85 062043e0 Erik van Pienbroek

                
86 c84c00bc Erik van Pienbroek
    g_slice_free(LogFuncData, func_data);
87 062043e0 Erik van Pienbroek

                
88 062043e0 Erik van Pienbroek
    return FALSE;
89 062043e0 Erik van Pienbroek
}
90 062043e0 Erik van Pienbroek

                
91 ca689ea2 Erik van Pienbroek
static void
92 ca689ea2 Erik van Pienbroek
log_func (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
93 ca689ea2 Erik van Pienbroek
{
94 c84c00bc Erik van Pienbroek
    LogFuncData *func_data = g_slice_new(LogFuncData);
95 ca689ea2 Erik van Pienbroek
    char *msg;
96 ca689ea2 Erik van Pienbroek

                
97 ca689ea2 Erik van Pienbroek
    if (log_domain) {
98 ca689ea2 Erik van Pienbroek
        msg = g_strdup_printf("%s: %s", log_domain, message);
99 ca689ea2 Erik van Pienbroek
    } else {
100 ca689ea2 Erik van Pienbroek
        msg = g_strdup(message);
101 ca689ea2 Erik van Pienbroek
    }
102 f0411da8 Erik van Pienbroek

                
103 062043e0 Erik van Pienbroek
    strncpy(func_data->msg, msg, sizeof(func_data->msg) - 1);
104 062043e0 Erik van Pienbroek
    func_data->log_level = log_level;
105 062043e0 Erik van Pienbroek

                
106 44b392d1 Erik van Pienbroek
    g_print("%s\n", msg);
107 44b392d1 Erik van Pienbroek

                
108 b002c440 Erik van Pienbroek
    g_idle_add_full(G_PRIORITY_HIGH, log_func_phase2, func_data, NULL);
109 44b392d1 Erik van Pienbroek

                
110 44b392d1 Erik van Pienbroek
    g_free(msg);
111 ca689ea2 Erik van Pienbroek
}
112 ca689ea2 Erik van Pienbroek

                
113 ca689ea2 Erik van Pienbroek
void
114 ca689ea2 Erik van Pienbroek
nntpgrab_gui_base_create_ui(const char *interface_name)
115 ca689ea2 Erik van Pienbroek
{
116 ca689ea2 Erik van Pienbroek
    GtkWidget *windowMain;
117 ca689ea2 Erik van Pienbroek
    char *filename;
118 ca689ea2 Erik van Pienbroek
    GdkPixbuf *pixbuf;
119 ca689ea2 Erik van Pienbroek
    GError *err = NULL;
120 ca689ea2 Erik van Pienbroek
    const char *path;
121 ca689ea2 Erik van Pienbroek
    char *interface_filename;
122 58720d6b Erik van Pienbroek
#if defined(WIN32)
123 58720d6b Erik van Pienbroek
    char *dirname;
124 58720d6b Erik van Pienbroek
#endif
125 ca689ea2 Erik van Pienbroek

                
126 ca689ea2 Erik van Pienbroek
    g_log_set_handler(NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
127 278d3499 Erik van Pienbroek
    g_log_set_handler("libpeas", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
128 e1a37b48 Erik van Pienbroek
    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);
129 773fc60e Erik van Pienbroek
    g_log_set_handler("NNTPGrab-utils", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
130 1a5af646 Erik van Pienbroek
    g_log_set_handler("NNTPGrab-automation", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
131 a877230c Erik van Pienbroek
    g_log_set_handler("NNTPGrab-server", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, log_func, NULL);
132 ca689ea2 Erik van Pienbroek

                
133 ca689ea2 Erik van Pienbroek
    /* load the interface */
134 ca689ea2 Erik van Pienbroek
#ifdef WIN32
135 58720d6b Erik van Pienbroek
    dirname = g_win32_get_package_installation_directory_of_module(NULL);
136 ca689ea2 Erik van Pienbroek
    path = g_build_path(G_DIR_SEPARATOR_S, dirname, "\\share\\nntpgrab", NULL);
137 ca689ea2 Erik van Pienbroek
    g_free(dirname);
138 ca689ea2 Erik van Pienbroek
#else
139 ca689ea2 Erik van Pienbroek
    if (g_getenv("NNTPGRAB_DATA_DIR")) {
140 ca689ea2 Erik van Pienbroek
        path = g_getenv("NNTPGRAB_DATA_DIR");
141 ca689ea2 Erik van Pienbroek
    } else {
142 ca689ea2 Erik van Pienbroek
        path = SHARE_DIR;
143 ca689ea2 Erik van Pienbroek
    }
144 ca689ea2 Erik van Pienbroek
#endif
145 ca689ea2 Erik van Pienbroek

                
146 ff9789b1 Erik van Pienbroek
    interface_filename = g_strdup_printf("%s.ui", interface_name);
147 ca689ea2 Erik van Pienbroek
    filename = g_build_filename(path, G_DIR_SEPARATOR_S, interface_filename, NULL);
148 ca689ea2 Erik van Pienbroek

                
149 61727f71 Erik van Pienbroek
#ifdef WIN32
150 61727f71 Erik van Pienbroek
    g_free(path);
151 61727f71 Erik van Pienbroek
#endif
152 61727f71 Erik van Pienbroek

                
153 ca689ea2 Erik van Pienbroek
    g_free(interface_filename);
154 ca689ea2 Erik van Pienbroek

                
155 ca689ea2 Erik van Pienbroek
    builder = gtk_builder_new();
156 ca689ea2 Erik van Pienbroek
    if (!gtk_builder_add_from_file(builder, filename, &err)) {
157 ca689ea2 Erik van Pienbroek
        builder = NULL;
158 3aa708d0 Erik van Pienbroek
        g_error("%s\n", err->message);
159 ca689ea2 Erik van Pienbroek
    }
160 ca689ea2 Erik van Pienbroek

                
161 ca689ea2 Erik van Pienbroek
    gtk_builder_connect_signals(builder, NULL);
162 ca689ea2 Erik van Pienbroek

                
163 ca689ea2 Erik van Pienbroek
    g_free(filename);
164 ca689ea2 Erik van Pienbroek

                
165 ca689ea2 Erik van Pienbroek
    // Set the icon of the window
166 ca689ea2 Erik van Pienbroek
    windowMain = nntpgrab_gui_base_get_widget("windowMain");
167 ca689ea2 Erik van Pienbroek
    pixbuf = gdk_pixbuf_new_from_xpm_data((const char **) &icon_64x64_xpm);
168 ca689ea2 Erik van Pienbroek
    gtk_window_set_icon(GTK_WINDOW(windowMain), pixbuf);
169 ca689ea2 Erik van Pienbroek
    g_object_unref(pixbuf);
170 ca689ea2 Erik van Pienbroek

                
171 ca689ea2 Erik van Pienbroek
    g_signal_connect(G_OBJECT(windowMain), "window_state_event",
172 ca689ea2 Erik van Pienbroek
                           G_CALLBACK(window_state_changed), NULL);
173 ca689ea2 Erik van Pienbroek
}
174 519ecc75 Erik van Pienbroek

                
175 519ecc75 Erik van Pienbroek
void
176 519ecc75 Erik van Pienbroek
nntpgrab_gui_base_destroy_ui(void)
177 519ecc75 Erik van Pienbroek
{
178 519ecc75 Erik van Pienbroek
    g_object_unref(builder);
179 519ecc75 Erik van Pienbroek
    builder = NULL;
180 519ecc75 Erik van Pienbroek
}
181 519ecc75 Erik van Pienbroek

                
182 61727f71 Erik van Pienbroek
gboolean
183 61727f71 Erik van Pienbroek
nntpgrab_gui_base_append_plugin_ui(const char *interface_name)
184 61727f71 Erik van Pienbroek
{
185 61727f71 Erik van Pienbroek
    char *filename;
186 61727f71 Erik van Pienbroek
    GError *err = NULL;
187 61727f71 Erik van Pienbroek
    char *path;
188 61727f71 Erik van Pienbroek
    char *interface_filename;
189 61727f71 Erik van Pienbroek
#if defined(WIN32)
190 61727f71 Erik van Pienbroek
    char *dirname;
191 61727f71 Erik van Pienbroek
#endif
192 61727f71 Erik van Pienbroek

                
193 61727f71 Erik van Pienbroek
    g_return_val_if_fail(interface_name != NULL, FALSE);
194 61727f71 Erik van Pienbroek
    g_return_val_if_fail(builder != NULL, FALSE);
195 61727f71 Erik van Pienbroek

                
196 61727f71 Erik van Pienbroek
    /* load the interface */
197 61727f71 Erik van Pienbroek
#ifdef WIN32
198 61727f71 Erik van Pienbroek
    dirname = g_win32_get_package_installation_directory_of_module(NULL);
199 61727f71 Erik van Pienbroek
    path = g_build_path(G_DIR_SEPARATOR_S, dirname, "\\share\\nntpgrab\\plugins", NULL);
200 61727f71 Erik van Pienbroek
    g_free(dirname);
201 61727f71 Erik van Pienbroek
#else
202 61727f71 Erik van Pienbroek
    if (g_getenv("NNTPGRAB_DATA_DIR")) {
203 61727f71 Erik van Pienbroek
        path = g_build_path(G_DIR_SEPARATOR_S, g_getenv("NNTPGRAB_DATA_DIR"), "plugins", NULL);
204 61727f71 Erik van Pienbroek
    } else {
205 61727f71 Erik van Pienbroek
        path = g_build_path(G_DIR_SEPARATOR_S, SHARE_DIR, "plugins", NULL);
206 61727f71 Erik van Pienbroek
    }
207 61727f71 Erik van Pienbroek
#endif
208 61727f71 Erik van Pienbroek

                
209 61727f71 Erik van Pienbroek
    interface_filename = g_strdup_printf("%s.ui", interface_name);
210 61727f71 Erik van Pienbroek
    filename = g_build_filename(path, G_DIR_SEPARATOR_S, interface_filename, NULL);
211 61727f71 Erik van Pienbroek
    g_free(interface_filename);
212 61727f71 Erik van Pienbroek
    g_free(path);
213 61727f71 Erik van Pienbroek

                
214 61727f71 Erik van Pienbroek
    if (!gtk_builder_add_from_file(builder, filename, &err)) {
215 61727f71 Erik van Pienbroek
        g_warning("Unable to load interface '%s': %s\n", interface_filename, err->message);
216 61727f71 Erik van Pienbroek
        g_error_free(err);
217 61727f71 Erik van Pienbroek
        return FALSE;
218 61727f71 Erik van Pienbroek
    }
219 61727f71 Erik van Pienbroek

                
220 61727f71 Erik van Pienbroek
    gtk_builder_connect_signals(builder, NULL);
221 61727f71 Erik van Pienbroek

                
222 61727f71 Erik van Pienbroek
    g_free(filename);
223 61727f71 Erik van Pienbroek

                
224 61727f71 Erik van Pienbroek
    return TRUE;
225 61727f71 Erik van Pienbroek
}