int S9xOpenGLDisplayDriver::query_availability () { GdkDisplay *gdk_display = gdk_display_get_default (); #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) { return 1; } #endif #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY (gdk_display)) { Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display); if (glXQueryExtension (dpy, NULL, NULL) == True) { return 1; } } #endif if (gui_config->hw_accel == HWA_OPENGL) gui_config->hw_accel = HWA_NONE; return 0; }
std::unique_ptr<PlatformDisplay> PlatformDisplay::createPlatformDisplay() { #if PLATFORM(GTK) #if defined(GTK_API_VERSION_2) return std::make_unique<PlatformDisplayX11>(GDK_DISPLAY_XDISPLAY(gdk_display_get_default())); #else GdkDisplay* display = gdk_display_manager_get_default_display(gdk_display_manager_get()); #if PLATFORM(X11) if (GDK_IS_X11_DISPLAY(display)) return std::make_unique<PlatformDisplayX11>(GDK_DISPLAY_XDISPLAY(display)); #endif #if PLATFORM(WAYLAND) if (GDK_IS_WAYLAND_DISPLAY(display)) return std::make_unique<PlatformDisplayWayland>(gdk_wayland_display_get_wl_display(display)); #endif #endif #elif PLATFORM(EFL) && defined(HAVE_ECORE_X) return std::make_unique<PlatformDisplayX11>(static_cast<Display*>(ecore_x_display_get())); #elif PLATFORM(WIN) return std::make_unique<PlatformDisplayWin>(); #endif #if PLATFORM(X11) return std::make_unique<PlatformDisplayX11>(); #endif ASSERT_NOT_REACHED(); return nullptr; }
static void *GLAPIENTRY glMPGetNativeDisplay(const gchar *name) { GdkDisplay *display = gdk_display_get_default(); #ifdef GDK_WINDOWING_WAYLAND if(GDK_IS_WAYLAND_DISPLAY(display) && g_strcmp0(name, "wl") == 0) return gdk_wayland_display_get_wl_display(display); #endif #ifdef GDK_WINDOWING_X11 if(GDK_IS_X11_DISPLAY(display) && g_strcmp0(name, "x11") == 0) return gdk_x11_display_get_xdisplay(display); #endif return NULL; }
static void* get_proc_address(void* ctx, const gchar* name) { GdkDisplay* display = gdk_display_get_default(); #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY(display)) return eglGetProcAddress(name); #endif #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY(display)) return (void*)(intptr_t) glXGetProcAddressARB((const GLubyte*) name); #endif g_return_val_if_reached(NULL); }
static bool HasClientDecor(GtkWidget* widget) { GdkDisplay* display = gtk_widget_get_display(widget); #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY(display)) return true; #endif #ifdef GDK_WINDOWING_MIR if (GDK_IS_MIR_DISPLAY(display)) return true; #endif #ifdef GDK_WINDOWING_BROADWAY if (GDK_IS_BROADWAY_DISPLAY(display)) return true; #endif return false; }
std::unique_ptr<PlatformDisplay> PlatformDisplay::createPlatformDisplay() { #if PLATFORM(GTK) #if defined(GTK_API_VERSION_2) return std::make_unique<PlatformDisplayX11>(GDK_DISPLAY_XDISPLAY(gdk_display_get_default())); #else GdkDisplay* display = gdk_display_manager_get_default_display(gdk_display_manager_get()); #if PLATFORM(X11) if (GDK_IS_X11_DISPLAY(display)) return std::make_unique<PlatformDisplayX11>(GDK_DISPLAY_XDISPLAY(display)); #endif #if PLATFORM(WAYLAND) if (GDK_IS_WAYLAND_DISPLAY(display)) return std::make_unique<PlatformDisplayWayland>(gdk_wayland_display_get_wl_display(display)); #endif #endif #elif PLATFORM(EFL) && defined(HAVE_ECORE_X) return std::make_unique<PlatformDisplayX11>(static_cast<Display*>(ecore_x_display_get())); #elif PLATFORM(WIN) return std::make_unique<PlatformDisplayWin>(); #endif #if PLATFORM(WAYLAND) if (auto platformDisplay = PlatformDisplayWayland::create()) return platformDisplay; #endif #if PLATFORM(X11) if (auto platformDisplay = PlatformDisplayX11::create()) return platformDisplay; #endif // If at this point we still don't have a display, just create a fake display with no native. #if PLATFORM(WAYLAND) return std::make_unique<PlatformDisplayWayland>(nullptr); #endif #if PLATFORM(X11) return std::make_unique<PlatformDisplayX11>(nullptr); #endif ASSERT_NOT_REACHED(); return nullptr; }
static void *get_proc_address(void *fn_ctx, const gchar *name) { GdkDisplay *display = gdk_display_get_default(); if(g_strcmp0(name, "glMPGetNativeDisplay") == 0) return glMPGetNativeDisplay; #ifdef GDK_WINDOWING_WAYLAND if (GDK_IS_WAYLAND_DISPLAY(display)) return eglGetProcAddress(name); #endif #ifdef GDK_WINDOWING_X11 if (GDK_IS_X11_DISPLAY(display)) return (void *)(intptr_t) glXGetProcAddressARB((const GLubyte *)name); #endif #ifdef GDK_WINDOWING_WIN32 if (GDK_IS_WIN32_DISPLAY(display)) return wglGetProcAddress(name); #endif g_assert_not_reached(); }
static void gtk_tooltip_position (GtkTooltip *tooltip, GdkDisplay *display, GtkWidget *new_tooltip_widget) { gint x, y, width, height; GdkScreen *screen; gint monitor_num; GdkRectangle monitor; guint cursor_size; GdkRectangle bounds; #define MAX_DISTANCE 32 gtk_widget_realize (GTK_WIDGET (tooltip->current_window)); tooltip->tooltip_widget = new_tooltip_widget; screen = gtk_widget_get_screen (new_tooltip_widget); width = gtk_widget_get_allocated_width (GTK_WIDGET (tooltip->current_window)); height = gtk_widget_get_allocated_height (GTK_WIDGET (tooltip->current_window)); monitor_num = gdk_screen_get_monitor_at_point (screen, tooltip->last_x, tooltip->last_y); gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); get_bounding_box (new_tooltip_widget, &bounds); /* Position the tooltip */ cursor_size = gdk_display_get_default_cursor_size (display); /* Try below */ x = bounds.x + bounds.width / 2 - width / 2; y = bounds.y + bounds.height + 4; if (y + height <= monitor.y + monitor.height) { if (tooltip->keyboard_mode_enabled) goto found; if (y <= tooltip->last_y + cursor_size + MAX_DISTANCE) { if (tooltip->last_x + cursor_size + MAX_DISTANCE < x) x = tooltip->last_x + cursor_size + MAX_DISTANCE; else if (x + width < tooltip->last_x - MAX_DISTANCE) x = tooltip->last_x - MAX_DISTANCE - width; goto found; } } /* Try above */ x = bounds.x + bounds.width / 2 - width / 2; y = bounds.y - height - 4; if (y >= monitor.y) { if (tooltip->keyboard_mode_enabled) goto found; if (y + height >= tooltip->last_y - MAX_DISTANCE) { if (tooltip->last_x + cursor_size + MAX_DISTANCE < x) x = tooltip->last_x + cursor_size + MAX_DISTANCE; else if (x + width < tooltip->last_x - MAX_DISTANCE) x = tooltip->last_x - MAX_DISTANCE - width; goto found; } } /* Try right FIXME: flip on rtl ? */ x = bounds.x + bounds.width + 4; y = bounds.y + bounds.height / 2 - height / 2; if (x + width <= monitor.x + monitor.width) { if (tooltip->keyboard_mode_enabled) goto found; if (x <= tooltip->last_x + cursor_size + MAX_DISTANCE) { if (tooltip->last_y + cursor_size + MAX_DISTANCE < y) y = tooltip->last_y + cursor_size + MAX_DISTANCE; else if (y + height < tooltip->last_y - MAX_DISTANCE) y = tooltip->last_y - MAX_DISTANCE - height; goto found; } } /* Try left FIXME: flip on rtl ? */ x = bounds.x - width - 4; y = bounds.y + bounds.height / 2 - height / 2; if (x >= monitor.x) { if (tooltip->keyboard_mode_enabled) goto found; if (x + width >= tooltip->last_x - MAX_DISTANCE) { if (tooltip->last_y + cursor_size + MAX_DISTANCE < y) y = tooltip->last_y + cursor_size + MAX_DISTANCE; else if (y + height < tooltip->last_y - MAX_DISTANCE) y = tooltip->last_y - MAX_DISTANCE - height; goto found; } } /* Fallback */ if (tooltip->keyboard_mode_enabled) { x = bounds.x + bounds.width / 2 - width / 2; y = bounds.y + bounds.height + 4; } else { /* At cursor */ x = tooltip->last_x + cursor_size * 3 / 4; y = tooltip->last_y + cursor_size * 3 / 4; } found: /* Show it */ if (tooltip->current_window) { if (x + width > monitor.x + monitor.width) x -= x - (monitor.x + monitor.width) + width; else if (x < monitor.x) x = monitor.x; if (y + height > monitor.y + monitor.height) y -= y - (monitor.y + monitor.height) + height; else if (y < monitor.y) y = monitor.y; if (!tooltip->keyboard_mode_enabled) { /* don't pop up under the pointer */ if (x <= tooltip->last_x && tooltip->last_x < x + width && y <= tooltip->last_y && tooltip->last_y < y + height) y = tooltip->last_y - height - 2; } #ifdef GDK_WINDOWING_WAYLAND /* set the transient parent on the tooltip when running with the Wayland * backend to allow correct positioning of the tooltip windows */ if (GDK_IS_WAYLAND_DISPLAY (display)) { GtkWidget *toplevel; toplevel = gtk_widget_get_toplevel (tooltip->tooltip_widget); if (GTK_IS_WINDOW (toplevel)) gtk_window_set_transient_for (GTK_WINDOW (tooltip->current_window), GTK_WINDOW (toplevel)); } #endif gtk_window_move (GTK_WINDOW (tooltip->current_window), x, y); gtk_widget_show (GTK_WIDGET (tooltip->current_window)); } }
bool wxTopLevelWindowGTK::Create( wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& sizeOrig, long style, const wxString &name ) { wxSize size(sizeOrig); if (!size.IsFullySpecified()) size.SetDefaults(GetDefaultSize()); wxTopLevelWindows.Append( this ); if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { wxFAIL_MSG( wxT("wxTopLevelWindowGTK creation failed") ); return false; } m_title = title; // NB: m_widget may be !=NULL if it was created by derived class' Create, // e.g. in wxTaskBarIconAreaGTK if (m_widget == NULL) { m_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) { // Tell WM that this is a dialog window and make it center // on parent by default (this is what GtkDialog ctor does): gtk_window_set_type_hint(GTK_WINDOW(m_widget), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_position(GTK_WINDOW(m_widget), GTK_WIN_POS_CENTER_ON_PARENT); } else { if (style & wxFRAME_TOOL_WINDOW) { gtk_window_set_type_hint(GTK_WINDOW(m_widget), GDK_WINDOW_TYPE_HINT_UTILITY); // On some WMs, like KDE, a TOOL_WINDOW will still show // on the taskbar, but on Gnome a TOOL_WINDOW will not. // For consistency between WMs and with Windows, we // should set the NO_TASKBAR flag which will apply // the set_skip_taskbar_hint if it is available, // ensuring no taskbar entry will appear. style |= wxFRAME_NO_TASKBAR; } } g_object_ref(m_widget); } wxWindow *topParent = wxGetTopLevelParent(m_parent); if (topParent && (((GTK_IS_WINDOW(topParent->m_widget)) && (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)) || (style & wxFRAME_FLOAT_ON_PARENT))) { gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(topParent->m_widget) ); } if (style & wxFRAME_NO_TASKBAR) { gtk_window_set_skip_taskbar_hint(GTK_WINDOW(m_widget), TRUE); } if (style & wxSTAY_ON_TOP) { gtk_window_set_keep_above(GTK_WINDOW(m_widget), TRUE); } if (style & wxMAXIMIZE) gtk_window_maximize(GTK_WINDOW(m_widget)); #if 0 if (!name.empty()) gtk_window_set_role( GTK_WINDOW(m_widget), wxGTK_CONV( name ) ); #endif gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) ); gtk_widget_set_can_focus(m_widget, false); g_signal_connect (m_widget, "delete_event", G_CALLBACK (gtk_frame_delete_callback), this); // m_mainWidget is a GtkVBox, holding the bars and client area (m_wxwindow) m_mainWidget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_widget_show( m_mainWidget ); gtk_widget_set_can_focus(m_mainWidget, false); gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget ); // m_wxwindow is the client area m_wxwindow = wxPizza::New(); gtk_widget_show( m_wxwindow ); gtk_box_pack_start(GTK_BOX(m_mainWidget), m_wxwindow, true, true, 0); // we donm't allow the frame to get the focus as otherwise // the frame will grab it at arbitrary focus changes gtk_widget_set_can_focus(m_wxwindow, false); if (m_parent) m_parent->AddChild( this ); g_signal_connect(m_wxwindow, "size_allocate", G_CALLBACK(size_allocate), this); PostCreation(); #ifndef __WXGTK3__ if (pos != wxDefaultPosition) gtk_widget_set_uposition( m_widget, m_x, m_y ); #endif // for some reported size corrections g_signal_connect (m_widget, "map_event", G_CALLBACK (gtk_frame_map_callback), this); // for iconized state g_signal_connect (m_widget, "window_state_event", G_CALLBACK (gtk_frame_window_state_callback), this); // for wxMoveEvent g_signal_connect (m_widget, "configure_event", G_CALLBACK (gtk_frame_configure_callback), this); // activation g_signal_connect_after (m_widget, "focus_in_event", G_CALLBACK (gtk_frame_focus_in_callback), this); g_signal_connect_after (m_widget, "focus_out_event", G_CALLBACK (gtk_frame_focus_out_callback), this); // We need to customize the default GTK+ logic for key processing to make // it conforming to wxWidgets event processing order. g_signal_connect (m_widget, "key_press_event", G_CALLBACK (wxgtk_tlw_key_press_event), NULL); #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ if (GDK_IS_X11_SCREEN(gtk_window_get_screen(GTK_WINDOW(m_widget)))) #endif { gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK); g_signal_connect(m_widget, "property_notify_event", G_CALLBACK(property_notify_event), this); } #endif // GDK_WINDOWING_X11 // translate wx decorations styles into Motif WM hints (they are recognized // by other WMs as well) // always enable moving the window as we have no separate flag for enabling // it m_gdkFunc = GDK_FUNC_MOVE; if ( style & wxCLOSE_BOX ) m_gdkFunc |= GDK_FUNC_CLOSE; if ( style & wxMINIMIZE_BOX ) m_gdkFunc |= GDK_FUNC_MINIMIZE; if ( style & wxMAXIMIZE_BOX ) m_gdkFunc |= GDK_FUNC_MAXIMIZE; if ( (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER) ) { m_gdkDecor = 0; gtk_window_set_decorated(GTK_WINDOW(m_widget), false); } else // have border { m_gdkDecor = GDK_DECOR_BORDER; if ( style & wxCAPTION ) m_gdkDecor |= GDK_DECOR_TITLE; #if defined(GDK_WINDOWING_WAYLAND) && GTK_CHECK_VERSION(3,10,0) else if ( GDK_IS_WAYLAND_DISPLAY(gtk_widget_get_display(m_widget)) && gtk_check_version(3,10,0) == NULL) { gtk_window_set_titlebar(GTK_WINDOW(m_widget), gtk_header_bar_new()); } #endif if ( style & wxSYSTEM_MENU ) m_gdkDecor |= GDK_DECOR_MENU; if ( style & wxMINIMIZE_BOX ) m_gdkDecor |= GDK_DECOR_MINIMIZE; if ( style & wxMAXIMIZE_BOX ) m_gdkDecor |= GDK_DECOR_MAXIMIZE; if ( style & wxRESIZE_BORDER ) { m_gdkFunc |= GDK_FUNC_RESIZE; m_gdkDecor |= GDK_DECOR_RESIZEH; } } m_decorSize = GetCachedDecorSize(); int w, h; GTKDoGetSize(&w, &h); if (style & wxRESIZE_BORDER) { gtk_window_set_default_size(GTK_WINDOW(m_widget), w, h); #ifndef __WXGTK3__ gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1); #endif } else { gtk_window_set_resizable(GTK_WINDOW(m_widget), false); // gtk_window_set_default_size() does not work for un-resizable windows, // unless you set the size hints, but that causes Ubuntu's WM to make // the window resizable even though GDK_FUNC_RESIZE is not set. gtk_widget_set_size_request(m_widget, w, h); } return true; }