comparison pidgin/win32/gtkdocklet-win32.c @ 20665:601083413e36

Ugly hacky fix so that it looks like docklet clicks on win32 come from a gdk event so that it causes the unread tab to receive focus. Fixes #3197.
author Daniel Atallah <daniel.atallah@gmail.com>
date Wed, 26 Sep 2007 21:03:16 +0000
parents 44b4e8bd759b
children 38c4fe48ebb5
comparison
equal deleted inserted replaced
20664:324c25c2daad 20665:601083413e36
46 */ 46 */
47 static HWND systray_hwnd = NULL; 47 static HWND systray_hwnd = NULL;
48 /* additional two cached_icons entries for pending and connecting icons */ 48 /* additional two cached_icons entries for pending and connecting icons */
49 static HICON cached_icons[PURPLE_STATUS_NUM_PRIMITIVES + 2]; 49 static HICON cached_icons[PURPLE_STATUS_NUM_PRIMITIVES + 2];
50 static GtkWidget *image = NULL; 50 static GtkWidget *image = NULL;
51 /* This is used to trigger click events on so they appear to GTK+ as if they are triggered by input */
52 static GtkWidget *dummy_button = NULL;
53 static GtkWidget *dummy_window = NULL;
51 static NOTIFYICONDATA _nicon_data; 54 static NOTIFYICONDATA _nicon_data;
55
56 static gboolean dummy_button_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
57 pidgin_docklet_clicked(event->button);
58 return TRUE;
59 }
52 60
53 static LRESULT CALLBACK systray_mainmsg_handler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { 61 static LRESULT CALLBACK systray_mainmsg_handler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
54 static UINT taskbarRestartMsg; /* static here means value is kept across multiple calls to this func */ 62 static UINT taskbarRestartMsg; /* static here means value is kept across multiple calls to this func */
55 63
56 switch(msg) { 64 switch(msg) {
68 break; 76 break;
69 77
70 case WM_TRAYMESSAGE: 78 case WM_TRAYMESSAGE:
71 { 79 {
72 int type = 0; 80 int type = 0;
81 GdkEvent *event;
82 GdkEventButton *event_btn;
73 83
74 /* We'll use Double Click - Single click over on linux */ 84 /* We'll use Double Click - Single click over on linux */
75 if(lparam == WM_LBUTTONDBLCLK) 85 if(lparam == WM_LBUTTONDBLCLK)
76 type = 1; 86 type = 1;
77 else if(lparam == WM_MBUTTONUP) 87 else if(lparam == WM_MBUTTONUP)
79 else if(lparam == WM_RBUTTONUP) 89 else if(lparam == WM_RBUTTONUP)
80 type = 3; 90 type = 3;
81 else 91 else
82 break; 92 break;
83 93
84 pidgin_docklet_clicked(type); 94 gtk_widget_show_all(dummy_window);
95 event = gdk_event_new(GDK_BUTTON_PRESS);
96 event_btn = (GdkEventButton *) event;
97 event_btn->window = g_object_ref (gdk_get_default_root_window());
98 event_btn->send_event = TRUE;
99 event_btn->time = GetTickCount();
100 event_btn->axes = NULL;
101 event_btn->state = 0;
102 event_btn->button = type;
103 event_btn->device = gdk_display_get_default ()->core_pointer;
104 event->any.window = g_object_ref(dummy_window->window);
105 gdk_window_set_user_data(event->any.window, dummy_button);
106
107 gtk_main_do_event((GdkEvent *)event);
108 gtk_widget_hide(dummy_window);
109 gdk_event_free((GdkEvent *)event);
110
85 break; 111 break;
86 } 112 }
87 default: 113 default:
88 if (msg == taskbarRestartMsg) { 114 if (msg == taskbarRestartMsg) {
89 /* explorer crashed and left us hanging... 115 /* explorer crashed and left us hanging...
548 static void winpidgin_tray_create() { 574 static void winpidgin_tray_create() {
549 OSVERSIONINFO osinfo; 575 OSVERSIONINFO osinfo;
550 /* dummy window to process systray messages */ 576 /* dummy window to process systray messages */
551 systray_hwnd = systray_create_hiddenwin(); 577 systray_hwnd = systray_create_hiddenwin();
552 578
579 dummy_window = gtk_window_new(GTK_WINDOW_POPUP);
580 dummy_button = gtk_button_new();
581 gtk_container_add(GTK_CONTAINER(dummy_window), dummy_button);
582
583 /* We trigger the click event indirectly so that gtk_get_current_event_state() is TRUE when the event is handled */
584 g_signal_connect(G_OBJECT(dummy_button), "button-press-event",
585 G_CALLBACK(dummy_button_cb), NULL);
586
553 image = gtk_image_new(); 587 image = gtk_image_new();
554 #if GLIB_CHECK_VERSION(2,10,0) 588 #if GLIB_CHECK_VERSION(2,10,0)
555 g_object_ref_sink(image); 589 g_object_ref_sink(image);
556 #else 590 #else
557 g_object_ref(image); 591 g_object_ref(image);
609 cached_icons[cached_cnt] = NULL; 643 cached_icons[cached_cnt] = NULL;
610 } 644 }
611 645
612 g_object_unref(image); 646 g_object_unref(image);
613 image = NULL; 647 image = NULL;
648
649 gtk_widget_destroy(dummy_window);
650 dummy_button = NULL;
651 dummy_window = NULL;
614 } 652 }
615 653
616 static struct docklet_ui_ops winpidgin_tray_ops = 654 static struct docklet_ui_ops winpidgin_tray_ops =
617 { 655 {
618 winpidgin_tray_create, 656 winpidgin_tray_create,