summarylogtreecommitdiffstats
path: root/pidgin-libnotify-getfocus.patch
blob: db45829d9d7ed5ad805bca01436807369dd2fd6d (plain)
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
66
67
68
69
--- src/pidgin-libnotify.c	2013-05-07 17:38:31.397261982 +0200
+++ src2/pidgin-libnotify.c	2013-05-07 17:43:43.787904584 +0200
@@ -169,6 +169,49 @@ pixbuf_from_buddy_icon (PurpleBuddyIcon
 	return icon;
 }
 
+/* Taken from pidgin-hotkeys to get focus on conversation window */
+static void
+hacky_active_window(GtkWidget *window)
+{
+    GdkScreen *screen;
+    GdkWindow *root;
+    GdkDisplay *display;
+    Display *xdisplay;
+    Window xroot;
+    XEvent xev;
+    static Atom _net_active_window = None;
+
+    screen = gtk_widget_get_screen(window);
+    root = gdk_screen_get_root_window(screen);
+    display = gdk_screen_get_display(screen);
+
+    xdisplay = GDK_DISPLAY_XDISPLAY(display);
+    xroot = GDK_WINDOW_XWINDOW(root);
+
+    if (_net_active_window == None)
+	_net_active_window = XInternAtom(xdisplay,
+					 "_NET_ACTIVE_WINDOW",
+					 False);
+
+    xev.xclient.type = ClientMessage;
+    xev.xclient.serial = 0;
+    xev.xclient.send_event = True;
+    xev.xclient.window = GDK_WINDOW_XWINDOW(window->window);
+    xev.xclient.message_type = _net_active_window;
+    xev.xclient.format = 32;
+    xev.xclient.data.l[0] = 1; /* requestor type; we're an app, I guess */
+    xev.xclient.data.l[1] = CurrentTime;
+    xev.xclient.data.l[2] = None; /* "currently active window", supposedly */
+    xev.xclient.data.l[3] = 0;
+    xev.xclient.data.l[4] = 0;
+
+    XSendEvent(xdisplay,
+	       xroot, False,
+	       SubstructureRedirectMask | SubstructureNotifyMask,
+	       &xev);
+}
+
+
 static void
 action_cb (NotifyNotification *notification,
 		   gchar *action, gpointer user_data)
@@ -194,6 +237,16 @@ action_cb (NotifyNotification *notificat
 									  buddy->name);
 	}
 	conv->ui_ops->present (conv);
+	
+	/* get the focus on the new conversation window */
+	{
+	    GtkWindow *gtkwindow;
+
+	    gtkwindow = GTK_WINDOW(pidgin_conv_get_window(PIDGIN_CONVERSATION(conv))->window);
+	    /*gtk_window_present(gtkwindow);*/
+	    hacky_active_window(GTK_WIDGET(gtkwindow));
+	}
+
 
 	notify_notification_close (notification, NULL);
 }