]> source.dussan.org Git - tigervnc.git/commitdiff
Updated bundled fltk with latest set of patches for
authorHenrik Andersson <henrik.andersson@cendio.com>
Fri, 16 Sep 2011 11:51:32 +0000 (11:51 +0000)
committerHenrik Andersson <henrik.andersson@cendio.com>
Fri, 16 Sep 2011 11:51:32 +0000 (11:51 +0000)
following fltk str:  2660, 2636, 2599, 2641...

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4675 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/fltk/FL/Fl_Widget.H
common/fltk/FL/mac.H
common/fltk/FL/win32.H
common/fltk/src/Fl.cxx
common/fltk/src/Fl_cocoa.mm
common/fltk/src/Fl_win32.cxx
common/fltk/src/fl_draw_pixmap.cxx
common/fltk/src/screen_xywh.cxx

index 041b2d36e8bfe1e0ab08efc6f890b82da9a18b1d..5cc6a7960f77f4be7f2d78145ed9fcdba544c343 100644 (file)
@@ -108,7 +108,6 @@ struct FL_EXPORT Fl_Label {
  */
 class FL_EXPORT Fl_Widget {
   friend class Fl_Group;
-  friend class Fl_X;
 
   Fl_Group* parent_;
   Fl_Callback* callback_;
index a8f88dba1c7ed234d66e0808e16e8f7f37a0a57b..f23dc8ecbfd5bf6eb024dd01faa342f6a4c8bbe9 100644 (file)
@@ -213,6 +213,9 @@ class Fl_Mac_App_Menu {
 public:
   /** Localizable text for the "About xxx" application menu item */
   static const char *about;
+  /** Copyright notice for the default about dialog. Will use the information
+   from the bundle if set to an empty string. */
+  static const char *copyright;
   /** Localizable text for the "Print Front Window" application menu item.
    This menu item won't be displayed if Fl_Mac_App_Menu::print 
    is set to an empty string.
index 2c682666c924ff31d76f73c1814fd32518413e77..9297e9f7bc14d70b39a3769b82bc2e2b697185e6 100644 (file)
@@ -82,6 +82,7 @@ public:
   int wait_for_expose;
   HDC private_dc; // used for OpenGL
   HCURSOR cursor;
+  int custom_cursor;
   HDC saved_hdc;  // saves the handle of the DC currently loaded
   // static variables, static functions and member functions
   static Fl_X* first;
index b0cb020f3cdf09d8f588d0d4c22ef05594c3a808..134e4d073ec548ca42e2a25b58faf3213b8bfa8b 100644 (file)
@@ -86,6 +86,7 @@ extern void fl_update_focus(void);
 //
 #if defined(__APPLE__) || defined(FL_DOXYGEN)
 const char *Fl_Mac_App_Menu::about = "About ";
+const char *Fl_Mac_App_Menu::copyright = NULL;
 const char *Fl_Mac_App_Menu::print = "Print Front Window";
 const char *Fl_Mac_App_Menu::services = "Services";
 const char *Fl_Mac_App_Menu::hide = "Hide ";
index 5fd52d68c91b05bb6ea6f5d346877bcdfca95e38..5fad4feccf3d354aa1b89a787297693df1ac5e82 100644 (file)
@@ -1666,6 +1666,7 @@ static void  q_set_window_title(NSWindow *nsw, const char * name, const char *mi
 - (void)rightMouseDragged:(NSEvent *)theEvent;
 - (void)otherMouseDragged:(NSEvent *)theEvent;
 - (void)scrollWheel:(NSEvent *)theEvent;
++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags;
 - (BOOL)handleKeyDown:(NSEvent *)theEvent;
 - (void)keyDown:(NSEvent *)theEvent;
 - (void)keyUp:(NSEvent *)theEvent;
@@ -1754,6 +1755,130 @@ static void  q_set_window_title(NSWindow *nsw, const char * name, const char *mi
 - (void)scrollWheel:(NSEvent *)theEvent {
   cocoaMouseWheelHandler(theEvent);
 }
++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags {
+  const UCKeyboardLayout *layout;
+  OSStatus err;
+
+  layout = NULL;
+
+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
+  TISInputSourceRef keyboard;
+  CFDataRef uchr;
+
+  keyboard = TISCopyCurrentKeyboardInputSource();
+  uchr = (CFDataRef)TISGetInputSourceProperty(keyboard,
+                                              kTISPropertyUnicodeKeyLayoutData);
+  if (uchr == NULL)
+    return nil;
+
+  layout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);
+#else
+  KeyboardLayoutRef old_layout;
+  int kind;
+
+  err = KLGetCurrentKeyboardLayout(&old_layout);
+  if (err != noErr)
+    return nil;
+
+  err = KLGetKeyboardLayoutProperty(old_layout, kKLKind,
+                                    (const void**)&kind);
+  if (err != noErr)
+    return nil;
+
+  // Old, crufty layout format?
+  if (kind == kKLKCHRKind) {
+    void *kchr_layout;
+
+    UInt32 chars, state;
+    char buf[3];
+
+    unichar result[16];
+    ByteCount in_len, out_len;
+
+    err = KLGetKeyboardLayoutProperty(old_layout, kKLKCHRData,
+                                      (const void**)&kchr_layout);
+    if (err != noErr)
+      return nil;
+
+    state = 0;
+
+    keyCode &= 0x7f;
+    modifierFlags &= 0xff00;
+
+    chars = KeyTranslate(kchr_layout, keyCode | modifierFlags, &state);
+
+    buf[0] = (chars >> 16) & 0xff;
+    buf[1] = chars & 0xff;
+    buf[2] = '\0';
+
+    if (buf[0] == '\0') {
+      buf[0] = buf[1];
+      buf[1] = '\0';
+    }
+
+    // The data is now in some layout specific encoding. Need to convert
+    // this to unicode.
+
+    ScriptCode script;
+    TextEncoding encoding;
+    TECObjectRef converter;
+
+    script = (ScriptCode)GetScriptManagerVariable(smKeyScript);
+
+    err = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare,
+                                          kTextRegionDontCare, NULL,
+                                          &encoding);
+    if (err != noErr)
+      return nil;
+
+    err = TECCreateConverter(&converter, encoding, kTextEncodingUnicodeV4_0);
+    if (err != noErr)
+      return nil;
+
+    in_len = strlen(buf);
+    out_len = sizeof(result);
+
+    err = TECConvertText(converter, (ConstTextPtr)buf, in_len, &in_len,
+                         (TextPtr)result, out_len, &out_len);
+
+    TECDisposeConverter(converter);
+
+    if (err != noErr)
+      return nil;
+
+    return [NSString stringWithCharacters:result
+                     length:(out_len / sizeof(unichar))];
+  }
+
+  if ((kind != kKLKCHRuchrKind) && (kind != kKLuchrKind))
+    return nil;
+
+  err = KLGetKeyboardLayoutProperty(old_layout, kKLuchrData,
+                                    (const void**)&layout);
+  if (err != noErr)
+    return nil;
+#endif
+  if (layout == NULL)
+    return nil;
+
+  UInt32 dead_state;
+  UniCharCount max_len, actual_len;
+  UniChar string[255];
+
+  dead_state = 0;
+  max_len = sizeof(string)/sizeof(*string);
+
+  modifierFlags = (modifierFlags >> 8) & 0xff;
+
+  err = UCKeyTranslate(layout, keyCode, kUCKeyActionDown, modifierFlags,
+                       LMGetKbdType(), 0, &dead_state, max_len, &actual_len,
+                       string);
+  if (err != noErr)
+    return nil;
+
+  return [NSString stringWithCharacters:string length:actual_len];
+}
 - (BOOL)handleKeyDown:(NSEvent *)theEvent {
   //NSLog(@"handleKeyDown");
   fl_lock_function();
@@ -1780,19 +1905,47 @@ static void  q_set_window_title(NSWindow *nsw, const char * name, const char *mi
       break;
     }
   }
-  // Don't send cmd-<key> to interpretKeyEvents because it beeps.
-  if (!no_text_key && !(Fl::e_state & FL_META) ) {
+  if (!no_text_key) {
     // The simple keyboard model will ignore insertText, so we need to grab
     // the symbol directly from the event. Note that we still use setMarkedText.
-    if (use_simple_keyboard)
-      [FLView prepareEtext:[theEvent charactersIgnoringModifiers]];
+    if (use_simple_keyboard) {
+      NSString *simple_chars;
+      UInt32 modifiers;
+
+      // We want a "normal" symbol out of the event, which basically means
+      // we only respect the shift and alt/altgr modifiers. Cocoa can help
+      // us if we only wanted shift, but as we also want alt/altgr, we'll
+      // have to do some lookup ourselves. This matches our behaviour on
+      // other platforms.
+
+      modifiers = 0;
+      if ([theEvent modifierFlags] & NSAlphaShiftKeyMask)
+        modifiers |= alphaLock;
+      if ([theEvent modifierFlags] & NSShiftKeyMask)
+        modifiers |= shiftKey;
+      if ([theEvent modifierFlags] & NSAlternateKeyMask)
+        modifiers |= optionKey;
+
+      simple_chars = [FLView keyTranslate:[theEvent keyCode]
+                             withModifierFlags:modifiers];
+      if (simple_chars == nil) {
+        // Something went wrong. Fall back to what Cocoa gave us...
+        simple_chars = [theEvent charactersIgnoringModifiers];
+      }
+
+      [FLView prepareEtext:simple_chars];
+    }
 
     // Then we can let the OS have a stab at it and see if it thinks it
     // should result in some text
-    NSText *edit = [[theEvent window]  fieldEditor:YES forObject:nil];
-    in_key_event = true;
-    [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
-    in_key_event = false;
+
+    // Don't send cmd-<key> to interpretKeyEvents because it beeps.
+    if (!(Fl::e_state & FL_META)) {
+      NSText *edit = [[theEvent window]  fieldEditor:YES forObject:nil];
+      in_key_event = true;
+      [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+      in_key_event = false;
+    }
   }
   //NSLog(@"to text=%@ l=%d", [NSString stringWithUTF8String:Fl::e_text], Fl::e_length);
   int handled = Fl::handle(FL_KEYDOWN, window);
@@ -3078,12 +3231,25 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
 @implementation FLaboutItemTarget
 - (void)showPanel
 {
-    NSDictionary *options;
-    options = [NSDictionary dictionaryWithObjectsAndKeys:
-                            [NSString stringWithFormat:@" GUI with FLTK %d.%d", FL_MAJOR_VERSION,
-                              FL_MINOR_VERSION ], @"Copyright",
-                            nil];
-    [NSApp  orderFrontStandardAboutPanelWithOptions:options];
+    if ((Fl_Mac_App_Menu::copyright == NULL) ||
+        (strlen(Fl_Mac_App_Menu::copyright) > 0)) {
+      NSString *copyright;
+
+      if (Fl_Mac_App_Menu::copyright == NULL)
+        copyright = [NSString stringWithFormat:@" GUI with FLTK %d.%d",
+                              FL_MAJOR_VERSION, FL_MINOR_VERSION ];
+      else
+        copyright = [NSString stringWithUTF8String:Fl_Mac_App_Menu::copyright];
+
+      NSDictionary *options;
+      options = [NSDictionary dictionaryWithObjectsAndKeys:
+                              copyright, @"Copyright",
+                              nil];
+
+      [NSApp orderFrontStandardAboutPanelWithOptions:options];
+    } else {
+      [NSApp orderFrontStandardAboutPanelWithOptions:nil];
+    }
   }
 //#include <FL/Fl_PostScript.H>
 - (void)printPanel
index b36f307c524cc05a2ae9b51acba3937ba186bff2..7fc639e14b917113e9db83b93354d8d6d0a83f02 100644 (file)
@@ -1179,7 +1179,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
       // Pressing Ctrl wreaks havoc with the symbol lookup, so turn that off.
       // But AltGr shows up as Ctrl+Alt in Windows, so keep Ctrl if Alt is
       // active.
-      if (!(keystate[VK_MENU] & (1<<31)))
+      if (!(keystate[VK_MENU] & 0x80))
         keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0;
 
       // We cannot inspect or modify Windows' internal state of the keyboard
@@ -1776,6 +1776,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
   x->region = 0;
   x->private_dc = 0;
   x->cursor = LoadCursor(NULL, IDC_ARROW);
+  x->custom_cursor = 0;
   if (!fl_codepage) fl_get_codepage();
 
   WCHAR *lab = NULL;
@@ -2033,9 +2034,10 @@ void Fl_Window::label(const char *name,const char *iname) {
 
 int Fl_X::set_cursor(Fl_Cursor c) {
   LPSTR n;
+  HCURSOR new_cursor;
 
   if (c == FL_CURSOR_NONE)
-    cursor = NULL;
+    new_cursor = NULL;
   else {
     switch (c) {
     case FL_CURSOR_ARROW:   n = IDC_ARROW; break;
@@ -2065,11 +2067,17 @@ int Fl_X::set_cursor(Fl_Cursor c) {
       return 0;
     }
 
-    cursor = LoadCursor(NULL, n);
-    if (cursor == NULL)
+    new_cursor = LoadCursor(NULL, n);
+    if (new_cursor == NULL)
       return 0;
   }
 
+  if ((cursor != NULL) && custom_cursor)
+    DestroyIcon(cursor);
+
+  cursor = new_cursor;
+  custom_cursor = 0;
+
   SetCursor(cursor);
 
   return 1;
@@ -2079,6 +2087,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
   BITMAPV5HEADER bi;
   HBITMAP bitmap, mask;
   DWORD *bits;
+  HCURSOR new_cursor;
 
   if ((hotx < 0) || (hotx >= image->w()))
     return 0;
@@ -2089,7 +2098,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
 
   bi.bV5Size        = sizeof(BITMAPV5HEADER);
   bi.bV5Width       = image->w();
-  bi.bV5Height      = image->h();
+  bi.bV5Height      = -image->h(); // Negative for top-down
   bi.bV5Planes      = 1;
   bi.bV5BitCount    = 32;
   bi.bV5Compression = BI_BITFIELDS;
@@ -2104,6 +2113,9 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
   bitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
   ReleaseDC(NULL, hdc);
 
+  if (bits == NULL)
+    return 0;
+
   const uchar *i = (const uchar*)*image->data();
   for (int y = 0;y < image->h();y++) {
     for (int x = 0;x < image->w();x++) {
@@ -2129,6 +2141,10 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
 
   // A mask bitmap is still needed even though it isn't used
   mask = CreateBitmap(image->w(),image->h(),1,1,NULL);
+  if (mask == NULL) {
+    DeleteObject(bitmap);
+    return 0;
+  }
 
   ICONINFO ii;
 
@@ -2138,11 +2154,20 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
   ii.hbmMask  = mask;
   ii.hbmColor = bitmap;
 
-  cursor = CreateIconIndirect(&ii);
+  new_cursor = CreateIconIndirect(&ii);
 
   DeleteObject(bitmap);
   DeleteObject(mask);
 
+  if (new_cursor == NULL)
+    return 0;
+
+  if ((cursor != NULL) && custom_cursor)
+    DestroyIcon(cursor);
+
+  cursor = new_cursor;
+  custom_cursor = 1;
+
   SetCursor(cursor);
 
   return 1;
index b02448597e4ba77df6fc0b1c971aca10599ef7a4..8296f6712da7dd0f90121d32eaaf5856675571b5 100644 (file)
@@ -128,7 +128,7 @@ int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) {
   if ((chars_per_pixel < 1) || (chars_per_pixel > 2))
     return 0;
 
-  uchar (*colors)[4] = new uchar [1<<(chars_per_pixel*8)][4];
+  uchar colors[1<<(chars_per_pixel*8)][4];
 
 #ifdef WIN32
   color_count = 0;
@@ -229,7 +229,6 @@ int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) {
     }
   }
   
-  delete [] colors;
   return 1;
 }
 
@@ -243,12 +242,10 @@ int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
   if (!fl_measure_pixmap(cdata, w, h))
     return 0;
 
-  uchar *buffer = new uchar[w*h*4];
+  uchar buffer[w*h*4];
 
-  if (!fl_convert_pixmap(cdata, buffer, bg)) {
-    delete buffer;
+  if (!fl_convert_pixmap(cdata, buffer, bg))
     return 0;
-  }
 
   // FIXME: Hack until fl_draw_image() supports alpha properly
 #ifdef  __APPLE_QUARTZ__
@@ -295,7 +292,6 @@ int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
     }
 #endif
 
-  delete buffer;
   return 1;
 }
 
index 5cf37598606678993916c2b65af214e3bdffa51e..9873634ea1ab30cd005297b8103ceda886416025 100644 (file)
@@ -30,6 +30,7 @@
 #include <FL/x.H>
 #include <config.h>
 
+#define MAX_SCREENS 16
 
 // Number of screens returned by multi monitor aware API; -1 before init
 static int num_screens = -1;
@@ -96,7 +97,7 @@ static void screen_init() {
 
     if (fl_edm) {
       // We do have EnumDisplayMonitors, so lets find out how many monitors...
-      num_screens = GetSystemMetrics(SM_CMONITORS);
+      //num_screens = GetSystemMetrics(SM_CMONITORS);
 
 //      if (num_screens > 1) {
         // If there is more than 1 monitor, enumerate them...
@@ -142,47 +143,62 @@ static void screen_init() {
   }
   num_screens = count;
 }
-#elif HAVE_XINERAMA
-#  include <X11/extensions/Xinerama.h>
+#else
 
-// Screen data...
-static XineramaScreenInfo *screens;
-static float dpi[16][2];
+#if HAVE_XINERAMA
+#  include <X11/extensions/Xinerama.h>
+#endif
+typedef struct {
+   short x_org;
+   short y_org;
+   short width;
+   short height;
+} FLScreenInfo;
+static FLScreenInfo screens[MAX_SCREENS];
+static float dpi[MAX_SCREENS][2];
 
 static void screen_init() {
   if (!fl_display) fl_open_display();
 
+  // FIXME: Rewrite using randr instead
+#if HAVE_XINERAMA
   if (XineramaIsActive(fl_display)) {
-    screens = XineramaQueryScreens(fl_display, &num_screens);
-    int i;
-    // Xlib and Xinerama may disagree on the screen count. Sigh...
-    // Use the minimum of the reported counts.
-    // Use the previous screen's info for non-existent ones.
-    int sc = ScreenCount(fl_display); // Xlib screen count
-    for (i=0; i<num_screens; i++) {
-      int mm = (i < sc) ? DisplayWidthMM(fl_display, i) : 0;
-      dpi[i][0] = mm ? screens[i].width*25.4f/mm : (i > 0) ? dpi[i-1][0] : 0.0f;
-      mm = (i < sc) ? DisplayHeightMM(fl_display, i) : 0;
-      dpi[i][1] = mm ? screens[i].height*25.4f/mm : (i > 0) ? dpi[i-1][1] : 0.0f;
+    static XineramaScreenInfo *xsi = XineramaQueryScreens(fl_display, &num_screens);
+    if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
+
+    /* There's no way to use different DPI for different Xinerama
+       screens. */
+    for (int i=0; i<num_screens; i++) {
+      screens[i].x_org = xsi[i].x_org;
+      screens[i].y_org = xsi[i].y_org;
+      screens[i].width = xsi[i].width;
+      screens[i].height = xsi[i].height;
+
+      int mm = DisplayWidthMM(fl_display, fl_screen);
+      dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f;
+      mm = DisplayHeightMM(fl_display, fl_screen);
+      dpi[i][1] = mm ? screens[i].height*25.4f/mm : 0.0f;
+    }
+  } else 
+#endif
+  { // ! XineramaIsActive()
+    num_screens = ScreenCount(fl_display);
+    if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
+    
+    for (int i=0; i<num_screens; i++) {
+      screens[i].x_org = 0;
+      screens[i].y_org = 0;
+      screens[i].width = DisplayWidth(fl_display, i);
+      screens[i].height = DisplayHeight(fl_display, i);
+
+      int mm = DisplayWidthMM(fl_display, i);
+      dpi[i][0] = mm ? DisplayWidth(fl_display, i)*25.4f/mm : 0.0f;
+      mm = DisplayHeightMM(fl_display, i);
+      dpi[i][1] = mm ? DisplayHeight(fl_display, i)*25.4f/mm : 0.0f;
     }
-  } else { // ! XineramaIsActive()
-    num_screens = 1;
-    int mm = DisplayWidthMM(fl_display, fl_screen);
-    dpi[0][0] = mm ? Fl::w()*25.4f/mm : 0.0f;
-    mm = DisplayHeightMM(fl_display, fl_screen);
-    dpi[0][1] = mm ? Fl::h()*25.4f/mm : dpi[0][0];
   }
 }
-#else
-static float dpi[2];
-static void screen_init() {
-  num_screens = 1;
-  if (!fl_display) fl_open_display();
-  int mm = DisplayWidthMM(fl_display, fl_screen);
-  dpi[0] = mm ? Fl::w()*25.4f/mm : 0.0f;
-  mm = DisplayHeightMM(fl_display, fl_screen);
-  dpi[1] = mm ? Fl::h()*25.4f/mm : dpi[0];  
-}
+
 #endif // WIN32
 
 
@@ -258,20 +274,11 @@ void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int n) {
     H = Fl::h();
   }
 #else
-#if HAVE_XINERAMA
-  if (num_screens > 0 && screens) {
+  if (num_screens > 0) {
     X = screens[n].x_org;
     Y = screens[n].y_org;
     W = screens[n].width;
     H = screens[n].height;
-  } else
-#endif // HAVE_XINERAMA
-  {
-    /* Fallback if something is broken (or no Xinerama)... */
-    X = 0;
-    Y = 0;
-    W = DisplayWidth(fl_display, fl_screen);
-    H = DisplayHeight(fl_display, fl_screen);
   }
 #endif // WIN32
 }
@@ -333,16 +340,11 @@ void Fl::screen_dpi(float &h, float &v, int n)
     h = dpi_h[n];
     v = dpi_v[n];
   }
-#elif HAVE_XINERAMA
+#else
   if (n >= 0 && n < num_screens) {
     h = dpi[n][0];
     v = dpi[n][1];
   }
-#else
-  if (n >= 0 && n < num_screens) {
-    h = dpi[0];
-    v = dpi[1];
-  }
 #endif // WIN32
 }