File: gtk_dialog.c

package info (click to toggle)
allegro5 2%3A5.2.6.0-3%2Bdeb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 24,212 kB
  • sloc: ansic: 125,319; cpp: 15,781; objc: 4,579; python: 2,802; java: 2,254; javascript: 1,204; sh: 1,002; makefile: 51; perl: 37; xml: 25; pascal: 24
file content (65 lines) | stat: -rw-r--r-- 1,741 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <gtk/gtk.h>
#include <gdk/gdkx.h>

#include "allegro5/allegro.h"
#include "allegro5/allegro_native_dialog.h"
#include "allegro5/internal/aintern_native_dialog.h"
#include "allegro5/internal/aintern_native_dialog_cfg.h"
#include "allegro5/internal/aintern_xdisplay.h"
#include "gtk_dialog.h"
#include "gtk_xgtk.h"

ALLEGRO_DEBUG_CHANNEL("gtk_dialog")


bool _al_init_native_dialog_addon(void)
{
   int argc = 0;
   char **argv = NULL;
   if (!gtk_init_check(&argc, &argv)) {
      ALLEGRO_ERROR("gtk_init_check failed\n");
      return false;
   }

   return _al_gtk_set_display_overridable_interface(true);
}


void _al_shutdown_native_dialog_addon(void)
{
   _al_gtk_set_display_overridable_interface(false);
}

static void really_make_transient(GtkWidget *window, ALLEGRO_DISPLAY_XGLX *glx)
{

   GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
   GdkDisplay *gdk = GDK_DISPLAY(gdk_window_get_display(gdk_window));

   GdkWindow *parent = gdk_x11_window_lookup_for_display(gdk, glx->window);
   if (!parent)
      parent = gdk_x11_window_foreign_new_for_display(gdk, glx->window);

   if (gdk_window != NULL)
      gdk_window_set_transient_for(gdk_window, parent);
}

static void realized(GtkWidget *window, gpointer data)
{
   really_make_transient(window, (void *)data);
}


void _al_gtk_make_transient(ALLEGRO_DISPLAY *display, GtkWidget *window)
{
   /* Set the current display window (if any) as the parent of the dialog. */
   ALLEGRO_DISPLAY_XGLX *glx = (void *)display;
   if (glx) {
      if (!gtk_widget_get_realized(window))
         g_signal_connect(window, "realize", G_CALLBACK(realized), (void *)glx);
      else
         really_make_transient(window, glx);
   }
}

/* vim: set sts=3 sw=3 et: */