blob: a0eec52c7206bafbb1990195821681c16cb65c25 [file] [log] [blame]
// 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