Description: Unbrand NX Agent Startup Screen / Brand X2Go Agent Startup Screen
 When launched with NX Agent flavour, the startup screen gets unbranded by
 this patch (the !M logo does not get shown).
 .
 When launched with X2Go Agent flavour, the startup screen gets branded
 with the X2GO logo.
Forwarded: not-needed
Author: Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de>
Last-Update: 2012-01-11
--- a/nx-X11/programs/Xserver/hw/nxagent/Splash.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Splash.c
@@ -35,6 +35,7 @@
 #include "Windows.h"
 #include "Atoms.h"
 #include "Trap.h"
+#include "Init.h"
 
 /*
  * Set here the required log level.
@@ -53,6 +54,7 @@
 int nxagentLogoWhite;
 int nxagentLogoRed;
 int nxagentLogoBlack;
+int nxagentLogoGray;
 
 void nxagentPaintLogo(Window win, GC gc, int scale, int width, int height);
 
@@ -166,6 +168,15 @@
   XPoint    m[12];
   int w, h, c, w2, h2;
 
+  /*
+   * Show only X2GO Logo when running as X2Go Agent
+   */
+   if(! nxagentX2go)
+   {
+     nxagentPixmapLogo = 0L;
+     return;
+   }
+
   #ifdef DEBUG
   fprintf(stderr, "nxagenShowtLogo: Got called.\n");
   #endif
@@ -218,75 +229,146 @@
   XSetForeground(nxagentDisplay, gc, nxagentLogoRed);
   XSetBackground(nxagentDisplay, gc, nxagentLogoWhite);
 
-  rect[0].x = w2-10*c;               rect[0].y = h2-8*c;
-  rect[1].x = w2-10*c;               rect[1].y = h2+8*c;
-  rect[2].x = w2+10*c;               rect[2].y = h2+8*c;
-  rect[3].x = w2+10*c;               rect[3].y = h2-8*c;
+  /*
+   * Draw X2GO Logo
+   */
 
+  /*
+   * Begin 'X'.
+   */
+
+  XSetForeground(nxagentDisplay, gc, nxagentLogoGray);
+  XSetBackground(nxagentDisplay, gc, nxagentLogoWhite);
+  rect[0].x = w2-7*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2-8*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2-4*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2-3*c;               rect[3].y = h2+3*c;
   XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
-  #ifdef NXAGENT_LOGO_DEBUG
-  fprintf(stderr, "filled red rect\n");
-  #endif
+  rect[0].x = w2-4*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2-3*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2-7*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2-8*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
-  rect[0].x = w2-9*c;               rect[0].y = h2-7*c;
-  rect[1].x = w2-9*c;               rect[1].y = h2+7*c;
-  rect[2].x = w2+9*c;               rect[2].y = h2+7*c;
-  rect[3].x = w2+9*c;               rect[3].y = h2-7*c;
+  /*
+   * End 'X'.
+   */
 
-  XSetForeground(nxagentDisplay, gc, nxagentLogoWhite);
-  XSetBackground(nxagentDisplay, gc, nxagentLogoRed);
+  /*
+   * Start '2'.
+   */
+
+  rect[0].x = w2-2*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2-1*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2-1*c;               rect[2].y = h2-3*c;
+  rect[3].x = w2-2*c;               rect[3].y = h2-3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
+
+  rect[0].x = w2-2*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+2*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+2*c;               rect[2].y = h2-4*c;
+  rect[3].x = w2-2*c;               rect[3].y = h2-4*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
+  rect[0].x = w2+1*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+2*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+2*c;               rect[2].y = h2-2*c;
+  rect[3].x = w2+1*c;               rect[3].y = h2-2*c;
   XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
+  rect[0].x = w2+2*c;               rect[0].y = h2-2*c;
+  rect[1].x = w2+1*c;               rect[1].y = h2-2*c;
+  rect[2].x = w2-2*c;               rect[2].y = h2+2*c;
+  rect[3].x = w2-1*c;               rect[3].y = h2+2*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
+
+
+  rect[0].x = w2-2*c;               rect[0].y = h2+2*c;
+  rect[1].x = w2+2*c;               rect[1].y = h2+2*c;
+  rect[2].x = w2+2*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2-2*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
   /*
-   * Begin 'M'.
+   * End '2'.
    */
 
-  m[0].x = w2-3*c;  m[0].y = h2-5*c;
-  m[1].x = w2+7*c;  m[1].y = h2-5*c;
-  m[2].x = w2+7*c;  m[2].y = h2+5*c;
-  m[3].x = w2+5*c;  m[3].y = h2+5*c;
-  m[4].x = w2+5*c;  m[4].y = h2-3*c;
-  m[5].x = w2+3*c;  m[5].y = h2-3*c;
-  m[6].x = w2+3*c;  m[6].y = h2+5*c;
-  m[7].x = w2+1*c;  m[7].y = h2+5*c;
-  m[8].x = w2+1*c;  m[8].y = h2-3*c;
-  m[9].x = w2-1*c;  m[9].y = h2-3*c;
-  m[10].x = w2-1*c; m[10].y = h2+5*c;
-  m[11].x = w2-3*c; m[11].y = h2+5*c;
+  /*
+   * Start 'G'.
+   */
 
-  XSetForeground(nxagentDisplay, gc, nxagentLogoRed);
-  XSetBackground(nxagentDisplay, gc, nxagentLogoWhite);
+  rect[0].x = w2+3*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+7*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+7*c;               rect[2].y = h2-4*c;
+  rect[3].x = w2+3*c;               rect[3].y = h2-4*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
-  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, m, 12, Nonconvex, CoordModeOrigin);
+  rect[0].x = w2+3*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+4*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+4*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2+3*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
+  rect[0].x = w2+3*c;               rect[0].y = h2+2*c;
+  rect[1].x = w2+7*c;               rect[1].y = h2+2*c;
+  rect[2].x = w2+7*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2+3*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
+
+  rect[0].x = w2+6*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+7*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+7*c;               rect[2].y = h2-3*c;
+  rect[3].x = w2+6*c;               rect[3].y = h2-3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
+
+  rect[0].x = w2+6*c;               rect[0].y = h2-0*c;
+  rect[1].x = w2+7*c;               rect[1].y = h2-0*c;
+  rect[2].x = w2+7*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2+6*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
+
+  rect[0].x = w2+5*c;               rect[0].y = h2-1*c;
+  rect[1].x = w2+7*c;               rect[1].y = h2-1*c;
+  rect[2].x = w2+7*c;               rect[2].y = h2+0*c;
+  rect[3].x = w2+5*c;               rect[3].y = h2+0*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
   /*
-   * End 'M'.
+   * End 'G'.
    */
 
   /*
-   * Begin '!'.
+   * Start 'O'.
    */
 
-  rect[0].x = w2-7*c;               rect[0].y = h2-5*c;
-  rect[1].x = w2-5*c;               rect[1].y = h2-5*c;
-  rect[2].x = w2-5*c;               rect[2].y = h2+2*c;
-  rect[3].x = w2-7*c;               rect[3].y = h2+2*c;
+  rect[0].x = w2+8*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+12*c;              rect[1].y = h2-5*c;
+  rect[2].x = w2+12*c;              rect[2].y = h2-4*c;
+  rect[3].x = w2+8*c;               rect[3].y = h2-4*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
+  rect[0].x = w2+8*c;               rect[0].y = h2+3*c;
+  rect[1].x = w2+12*c;              rect[1].y = h2+3*c;
+  rect[2].x = w2+12*c;              rect[2].y = h2+2*c;
+  rect[3].x = w2+8*c;               rect[3].y = h2+2*c;
   XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
-  rect[0].x = w2-7*c;               rect[0].y = h2+3*c;
-  rect[1].x = w2-5*c;               rect[1].y = h2+3*c;
-  rect[2].x = w2-5*c;               rect[2].y = h2+5*c;
-  rect[3].x = w2-7*c;               rect[3].y = h2+5*c;
+  rect[0].x = w2+8*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+9*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+9*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2+8*c;               rect[3].y = h2+3*c;
+  XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
+  rect[0].x = w2+11*c;               rect[0].y = h2-5*c;
+  rect[1].x = w2+12*c;               rect[1].y = h2-5*c;
+  rect[2].x = w2+12*c;               rect[2].y = h2+3*c;
+  rect[3].x = w2+11*c;               rect[3].y = h2+3*c;
   XFillPolygon(nxagentDisplay, nxagentPixmapLogo, gc, rect, 4, Convex, CoordModeOrigin);
 
   /*
-   * End 'M'.
+   * End 'O'.
    */
 
+
   XSetWindowBackgroundPixmap(nxagentDisplay, win, nxagentPixmapLogo);
 
   #ifdef NXAGENT_LOGO_DEBUG
--- a/nx-X11/programs/Xserver/hw/nxagent/Display.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Display.c
@@ -1430,22 +1430,10 @@
   g = pV.green_mask;
   b = pV.blue_mask;
 
-  if (!pV.red_mask || !pV.green_mask || !pV.blue_mask)
-  {
-    nxagentLogoBlack = 0x000000;
-    nxagentLogoRed   = 0xff0000;
-    nxagentLogoWhite = 0xffffff;
-  }
-  else
-  {
-    for (or=0, off=0x800000; (r&(off>>or)) == 0; or++);
-    for (og=0, off=0x800000; (g&(off>>og)) == 0; og++);
-    for (ob=0, off=0x800000; (b&(off>>ob)) == 0; ob++);
-
-    nxagentLogoRed   = nxagentLogoColor(0xff0000);
-    nxagentLogoBlack = nxagentLogoColor(0x000000);
-    nxagentLogoWhite = 0xffffff;
-  }
+  nxagentLogoBlack = 0x000000;
+  nxagentLogoRed   = 0xff0000;
+  nxagentLogoWhite = 0xffffff;
+  nxagentLogoGray  = 0x222222;
 
   #ifdef WATCH
 
@@ -2696,22 +2684,10 @@
   g = pV.green_mask;
   b = pV.blue_mask;
 
-  if (!pV.red_mask || !pV.green_mask || !pV.blue_mask)
-  {
-    nxagentLogoBlack = 0x000000;
-    nxagentLogoRed   = 0xff0000;
-    nxagentLogoWhite = 0xffffff;
-  }
-  else
-  {
-    for (or=0, off=0x800000; (r&(off>>or)) == 0; or++);
-    for (og=0, off=0x800000; (g&(off>>og)) == 0; og++);
-    for (ob=0, off=0x800000; (b&(off>>ob)) == 0; ob++);
-
-    nxagentLogoRed   = nxagentLogoColor(0xff0000);
-    nxagentLogoBlack = nxagentLogoColor(0x000000);
-    nxagentLogoWhite = 0xffffff;
-  }
+  nxagentLogoBlack = 0x000000;
+  nxagentLogoRed   = 0xff0000;
+  nxagentLogoWhite = 0xffffff;
+  nxagentLogoGray  = 0x222222;
 
   useXpmIcon = nxagentMakeIcon(nxagentDisplay, &nxagentIconPixmap, &nxagentIconShape);
 
--- a/nx-X11/programs/Xserver/hw/nxagent/Splash.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Splash.h
@@ -33,6 +33,7 @@
 extern int nxagentLogoWhite;
 extern int nxagentLogoRed;
 extern int nxagentLogoBlack;
+extern int nxagentLogoGray;
 
 extern Window nxagentSplashWindow;
 
--- a/nx-X11/programs/Xserver/os/oscolor.c
+++ b/nx-X11/programs/Xserver/os/oscolor.c
@@ -53,7 +53,19 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-static char* nxAltRgbPaths[] = {"/etc/nxagent/rgb", "/usr/share/nx/rgb", "/usr/local/share/nx/rgb", "/usr/NX/share/rgb", "/usr/share/X11/rgb", "/etc/X11/rgb"};
+/* FIXME: we need more intelligent code (like provided by the nxagentX2go
+ * var in hw/nxagent/Init.h) to detect our current runtime mode (running
+ * as x2goagent, running as nxagent)
+ */
+static char* nxAltRgbPaths[] = {"/etc/x2go/rgb", \
+                                "/usr/share/x2go/rgb", \
+                                "/usr/local/share/x2go/rgb", \
+                                "/etc/nxagent/rgb", \
+                                "/usr/share/nx/rgb", \
+                                "/usr/local/share/nx/rgb", \
+                                "/usr/NX/share/rgb", \
+                                "/usr/share/X11/rgb", \
+                                "/etc/X11/rgb"};
 static char _NXRgbPath[1024];
 
 #endif
--- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
@@ -62,6 +62,7 @@
 
 #include "globals.h"
 #include "property.h"
+#include "Init.h"
 
 #include <X11/extensions/XKB.h>
 
@@ -138,8 +139,11 @@
 #ifndef XKB_ALTERNATE_BASE_DIRECTORY
 #define XKB_ALTERNATE_BASE_DIRECTORY   "/usr/X11R6/lib/X11/xkb"
 #endif
-#ifndef XKB_CONFIG_FILE
-#define XKB_CONFIG_FILE      "/etc/nxagent/nxagent.keyboard"
+#ifndef XKB_CONFIG_FILE_NX
+#define XKB_CONFIG_FILE_NX   "/etc/nxagent/nxagent.keyboard"
+#endif
+#ifndef XKB_CONFIG_FILE_X2GO
+#define XKB_CONFIG_FILE_X2GO "/etc/x2go/x2goagent.keyboard"
 #endif
 #ifndef XKB_DFLT_RULES_FILE
 #define XKB_DFLT_RULES_FILE  "xfree86"
@@ -988,7 +992,10 @@
 
         XkbGetControls(nxagentDisplay, XkbAllControlsMask, xkb);
 
-        nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE);
+        if (nxagentX2go)
+            nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_X2GO);
+        else
+            nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_NX);
 
         nxagentXkbConfigFilePath = malloc((nxagentXkbConfigFilePathSize + 1) * sizeof(char));
 
@@ -997,7 +1004,10 @@
           FatalError("nxagentKeyboardProc: malloc failed.");
         }
 
-        strcpy(nxagentXkbConfigFilePath, XKB_CONFIG_FILE);
+        if (nxagentX2go)
+            nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_X2GO);
+        else
+            nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_NX);
  
         #ifdef TEST
         fprintf(stderr, "nxagentKeyboardProc: nxagentXkbConfigFilePath [%s].\n",
