This commit was manufactured by cvs2svn to create branch 'decode'.
[gnokii.git] / xgnokii / xgnokii_logos.c
diff --git a/xgnokii/xgnokii_logos.c b/xgnokii/xgnokii_logos.c
new file mode 100644 (file)
index 0000000..61a6ae9
--- /dev/null
@@ -0,0 +1,1739 @@
+#include <stdlib.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-api.h"
+#include "gsm-networks.h"
+#include "files/gsm-filetypes.h"
+#include "gsm-bitmaps.h"
+
+#include "xgnokii_logos.h"
+#include "xgnokii_common.h"
+#include "xgnokii_lowlevel.h"
+#include "xgnokii.h"
+
+#include "xpm/Operator_logo.xpm"
+#include "xpm/Startup_logo.xpm"
+#include "xpm/Caller_logo.xpm"
+
+#include "xpm/Black_point.xpm"
+#include "xpm/Green_point.xpm"
+#include "xpm/Green_pixel.xpm"
+
+#include "xpm/New.xpm"
+#include "xpm/Send.xpm"
+#include "xpm/Read.xpm"
+
+#include "xpm/Edit_invert.xpm"
+#include "xpm/Edit_flip_horizontal.xpm"
+#include "xpm/Edit_flip_vertical.xpm"
+
+#include "xpm/Tool_brush.xpm"
+#include "xpm/Tool_line.xpm"
+#include "xpm/Tool_rectangle.xpm"
+#include "xpm/Tool_filled_rectangle.xpm"
+
+extern GSM_Network GSM_Networks[];
+
+static GtkWidget *GUI_LogosWindow;
+
+static ErrorDialog errorDialog = {NULL, NULL};
+static InfoDialog infoDialog = {NULL, NULL};
+
+/* stuff for drawingArea */
+static GtkWidget *drawingArea = NULL;
+static GdkPixmap *drawingPixmap = NULL;
+static GdkPixmap *greenPointPixmap, *blackPointPixmap;
+static int drawingAreaWidth, drawingAreaHeight; /* in pixels */
+static int mouseButtonPushed = 0;
+
+/* stuff for previewArea */
+static GtkWidget *previewArea = NULL;
+static GdkPixmap *previewPixmap = NULL;
+static GdkPixmap *greenPixelPixmap;
+static int previewPixmapWidth, previewPixmapHeight;
+static int previewAvailable = 1, showPreviewErrorDialog = 1;
+static int previewPixmapNumber = 0;
+
+static GSM_Bitmap bitmap, oldBitmap;
+static GSM_NetworkInfo networkInfo;
+
+/* widgets for toolbar - some, need global variables */
+static GtkWidget *buttonStartup, *buttonOperator, *buttonCaller, *buttonPicture;
+static GtkWidget *networkCombo, *callerCombo;
+
+static int activeTool = TOOL_BRUSH;
+static int toolStartX, toolStartY, toolLastX, toolLastY;
+
+/* tools for drawing */
+static GtkWidget *buttonBrush, *buttonLine, *buttonRectangle;
+static GtkWidget *buttonFilledRectangle;
+
+/* Contains fileName for Export dialog. */
+typedef struct {
+  gchar *fileName;
+} ExportDialogData;
+
+static ExportDialogData exportDialogData = {NULL};
+
+GtkWidget *FileSelection;
+
+static int callersGroupsInitialized = 0;
+
+/* returns lowest number from three numbers */
+int GetMinFrom3(int a, int b, int c) {
+  if (a > b) {
+    if (b > c)
+      return c;
+    else
+      return b;
+  } else {
+    if (a > c)
+      return c;
+    else
+      return a;    
+  }
+}
+
+/* returns highest number from three numbers */
+int GetMaxFrom3(int a, int b, int c) {
+  if (a > b) {
+    if (c > a)
+      return c;
+    else
+      return a;
+  } else {
+    if (c > b)
+      return c;
+    else
+      return b;
+  }
+}
+
+/* load preview pixmap from file */
+GdkPixmap *GetPreviewPixmap (GtkWidget *widget) {
+  GdkPixmap *pixmap;
+  GdkBitmap *mask;
+  gchar *file;
+
+  if (previewPixmapNumber == 0)
+  {
+    if (!strcmp (xgnokiiConfig.model, "6110") ||
+        !strcmp (xgnokiiConfig.model, "6120"))
+    {
+      file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_6110.xpm");
+      previewPixmapNumber = 1;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "6130") ||
+             !strcmp (xgnokiiConfig.model, "6150") ||
+             !strcmp (xgnokiiConfig.model, "616x") ||
+             !strcmp (xgnokiiConfig.model, "6185") ||
+             !strcmp (xgnokiiConfig.model, "6190"))
+    {
+      file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_6150.xpm");
+      previewPixmapNumber = 2;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "3210"))
+    {
+      file = g_strdup_printf("%s%s", xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_3210.xpm");
+      previewPixmapNumber = 3;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "3310") ||
+             !strcmp (xgnokiiConfig.model, "3330"))
+    {
+      file = g_strdup_printf("%s%s", xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_3310.xpm");
+      previewPixmapNumber = 4;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "5110") ||
+             !strcmp (xgnokiiConfig.model, "5130"))
+    {
+      file = g_strdup_printf("%s%s", xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_5110.xpm");
+      previewPixmapNumber = 5;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "6250"))
+    {
+      file = g_strdup_printf("%s%s", xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_6250.xpm");
+      previewPixmapNumber = 6;
+    }
+    else if (!strcmp (xgnokiiConfig.model, "7110"))
+    {
+      file = g_strdup_printf("%s%s", xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_7110.xpm");
+      previewPixmapNumber = 7;
+    }
+    else
+    {
+      file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                             "/xpm/Preview_6210.xpm");
+      previewPixmapNumber = 8;
+    }
+  }
+  else
+    switch (previewPixmapNumber)
+    {
+      case 1: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_6110.xpm"); 
+              break;
+      case 2: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_6150.xpm"); 
+              break;
+      case 3: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_3210.xpm"); 
+              break;
+      case 4: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_3310.xpm"); 
+              break;
+      case 5: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_5110.xpm"); 
+              break;
+      case 6: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_6250.xpm"); 
+              break;
+      case 7: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                     "/xpm/Preview_7110.xpm"); 
+              break;
+      default: file = g_strdup_printf("%s%s",xgnokiiConfig.xgnokiidir,
+                                      "/xpm/Preview_6210.xpm");
+              break;
+    }
+
+  pixmap = gdk_pixmap_create_from_xpm(widget->window,&mask,
+                                      &widget->style->bg[GTK_STATE_NORMAL],
+                                      file);
+  g_free(file);
+
+  return pixmap;
+}
+
+/* ********************************************************
+ * ** SET/CLEAR POINTS ************************************
+ * ********************************************************
+ */
+void SetPreviewPoint(GtkWidget *widget, int x, int y, int update) {
+  if (!previewAvailable) return;
+  
+  /* there is difference between positiong of startupLogo and others */
+  if (bitmap.type != GSM_StartupLogo && bitmap.type != GSM_7110StartupLogo &&
+      bitmap.type != GSM_6210StartupLogo) {
+    x += PREVIEWJUMPX;
+    y += PREVIEWJUMPY;
+  }
+
+  /* draw point to pixmap */
+  if (previewPixmap)
+    gdk_draw_point(previewPixmap,widget->style->black_gc,
+                   x+PREVIEWSTARTX,y+PREVIEWSTARTY);
+
+  if (update) {
+    GdkRectangle updateRect;
+
+    /* update point on screen */
+    updateRect.width = 1;
+    updateRect.height = 1;
+    updateRect.x = PREVIEWSTARTX+x;
+    updateRect.y = PREVIEWSTARTY+y;
+
+    gtk_widget_draw(previewArea,&updateRect);
+  }  
+}
+
+void ClearPreviewPoint(GtkWidget *widget, int x, int y, int update) {
+  if (!previewAvailable) return;
+  
+  /* there is difference between positiong of startupLogo and others */
+  if (bitmap.type != GSM_StartupLogo && bitmap.type != GSM_7110StartupLogo &&
+      bitmap.type != GSM_6210StartupLogo) {
+    x += PREVIEWJUMPX;
+    y += PREVIEWJUMPY;
+  }
+
+  /* clean point from pixmap - any idea how to draw green point without pixmap? */
+  if (previewPixmap)
+    gdk_draw_pixmap(previewPixmap,
+                    widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+                    greenPixelPixmap,0,0,x+PREVIEWSTARTX,y+PREVIEWSTARTY,1,1);
+  if (update) {
+    GdkRectangle updateRect;
+
+    /* clean from screen too */
+    updateRect.width = 1;
+    updateRect.height = 1;
+    updateRect.x = PREVIEWSTARTX+x;
+    updateRect.y = PREVIEWSTARTY+y;
+
+    gtk_widget_draw(previewArea,&updateRect);
+  }
+}
+
+int IsPoint(int x, int y) {
+  return GSM_IsPointBitmap(&bitmap,x,y);
+}
+
+void SetPoint(GtkWidget *widget, int x, int y, int update) {
+
+  GSM_SetPointBitmap(&bitmap,x,y);
+
+  /* draw point to pixmap */
+  gdk_draw_pixmap(drawingPixmap,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+         blackPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+
+  if (update) {
+    GdkRectangle updateRect;
+
+    /* calculate update rectangle */
+    updateRect.width = POINTSIZE+2;
+    updateRect.height = POINTSIZE+2;
+    updateRect.x = x * (POINTSIZE+1);
+    updateRect.y = y * (POINTSIZE+1);
+
+    /* update on screen */
+    gtk_widget_draw(drawingArea,&updateRect);
+  }
+
+  /* draw preview point too */
+  if (previewAvailable) SetPreviewPoint(widget,x,y,update); 
+}
+
+void ClearPoint(GtkWidget *widget, int x, int y, int update) {
+
+  GSM_ClearPointBitmap(&bitmap,x,y);
+
+  /* clear point from pixmap */
+  gdk_draw_pixmap(drawingPixmap,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+          greenPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+
+  if (update) {
+    GdkRectangle updateRect;
+
+    /* calculate update rectangle */
+    updateRect.width = POINTSIZE+2;
+    updateRect.height = POINTSIZE+2;
+    updateRect.x = x * (POINTSIZE+1);
+    updateRect.y = y * (POINTSIZE+1);
+          
+    /* update on screen */
+    gtk_widget_draw(drawingArea,&updateRect);
+  }
+
+  /* clear point from previewArea too */
+  if (previewAvailable) ClearPreviewPoint(widget,x,y,update); 
+}
+
+/* ****************************************************
+ * *** UPDATES - PREVIEW & DRAWING AREAS **************
+ * ****************************************************
+ */
+
+/* this redraw all logo points - preview & drawing area */
+void UpdatePointsRectangle(GtkWidget *widget, int x1, int y1, int x2, int y2) {
+  GdkRectangle updateRect;
+  int x, y, dx = 0, dy = 0;
+
+  if (bitmap.type != GSM_StartupLogo && bitmap.type != GSM_7110StartupLogo &&
+      bitmap.type != GSM_6210StartupLogo) {
+    dx = PREVIEWJUMPX;
+    dy = PREVIEWJUMPY;
+  }
+
+  if (x1 > x2) {
+    x = x1;
+    x1 = x2;
+    x2 = x;
+  }
+
+  if (y1 > y2) {
+    y = y1;
+    y1 = y2;
+    y2 = y;
+  }
+  
+  for (y = y1;y <= y2;y++)
+    for (x = x1;x <= x2;x++) {
+      if (IsPoint(x,y)) {
+        /* set on drawing area */
+        gdk_draw_pixmap(drawingPixmap,
+                        drawingArea->style->fg_gc[GTK_WIDGET_STATE(drawingArea)],
+                        blackPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+
+        /* set on preview */
+        if (previewAvailable && previewPixmap) 
+          gdk_draw_point(previewPixmap,previewArea->style->black_gc,
+                         x+PREVIEWSTARTX+dx,y+PREVIEWSTARTY+dy);
+      } else {
+        /* clear from drawing */
+        gdk_draw_pixmap(drawingPixmap,
+                        drawingArea->style->fg_gc[GTK_WIDGET_STATE(drawingArea)],
+                        greenPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+
+        /* clear from preview */
+        if (previewAvailable && previewPixmap) 
+          gdk_draw_pixmap(previewPixmap,
+                          previewArea->style->fg_gc[GTK_WIDGET_STATE(previewArea)],
+                          greenPixelPixmap,0,0,x+PREVIEWSTARTX+dx,y+PREVIEWSTARTY+dy,
+                          1,1);
+      }
+    }
+     
+  if (previewAvailable) {  
+    updateRect.x = PREVIEWSTARTX+dx+x1;
+    updateRect.y = PREVIEWSTARTY+dy+y1;
+    updateRect.width = x2-x1+1;
+    updateRect.height = y2-y1+1;
+    gtk_widget_draw(previewArea,&updateRect);
+  }  
+
+  updateRect.x = x1*(POINTSIZE+1);
+  updateRect.y = y1*(POINTSIZE+1);
+  updateRect.width = (x2-x1+1)*(POINTSIZE+1)+1;
+  updateRect.height = (y2-y1+1)*(POINTSIZE+1)+1;
+  gtk_widget_draw(drawingArea,&updateRect); 
+}
+
+void UpdatePoints(GtkWidget *widget) {
+  UpdatePointsRectangle(widget,0,0,bitmap.width-1,bitmap.height-1);
+}
+
+/* this redraw all logo points in previewArea, NO DRAWING AREA */
+void UpdatePreviewPoints (void) {
+  GdkRectangle updateRect;
+  int x, y, dx = 0, dy = 0;
+
+  if (!previewPixmap || !previewAvailable) return;  
+
+  if (bitmap.type != GSM_StartupLogo && bitmap.type != GSM_7110StartupLogo &&
+      bitmap.type != GSM_6210StartupLogo) {
+    dx = PREVIEWJUMPX;
+    dy = PREVIEWJUMPY;
+  }
+
+  for (y = 0;y < bitmap.height;y++)
+    for (x = 0;x < bitmap.width;x++) {
+      if (IsPoint(x,y)) {
+        gdk_draw_point(previewPixmap,previewArea->style->black_gc,
+                       x+PREVIEWSTARTX+dx,y+PREVIEWSTARTY+dy);
+      } else {
+        gdk_draw_pixmap(previewPixmap,
+                        previewArea->style->fg_gc[GTK_WIDGET_STATE(previewArea)],
+                        greenPixelPixmap,0,0,
+                        x+PREVIEWSTARTX+dx,y+PREVIEWSTARTY+dy,1,1);
+      }
+    }
+              
+  updateRect.x = dx; 
+  updateRect.y = dy;
+  updateRect.width = bitmap.width;
+  updateRect.height = bitmap.height;
+  gtk_widget_draw(previewArea,&updateRect);
+}
+
+/* ******************************************************
+ * **** DRAWING TOOLS ***********************************
+ * ******************************************************
+ */
+
+/* TOOL - BRUSH */
+void ToolBrush(GtkWidget *widget, int column, int row, int button) {
+  /* only this tool directly update bitmap & screen */
+  if (button > 1) 
+    ClearPoint(widget,column,row,1);
+  else
+    SetPoint(widget,column,row,1);
+}
+
+/* TOOL - LINE */
+/* going to rewrite to Bresenham algorithm */ 
+static void ToolLineUpdate(GtkWidget *widget, int column, int row) {
+  double delta, y, x;
+  int i, x1, y1, x2, y2;
+  
+  if (abs(toolStartX-toolLastX) >= abs(toolStartY-toolLastY)) {
+    if (toolStartX > toolLastX) {
+      x1 = toolLastX;
+      x2 = toolStartX;
+      y1 = toolLastY;
+      y2 = toolStartY;
+    } else {
+      x1 = toolStartX;
+      x2 = toolLastX;
+      y1 = toolStartY;
+      y2 = toolLastY;
+    }
+    delta = ((double)(y2-y1))/((double)(x2-x1));
+    y = (double)y1;
+    for (i = x1;i <= x2;i++) {
+      if (!GSM_IsPointBitmap(&oldBitmap,i,(int)y)) ClearPoint(widget,i,(int)y,0);
+      y += delta;
+    }
+  } else {
+    if (toolStartY > toolLastY) {
+      x1 = toolLastX;
+      x2 = toolStartX;
+      y1 = toolLastY;
+      y2 = toolStartY;      
+    } else {
+      x1 = toolStartX;
+      x2 = toolLastX;
+      y1 = toolStartY;
+      y2 = toolLastY;
+    }
+    delta = ((double)(x2-x1))/((double)(y2-y1));
+
+    x = (double)x1;
+    for (i = y1;i <= y2;i++) {
+      if (!GSM_IsPointBitmap(&oldBitmap,(int)x,i)) ClearPoint(widget,(int)x,i,0);
+      x += delta;
+    }
+  } 
+
+  if (abs(toolStartX-column) >= abs(toolStartY-row)) {
+    if (toolStartX > column) {
+      x1 = column;
+      x2 = toolStartX;
+      y1 = row;
+      y2 = toolStartY;
+    } else {
+      x1 = toolStartX;
+      x2 = column;
+      y1 = toolStartY;
+      y2 = row;
+    }
+
+    delta = ((double)(y2-y1))/((double)(x2-x1));
+    y = (double)y1;
+    for (i = x1;i <= x2;i++) {
+      SetPoint(widget,i,(int)y,0);
+      y += delta;
+    }
+  } else {
+    if (toolStartY > row) {
+      x1 = column;
+      x2 = toolStartX;
+      y1 = row;
+      y2 = toolStartY;
+    } else {
+      x1 = toolStartX;
+      x2 = column;
+      y1 = toolStartY;
+      y2 = row;
+    }
+
+    delta = ((double)(x2-x1))/((double)(y2-y1));
+
+    x = (double)x1;
+    for (i = y1;i <= y2;i++) {
+      SetPoint(widget,(int)x,i,0);
+      x += delta;
+    }
+  }
+}
+
+/* TOOL - FILLED RECT */
+static void ToolFilledRectangleUpdate(GtkWidget *widget, int column, int row) {
+  int i, j, x1, y1, x2, y2;
+
+  if (toolStartX > toolLastX) {
+    x1 = toolLastX;
+    x2 = toolStartX;
+  } else {
+    x1 = toolStartX;
+    x2 = toolLastX;
+  }
+
+  if (toolStartY > toolLastY) {
+    y1 = toolLastY;
+    y2 = toolStartY;
+  } else {
+    y1 = toolStartY;
+    y2 = toolLastY;
+  }
+
+  for (j = y1;j <= y2;j++)
+    for (i = x1;i <= x2;i++)
+      if (!GSM_IsPointBitmap(&oldBitmap,i,j)) ClearPoint(widget,i,j,0);
+
+  if (toolStartX > column) {
+    x1 = column;
+    x2 = toolStartX;
+  } else {
+    x1 = toolStartX;
+    x2 = column;
+  }
+
+  if (toolStartY > row) {
+    y1 = row;
+    y2 = toolStartY;
+  } else {
+    y1 = toolStartY;
+    y2 = row;
+  }
+
+  for (j = y1;j <= y2;j++)
+    for (i = x1;i <= x2;i++)
+      SetPoint(widget,i,j,0);
+}
+
+/* TOOL - RECTANGLE */
+static void ToolRectangleUpdate(GtkWidget *widget, int column, int row) {
+  int i, j, x1, y1, x2, y2;
+
+  /* clear old rectangle */
+  if (toolStartX > toolLastX) {
+    x1 = toolLastX;
+    x2 = toolStartX;
+  } else {
+    x1 = toolStartX;
+    x2 = toolLastX;
+  }
+
+  if (toolStartY > toolLastY) {
+    y1 = toolLastY;
+    y2 = toolStartY;
+  } else {
+    y1 = toolStartY;
+    y2 = toolLastY;
+  }
+
+  for (i = x1;i <= x2;i++) {
+    if (!GSM_IsPointBitmap(&oldBitmap,i,y1)) ClearPoint(widget,i,y1,0);
+    if (!GSM_IsPointBitmap(&oldBitmap,i,y2)) ClearPoint(widget,i,y2,0);                
+  }
+
+  for (j = y1;j <= y2;j++) {
+    if (!GSM_IsPointBitmap(&oldBitmap,x1,j)) ClearPoint(widget,x1,j,0);
+    if (!GSM_IsPointBitmap(&oldBitmap,x2,j)) ClearPoint(widget,x2,j,0);
+  }
+
+  /* draw new rectangle */
+  if (toolStartX > column) {
+    x1 = column;
+    x2 = toolStartX;
+  } else {
+    x1 = toolStartX;
+    x2 = column;
+  }
+
+  if (toolStartY > row) {
+    y1 = row;
+    y2 = toolStartY;
+  } else {
+    y1 = toolStartY;
+    y2 = row;
+  }
+
+  for (i = x1;i <= x2;i++) {
+    if (!IsPoint(i,y1)) SetPoint(widget,i,y1,0);
+    if (!IsPoint(i,y2)) SetPoint(widget,i,y2,0);
+  }
+
+  for (j = y1;j <= y2;j++) {
+    if (!IsPoint(x1,j)) SetPoint(widget,x1,j,0);
+    if (!IsPoint(x2,j)) SetPoint(widget,x2,j,0);
+  }
+}
+
+static void UpdateToolScreen(GtkWidget *widget, int x1, int y1, int x2, int y2) {
+  GdkRectangle updateRect;
+
+  /* update preview area */
+  updateRect.x = PREVIEWSTARTX+x1;
+  updateRect.y = PREVIEWSTARTY+y1;
+  if (bitmap.type != GSM_StartupLogo && bitmap.type != GSM_7110StartupLogo &&
+      bitmap.type != GSM_6210StartupLogo) {
+    updateRect.x += PREVIEWJUMPX;
+    updateRect.y += PREVIEWJUMPY;
+  }
+  updateRect.width = x2-x1+1;
+  updateRect.height = y2-y1+1;
+  gtk_widget_draw(previewArea,&updateRect);
+
+  /* update drawing area */
+  updateRect.x = x1 * (POINTSIZE+1);
+  updateRect.y = y1 * (POINTSIZE+1);
+  updateRect.width = (x2-x1+1)*(POINTSIZE+2);
+  updateRect.height = (y2-y1+1)*(POINTSIZE+2);
+  gtk_widget_draw(drawingArea,&updateRect);
+}
+
+/* *************************************
+ * ** PREVIEW AREA EVENTS **************
+ * *************************************
+ */
+
+static gint PreviewAreaButtonPressEvent(GtkWidget *widget, GdkEventButton *event) {
+  previewPixmapNumber = (previewPixmapNumber % 8) + 1;
+
+  gtk_drawing_area_size(GTK_DRAWING_AREA(previewArea),
+                        previewPixmapWidth,previewPixmapHeight);
+
+  return TRUE;
+}
+
+static gint PreviewAreaConfigureEvent(GtkWidget *widget, GdkEventConfigure *event) {
+  if (previewPixmap) gdk_pixmap_unref(previewPixmap);
+  previewPixmap = GetPreviewPixmap(widget);
+
+  UpdatePreviewPoints();
+        
+  return TRUE;
+}
+
+static gint PreviewAreaExposeEvent(GtkWidget *widget, GdkEventExpose *event) {
+  /* got previewPixmap? */
+  if (previewPixmap)
+    /* yes - simply redraw some rectangle */      
+    gdk_draw_pixmap(widget->window,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+                    previewPixmap,event->area.x,event->area.y,event->area.x,
+                    event->area.y,event->area.width,event->area.height);
+
+  return FALSE;
+}
+
+/* ********************************
+ * ** DRAWING AREA EVENTS *********
+ * ********************************
+ */
+
+static gint DrawingAreaButtonPressEvent(GtkWidget *widget, GdkEventButton *event) {
+  /* got drawingPixmap? */
+  if (drawingPixmap == NULL) return TRUE;
+
+  if (!mouseButtonPushed) {
+    if ((event->button == 1 && activeTool != TOOL_BRUSH) || 
+        (activeTool == TOOL_BRUSH)) {
+      /* position from we starting drawing */
+      toolStartX = event->x / (POINTSIZE+1);
+      if (toolStartX < 0) toolStartX = 0;
+      if (toolStartX > bitmap.width-1) toolStartX = bitmap.width-1;
+    
+      toolStartY = event->y / (POINTSIZE+1);
+      if (toolStartY < 0) toolStartY = 0;
+      if (toolStartY > bitmap.height-1) toolStartY = bitmap.height-1;
+
+      toolLastX = toolStartX;
+      toolLastY = toolStartY;
+
+      /* store old bitmap for drawing, resp. for moving, resizing primitive */
+      memcpy(&oldBitmap,&bitmap,sizeof(oldBitmap));
+    }
+
+    if (event->button == 1) mouseButtonPushed = 1;
+  
+    switch (activeTool) { 
+      case TOOL_BRUSH:
+        ToolBrush(widget,toolStartX,toolStartY,event->button);
+        break;
+      case TOOL_LINE:
+      case TOOL_RECTANGLE:
+        if (event->button == 1) ToolBrush(widget,toolStartX,toolStartY,event->button);
+        break;
+    }
+  }
+
+  /* user is drawing some tool other than TOOL_BRUSH and pushed mouse button
+   * another than first => cancel tool and redraw to oldBitmap (bitmap when
+   * user start drawing)
+   */
+  if (mouseButtonPushed && activeTool != TOOL_BRUSH && event->button != 1) {
+    int lowestX, lowestY, highestX, highestY;
+    int i, j;
+
+    lowestX  = GetMinFrom3(toolStartX,toolLastX,toolLastX);
+    lowestY  = GetMinFrom3(toolStartY,toolLastY,toolLastY);
+    highestX = GetMaxFrom3(toolStartX,toolLastX,toolLastX);
+    highestY = GetMaxFrom3(toolStartY,toolLastY,toolLastY);
+
+    for (j = lowestY;j <= highestY;j++)
+      for (i = lowestX;i <= highestX;i++)
+        if (GSM_IsPointBitmap(&oldBitmap,i,j))
+          SetPoint(widget,i,j,0);
+        else
+          ClearPoint(widget,i,j,0);
+    UpdateToolScreen(widget,lowestX,lowestY,highestX,highestY);
+
+    mouseButtonPushed = 0;
+  }
+
+  return TRUE;
+}
+
+static gint DrawingAreaButtonReleaseEvent(GtkWidget *widget, GdkEventButton *event) {
+  if (event->button == 1)
+    mouseButtonPushed = 0;
+
+  return TRUE;
+}
+
+static gint DrawingAreaMotionNotifyEvent(GtkWidget *widget, GdkEventMotion *event) {
+  int x,y;
+  GdkModifierType state;
+  
+  if (!mouseButtonPushed && activeTool != TOOL_BRUSH) return TRUE;
+  
+  if (event->is_hint)
+    gdk_window_get_pointer(event->window,&x,&y,&state);
+  else {
+    x = event->x;
+    y = event->y;
+    state = event->state;
+  }
+
+  x = x / (POINTSIZE+1);
+  y = y / (POINTSIZE+1);
+  if (x < 0) x = 0;
+  if (y < 0) y = 0;
+  if (x > bitmap.width-1) x = bitmap.width-1;
+  if (y > bitmap.height-1) y = bitmap.height-1;
+
+  if (y == toolLastY && x == toolLastX) return TRUE;
+  
+  switch (activeTool) {
+    case TOOL_BRUSH:
+      if (state & GDK_BUTTON1_MASK && drawingPixmap != NULL) ToolBrush(widget,x,y,1);
+      if (state & GDK_BUTTON2_MASK && drawingPixmap != NULL) ToolBrush(widget,x,y,2);
+      if (state & GDK_BUTTON3_MASK && drawingPixmap != NULL) ToolBrush(widget,x,y,3);
+      break;
+    case TOOL_RECTANGLE:
+      if (drawingPixmap != NULL) ToolRectangleUpdate(widget,x,y);
+      break;
+    case TOOL_FILLED_RECTANGLE:
+      if (drawingPixmap != NULL) ToolFilledRectangleUpdate(widget,x,y); 
+      break; 
+    case TOOL_LINE:
+      if (drawingPixmap != NULL) ToolLineUpdate(widget,x,y); 
+      break; 
+  }   
+
+  /* what is this?
+   * it's simple, above tools updates only bitmap in memory and this
+   * function update from bitmap to screen, it's made as non-blinking
+   * drawing functions with this, simply draw everything we need and
+   * after that, redraw to screen rectangle in which we made changes 
+   * it's not redrawing pixel by pixel (blinking)
+   */
+  if (activeTool != TOOL_BRUSH) {
+    int lowestX, lowestY, highestX, highestY;
+
+    lowestX  = GetMinFrom3(toolStartX,toolLastX,x);
+    lowestY  = GetMinFrom3(toolStartY,toolLastY,y);
+    highestX = GetMaxFrom3(toolStartX,toolLastX,x);
+    highestY = GetMaxFrom3(toolStartY,toolLastY,y);
+  
+    UpdateToolScreen(widget,lowestX,lowestY,highestX,highestY);  
+  }
+
+  toolLastX = x;
+  toolLastY = y; 
+  return TRUE;  
+}
+
+/* configureEvent? -> event when someone resize windows, ... */
+static gint DrawingAreaConfigureEvent(GtkWidget *widget, GdkEventConfigure *event) {
+  int x, y;
+  /* got drawingPixmap? */
+  if (drawingPixmap) gdk_pixmap_unref(drawingPixmap); /* got, erase it */
+
+  /* make a new pixmap */
+  drawingPixmap = gdk_pixmap_new(widget->window,drawingAreaWidth,
+                 drawingAreaHeight,-1);
+
+  /* draw grid into pixmap */
+  for (y = 0;y < bitmap.height;y++)
+    for (x = 0;x < bitmap.width;x++)
+      if (IsPoint(x,y))
+        gdk_draw_pixmap(drawingPixmap,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+                        blackPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+      else
+        gdk_draw_pixmap(drawingPixmap,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+                        greenPointPixmap,0,0,x*(POINTSIZE+1),y*(POINTSIZE+1),-1,-1);
+  
+  return TRUE;
+}
+
+static gint DrawingAreaExposeEvent(GtkWidget *widget, GdkEventExpose *event) {
+  /* got drawingPixmap? */
+  if (drawingPixmap)
+    /* got - draw it */
+    gdk_draw_pixmap(widget->window,widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+                   drawingPixmap,
+                   event->area.x,event->area.y,event->area.x,event->area.y,
+                   event->area.width,event->area.height);
+  return FALSE; 
+}
+
+/* *****************************************
+ * ** TOOLBAR & MENU EVENTS ****************
+ * *****************************************
+ */
+
+static void GetNetworkInfoEvent(GtkWidget *widget) {
+  GSM_Error error;
+  PhoneEvent *e = (PhoneEvent *)g_malloc(sizeof(PhoneEvent));
+  D_NetworkInfo *data = (D_NetworkInfo *)g_malloc(sizeof(D_NetworkInfo));
+
+  /* prepare data for event */
+  data->info = &networkInfo;
+  e->event = Event_GetNetworkInfo;
+  e->data = data;
+
+  /* launch event and wait for result */
+  GUI_InsertEvent(e);
+  pthread_mutex_lock(&getNetworkInfoMutex);
+  pthread_cond_wait(&getNetworkInfoCond,&getNetworkInfoMutex);
+  pthread_mutex_unlock(&getNetworkInfoMutex);
+  error = data->status;
+  g_free(data);
+
+  /* watch for errors */
+  if (error != GE_NONE) {
+    gchar *buf = g_strdup_printf(_("Error getting network info\n(error=%d)"),error);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+  }
+
+  /* set new operator name to combo */
+  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(networkCombo)->entry),
+               GSM_GetNetworkName(networkInfo.NetworkCode));
+}
+
+static void GetLogoEvent(GtkWidget *widget) {
+  int i;
+  GSM_Error error;
+  PhoneEvent *e = (PhoneEvent *) g_malloc(sizeof(PhoneEvent));
+  D_Bitmap *data = (D_Bitmap *)g_malloc(sizeof(D_Bitmap));
+  char *operator = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(networkCombo)->entry));
+
+  /* prepare data for event */
+  strncpy(bitmap.netcode,GSM_GetNetworkCode(operator),7);
+  data->bitmap = &bitmap;
+  e->event = Event_GetBitmap;
+  e->data = data;
+  if (GetModelFeature(FN_CALLERGROUPS)!=0) {
+    for (i = 0;i < 6;i++) 
+      if (strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(callerCombo)->entry)),
+                 xgnokiiConfig.callerGroups[i]) == 0) bitmap.number = i; 
+  }
+  
+  /* launch event and wait for result */
+  GUI_InsertEvent(e);
+  pthread_mutex_lock(&getBitmapMutex);
+  pthread_cond_wait(&getBitmapCond,&getBitmapMutex);
+  pthread_mutex_unlock(&getBitmapMutex);
+  error = data->status;
+  g_free(data);
+
+  /* watch for errors */
+  if (error != GE_NONE) {
+    gchar *buf = g_strdup_printf(_("Error getting bitmap\n(error=%d)"),error);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+  } else {
+    /* no error, draw logo from phone */
+    UpdatePoints(drawingArea);
+  }
+}
+
+static void SetLogoEvent(GtkWidget *widget) {
+  GSM_Error error;
+  PhoneEvent *e = (PhoneEvent *)g_malloc(sizeof(PhoneEvent));
+  D_Bitmap *data = (D_Bitmap *)g_malloc(sizeof(D_Bitmap));
+  char *operator = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(networkCombo)->entry));
+  int i;
+
+  /* prepare data */
+  strncpy(bitmap.netcode,GSM_GetNetworkCode(operator),7);
+  if (bitmap.type == GSM_CallerLogo) {
+    /* above condition must be there, because if you launch logos before
+     * callerGroups are available, you will see segfault - callerGroups not initialized 
+     */
+    if (GetModelFeature(FN_CALLERGROUPS)!=0) {
+      for (i = 0;i < 6;i++) 
+        if (strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(callerCombo)->entry)),
+                   xgnokiiConfig.callerGroups[i]) == 0) bitmap.number = i; 
+    }  
+  }
+  if (bitmap.type == GSM_StartupLogo) {
+    bitmap.number=0;
+  }
+  
+  data->bitmap = &bitmap;
+  e->event = Event_SetBitmap;
+  e->data = data;
+
+  /* launch event and wait for result */
+  GUI_InsertEvent(e);
+  pthread_mutex_lock(&setBitmapMutex);
+  pthread_cond_wait(&setBitmapCond,&setBitmapMutex);
+  pthread_mutex_unlock(&setBitmapMutex);
+  error = data->status;
+  g_free(data);
+
+  /* watch for errors */
+  if (error != GE_NONE) {
+    gchar *buf = g_strdup_printf(_("Error setting bitmap\n(error=%d)"),error);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+  }
+}
+
+static void ClearLogoEvent(GtkWidget *widget) {
+  
+  bitmap.size=GSM_GetBitmapSize(&bitmap);
+  
+  GSM_ClearBitmap(&bitmap);
+
+  UpdatePoints(widget);
+}
+
+static void InvertLogoEvent(GtkWidget *widget) {
+  int column, row;
+
+  for (column = 0;column < bitmap.width;column++)
+    for (row = 0;row < bitmap.height;row++)
+      if (IsPoint(column,row))
+       GSM_ClearPointBitmap(&bitmap,column,row);
+      else
+       GSM_SetPointBitmap(&bitmap,column,row);
+
+  UpdatePoints(widget);
+}
+
+static void UpLogoEvent(GtkWidget *widget) {
+  int column, row;
+
+  GSM_Bitmap tbitmap;
+  
+  tbitmap=bitmap;
+  
+  for (row = 0;row < bitmap.height-1;row++)
+    for (column = 0;column < bitmap.width;column++)
+      if (IsPoint(column,row+1))
+       GSM_SetPointBitmap(&bitmap,column,row);
+      else
+       GSM_ClearPointBitmap(&bitmap,column,row);
+
+  for (column = 0;column < bitmap.width;column++)
+    if (GSM_IsPointBitmap(&tbitmap,column,0))
+      GSM_SetPointBitmap(&bitmap,column,row);
+    else
+      GSM_ClearPointBitmap(&bitmap,column,row);    
+
+  UpdatePoints(widget); 
+}
+
+static void DownLogoEvent(GtkWidget *widget) {
+  int column, row;
+
+  GSM_Bitmap tbitmap;
+  
+  tbitmap=bitmap;
+
+  for (row = bitmap.height-1;row > 0;row--)
+    for (column = 0;column < bitmap.width;column++)
+      if (IsPoint(column,row-1))
+        GSM_SetPointBitmap(&bitmap,column,row);
+      else
+        GSM_ClearPointBitmap(&bitmap,column,row);
+
+  for (column = 0;column < bitmap.width;column++)
+    if (GSM_IsPointBitmap(&tbitmap,column,bitmap.height-1))
+      GSM_SetPointBitmap(&bitmap,column,0);
+    else
+      GSM_ClearPointBitmap(&bitmap,column,0);
+
+  UpdatePoints(widget);
+}
+
+static void LeftLogoEvent(GtkWidget *widget) {
+  int column, row;
+
+  GSM_Bitmap tbitmap;
+  
+  tbitmap=bitmap;
+
+  for (column = 0; column < bitmap.width-1;column++)
+    for (row = 0;row < bitmap.height;row++)
+      if (IsPoint(column+1,row))
+        GSM_SetPointBitmap(&bitmap,column,row);
+      else
+       GSM_ClearPointBitmap(&bitmap,column,row);
+
+  for (row = 0;row < bitmap.height;row++)
+    if (GSM_IsPointBitmap(&tbitmap,0,row))
+      GSM_SetPointBitmap(&bitmap,bitmap.width-1,row);
+    else
+      GSM_ClearPointBitmap(&bitmap,bitmap.width-1,row);
+
+  UpdatePoints(widget);
+}
+
+static void RightLogoEvent(GtkWidget *widget) {
+  int column, row;
+
+  GSM_Bitmap tbitmap;
+  
+  tbitmap=bitmap;
+
+  for (column = bitmap.width-1;column > 0;column--)
+    for (row = 0;row < bitmap.height;row++)
+      if (IsPoint(column-1,row))
+        GSM_SetPointBitmap(&bitmap,column,row);
+      else
+        GSM_ClearPointBitmap(&bitmap,column,row);
+
+  for (row = 0;row < bitmap.height;row++)
+    if (GSM_IsPointBitmap(&tbitmap,bitmap.width-1,row))
+      GSM_SetPointBitmap(&bitmap,0,row);
+    else
+      GSM_ClearPointBitmap(&bitmap,0,row);
+
+  UpdatePoints(widget);
+}
+
+static void FlipVerticalLogoEvent(GtkWidget *widget) {
+  int row, column, temp;
+
+  for (row = 0;row < (bitmap.height/2);row++)
+    for (column = 0;column < bitmap.width;column++) {
+      temp = IsPoint(column,row);
+      if (IsPoint(column,bitmap.height-1-row))
+       GSM_SetPointBitmap(&bitmap,column,row);
+      else
+       GSM_ClearPointBitmap(&bitmap,column,row);
+
+      if (temp)
+       GSM_SetPointBitmap(&bitmap,column,bitmap.height-1-row);
+      else
+       GSM_ClearPointBitmap(&bitmap,column,bitmap.height-1-row);
+    }
+
+  UpdatePoints(widget);
+}
+
+static void FlipHorizontalLogoEvent(GtkWidget *widget) {
+  int row, column, temp;
+
+  for (row = 0;row < bitmap.height;row++)
+    for (column = 0;column < (bitmap.width/2);column++) {
+      temp = IsPoint(column,row);
+
+      if (IsPoint(bitmap.width-1-column,row))
+       GSM_SetPointBitmap(&bitmap,column,row);
+      else
+        GSM_ClearPointBitmap(&bitmap,column,row);
+
+      if (temp)
+       GSM_SetPointBitmap(&bitmap,bitmap.width-1-column,row);
+      else
+       GSM_ClearPointBitmap(&bitmap,bitmap.width-1-column,row);
+    }
+
+  UpdatePoints(widget);
+} 
+
+/* this is launched when tool was changed */
+static gint ToolTypeEvent(GtkWidget *widget) {
+  if (GTK_TOGGLE_BUTTON(buttonBrush)->active) activeTool = TOOL_BRUSH; else
+  if (GTK_TOGGLE_BUTTON(buttonLine)->active) activeTool = TOOL_LINE; else
+  if (GTK_TOGGLE_BUTTON(buttonRectangle)->active) activeTool = TOOL_RECTANGLE; else
+  if (GTK_TOGGLE_BUTTON(buttonFilledRectangle)->active)
+    activeTool = TOOL_FILLED_RECTANGLE;
+
+  return 0;
+}
+
+/* this is launched when logo type was change by buttons on toolbar */
+static gint LogoTypeEvent(GtkWidget *widget) {
+  int clear = 0;
+
+  /* is startupLogo? */
+  if (GTK_TOGGLE_BUTTON(buttonStartup)->active &&
+      bitmap.type != GSM_StartupLogo && bitmap.type != GSM_6210StartupLogo &&
+      bitmap.type != GSM_7110StartupLogo) {
+    /* look for old bitmap type, clean if another */
+    clear = 1;
+    
+    if (!strcmp(xgnokiiConfig.model,"7110")) {
+      GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
+    } else if (!strcmp(xgnokiiConfig.model,"6210") || !strcmp(xgnokiiConfig.model,"6250")) {
+      GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
+    } else {
+      GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
+    }
+  }
+  
+  /* new type is PictureImage */
+  if (GTK_TOGGLE_BUTTON(buttonPicture)->active && bitmap.type != GSM_PictureImage) {
+    /* look for old bitmap type, clean if another */
+    clear = 1;
+    GSM_ResizeBitmap(&bitmap,GSM_PictureImage);
+  }
+  
+  /* new type is callerLogo */
+  if (GTK_TOGGLE_BUTTON(buttonCaller)->active && bitmap.type != GSM_CallerLogo) {
+    /* previous was startup or Picture ? clear and draw batteries, signal, ... */      
+    if (bitmap.type != GSM_OperatorLogo) clear = 1;
+    GSM_ResizeBitmap(&bitmap,GSM_CallerLogo);
+  }
+
+  /* is new type operatorLogo? */
+  if (GTK_TOGGLE_BUTTON(buttonOperator)->active && bitmap.type != GSM_OperatorLogo &&
+      bitmap.type != GSM_7110OperatorLogo) {
+
+    /* previous startup or Picture ? clear and draw batteries, signal, ... */      
+    if (bitmap.type != GSM_CallerLogo) clear = 1;
+
+    if (!strcmp(xgnokiiConfig.model,"7110")) {
+      GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
+    } else if (!strcmp(xgnokiiConfig.model,"6210") || !strcmp(xgnokiiConfig.model,"6250")) {
+      GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
+    } else {
+      GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
+    }
+  }
+
+  /* must clear? */
+  if (clear) {
+    if (previewAvailable) {
+      /* configure event reload pixmap from disk and redraws */
+      gtk_drawing_area_size(GTK_DRAWING_AREA(previewArea),
+                            previewPixmapWidth,previewPixmapHeight);
+    }   
+
+    /* change new drawingArea size */
+    drawingAreaWidth = bitmap.width * (POINTSIZE+1)+1;
+    drawingAreaHeight = bitmap.height * (POINTSIZE+1)+1;
+
+    gtk_drawing_area_size(GTK_DRAWING_AREA(drawingArea),
+                          drawingAreaWidth,drawingAreaHeight);
+  }
+
+  return 0;
+}
+
+static inline void CloseLogosWindow (void) {
+  gtk_widget_hide(GUI_LogosWindow);
+}
+
+void ExportLogoFileMain(gchar *name)
+{
+  GSM_Bitmap tbitmap;
+  GSM_Error error;
+  
+  tbitmap=bitmap;
+
+  strncpy(tbitmap.netcode,GSM_GetNetworkCode(networkInfo.NetworkCode),7);
+
+  error=GSM_SaveBitmapFile(name,&tbitmap);
+  if (error!=GE_NONE) {
+    gchar *buf = g_strdup_printf(_("Error saving file\n(error=%d)"),error);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+  }
+}
+
+static void YesLogoFileExportDialog (GtkWidget *w, gpointer data)
+{
+  gtk_widget_hide (GTK_WIDGET (data));
+  ExportLogoFileMain(exportDialogData.fileName);
+}
+
+static void ExportFileSelected (GtkWidget *w, GtkFileSelection *fs)
+{
+  static YesNoDialog dialog = { NULL, NULL};
+  FILE *f;
+  gchar err[80];
+
+  exportDialogData.fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+  gtk_widget_hide (GTK_WIDGET (fs));
+
+  if ((f = fopen (exportDialogData.fileName, "r")) != NULL)
+  {
+    fclose (f);
+    if (dialog.dialog == NULL)
+    {
+      CreateYesNoDialog (&dialog, YesLogoFileExportDialog, CancelDialog, GUI_LogosWindow);
+      gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
+      g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), exportDialogData.fileName); 
+      gtk_label_set_text (GTK_LABEL(dialog.text), err);
+    }
+    gtk_widget_show (dialog.dialog);
+  }
+  else
+    ExportLogoFileMain(exportDialogData.fileName);
+}
+
+void ImportFileSelected(GtkWidget *w, GtkFileSelection *fs)
+{
+  GSM_Bitmap tbitmap;
+  GSM_Error error=0;
+  
+  gchar *fileName;
+  FILE *f;
+
+  fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+  gtk_widget_hide (GTK_WIDGET (fs));
+
+  if ((f = fopen (fileName, "r")) == NULL) {
+    gchar *buf = g_strdup_printf(_("Can't open file %s for reading !"),fileName);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+    return;
+  }
+
+  error=GSM_ReadBitmapFile(fileName,&tbitmap);
+  if (error!=GE_NONE) {
+    gchar *buf = g_strdup_printf(_("Error reading file\n(error=%d)"),error);
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+    return;
+  }
+
+  exportDialogData.fileName=fileName;
+  
+  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonStartup),false);
+  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonOperator),false);
+  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonCaller),false);
+  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonPicture),false);  
+
+  if (tbitmap.type==GSM_OperatorLogo || tbitmap.type==GSM_7110OperatorLogo) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonOperator),true);
+  if (tbitmap.type==GSM_StartupLogo || tbitmap.type==GSM_7110StartupLogo || tbitmap.type==GSM_6210StartupLogo) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonStartup),true);
+  if (tbitmap.type==GSM_CallerLogo) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonCaller),true);
+  if (tbitmap.type==GSM_PictureImage) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(buttonPicture),true);  
+  
+  memcpy(&bitmap,&tbitmap,sizeof(GSM_Bitmap));
+
+  if (!strcmp(xgnokiiConfig.model,"7110")) { //7110
+    if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_6210StartupLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
+
+    if (bitmap.type==GSM_OperatorLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
+
+  } else if (!strcmp(xgnokiiConfig.model,"6210") || !strcmp(xgnokiiConfig.model,"6250")) { //6210,6250
+    if (bitmap.type==GSM_StartupLogo || bitmap.type==GSM_7110StartupLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
+
+    if (bitmap.type==GSM_OperatorLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_7110OperatorLogo);
+
+  } else {
+    if (bitmap.type==GSM_6210StartupLogo || bitmap.type==GSM_7110StartupLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
+    if (bitmap.type==GSM_7110OperatorLogo)
+      GSM_ResizeBitmap(&bitmap,GSM_OperatorLogo);
+  }  
+  
+  UpdatePoints(drawingArea);
+}
+
+void SaveLogoAs(GtkWidget *widget)
+{
+  FileSelection=gtk_file_selection_new ("Save logo as ...");
+
+  gtk_signal_connect (
+       GTK_OBJECT (GTK_FILE_SELECTION (FileSelection)->ok_button),
+       "clicked", (GtkSignalFunc) ExportFileSelected, FileSelection);
+    
+  gtk_signal_connect_object (
+       GTK_OBJECT(GTK_FILE_SELECTION(FileSelection)->cancel_button),
+       "clicked", (GtkSignalFunc) gtk_widget_destroy,
+        GTK_OBJECT (FileSelection));
+    
+  gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(FileSelection));
+
+  gtk_widget_show(FileSelection);
+}
+
+void SaveLogo(GtkWidget *widget)
+{
+  if (exportDialogData.fileName==NULL) {
+    SaveLogoAs(widget);
+  } else {
+    ExportLogoFileMain(exportDialogData.fileName);
+  }
+}
+
+void OpenLogo(GtkWidget *widget)
+{
+  FileSelection=gtk_file_selection_new ("Open logo...");
+
+  gtk_signal_connect (
+       GTK_OBJECT (GTK_FILE_SELECTION (FileSelection)->ok_button),
+       "clicked", (GtkSignalFunc) ImportFileSelected, FileSelection);
+    
+  gtk_signal_connect_object (
+       GTK_OBJECT(GTK_FILE_SELECTION(FileSelection)->cancel_button),
+       "clicked", (GtkSignalFunc) gtk_widget_destroy,
+        GTK_OBJECT (FileSelection));
+    
+  gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(FileSelection));
+
+  gtk_widget_show(FileSelection);
+}
+
+static GtkItemFactoryEntry logosMenuItems[] = {
+  { NULL,      NULL,           NULL,                    0, "<Branch>"},
+  { NULL,       "<control>O",   OpenLogo,               0, NULL},
+  { NULL,       "<control>S",   SaveLogo,               0, NULL},
+  { NULL,      NULL,           SaveLogoAs,              0, NULL},
+  { NULL,       NULL,           NULL,                    0, "<Separator>"},
+  { NULL,       "<control>G",   GetNetworkInfoEvent,     0, NULL},
+  { NULL,       NULL,           GetLogoEvent,            0, NULL},
+  { NULL,       "<control>T",   SetLogoEvent,            0, NULL},
+  { NULL,       NULL,           NULL,                    0, "<Separator>"},
+  { NULL,       "<control>W",   CloseLogosWindow,        0, NULL},
+  { NULL,      NULL,           NULL,                    0, "<Branch>"},
+  { NULL,      "<control>C",   ClearLogoEvent,          0, NULL},
+  { NULL,      "<control>I",   InvertLogoEvent,         0, NULL},
+  { NULL,      NULL,           NULL,                    0, "<Separator>"},
+  { NULL,      "<control>U",   UpLogoEvent,             0, NULL},
+  { NULL,      "<control>D",   DownLogoEvent,           0, NULL},
+  { NULL,      "<control>L",   LeftLogoEvent,           0, NULL},
+  { NULL,      "<control>R",   RightLogoEvent,          0, NULL},
+  { NULL,      NULL,           NULL,                    0, "<Separator>"},
+  { NULL,      "<control>H",   FlipHorizontalLogoEvent, 0, NULL},
+  { NULL,      "<control>V",   FlipVerticalLogoEvent,   0, NULL},
+};
+
+static void InitLogosMenu (void) {
+ logosMenuItems[0].path = g_strdup(_("/_File"));
+ logosMenuItems[1].path = g_strdup(_("/File/_Open"));
+ logosMenuItems[2].path = g_strdup(_("/File/_Save"));
+ logosMenuItems[3].path = g_strdup(_("/File/Save _as ..."));
+ logosMenuItems[4].path = g_strdup(_("/File/Sep1"));
+ logosMenuItems[5].path = g_strdup(_("/File/_Get operator"));
+ logosMenuItems[6].path = g_strdup(_("/File/Get _logo"));
+ logosMenuItems[7].path = g_strdup(_("/File/Se_t logo"));
+ logosMenuItems[8].path = g_strdup(_("/File/Sep2"));
+ logosMenuItems[9].path = g_strdup(_("/File/_Close"));
+ logosMenuItems[10].path = g_strdup(_("/_Edit"));
+ logosMenuItems[11].path = g_strdup(_("/Edit/_Clear"));
+ logosMenuItems[12].path = g_strdup(_("/Edit/_Invert"));
+ logosMenuItems[13].path = g_strdup(_("/Edit/Sep3"));
+ logosMenuItems[14].path = g_strdup(_("/Edit/_Up logo"));
+ logosMenuItems[15].path = g_strdup(_("/Edit/_Down logo"));
+ logosMenuItems[16].path = g_strdup(_("/Edit/_Left logo"));
+ logosMenuItems[17].path = g_strdup(_("/Edit/_Right logo"));
+ logosMenuItems[18].path = g_strdup(_("/Edit/Sep4"));
+ logosMenuItems[19].path = g_strdup(_("/Edit/Flip _horizontal"));
+ logosMenuItems[20].path = g_strdup(_("/Edit/Flip _vertical"));
+}
+
+void GUI_CreateLogosWindow (void) {
+  int nMenuItems = sizeof (logosMenuItems) / sizeof (logosMenuItems[0]);
+  GtkAccelGroup *accelGroup;
+  GtkItemFactory *itemFactory;
+  GtkWidget *menuBar;
+  GtkWidget *toolBar, *vertToolBar;
+  GtkWidget *vbox;
+  GtkWidget *hbox;
+  GtkWidget *drawingBox;
+  GtkWidget *separator;
+  GdkBitmap *mask;
+
+  GList *glistNetwork = NULL;
+
+  int i = 0;
+  previewPixmapWidth = PREVIEWWIDTH;
+  previewPixmapHeight = PREVIEWHEIGHT;
+  
+  InitLogosMenu();
+
+  /* realize top level window for logos */
+  GUI_LogosWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_policy(GTK_WINDOW(GUI_LogosWindow),1,1,1);
+  gtk_window_set_title(GTK_WINDOW(GUI_LogosWindow),_("Logos"));
+  gtk_signal_connect(GTK_OBJECT(GUI_LogosWindow),"delete_event",
+                     GTK_SIGNAL_FUNC(DeleteEvent),NULL);
+  gtk_widget_realize(GUI_LogosWindow);
+
+  CreateErrorDialog(&errorDialog,GUI_LogosWindow);
+  CreateInfoDialog(&infoDialog,GUI_LogosWindow);
+
+  accelGroup = gtk_accel_group_new();
+  gtk_accel_group_attach(accelGroup,GTK_OBJECT(GUI_LogosWindow));
+  
+  /* create main vbox */
+  vbox = gtk_vbox_new(FALSE,1);
+  gtk_container_add(GTK_CONTAINER(GUI_LogosWindow),vbox);
+  gtk_widget_show(vbox);
+  itemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"<main>",accelGroup);
+  gtk_item_factory_create_items(itemFactory,nMenuItems,logosMenuItems,NULL);
+  menuBar = gtk_item_factory_get_widget(itemFactory,"<main>");
+
+  gtk_box_pack_start(GTK_BOX(vbox),menuBar,FALSE,FALSE,0);
+  gtk_widget_show(menuBar);
+
+  /* toolbar */
+  toolBar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,GTK_TOOLBAR_ICONS);
+  gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolBar),GTK_RELIEF_NORMAL);
+  gtk_toolbar_set_style(GTK_TOOLBAR(toolBar),GTK_TOOLBAR_ICONS);
+
+  gtk_toolbar_append_item(GTK_TOOLBAR(toolBar),NULL,"Clear logo",NULL,
+                 NewPixmap(New_xpm,GUI_LogosWindow->window,
+                 &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 (GtkSignalFunc)ClearLogoEvent,toolBar);
+
+  gtk_toolbar_append_space(GTK_TOOLBAR(toolBar));
+
+  gtk_toolbar_append_item(GTK_TOOLBAR(toolBar),NULL,"Get logo",NULL,
+                 NewPixmap(Read_xpm,GUI_LogosWindow->window,
+                 &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 (GtkSignalFunc)GetLogoEvent,toolBar);
+
+  gtk_toolbar_append_item(GTK_TOOLBAR(toolBar),NULL,"Set logo",NULL,
+                 NewPixmap(Send_xpm,GUI_LogosWindow->window,
+                 &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 (GtkSignalFunc)SetLogoEvent,toolBar);
+
+  gtk_toolbar_append_space(GTK_TOOLBAR(toolBar));
+
+  buttonStartup = gtk_toolbar_append_element(GTK_TOOLBAR(toolBar),
+                 GTK_TOOLBAR_CHILD_RADIOBUTTON,NULL,NULL,"Startup logo",
+                 "",NewPixmap(Startup_logo_xpm,GUI_LogosWindow->window,
+                  &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 GTK_SIGNAL_FUNC(LogoTypeEvent),NULL);
+
+  buttonOperator = gtk_toolbar_append_element(GTK_TOOLBAR(toolBar),
+                  GTK_TOOLBAR_CHILD_RADIOBUTTON,buttonStartup,NULL,"Operator logo",
+                 "",NewPixmap(Operator_logo_xpm,GUI_LogosWindow->window,
+                 &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 GTK_SIGNAL_FUNC(LogoTypeEvent),NULL);
+
+  buttonCaller = gtk_toolbar_append_element(GTK_TOOLBAR(toolBar),
+                 GTK_TOOLBAR_CHILD_RADIOBUTTON,
+                buttonOperator,
+                NULL,"Caller logo",
+                "",NewPixmap(Caller_logo_xpm,GUI_LogosWindow->window,
+                &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                GTK_SIGNAL_FUNC(LogoTypeEvent),NULL);
+
+  buttonPicture = gtk_toolbar_append_element(GTK_TOOLBAR(toolBar),
+                  GTK_TOOLBAR_CHILD_RADIOBUTTON,
+                 buttonOperator,
+                 NULL,"Picture image",
+                 "",NewPixmap(Caller_logo_xpm,GUI_LogosWindow->window,
+                 &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                 GTK_SIGNAL_FUNC(LogoTypeEvent),NULL);
+
+  gtk_toolbar_append_space(GTK_TOOLBAR(toolBar));
+  
+  networkCombo = gtk_combo_new();
+  gtk_combo_set_use_arrows_always(GTK_COMBO(networkCombo),1);
+  while (strcmp(GSM_Networks[i].Name,"unknown"))
+    glistNetwork = g_list_insert_sorted(glistNetwork,GSM_Networks[i++].Name,
+                   (GCompareFunc)strcmp);
+  gtk_combo_set_popdown_strings(GTK_COMBO(networkCombo),glistNetwork);
+  gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(networkCombo)->entry),FALSE);
+  gtk_toolbar_append_widget(GTK_TOOLBAR(toolBar),networkCombo,"","");
+  gtk_widget_show(networkCombo);
+  g_list_free(glistNetwork);
+
+  callerCombo = gtk_combo_new();
+  gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(callerCombo)->entry),FALSE);
+  gtk_toolbar_append_widget(GTK_TOOLBAR(toolBar),callerCombo,"","");
+  gtk_widget_show(callerCombo);
+  
+  gtk_box_pack_start(GTK_BOX(vbox),toolBar,FALSE,FALSE,0);
+  gtk_widget_show(toolBar); 
+
+  /* vertical separator */
+  separator = gtk_hseparator_new();
+  gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(separator),FALSE,FALSE,0);
+  
+  /* create horizontal box for preview and drawing areas */
+  hbox = gtk_hbox_new(FALSE,5);
+  gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
+  gtk_widget_show(hbox);
+  /* set GSM_Bitmap width,height needed for creating drawinArea
+   * we are starting, default is startupLogo
+   */
+  bitmap.type = GSM_7110StartupLogo;
+  bitmap.height = 65;
+  bitmap.width = 96;
+  bitmap.size = bitmap.height * bitmap.width / 8;
+  if (!strcmp(xgnokiiConfig.model,"7110")) { //7110
+    GSM_ResizeBitmap(&bitmap,GSM_7110StartupLogo);
+  } else if (!strcmp(xgnokiiConfig.model,"6210") || !strcmp(xgnokiiConfig.model,"6250")) { //6210,6250
+    GSM_ResizeBitmap(&bitmap,GSM_6210StartupLogo);
+  } else {
+    GSM_ResizeBitmap(&bitmap,GSM_StartupLogo);
+  }
+  drawingAreaWidth = bitmap.width * (POINTSIZE+1)+1;
+  drawingAreaHeight = bitmap.height * (POINTSIZE+1)+1;
+  /* previewArea */
+  previewPixmap = GetPreviewPixmap(GUI_LogosWindow);
+
+  if (previewPixmap != NULL) {
+    previewArea = gtk_drawing_area_new();
+    gtk_drawing_area_size(GTK_DRAWING_AREA(previewArea),
+                          previewPixmapWidth,previewPixmapHeight);
+    
+    greenPixelPixmap = gdk_pixmap_create_from_xpm_d(GUI_LogosWindow->window,
+                       &mask,&GUI_LogosWindow->style->bg[GTK_STATE_NORMAL],
+                       Green_pixel_xpm);
+
+    gtk_signal_connect(GTK_OBJECT(previewArea),"expose_event",
+                      (GtkSignalFunc)PreviewAreaExposeEvent,NULL);
+    gtk_signal_connect(GTK_OBJECT(previewArea),"configure_event",
+                       (GtkSignalFunc)PreviewAreaConfigureEvent,NULL);
+    gtk_signal_connect(GTK_OBJECT(previewArea),"button_press_event",
+                       (GtkSignalFunc)PreviewAreaButtonPressEvent,NULL);
+
+    gtk_widget_set_events(previewArea,GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK );
+
+    gtk_box_pack_start(GTK_BOX(hbox),previewArea,FALSE,FALSE,0);
+    gtk_widget_show(previewArea);
+    
+    /* clear battery, signal, menu & names from preview phone */
+    UpdatePreviewPoints (); 
+
+  } else previewAvailable = 0;
+
+  /* drawingArea */
+  greenPointPixmap = gdk_pixmap_create_from_xpm_d(GUI_LogosWindow->window,
+                 &mask,&GUI_LogosWindow->style->bg[GTK_STATE_NORMAL],Green_point_xpm);
+  blackPointPixmap = gdk_pixmap_create_from_xpm_d(GUI_LogosWindow->window,
+                 &mask,&GUI_LogosWindow->style->bg[GTK_STATE_NORMAL],Black_point_xpm);
+  
+  drawingBox = gtk_vbox_new(FALSE,3);
+  gtk_box_pack_start(GTK_BOX(hbox),drawingBox,FALSE,FALSE,0);
+  gtk_widget_show(drawingBox);
+
+  drawingArea = gtk_drawing_area_new();
+  gtk_drawing_area_size(GTK_DRAWING_AREA(drawingArea),
+                 drawingAreaWidth,drawingAreaHeight);
+
+  gtk_signal_connect(GTK_OBJECT(drawingArea),"configure_event",
+                 (GtkSignalFunc)DrawingAreaConfigureEvent,NULL);
+  gtk_signal_connect(GTK_OBJECT(drawingArea),"expose_event",
+                 (GtkSignalFunc)DrawingAreaExposeEvent,NULL);
+  gtk_signal_connect(GTK_OBJECT(drawingArea),"button_press_event",
+                 (GtkSignalFunc)DrawingAreaButtonPressEvent,NULL);
+  gtk_signal_connect(GTK_OBJECT(drawingArea),"button_release_event",
+                  (GtkSignalFunc)DrawingAreaButtonReleaseEvent,NULL);
+  gtk_signal_connect(GTK_OBJECT(drawingArea),"motion_notify_event",
+                 (GtkSignalFunc)DrawingAreaMotionNotifyEvent,NULL);
+  
+  gtk_widget_set_events(drawingArea,GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK |
+                 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | 
+                  GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
+
+  gtk_box_pack_start(GTK_BOX(drawingBox),drawingArea,FALSE,FALSE,0);
+  gtk_widget_show(drawingArea);
+
+  /* vertical tool bar */
+  vertToolBar = gtk_toolbar_new(GTK_ORIENTATION_VERTICAL,GTK_TOOLBAR_ICONS);
+  gtk_toolbar_set_button_relief(GTK_TOOLBAR(vertToolBar),GTK_RELIEF_NORMAL);
+  gtk_toolbar_set_style(GTK_TOOLBAR(vertToolBar),GTK_TOOLBAR_ICONS);
+
+  buttonBrush = gtk_toolbar_append_element(GTK_TOOLBAR(vertToolBar),
+                GTK_TOOLBAR_CHILD_RADIOBUTTON,NULL,NULL,"Brush tool",
+                "",NewPixmap(Tool_brush_xpm,GUI_LogosWindow->window,
+                &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                GTK_SIGNAL_FUNC(ToolTypeEvent),NULL);
+
+  buttonLine = gtk_toolbar_append_element(GTK_TOOLBAR(vertToolBar),
+               GTK_TOOLBAR_CHILD_RADIOBUTTON,buttonBrush,NULL,"Line tool",
+               "",NewPixmap(Tool_line_xpm,GUI_LogosWindow->window,
+               &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+               GTK_SIGNAL_FUNC(ToolTypeEvent),NULL);
+
+  buttonRectangle = gtk_toolbar_append_element(GTK_TOOLBAR(vertToolBar),
+                    GTK_TOOLBAR_CHILD_RADIOBUTTON,buttonLine,NULL,"Rectangle tool",
+                    "",NewPixmap(Tool_rectangle_xpm,GUI_LogosWindow->window,
+                    &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                    GTK_SIGNAL_FUNC(ToolTypeEvent),NULL);
+
+  buttonFilledRectangle = gtk_toolbar_append_element(GTK_TOOLBAR(vertToolBar),
+                          GTK_TOOLBAR_CHILD_RADIOBUTTON,buttonRectangle,NULL,
+                          "Filled rectangle tool",
+                          "",NewPixmap(Tool_filled_rectangle_xpm,
+                          GUI_LogosWindow->window,
+                          &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                          GTK_SIGNAL_FUNC(ToolTypeEvent),NULL);
+
+  gtk_toolbar_append_space(GTK_TOOLBAR(vertToolBar));
+  gtk_toolbar_append_item(GTK_TOOLBAR(vertToolBar),NULL,"Invert logo",NULL,
+                          NewPixmap(Edit_invert_xpm,GUI_LogosWindow->window,
+                          &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                          (GtkSignalFunc)InvertLogoEvent,vertToolBar);
+
+  gtk_toolbar_append_item(GTK_TOOLBAR(vertToolBar),NULL,"Horizontal flip",NULL,
+                          NewPixmap(Edit_flip_horizontal_xpm,GUI_LogosWindow->window,
+                          &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                          (GtkSignalFunc)FlipHorizontalLogoEvent,vertToolBar);
+
+  gtk_toolbar_append_item(GTK_TOOLBAR(vertToolBar),NULL,"Vertical flip",NULL,
+                          NewPixmap(Edit_flip_vertical_xpm,GUI_LogosWindow->window,
+                          &GUI_LogosWindow->style->bg[GTK_STATE_NORMAL]),
+                          (GtkSignalFunc)FlipVerticalLogoEvent,vertToolBar);
+
+  
+  gtk_box_pack_start(GTK_BOX(hbox),vertToolBar,FALSE,FALSE,0);
+  gtk_widget_show(vertToolBar);
+
+  GUIEventAdd(GUI_EVENT_CALLERS_GROUPS_CHANGED,&GUI_RefreshLogosGroupsCombo);
+}
+
+void GUI_RefreshLogosGroupsCombo (void) {
+  GList *callerList = NULL;
+  int i;
+  
+  for (i = 0;i < 6;i++)
+    callerList = g_list_insert(callerList,xgnokiiConfig.callerGroups[i],i);
+  
+  gtk_combo_set_popdown_strings(GTK_COMBO(callerCombo),callerList);
+  g_list_free(callerList);
+
+  if (!callersGroupsInitialized) callersGroupsInitialized = 1;
+}
+
+void GUI_ShowLogosWindow (void) {
+
+  gtk_widget_show(buttonCaller);
+  gtk_widget_show(callerCombo); 
+
+  if (xgnokiiConfig.callerGroups[0] == NULL) {
+    GUI_Refresh(); 
+    GUI_InitCallerGroupsInf ();
+  }
+
+  if (!callersGroupsInitialized) GUI_RefreshLogosGroupsCombo ();           
+  
+  gtk_widget_show(GUI_LogosWindow);
+
+  if (!previewAvailable && showPreviewErrorDialog) {
+    gchar *buf = g_strdup(_("Load preview pixmap error, feature disabled."));
+    gtk_label_set_text(GTK_LABEL(errorDialog.text),buf);
+    gtk_widget_show(errorDialog.dialog);
+    g_free(buf);
+
+    showPreviewErrorDialog = 0;
+  }
+}