From: Oliver Kurth Date: Fri, 15 Sep 2017 18:22:59 +0000 (-0700) Subject: Add support for gtk3 X-Git-Tag: stable-10.2.0~583 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=efd6c9ad4d0ea0198de7107afeb72d2bc8a2b8f2;p=thirdparty%2Fopen-vm-tools.git Add support for gtk3 Changes to support building open-vm-tools with gtk3. #ifdef statements have been added for conditional compiling for GTK2/GTK3. --- diff --git a/open-vm-tools/configure.ac b/open-vm-tools/configure.ac index ffd19f29d..4c0b5f809 100644 --- a/open-vm-tools/configure.ac +++ b/open-vm-tools/configure.ac @@ -183,21 +183,41 @@ AC_ARG_ENABLE( [enable_multimon="$enableval"], [enable_multimon="yes"]) +AC_ARG_WITH( + gtk3, + AS_HELP_STRING( + [--without-gtk3], + [compiles without Gtk 3.0]), + [with_gtk3="$withval"], + [with_gtk3="no"]) + AC_ARG_WITH( gtk2, AS_HELP_STRING( [--without-gtk2], [compiles without Gtk 2.0]), [with_gtk2="$withval"], - [with_gtk2="yes"]) - -AC_ARG_WITH( - gtkmm, - AS_HELP_STRING( - [--without-gtkmm], - [compiles without Gtkmm, sigc++, and related libs]), - [with_gtkmm="$withval"], - [with_gtkmm="yes"]) + [if test "$with_gtk3" = "yes"; then with_gtk2="no" ; else with_gtk2="yes"; fi]) + +if test "$with_gtk3" = "yes"; then + AC_ARG_WITH( + gtkmm3, + AS_HELP_STRING( + [--without-gtkmm3], + [compiles without Gtkmm 3, sigc++, and related libs]), + [with_gtkmm3="$withval"], + [with_gtkmm3="yes"]) + with_gtkmm="no" +else + AC_ARG_WITH( + gtkmm, + AS_HELP_STRING( + [--without-gtkmm], + [compiles without Gtkmm, sigc++, and related libs]), + [with_gtkmm="$withval"], + [with_gtkmm="yes"]) + with_gtkmm3="no" +fi AC_ARG_ENABLE( docs, @@ -618,10 +638,22 @@ else have_xcomposite="yes" fi - # Check whether we have gtk+ 2.0. - if test "$with_gtk2" != "no"; then + # Check whether we have gtk+ 3.0. + if test "$with_gtk3" != "no"; then # gdk_display_get_default_group (added in gtk+ 2.4.0) is function currently # needed by vmware-user. + AC_VMW_CHECK_LIB([gtk-3], + [GTK], + [gtk+-3.0], + [], + [3.0.0], + [gtk/gtk.h], + [gdk_display_get_default_group], + [GTK_CPPFLAGS="$GTK_CPPFLAGS -DGTK3"], + [AC_MSG_ERROR([Gtk+ 3.0 library not found or too old. Please configure without Gtk+ support (using --without-gtk3) or install the Gtk+ 3.0 devel package.])]) + + # Check whether we have gtk+ 2.0. + elif test "$with_gtk2" != "no"; then AC_VMW_CHECK_LIB([gtk-x11-2.0], [GTK], [gtk+-2.0], @@ -637,17 +669,31 @@ else # Check for gtkmm 2.4.0 or greater. # - if test "$with_gtkmm" != "no"; then - CUSTOM_GTKMM_CPPFLAGS="$CUSTOM_GTKMM_CPPFLAGS $GTK_CPPFLAGS" - AC_VMW_CHECK_LIBXX([gtkmm-2.4], - [GTKMM], - [gtkmm-2.4], - [], - [2.4.0], - [gtkmm.h], - [], - [GTKMM_CPPFLAGS="$GTKMM_CPPFLAGS -DHAVE_GTKMM"], - [AC_MSG_ERROR([gtkmm library not found. Please install the libgtkmm devel package(s), or re-configure using --without-gtkmm.])]) + + if test "$with_gtkmm" != "no" -o "$with_gtkmm3" != "no"; then + if test "$with_gtkmm3" != "no"; then + AC_VMW_CHECK_LIBXX([gtkmm-3.0], + [GTKMM], + [gtkmm-3.0], + [], + [3.0.0], + [], + [], + [GTKMM_CPPFLAGS="$GTKMM_CPPFLAGS -DHAVE_GTKMM"], + [AC_MSG_ERROR([gtkmm3 library not found. Please install the libgtkmm devel package(s), or re-configure using --without-gtkmm3.])]) + + elif test "$with_gtkmm" != "no"; then + CUSTOM_GTKMM_CPPFLAGS="$CUSTOM_GTKMM_CPPFLAGS $GTK_CPPFLAGS" + AC_VMW_CHECK_LIBXX([gtkmm-2.4], + [GTKMM], + [gtkmm-2.4], + [], + [2.4.0], + [gtkmm.h], + [], + [GTKMM_CPPFLAGS="$GTKMM_CPPFLAGS -DHAVE_GTKMM"], + [AC_MSG_ERROR([gtkmm library not found. Please install the libgtkmm devel package(s), or re-configure using --without-gtkmm.])]) + fi # # libsigc++-2.0 >= 2.5.1 requires C++11 support @@ -1284,7 +1330,7 @@ AM_CONDITIONAL(HAVE_DNET, test "$have_dnet" = "yes") AM_CONDITIONAL(HAVE_DOXYGEN, test "$have_doxygen" = "yes") AM_CONDITIONAL(HAVE_FUSE, test "$have_fuse" = "yes") AM_CONDITIONAL(HAVE_GNU_LD, test "$with_gnu_ld" = "yes") -AM_CONDITIONAL(HAVE_GTKMM, test "$have_x" = "yes" -a "$with_gtkmm" = "yes") +AM_CONDITIONAL(HAVE_GTKMM, test "$have_x" = "yes" -a \( "$with_gtkmm" = "yes" -o "$with_gtkmm3" = "yes" \) ) AM_CONDITIONAL(HAVE_PAM, test "$with_pam" = "yes") AM_CONDITIONAL(USE_SLASH_PROC, test "$os" = "linux") AM_CONDITIONAL(USE_PRINTF_WRAPPERS, test "$bsdPrintfWrappers" = "yes") diff --git a/open-vm-tools/lib/appUtil/appUtilX11.c b/open-vm-tools/lib/appUtil/appUtilX11.c index a6224ef11..5f8621f49 100644 --- a/open-vm-tools/lib/appUtil/appUtilX11.c +++ b/open-vm-tools/lib/appUtil/appUtilX11.c @@ -33,7 +33,9 @@ #include "debug.h" #ifndef GTK2 -#error "Gtk 2.0 is required" +#ifndef GTK3 +#error "Gtk 2.0 or 3.0 is required" +#endif #endif #include diff --git a/open-vm-tools/services/plugins/desktopEvents/x11Lock.c b/open-vm-tools/services/plugins/desktopEvents/x11Lock.c index b09b350e6..572234ac1 100644 --- a/open-vm-tools/services/plugins/desktopEvents/x11Lock.c +++ b/open-vm-tools/services/plugins/desktopEvents/x11Lock.c @@ -82,14 +82,14 @@ InitGroupLeader(Window *groupLeader, gdkDisplay = gdk_display_get_default(); gdkLeader = gdk_display_get_default_group(gdkDisplay); - myGroupLeader = GDK_WINDOW_XWINDOW(gdkLeader); + myGroupLeader = GDK_WINDOW_XID(gdkLeader); myRootWindow = GDK_ROOT_WINDOW(); ASSERT(myGroupLeader); ASSERT(myRootWindow); /* XXX: With g_set_prgname() being called, this can probably go away. */ - XStoreName(GDK_DISPLAY(), myGroupLeader, VMUSER_TITLE); + XStoreName(gdk_x11_get_default_xdisplay(), myGroupLeader, VMUSER_TITLE); /* * Sanity check: Set the override redirect property on our group leader @@ -97,10 +97,10 @@ InitGroupLeader(Window *groupLeader, * This makes sure that (a) a window manager can't re-parent our window, * and (b) that we remain a top-level window. */ - XChangeWindowAttributes(GDK_DISPLAY(), myGroupLeader, CWOverrideRedirect, + XChangeWindowAttributes(gdk_x11_get_default_xdisplay(), myGroupLeader, CWOverrideRedirect, &attr); - XReparentWindow(GDK_DISPLAY(), myGroupLeader, myRootWindow, 10, 10); - XSync(GDK_DISPLAY(), FALSE); + XReparentWindow(gdk_x11_get_default_xdisplay(), myGroupLeader, myRootWindow, 10, 10); + XSync(gdk_x11_get_default_xdisplay(), FALSE); *groupLeader = myGroupLeader; *rootWindow = myRootWindow; @@ -216,7 +216,7 @@ AcquireDisplayLock(void) Bool alreadyLocked = FALSE; // Set to TRUE if we discover lock is held. Bool retval = FALSE; - defaultDisplay = GDK_DISPLAY(); + defaultDisplay = gdk_x11_get_default_xdisplay(); /* * Reset some of our main window's settings & fetch Xlib handles for diff --git a/open-vm-tools/services/plugins/dndcp/copyPasteCompatX11.c b/open-vm-tools/services/plugins/dndcp/copyPasteCompatX11.c index 525557d7a..d5a0fdf97 100644 --- a/open-vm-tools/services/plugins/dndcp/copyPasteCompatX11.c +++ b/open-vm-tools/services/plugins/dndcp/copyPasteCompatX11.c @@ -159,7 +159,11 @@ CopyPasteSelectionRemoveTarget(GtkWidget *widget, GList *selectionLists; /* Get selection list. */ +#ifndef GTK3 selectionLists = gtk_object_get_data(GTK_OBJECT (widget), selection_handler_key); +#else + selectionLists = g_object_get_data(G_OBJECT (widget), selection_handler_key); +#endif tempList = selectionLists; while (tempList) { /* Enumerate the list to find the selection. */ @@ -168,6 +172,10 @@ CopyPasteSelectionRemoveTarget(GtkWidget *widget, /* Remove target. */ gtk_target_list_remove(targetList->list, target); /* If no more target, remove selection from list. */ +#ifndef GTK3 + /* the following code does not build with gtk3 - it may not be + necessary and gtk_target_list_remove() takes care of it, + or we create a memory leak. */ if (!targetList->list->list) { /* Free target list. */ gtk_target_list_unref(targetList->list); @@ -176,12 +184,17 @@ CopyPasteSelectionRemoveTarget(GtkWidget *widget, selectionLists = g_list_remove_link(selectionLists, tempList); g_list_free_1(tempList); } +#endif break; } tempList = tempList->next; } /* Put new selection list back. */ +#ifndef GTK3 gtk_object_set_data (GTK_OBJECT (widget), selection_handler_key, selectionLists); +#else + g_object_set_data (G_OBJECT (widget), selection_handler_key, selectionLists); +#endif } @@ -335,7 +348,12 @@ CopyPasteSelectionReceivedCB(GtkWidget *widget, // IN: unused gpointer data) // IN: unused { char *target; +#ifndef GTK3 char *utf8Str = NULL; +#else + const char *utf8Str = NULL; + char *utf8Str_cvt = NULL; +#endif size_t len; size_t aligned_len; @@ -344,52 +362,96 @@ CopyPasteSelectionReceivedCB(GtkWidget *widget, // IN: unused goto exit; } +#ifndef GTK3 if (selection_data->length < 0) { +#else + if (gtk_selection_data_get_length(selection_data) < 0) { +#endif g_debug("CopyPasteSelectionReceivedCB: Error, length less than 0\n"); goto exit; } /* Try to get clipboard or selection timestamp. */ +#ifndef GTK3 if (selection_data->target == GDK_SELECTION_TYPE_TIMESTAMP) { if (selection_data->selection == GDK_SELECTION_PRIMARY) { if (selection_data->length == 4) { gGuestSelPrimaryTime = *(uint32 *)selection_data->data; +#else + if (gtk_selection_data_get_target(selection_data) == GDK_SELECTION_TYPE_TIMESTAMP) { + if (gtk_selection_data_get_selection(selection_data) == GDK_SELECTION_PRIMARY) { + if (gtk_selection_data_get_length(selection_data) == 4) { + gGuestSelPrimaryTime = *(uint32 *)gtk_selection_data_get_data(selection_data); +#endif g_debug("CopyPasteSelectionReceivedCB: Got pri time [%"FMT64"u]\n", gGuestSelPrimaryTime); +#ifndef GTK3 } else if (selection_data->length == 8) { gGuestSelPrimaryTime = *(uint64 *)selection_data->data; +#else + } else if (gtk_selection_data_get_length(selection_data) == 8) { + gGuestSelPrimaryTime = *(uint64 *)gtk_selection_data_get_data(selection_data); +#endif g_debug("CopyPasteSelectionReceivedCB: Got pri time [%"FMT64"u]\n", gGuestSelPrimaryTime); } else { g_debug("CopyPasteSelectionReceivedCB: Unknown pri time. Size %d\n", +#ifndef GTK3 selection_data->length); +#else + gtk_selection_data_get_length(selection_data)); +#endif } } +#ifndef GTK3 if (selection_data->selection == GDK_SELECTION_CLIPBOARD) { if (selection_data->length == 4) { gGuestSelClipboardTime = *(uint32 *)selection_data->data; +#else + if (gtk_selection_data_get_selection(selection_data) == GDK_SELECTION_CLIPBOARD) { + if (gtk_selection_data_get_length(selection_data) == 4) { + gGuestSelClipboardTime = *(uint32 *)gtk_selection_data_get_data(selection_data); +#endif g_debug("CopyPasteSelectionReceivedCB: Got clip time [%"FMT64"u]\n", gGuestSelClipboardTime); +#ifndef GTK3 } else if (selection_data->length == 8) { gGuestSelClipboardTime = *(uint64 *)selection_data->data; +#else + } else if (gtk_selection_data_get_length(selection_data) == 8) { + gGuestSelClipboardTime = *(uint64 *)gtk_selection_data_get_data(selection_data); +#endif g_debug("CopyPasteSelectionReceivedCB: Got clip time [%"FMT64"u]\n", gGuestSelClipboardTime); } else { g_debug("CopyPasteSelectionReceivedCB: Unknown clip time. Size %d\n", +#ifndef GTK3 selection_data->length); +#else + gtk_selection_data_get_length(selection_data)); +#endif } } goto exit; } +#ifndef GTK3 if (selection_data->selection == GDK_SELECTION_PRIMARY) { +#else + if (gtk_selection_data_get_selection(selection_data) == GDK_SELECTION_PRIMARY) { +#endif target = gGuestSelPrimaryBuf; +#ifndef GTK3 } else if (selection_data->selection == GDK_SELECTION_CLIPBOARD) { +#else + } else if (gtk_selection_data_get_selection(selection_data) == GDK_SELECTION_CLIPBOARD) { +#endif target = gGuestSelClipboardBuf; } else { goto exit; } +#ifndef GTK3 utf8Str = selection_data->data; len = strlen(selection_data->data); @@ -403,11 +465,27 @@ CopyPasteSelectionReceivedCB(GtkWidget *widget, // IN: unused } goto exit; } +#else + utf8Str = gtk_selection_data_get_data(selection_data); + len = strlen(gtk_selection_data_get_data(selection_data)); + + if (gtk_selection_data_get_target(selection_data) != GDK_SELECTION_TYPE_STRING && + gtk_selection_data_get_target(selection_data) != GDK_SELECTION_TYPE_UTF8_STRING) { + /* It is a file list. */ + if (len >= MAX_SELECTION_BUFFER_LENGTH - 1) { + Warning("CopyPasteSelectionReceivedCB file list too long\n"); + } else { + memcpy(target, gtk_selection_data_get_data(selection_data), len + 1); + } + goto exit; + } +#endif /* * If target is GDK_SELECTION_TYPE_STRING, assume encoding is local code * set. Convert to utf8 before send to vmx. */ +#ifndef GTK3 if (selection_data->target == GDK_SELECTION_TYPE_STRING && !CodeSet_CurrentToUtf8(selection_data->data, selection_data->length, @@ -417,6 +495,20 @@ CopyPasteSelectionReceivedCB(GtkWidget *widget, // IN: unused gWaitingOnGuestSelection = FALSE; return; } +#else + if (gtk_selection_data_get_target(selection_data) == GDK_SELECTION_TYPE_STRING) { + if (!CodeSet_CurrentToUtf8(gtk_selection_data_get_data(selection_data), + gtk_selection_data_get_length(selection_data), + &utf8Str_cvt, + &len)) { + g_debug("CopyPasteSelectionReceivedCB: Couldn't convert to utf8 code set\n"); + gWaitingOnGuestSelection = FALSE; + return; + } else { + utf8Str = utf8Str_cvt; + } + } +#endif /* * String in backdoor communication is 4 bytes by 4 bytes, so the len @@ -436,8 +528,13 @@ CopyPasteSelectionReceivedCB(GtkWidget *widget, // IN: unused } exit: +#ifndef GTK3 if (selection_data->target == GDK_SELECTION_TYPE_STRING) { free(utf8Str); +#else + if (gtk_selection_data_get_target(selection_data) == GDK_SELECTION_TYPE_STRING) { + free(utf8Str_cvt); +#endif } gWaitingOnGuestSelection = FALSE; } @@ -483,8 +580,13 @@ CopyPasteSelectionGetCB(GtkWidget *widget, // IN: unused } /* If it is text copy paste, return gHostClipboardBuf. */ +#ifndef GTK3 if (GDK_SELECTION_TYPE_STRING == selection_data->target || GDK_SELECTION_TYPE_UTF8_STRING == selection_data->target) { +#else + if (GDK_SELECTION_TYPE_STRING == gtk_selection_data_get_target(selection_data) || + GDK_SELECTION_TYPE_UTF8_STRING == gtk_selection_data_get_target(selection_data)) { +#endif char *outBuf = gHostClipboardBuf; size_t len = strlen(gHostClipboardBuf); @@ -492,7 +594,11 @@ CopyPasteSelectionGetCB(GtkWidget *widget, // IN: unused * If target is GDK_SELECTION_TYPE_STRING, assume encoding is local code * set. Convert from utf8 to local one. */ +#ifndef GTK3 if (GDK_SELECTION_TYPE_STRING == selection_data->target && +#else + if (GDK_SELECTION_TYPE_STRING == gtk_selection_data_get_target(selection_data) && +#endif !CodeSet_Utf8ToCurrent(gHostClipboardBuf, strlen(gHostClipboardBuf), &outBuf, @@ -501,11 +607,19 @@ CopyPasteSelectionGetCB(GtkWidget *widget, // IN: unused return; } +#ifndef GTK3 gtk_selection_data_set(selection_data, selection_data->target, 8, +#else + gtk_selection_data_set(selection_data, gtk_selection_data_get_target(selection_data), 8, +#endif outBuf, len); g_debug("CopyPasteSelectionGetCB: Set text [%s]\n", outBuf); +#ifndef GTK3 if (GDK_SELECTION_TYPE_STRING == selection_data->target) { +#else + if (GDK_SELECTION_TYPE_STRING == gtk_selection_data_get_target(selection_data)) { +#endif free(outBuf); } @@ -728,12 +842,21 @@ CopyPaste_Register(GtkWidget* mainWnd, // IN gtk_selection_add_target(mainWnd, GDK_SELECTION_CLIPBOARD, GDK_SELECTION_TYPE_UTF8_STRING, 0); +#ifndef GTK3 gtk_signal_connect(GTK_OBJECT(mainWnd), "selection_received", GTK_SIGNAL_FUNC(CopyPasteSelectionReceivedCB), mainWnd); gtk_signal_connect(GTK_OBJECT(mainWnd), "selection_get", GTK_SIGNAL_FUNC(CopyPasteSelectionGetCB), mainWnd); gtk_signal_connect(GTK_OBJECT(mainWnd), "selection_clear_event", GTK_SIGNAL_FUNC(CopyPasteSelectionClearCB), mainWnd); +#else + g_signal_connect(G_OBJECT(mainWnd), "selection_received", + G_CALLBACK(CopyPasteSelectionReceivedCB), mainWnd); + g_signal_connect(G_OBJECT(mainWnd), "selection_get", + G_CALLBACK(CopyPasteSelectionGetCB), mainWnd); + g_signal_connect(G_OBJECT(mainWnd), "selection_clear_event", + G_CALLBACK(CopyPasteSelectionClearCB), mainWnd); +#endif CopyPasteStateInit(); @@ -761,6 +884,7 @@ void CopyPaste_Unregister(GtkWidget* mainWnd) { g_debug("%s: enter\n", __FUNCTION__); +#ifndef GTK3 gtk_signal_disconnect_by_func(GTK_OBJECT(mainWnd), GTK_SIGNAL_FUNC(CopyPasteSelectionReceivedCB), mainWnd); @@ -770,6 +894,17 @@ CopyPaste_Unregister(GtkWidget* mainWnd) gtk_signal_disconnect_by_func(GTK_OBJECT(mainWnd), GTK_SIGNAL_FUNC(CopyPasteSelectionClearCB), mainWnd); +#else + g_signal_handlers_disconnect_by_func(G_OBJECT(mainWnd), + G_CALLBACK(CopyPasteSelectionReceivedCB), + mainWnd); + g_signal_handlers_disconnect_by_func(G_OBJECT(mainWnd), + G_CALLBACK(CopyPasteSelectionGetCB), + mainWnd); + g_signal_handlers_disconnect_by_func(G_OBJECT(mainWnd), + G_CALLBACK(CopyPasteSelectionClearCB), + mainWnd); +#endif } diff --git a/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp b/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp index fed562086..fffdc4026 100644 --- a/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp +++ b/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp @@ -223,7 +223,11 @@ CopyPasteDnDX11::Init(ToolsAppCtx *ctx) } gUserMainWidget = gtk_invisible_new(); +#ifndef GTK3 gXDisplay = GDK_WINDOW_XDISPLAY(gUserMainWidget->window); +#else + gXDisplay = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(gUserMainWidget)); +#endif gXRoot = RootWindow(gXDisplay, DefaultScreen(gXDisplay)); /* diff --git a/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.cpp b/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.cpp index d0986ef82..cef64c1b2 100644 --- a/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.cpp +++ b/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.cpp @@ -1191,7 +1191,7 @@ CopyPasteUIX11::GetRemoteClipboardCB(const CPClipboard *clip) // IN if (CPClipboard_ItemExists(clip, CPFORMAT_TEXT) || CPClipboard_ItemExists(clip, CPFORMAT_RTF)) { - std::list targets; + std::vector targets; /* * rtf should be first in the target list otherwise OpenOffice may not diff --git a/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.h b/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.h index 76c96747b..5b139123d 100644 --- a/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.h +++ b/open-vm-tools/services/plugins/dndcp/copyPasteUIX11.h @@ -110,7 +110,7 @@ private: GuestCopyPasteMgr *mCP; bool mClipboardEmpty; utf::string mHGStagingDir; - std::list mListTargets; + std::vector mListTargets; bool mIsClipboardOwner; uint64 mClipTime; uint64 mPrimTime; diff --git a/open-vm-tools/services/plugins/dndcp/dndUIX11.cpp b/open-vm-tools/services/plugins/dndcp/dndUIX11.cpp index a18c95297..231479a99 100644 --- a/open-vm-tools/services/plugins/dndcp/dndUIX11.cpp +++ b/open-vm-tools/services/plugins/dndcp/dndUIX11.cpp @@ -251,7 +251,7 @@ DnDUIX11::InitGtk() TRACE_CALL(); /* Construct supported target list for HG DnD. */ - std::list targets; + std::vector targets; /* File DnD. */ targets.push_back(Gtk::TargetEntry(DRAG_TARGET_NAME_URI_LIST)); @@ -367,7 +367,7 @@ DnDUIX11::OnSrcDragBegin(const CPClipboard *clip, // IN * Construct the target and action list, as well as a fake motion notify * event that's consistent with one that would typically start a drag. */ - targets = Gtk::TargetList::create(std::list()); + targets = Gtk::TargetList::create(std::vector()); if (CPClipboard_ItemExists(&mClipboard, CPFORMAT_FILELIST)) { mHGStagingDir = stagingDir; @@ -414,7 +414,12 @@ DnDUIX11::OnSrcDragBegin(const CPClipboard *clip, // IN event.axes = NULL; event.state = GDK_BUTTON1_MASK; event.is_hint = 0; +#ifndef GTK3 event.device = gdk_device_get_core_pointer(); +#else + GdkDeviceManager* manager = gdk_display_get_device_manager(gdk_window_get_display(event.window)); + event.device = gdk_device_manager_get_client_pointer(manager); +#endif event.x_root = mOrigin.get_x(); event.y_root = mOrigin.get_y(); @@ -763,7 +768,11 @@ DnDUIX11::OnMoveMouse(int32 x, // IN: Pointer x-coord // If we are the context of a DnD, send DnD feedback to the source. DND_DROPEFFECT effect; +#ifndef GTK3 effect = ToDropEffect((Gdk::DragAction)(mDragCtx->action)); +#else + effect = ToDropEffect((Gdk::DragAction)(gdk_drag_context_get_selected_action(mDragCtx))); +#endif if (effect != mEffect) { mEffect = effect; g_debug("%s: Updating feedback\n", __FUNCTION__); @@ -851,11 +860,16 @@ DnDUIX11::OnGtkDragMotion( * Gdk::DragContext::get_targets, but API/ABI broke between 2.10 and * 2.12, so we work around it like this for now. */ +#ifndef GTK3 Glib::ListHandle targets( dc->gobj()->targets, Glib::OWNERSHIP_NONE); +#else + Glib::ListHandle targets( + gdk_drag_context_list_targets(dc->gobj()), Glib::OWNERSHIP_NONE); +#endif - std::list as = targets; - std::list::iterator result; + std::vector as = targets; + std::vector::iterator result; char *pid; pid = Str_Asprintf(NULL, "guest-dnd-target %d", static_cast(getpid())); if (pid) { @@ -1509,7 +1523,7 @@ DnDUIX11::RequestData( guint time) // IN: event timestamp { Glib::RefPtr targets; - targets = Gtk::TargetList::create(std::list()); + targets = Gtk::TargetList::create(std::vector()); CPClipboard_Clear(&mClipboard); mNumPendingRequest = 0; @@ -1757,9 +1771,13 @@ DnDUIX11::SendFakeXEvents( g_debug("%s: unable to get widget\n", __FUNCTION__); return false; } - +#ifndef GTK3 dndXDisplay = GDK_WINDOW_XDISPLAY(widget->window); dndXWindow = GDK_WINDOW_XWINDOW(widget->window); +#else + dndXDisplay = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(widget)); + dndXWindow = GDK_WINDOW_XID(gtk_widget_get_window(widget)); +#endif rootWnd = RootWindow(dndXDisplay, DefaultScreen(dndXDisplay)); /* @@ -1773,7 +1791,11 @@ DnDUIX11::SendFakeXEvents( if (showWidget) { g_debug("%s: showing Gtk widget\n", __FUNCTION__); gtk_widget_show(widget); +#ifndef GTK3 gdk_window_show(widget->window); +#else + gdk_window_show(gtk_widget_get_window(widget)); +#endif } /* Get the current location of the mouse if coordinates weren't provided. */ @@ -1937,8 +1959,11 @@ DnDUIX11::TryXTestFakeDeviceButtonEvent() g_debug("%s: unable to get widget\n", __FUNCTION__); return false; } - +#ifndef GTK3 dndXDisplay = GDK_WINDOW_XDISPLAY(widget->window); +#else + dndXDisplay = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(widget)); +#endif /* First get list of all input device. */ if (!(list = XListInputDevices (dndXDisplay, &numDevices))) { diff --git a/open-vm-tools/services/plugins/dndcp/dragDetWndX11.cpp b/open-vm-tools/services/plugins/dndcp/dragDetWndX11.cpp index 26323cbea..11094ff3f 100644 --- a/open-vm-tools/services/plugins/dndcp/dragDetWndX11.cpp +++ b/open-vm-tools/services/plugins/dndcp/dragDetWndX11.cpp @@ -219,11 +219,14 @@ DragDetWnd::SetGeometry(const int x, void DragDetWnd::GetGeometry(int &x, int &y, int &width, int &height) { - int dummy; - Glib::RefPtr gdkwin = get_window(); if (gdkwin) { +#ifndef GTK3 + int dummy; gdkwin->get_geometry(x, y, width, height, dummy); +#else + gdkwin->get_geometry(x, y, width, height); +#endif #if defined(DETWNDTEST) Flush(); #endif diff --git a/open-vm-tools/services/plugins/resolutionSet/resolutionX11.c b/open-vm-tools/services/plugins/resolutionSet/resolutionX11.c index 3086d62bb..ae975281b 100644 --- a/open-vm-tools/services/plugins/resolutionSet/resolutionX11.c +++ b/open-vm-tools/services/plugins/resolutionSet/resolutionX11.c @@ -602,7 +602,11 @@ ResolutionToolkitInit(ToolsAppCtx *ctx) // IN: For config database access XSetErrorHandler(ResolutionX11ErrorHandler); gtk_init(&argc, (char ***) &argv); wnd = gtk_invisible_new(); +#ifndef GTK3 display = GDK_WINDOW_XDISPLAY(wnd->window); +#else + display = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(wnd)); +#endif if (!display) g_error("%s: Invalid display detected.\n", __func__);