Add gyk-osx.patch to repo, remove #ifdefs made obsolete by the patch.
authorNick Mainsbridge <beatroute@iprimus.com.au>
Sun, 26 Oct 2008 08:27:30 +0000 (08:27 +0000)
committerNick Mainsbridge <beatroute@iprimus.com.au>
Sun, 26 Oct 2008 08:27:30 +0000 (08:27 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@4013 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/utils.cc
patches/gtk-osx.patch [new file with mode: 0644]

index 5ceacc48e1b2c7bb4a6104d0ad1c1699c4a9039d..0ca761559937f99f7528737b9a80bbc73a657583 100644 (file)
@@ -396,11 +396,9 @@ set_color (Gdk::Color& c, int rgb)
        c.set_rgb((rgb >> 16)*256, ((rgb & 0xff00) >> 8)*256, (rgb & 0xff)*256);
 }
 
-#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
 extern "C" {
        gboolean gdk_quartz_possibly_forward (GdkEvent*);
 }
-#endif
 
 bool
 key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
@@ -473,14 +471,12 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                                return true;
                        }
 
-#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
                        int oldval = ev->keyval;
                        ev->keyval = fakekey;
                        if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
                                return true;
                        }
                        ev->keyval = oldval;
-#endif
                }
        }
 
@@ -497,11 +493,9 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tactivate, then propagate\n";
                }
 #endif
-#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
                if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
                        return true;
                }
-#endif
                if (!gtk_window_activate_key (win, ev)) {
 #ifdef DEBUG_ACCELERATOR_HANDLING
                        if (debug) {
@@ -532,11 +526,9 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tpropagation didn't handle, so activate\n";
                }
 #endif
-#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
                if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
                        return true;
                }
-#endif
                return gtk_window_activate_key (win, ev);
        } else {
 #ifdef DEBUG_ACCELERATOR_HANDLING
diff --git a/patches/gtk-osx.patch b/patches/gtk-osx.patch
new file mode 100644 (file)
index 0000000..12c29a6
--- /dev/null
@@ -0,0 +1,281 @@
+Index: gtk/gtktreeview.c
+===================================================================
+--- gtk/gtktreeview.c  (revision 21475)
++++ gtk/gtktreeview.c  (working copy)
+@@ -99,6 +99,9 @@
+   guint source_set : 1;
+   guint dest_set : 1;
++
++  GtkTreePath* path;
++  GtkTreeModel* model;
+ };
+@@ -2534,6 +2537,7 @@
+       gboolean row_double_click = FALSE;
+       gboolean rtl;
+       gboolean node_selected;
++      gboolean edits_allowed;
+       /* Empty tree? */
+       if (tree_view->priv->tree == NULL)
+@@ -2643,9 +2647,17 @@
+       tree_view->priv->focus_column = column;
++      /* ARDOUR HACK */
++
++      if (g_object_get_data (G_OBJECT(tree_view), "mouse-edits-require-mod1")) {
++            edits_allowed = (event->state & GDK_MOD1_MASK);
++      } else {
++            /* regular GTK design: do edits if none of the default modifiers are active  */
++            edits_allowed = !(event->state & gtk_accelerator_get_default_mod_mask ());
++      }
++
+       /* decide if we edit */
+-      if (event->type == GDK_BUTTON_PRESS && event->button == 1 &&
+-        !(event->state & gtk_accelerator_get_default_mod_mask ()))
++      if (event->type == GDK_BUTTON_PRESS && event->button == 1 && edits_allowed)
+       {
+         GtkTreePath *anchor;
+         GtkTreeIter iter;
+@@ -3010,8 +3022,7 @@
+       if (tree_view->priv->button_pressed_node == tree_view->priv->prelight_node &&
+           GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT))
+       {
+-        GtkTreePath *path = NULL;
+-
++          GtkTreePath *path = NULL;
+         path = _gtk_tree_view_find_path (tree_view,
+                                          tree_view->priv->button_pressed_tree,
+                                          tree_view->priv->button_pressed_node);
+@@ -6967,6 +6978,19 @@
+   return path;
+ }
++#ifdef GDK_WINDOWING_QUARTZ
++
++static void
++gtk_tree_view_catch_drag_begin (GtkWidget* widget,
++                              GdkDragContext* context,
++                              gpointer user_data)
++{
++      TreeViewDragInfo* drag_info = (TreeViewDragInfo*) user_data;
++      set_source_row (context, drag_info->model, drag_info->path);
++}
++
++#endif
++
+ static gboolean
+ gtk_tree_view_maybe_begin_dragging_row (GtkTreeView      *tree_view,
+                                         GdkEventMotion   *event)
+@@ -6979,6 +7003,7 @@
+   gint cell_x, cell_y;
+   GtkTreeModel *model;
+   gboolean retval = FALSE;
++  gint drag_begin_id;
+   di = get_info (tree_view);
+@@ -7025,13 +7050,26 @@
+   retval = TRUE;
++#ifdef GDK_WINDOWING_QUARTZ
++
++  /* catch drag-being signal */
++  di->model = model;
++  di->path = path;
++  drag_begin_id = g_signal_connect (tree_view, "drag-begin", G_CALLBACK (gtk_tree_view_catch_drag_begin), (gpointer) di);
++#endif
++
+   context = gtk_drag_begin (widget,
+                             gtk_drag_source_get_target_list (widget),
+                             di->source_actions,
+                             button,
+                             (GdkEvent*)event);
++#ifndef GDK_WINDOWING_QUARTZ
+   set_source_row (context, model, path);
++#else 
++  /* disconnect drag-begin and catch drag-end */
++  g_signal_handler_disconnect (tree_view, drag_begin_id);
++#endif
+  out:
+   if (path)
+Index: gtk/gtkquartz.c
+===================================================================
+--- gtk/gtkquartz.c    (revision 21475)
++++ gtk/gtkquartz.c    (working copy)
+@@ -24,6 +24,23 @@
+ #include "gtkalias.h"
+ NSImage *
++_gtk_quartz_create_image_from_drawable (GdkDrawable* drawable)
++{
++      GdkPixbuf* pixbuf;
++      NSImage* image = NULL;
++
++      pixbuf = gdk_pixbuf_get_from_drawable (NULL, drawable, NULL, 
++                                                0, 0, /* src */
++                                                0, 0, /* dst */
++                                                -1, -1);
++      if (pixbuf) 
++        image = _gtk_quartz_create_image_from_pixbuf (pixbuf);
++      
++      return image;
++}
++
++
++NSImage *
+ _gtk_quartz_create_image_from_pixbuf (GdkPixbuf *pixbuf)
+ {
+   CGColorSpaceRef colorspace;
+Index: gtk/gtkquartz.h
+===================================================================
+--- gtk/gtkquartz.h    (revision 21475)
++++ gtk/gtkquartz.h    (working copy)
+@@ -41,6 +41,7 @@
+                                                   GtkSelectionData *selection_data);
+                       
+ NSImage *_gtk_quartz_create_image_from_pixbuf (GdkPixbuf *pixbuf);
++NSImage *_gtk_quartz_create_image_from_drawable (GdkDrawable *drawable);
+                           
+ G_END_DECLS
+Index: gtk/gtkdnd-quartz.c
+===================================================================
+--- gtk/gtkdnd-quartz.c        (revision 21475)
++++ gtk/gtkdnd-quartz.c        (working copy)
+@@ -1086,13 +1086,13 @@
+               GdkPixbuf *pixbuf;
+               pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 1, 1);
+-              gdk_pixbuf_fill (pixbuf, 0xffffff);
+-          
+-              gtk_drag_set_icon_pixbuf (context,
+-                                        pixbuf,
++              gdk_pixbuf_fill (pixbuf, 0xffffff);
++
++              gtk_drag_set_icon_pixbuf (context,
++                                        pixbuf,
+                                         0, 0);
+-              g_object_unref (pixbuf);
++              g_object_unref (pixbuf);
+             }
+           break;
+         case GTK_IMAGE_PIXBUF:
+@@ -1668,7 +1668,20 @@
+                         gint               hot_x,
+                         gint               hot_y)
+ {
+-  g_warning ("gtk_drag_set_icon_pixmap is not supported on Mac OS X");
++  GdkPixbuf *pixbuf;
++  
++  g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
++  g_return_if_fail (context->is_source);
++  g_return_if_fail (GDK_IS_COLORMAP (colormap));
++  g_return_if_fail (GDK_IS_PIXMAP (pixmap));
++  
++  pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, colormap,
++                                       0, 0, /* src */
++                                       0, 0, /* dst */
++                                       -1, -1);
++  
++  gtk_drag_set_icon_pixbuf (context, pixbuf, hot_x, hot_y);
++  g_object_unref (pixbuf);
+ }
+ /**
+Index: gdk/quartz/gdkevents-quartz.c
+===================================================================
+--- gdk/quartz/gdkevents-quartz.c      (revision 21475)
++++ gdk/quartz/gdkevents-quartz.c      (working copy)
+@@ -112,6 +112,18 @@
+   return ((GdkEventPrivate *) event)->windowing_data;
+ }
++/* A category that exposes the protected carbon event for an NSEvent. */
++@interface NSEvent (GdkQuartzNSEvent)
++- (void *)gdk_quartz_event_ref;
++@end 
++
++@implementation NSEvent (GdkQuartzNSEvent)
++- (void *)gdk_quartz_event_ref
++{
++  return _eventRef;
++}
++@end
++
+ void 
+ _gdk_events_init (void)
+ {
+@@ -1670,6 +1682,65 @@
+ }
+ static gboolean
++_gdk_quartz_possibly_forward_accelerator (NSEvent* nsevent)
++{
++  /* Special-case menu shortcut events. We create command events for
++   * those and forward to the corresponding menu.
++   */
++  if ((!_gdk_quartz_keyboard_grab_window ||
++       (_gdk_quartz_keyboard_grab_window && keyboard_grab_owner_events)) &&
++      [nsevent type] == NSKeyDown)
++    {
++      EventRef event_ref;
++      MenuRef menu_ref;
++      MenuItemIndex index;
++
++      event_ref = [nsevent gdk_quartz_event_ref];
++      if (IsMenuKeyEvent (NULL, event_ref,
++                          kMenuEventQueryOnly, 
++                          &menu_ref, &index))
++        {
++          MenuCommand menu_command;
++          HICommand hi_command;
++
++          if (GetMenuItemCommandID (menu_ref, index, &menu_command) != noErr)
++            return FALSE;
++   
++          hi_command.commandID = menu_command;
++          hi_command.menu.menuRef = menu_ref;
++          hi_command.menu.menuItemIndex = index;
++
++          CreateEvent (NULL, kEventClassCommand, kEventCommandProcess, 
++                       0, kEventAttributeUserEvent, &event_ref);
++          SetEventParameter (event_ref, kEventParamDirectObject, 
++                             typeHICommand, 
++                             sizeof (HICommand), &hi_command);
++
++          SendEventToEventTarget (event_ref, GetMenuEventTarget (menu_ref));
++
++          ReleaseEvent (event_ref);
++
++          return TRUE;
++        }
++    }
++  return FALSE;
++}
++
++gboolean
++gdk_quartz_possibly_forward (GdkEvent* event)
++{
++  NSEvent *nsevent;
++  g_return_val_if_fail (event != NULL, FALSE);
++
++  nsevent = ((GdkEventPrivate*)event)->windowing_data;
++
++  if (nsevent)
++    return _gdk_quartz_possibly_forward_accelerator (nsevent);
++
++  return FALSE;
++}
++
++static gboolean
+ gdk_event_translate (NSEvent *nsevent)
+ {
+   NSWindow *nswindow;