15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_GLIB_GLIB_SIGNAL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_GLIB_GLIB_SIGNAL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void* gpointer; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// At the time of writing this, there were two common ways of binding our C++ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code to the gobject C system. We either defined a whole bunch of "static 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MethodThunk()" which just called nonstatic Method()s on a class (which hurt 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// readability of the headers and signal connection code) OR we declared 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "static Method()" and passed in the current object as the gpointer (and hurt 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// readability in the implementation by having "context->" before every 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variable). 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The hopeful result of using these macros is that the code will be more 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// readable and regular. There shouldn't be a bunch of static Thunks visible in 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the headers and the implementations shouldn't be filled with "context->" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// de-references. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, SENDER) \ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, gpointer userdata) { \ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender); \ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, \ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1, ARG2); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3) \ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, gpointer userdata) { \ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three); \ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1, ARG2, ARG3); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG4) \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, \ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four); \ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG4, ARG5) \ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, ARG5 five, \ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four, five); \ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG4, ARG5, ARG6) \ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, ARG5 five, \ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG6 six, gpointer userdata) { \ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four, five, six); \ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, SENDER) \ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, gpointer userdata) { \ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender); \ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, \ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1, ARG2); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3) \ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, gpointer userdata) { \ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three); \ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3, ARG4) \ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, \ 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four); \ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3, ARG4, ARG5) \ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, ARG5 five, \ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpointer userdata) { \ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four, five); \ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3, ARG4, ARG5, ARG6) \ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG3 three, ARG4 four, ARG5 five, \ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARG6 six, gpointer userdata) { \ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<CLASS*>(userdata)-> \ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) METHOD(sender, one, two, three, four, five, six); \ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 155