00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00028
00029
00030
00031
00032
00033 #include <sys/types.h>
00034
00035 #include <glib.h>
00036 #include <gdk/gdkkeysyms.h>
00037
00038 #include <liberdm/display.h>
00039 #include <libermanifest/ermanifest.h>
00040
00041 #include "contentListerLog.h"
00042 #include "gtkErrorScreen.h"
00043 #include "displayUpdate.h"
00044 #include "stack.h"
00045 #include "erConnect.h"
00046 #include "system.h"
00047 #include "gtkPincodeScreen.h"
00048 #include "control.h"
00049
00050 static GdkPixbuf *g_error_images[ctrlLastIcon];
00051
00052
00053 gboolean error_screen_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data);
00054 static void on_error_screen_destroy(GtkWidget * widget, gpointer data);
00055 guint error_screen_keypress(GtkWidget * widget, GdkEventKey * event, gpointer data);
00056
00057
00058 static void gtk_error_screen_class_init(GtkErrorScreenClass * klass);
00059 static void gtk_error_screen_init(GtkErrorScreen * error_screen);
00060
00061 static void error_screen_init_images(void);
00062 static void error_screen_destroy_images(void);
00063 GdkPixbuf *error_screen_get_image(unsigned int error_ID);
00064
00065
00066 GtkWidget *gtk_error_screen_new()
00067 {
00068 GtkErrorScreen *errorScreen;
00069
00070 errorScreen = (GtkErrorScreen *) g_object_new(GTK_ERROR_SCREEN_TYPE, NULL);
00071
00072 CL_LOGPRINTF("error screen 0x%x", (unsigned int) errorScreen);
00073
00074 return GTK_WIDGET(errorScreen);
00075 }
00076
00077
00078 GType gtk_error_screen_get_type(void)
00079 {
00080 static GType error_screen_type = 0;
00081
00082 if (!error_screen_type)
00083 {
00084 static const GTypeInfo error_screen_info = {
00085 sizeof(GtkErrorScreenClass),
00086 NULL,
00087 NULL,
00088 (GClassInitFunc) gtk_error_screen_class_init,
00089 NULL,
00090 NULL,
00091 sizeof(GtkErrorScreen),
00092 0,
00093 (GInstanceInitFunc) gtk_error_screen_init,
00094 };
00095
00096 error_screen_type = g_type_register_static(GTK_TYPE_EVENT_BOX, "ErrorScreen", &error_screen_info, 0);
00097 }
00098 return error_screen_type;
00099 }
00100
00101
00102 static void gtk_error_screen_class_init(GtkErrorScreenClass * klass)
00103 {
00104
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 static void gtk_error_screen_init(GtkErrorScreen * error_screen)
00117 {
00118 GtkWidget *vbox;
00119 GtkWidget *topLevelVBox;
00120
00121 error_screen_init_images();
00122
00123
00124 gtk_widget_set_name(GTK_WIDGET(error_screen), "error_screen_background");
00125
00126
00127 topLevelVBox = gtk_vbox_new(FALSE, 0);
00128 gtk_container_add(GTK_CONTAINER(error_screen), topLevelVBox);
00129
00130
00131 vbox = gtk_vbox_new(TRUE, VBOX_TEXT_IMAGE_SPACING);
00132 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
00133 gtk_box_pack_start(GTK_BOX(topLevelVBox), vbox, FALSE, FALSE, BOTTOM_TOP_BORDER);
00134
00135
00136 error_screen->image = gtk_image_new();
00137 gtk_widget_set_size_request(GTK_WIDGET(error_screen->image), ERROR_IMAGE_MIN_WIDTH, ERROR_IMAGE_MIN_HEIGHT);
00138 gtk_box_pack_start(GTK_BOX(vbox), error_screen->image, FALSE, FALSE, 0);
00139 error_screen->pixmap = NULL;
00140
00141
00142 error_screen->text = gtk_label_new(NULL);
00143 gtk_widget_set_name(GTK_WIDGET(error_screen->text), "error_screen_text");
00144 gtk_widget_set_size_request(GTK_WIDGET(error_screen->text), ERROR_DESCRIPTION_WIDTH, (-1));
00145 gtk_misc_set_alignment(GTK_MISC(error_screen->text), 0.5, 0.0);
00146 gtk_label_set_single_line_mode(GTK_LABEL(error_screen->text), FALSE);
00147 gtk_label_set_line_wrap(GTK_LABEL(error_screen->text), TRUE);
00148 gtk_label_set_justify(GTK_LABEL(error_screen->text), GTK_JUSTIFY_CENTER);
00149 gtk_box_pack_start(GTK_BOX(vbox), error_screen->text, FALSE, FALSE, 0);
00150
00151
00152 g_signal_connect(G_OBJECT(error_screen), "key_press_event", G_CALLBACK(error_screen_keypress), NULL);
00153 g_signal_connect(G_OBJECT(error_screen), "expose-event", G_CALLBACK(error_screen_expose_event), NULL);
00154 g_signal_connect(G_OBJECT(error_screen), "destroy", G_CALLBACK(on_error_screen_destroy), NULL);
00155
00156 gtk_widget_show_all(GTK_WIDGET(topLevelVBox));
00157 }
00158
00159 static void on_error_screen_destroy(GtkWidget * widget, gpointer data)
00160 {
00161 GtkErrorScreen *error_screen = (GtkErrorScreen *) widget;
00162
00163 CL_WARNPRINTF("entry");
00164
00165
00166 gtk_image_set_from_pixbuf(GTK_IMAGE(error_screen->image), NULL);
00167
00168 error_screen_destroy_images();
00169 }
00170
00171
00172 guint error_screen_keypress(GtkWidget * widget, GdkEventKey * event, gpointer data)
00173 {
00174 int returnValue = 0;
00175
00176 CL_LOGPRINTF("receiving keypress 0x%x", event->keyval);
00177
00178 switch (event->keyval)
00179 {
00180 case GDK_Page_Down:
00181 case GDK_F1:
00182 case GDK_Page_Up:
00183 case GDK_F2:
00184 case GDK_Home:
00185 case GDK_F5:
00186 case GDK_Return:
00187 case GDK_Up:
00188 case GDK_F4:
00189 case GDK_Down:
00190 case GDK_F3:
00191 CL_SCREENPRINTF("invalid key press");
00192 display_update_request_screen_refresh(MAIN_WINDOW_EXPOSE_LEVEL);
00193 break;
00194
00195 #ifdef COMMAND_LINE_INPUT
00196 case GDK_F12:
00197
00198 ctrl_contentType_button_clicked(st_ContentTypeBooks);
00199 break;
00200 case GDK_F11:
00201
00202 ctrl_contentType_button_clicked(st_ContentTypeNews);
00203 break;
00204 case GDK_F10:
00205
00206 ctrl_contentType_button_clicked(st_ContentTypeDocs);
00207 break;
00208 case GDK_F9:
00209
00210 ctrl_contentType_button_clicked(st_ContentTypeNotes);
00211 break;
00212 case GDK_F8:
00213
00214 ctrl_mode_button_clicked();
00215 break;
00216 #endif //COMMAND_LINE_INPUT
00217 }
00218 return returnValue;
00219 }
00220
00221
00222 void gtk_error_screen_set_text(GtkErrorScreen * error_screen, const gchar * text)
00223 {
00224 g_return_if_fail(IS_GTK_ERROR_SCREEN(error_screen));
00225 g_return_if_fail(text != NULL);
00226
00227 CL_LOGPRINTF("text %s", text);
00228
00229 gtk_label_set_text(GTK_LABEL(error_screen->text), text);
00230 }
00231
00232 void gtk_error_screen_set_image(GtkErrorScreen * error_screen, ctrlErrorIcon_e icon)
00233 {
00234 g_return_if_fail(IS_GTK_ERROR_SCREEN(error_screen));
00235
00236 error_screen->pixmap = error_screen_get_image(icon);
00237 gtk_image_set_from_pixbuf(GTK_IMAGE(error_screen->image), error_screen->pixmap);
00238
00239 return;
00240 }
00241
00242
00243 gboolean error_screen_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data)
00244 {
00245 CL_SCREENPRINTF("entry");
00246 display_update_request_screen_refresh(LISTER_EXPOSE_LEVEL);
00247 return FALSE;
00248 }
00249
00250 static void error_screen_init_images(void)
00251 {
00252 GError *error = NULL;
00253
00254 g_error_images[ctrlWarningIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/Warning.png", &error);
00255 if (NULL == g_error_images[ctrlWarningIcon])
00256 {
00257 CL_ERRORPRINTF("ctrlWarningIcon - error %s", error->message);
00258 }
00259
00260 g_error_images[ctrlInfoIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/Info.png", &error);
00261 if (NULL == g_error_images[ctrlInfoIcon])
00262 {
00263 CL_ERRORPRINTF("ctrlInfoIcon - error %s", error->message);
00264 }
00265
00266 g_error_images[ctrlErrorIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/Error.png", &error);
00267 if (NULL == g_error_images[ctrlErrorIcon])
00268 {
00269 CL_ERRORPRINTF("ctrlErrorIcon - error %s", error->message);
00270 }
00271
00272 g_error_images[ctrlProhibitedIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/Prohibited.png", &error);
00273 if (NULL == g_error_images[ctrlProhibitedIcon])
00274 {
00275 CL_ERRORPRINTF("ctrlProhibitedIcon - error %s", error->message);
00276 }
00277
00278 g_error_images[ctrlDontDisconnectNWIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/DontDisconnect-NW.png", &error);
00279 if (NULL == g_error_images[ctrlDontDisconnectNWIcon])
00280 {
00281 CL_ERRORPRINTF("ctrlDontDisconnectNWIcon - error %s", error->message);
00282 }
00283
00284 g_error_images[ctrlBatteryLowIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/BatteryLow.png", &error);
00285 if (NULL == g_error_images[ctrlBatteryLowIcon])
00286 {
00287 CL_ERRORPRINTF("ctrlBatteryLowIcon - error %s", error->message);
00288 }
00289
00290 g_error_images[ctrlSystemShutdownIcon] = gdk_pixbuf_new_from_file(DATA_DIR "/Shutdown.png", &error);
00291 if (NULL == g_error_images[ctrlSystemShutdownIcon])
00292 {
00293 CL_ERRORPRINTF("ctrlSystemShutdownIcon - error %s", error->message);
00294 }
00295 }
00296
00297 static void error_screen_destroy_images(void)
00298 {
00299 int index;
00300
00301 CL_LOGPRINTF("entry");
00302
00303 for (index = 0; index < ctrlLastIcon; index++)
00304 {
00305 if (g_error_images[index])
00306 {
00307 g_free(g_error_images[index]);
00308 g_error_images[index] = NULL;
00309 }
00310 }
00311 }
00312
00313 GdkPixbuf *error_screen_get_image(unsigned int error_ID)
00314 {
00315 if ((error_ID < ctrlLastIcon))
00316 {
00317 return g_error_images[error_ID];
00318 }
00319 else
00320 {
00321 return NULL;
00322 }
00323 }