| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef APP_GTK_SIGNAL_H_ | |
| 6 #define APP_GTK_SIGNAL_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 typedef void* gpointer; | |
| 10 typedef struct _GtkWidget GtkWidget; | |
| 11 | |
| 12 // At the time of writing this, there were two common ways of binding our C++ | |
| 13 // code to the gobject C system. We either defined a whole bunch of "static | |
| 14 // MethodThunk()" which just called nonstatic Method()s on a class (which hurt | |
| 15 // readability of the headers and signal connection code) OR we declared | |
| 16 // "static Method()" and passed in the current object as the gpointer (and hurt | |
| 17 // readability in the implementation by having "context->" before every | |
| 18 // variable). | |
| 19 | |
| 20 // The hopeful result of using these macros is that the code will be more | |
| 21 // readable and regular. There shouldn't be a bunch of static Thunks visible in | |
| 22 // the headers and the implementations shouldn't be filled with "context->" | |
| 23 // de-references. | |
| 24 | |
| 25 #define CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, SENDER) \ | |
| 26 static RETURN METHOD ## Thunk(SENDER sender, gpointer userdata) { \ | |
| 27 return reinterpret_cast<CLASS*>(userdata)->METHOD(sender); \ | |
| 28 } \ | |
| 29 \ | |
| 30 virtual RETURN METHOD(SENDER); | |
| 31 | |
| 32 #define CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ | |
| 33 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, \ | |
| 34 gpointer userdata) { \ | |
| 35 return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ | |
| 36 } \ | |
| 37 \ | |
| 38 virtual RETURN METHOD(SENDER, ARG1); | |
| 39 | |
| 40 #define CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ | |
| 41 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ | |
| 42 gpointer userdata) { \ | |
| 43 return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ | |
| 44 } \ | |
| 45 \ | |
| 46 virtual RETURN METHOD(SENDER, ARG1, ARG2); | |
| 47 | |
| 48 #define CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3) \ | |
| 49 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ | |
| 50 ARG3 three, gpointer userdata) { \ | |
| 51 return reinterpret_cast<CLASS*>(userdata)-> \ | |
| 52 METHOD(sender, one, two, three); \ | |
| 53 } \ | |
| 54 \ | |
| 55 virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3); | |
| 56 | |
| 57 #define CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | |
| 58 ARG4) \ | |
| 59 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ | |
| 60 ARG3 three, ARG4 four, \ | |
| 61 gpointer userdata) { \ | |
| 62 return reinterpret_cast<CLASS*>(userdata)-> \ | |
| 63 METHOD(sender, one, two, three, four); \ | |
| 64 } \ | |
| 65 \ | |
| 66 virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4); | |
| 67 | |
| 68 #define CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | |
| 69 ARG4, ARG5) \ | |
| 70 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ | |
| 71 ARG3 three, ARG4 four, ARG5 five, \ | |
| 72 gpointer userdata) { \ | |
| 73 return reinterpret_cast<CLASS*>(userdata)-> \ | |
| 74 METHOD(sender, one, two, three, four, five); \ | |
| 75 } \ | |
| 76 \ | |
| 77 virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5); | |
| 78 | |
| 79 #define CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ | |
| 80 ARG4, ARG5, ARG6) \ | |
| 81 static RETURN METHOD ## Thunk(SENDER sender, ARG1 one, ARG2 two, \ | |
| 82 ARG3 three, ARG4 four, ARG5 five, \ | |
| 83 ARG6 six, gpointer userdata) { \ | |
| 84 return reinterpret_cast<CLASS*>(userdata)-> \ | |
| 85 METHOD(sender, one, two, three, four, five, six); \ | |
| 86 } \ | |
| 87 \ | |
| 88 virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); | |
| 89 | |
| 90 // These macros handle the common case where the sender object will be a | |
| 91 // GtkWidget*. | |
| 92 #define CHROMEGTK_CALLBACK_0(CLASS, RETURN, METHOD) \ | |
| 93 CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*); | |
| 94 | |
| 95 #define CHROMEGTK_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \ | |
| 96 CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1); | |
| 97 | |
| 98 #define CHROMEGTK_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \ | |
| 99 CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2); | |
| 100 | |
| 101 #define CHROMEGTK_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \ | |
| 102 CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3); | |
| 103 | |
| 104 #define CHROMEGTK_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4) \ | |
| 105 CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, ARG4); | |
| 106 | |
| 107 #define CHROMEGTK_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ | |
| 108 ARG5) \ | |
| 109 CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ | |
| 110 ARG4, ARG5); | |
| 111 | |
| 112 #define CHROMEGTK_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \ | |
| 113 ARG5, ARG6) \ | |
| 114 CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \ | |
| 115 ARG4, ARG5, ARG6); | |
| 116 | |
| 117 #endif // APP_GTK_SIGNAL_H_ | |
| OLD | NEW |