|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef UI_BASE_GLIB_GLIB_SIGNAL_H_ | 
|  | #define UI_BASE_GLIB_GLIB_SIGNAL_H_ | 
|  |  | 
|  | typedef void* gpointer; | 
|  |  | 
|  | // At the time of writing this, there were two common ways of binding our C++ | 
|  | // code to the gobject C system. We either defined a whole bunch of "static | 
|  | // MethodThunk()" which just called nonstatic Method()s on a class (which hurt | 
|  | // readability of the headers and signal connection code) OR we declared | 
|  | // "static Method()" and passed in the current object as the gpointer (and hurt | 
|  | // readability in the implementation by having "context->" before every | 
|  | // variable). | 
|  |  | 
|  | // The hopeful result of using these macros is that the code will be more | 
|  | // readable and regular. There shouldn't be a bunch of static Thunks visible in | 
|  | // the headers and the implementations shouldn't be filled with "context->" | 
|  | // de-references. | 
|  |  | 
|  | #define CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, SENDER)           \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, gpointer userdata) { \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender);      \ | 
|  | }                                                                 \ | 
|  | \ | 
|  | RETURN METHOD(SENDER); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1)     \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one,            \ | 
|  | gpointer userdata) {                \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ | 
|  | }                                                                 \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2)    \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,       \ | 
|  | gpointer userdata) {                     \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ | 
|  | }                                                                      \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1, ARG2); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3) \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,          \ | 
|  | ARG3 three, gpointer userdata) {            \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                             \ | 
|  | METHOD(sender, one, two, three);                                    \ | 
|  | }                                                                         \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1, ARG2, ARG3); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | 
|  | ARG4)                                            \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,          \ | 
|  | ARG3 three, ARG4 four,                      \ | 
|  | gpointer userdata) {                        \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                             \ | 
|  | METHOD(sender, one, two, three, four);                              \ | 
|  | }                                                                         \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | 
|  | ARG4, ARG5)                                      \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,          \ | 
|  | ARG3 three, ARG4 four, ARG5 five,           \ | 
|  | gpointer userdata) {                        \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                             \ | 
|  | METHOD(sender, one, two, three, four, five);                        \ | 
|  | }                                                                         \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5); | 
|  |  | 
|  | #define CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | 
|  | ARG4, ARG5, ARG6)                                \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,          \ | 
|  | ARG3 three, ARG4 four, ARG5 five,           \ | 
|  | ARG6 six, gpointer userdata) {              \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                             \ | 
|  | METHOD(sender, one, two, three, four, five, six);                   \ | 
|  | }                                                                         \ | 
|  | \ | 
|  | RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, SENDER)   \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, gpointer userdata) { \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender);      \ | 
|  | }                                                                 \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one,                \ | 
|  | gpointer userdata) {                    \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one);     \ | 
|  | }                                                                     \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,            \ | 
|  | gpointer userdata) {                          \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two);      \ | 
|  | }                                                                           \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1, ARG2); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ | 
|  | ARG3)                                      \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,            \ | 
|  | ARG3 three, gpointer userdata) {              \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                               \ | 
|  | METHOD(sender, one, two, three);                                      \ | 
|  | }                                                                           \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ | 
|  | ARG3, ARG4)                                \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,            \ | 
|  | ARG3 three, ARG4 four,                        \ | 
|  | gpointer userdata) {                          \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                               \ | 
|  | METHOD(sender, one, two, three, four);                                \ | 
|  | }                                                                           \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ | 
|  | ARG3,  ARG4, ARG5)                         \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,            \ | 
|  | ARG3 three, ARG4 four, ARG5 five,             \ | 
|  | gpointer userdata) {                          \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                               \ | 
|  | METHOD(sender, one, two, three, four, five);                          \ | 
|  | }                                                                           \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5); | 
|  |  | 
|  | #define CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ | 
|  | ARG3, ARG4, ARG5, ARG6)                    \ | 
|  | static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two,            \ | 
|  | ARG3 three, ARG4 four, ARG5 five,             \ | 
|  | ARG6 six, gpointer userdata) {                \ | 
|  | return reinterpret_cast<CLASS*>(userdata)->                               \ | 
|  | METHOD(sender, one, two, three, four, five, six);                     \ | 
|  | }                                                                           \ | 
|  | \ | 
|  | virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); | 
|  |  | 
|  | #endif |