diff -r 8ba616e7c69c -r bf3f91939dc5 pidgin/gtkdebug.c --- a/pidgin/gtkdebug.c Thu Jul 13 01:37:53 2017 -0400 +++ b/pidgin/gtkdebug.c Thu Jul 13 03:22:56 2017 -0400 @@ -59,7 +59,21 @@ } DebugWindow; static DebugWindow *debug_win = NULL; -static guint debug_enabled_timer = 0; + +struct _PidginDebugUi +{ + GObject parent; + + /* Other members, including private data. */ + guint debug_enabled_timer; +}; + +static void pidgin_debug_ui_finalize(GObject *gobject); +static void pidgin_debug_ui_interface_init(PurpleDebugUiInterface *iface); + +G_DEFINE_TYPE_WITH_CODE(PidginDebugUi, pidgin_debug_ui, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(PURPLE_TYPE_DEBUG_UI, + pidgin_debug_ui_interface_init)); static gint debug_window_destroy(GtkWidget *w, GdkEvent *event, void *unused) @@ -621,12 +635,23 @@ static gboolean debug_enabled_timeout_cb(gpointer data) { - debug_enabled_timer = 0; + PidginDebugUi *ui = PIDGIN_DEBUG_UI(data); + + ui->debug_enabled_timer = 0; + + pidgin_debug_window_show(); + + return FALSE; +} - if (data) - pidgin_debug_window_show(); - else - pidgin_debug_window_hide(); +static gboolean +debug_disabled_timeout_cb(gpointer data) +{ + PidginDebugUi *ui = PIDGIN_DEBUG_UI(data); + + ui->debug_enabled_timer = 0; + + pidgin_debug_window_hide(); return FALSE; } @@ -635,7 +660,12 @@ debug_enabled_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data) { - debug_enabled_timer = g_timeout_add(0, debug_enabled_timeout_cb, GINT_TO_POINTER(GPOINTER_TO_INT(value))); + PidginDebugUi *ui = PIDGIN_DEBUG_UI(data); + + if (GPOINTER_TO_INT(value)) + ui->debug_enabled_timer = g_timeout_add(0, debug_enabled_timeout_cb, data); + else + ui->debug_enabled_timer = g_timeout_add(0, debug_disabled_timeout_cb, data); } static void @@ -701,8 +731,8 @@ } #endif -void -pidgin_debug_init(void) +static void +pidgin_debug_ui_init(PidginDebugUi *self) { /* Debug window preferences. */ /* @@ -730,7 +760,7 @@ purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/debug/highlight", FALSE); purple_prefs_connect_callback(NULL, PIDGIN_PREFS_ROOT "/debug/enabled", - debug_enabled_cb, NULL); + debug_enabled_cb, self); #define REGISTER_G_LOG_HANDLER(name) \ g_log_set_handler((name), G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL \ @@ -757,13 +787,16 @@ #endif } -void -pidgin_debug_uninit(void) +static void +pidgin_debug_ui_finalize(GObject *gobject) { - purple_debug_set_ui_ops(NULL); + PidginDebugUi *self = PIDGIN_DEBUG_UI(gobject); - if (debug_enabled_timer != 0) - g_source_remove(debug_enabled_timer); + if (self->debug_enabled_timer != 0) + g_source_remove(self->debug_enabled_timer); + self->debug_enabled_timer = 0; + + G_OBJECT_CLASS(pidgin_debug_ui_parent_class)->finalize(gobject); } void @@ -787,8 +820,9 @@ } static void -pidgin_debug_print(PurpleDebugLevel level, const char *category, - const char *arg_s) +pidgin_debug_print(PurpleDebugUi *self, + PurpleDebugLevel level, const char *category, + const char *arg_s) { gchar *esc_s; const char *mdate; @@ -814,26 +848,31 @@ } static gboolean -pidgin_debug_is_enabled(PurpleDebugLevel level, const char *category) +pidgin_debug_is_enabled(PurpleDebugUi *self, PurpleDebugLevel level, const char *category) { return (debug_win != NULL && purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled")); } -static PurpleDebugUiOps ops = +static void +pidgin_debug_ui_interface_init(PurpleDebugUiInterface *iface) +{ + iface->print = pidgin_debug_print; + iface->is_enabled = pidgin_debug_is_enabled; +} + +static void +pidgin_debug_ui_class_init(PidginDebugUiClass *klass) { - pidgin_debug_print, - pidgin_debug_is_enabled, - NULL, - NULL, - NULL, - NULL -}; + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->finalize = pidgin_debug_ui_finalize; +} -PurpleDebugUiOps * -pidgin_debug_get_ui_ops(void) +PidginDebugUi * +pidgin_debug_ui_new(void) { - return &ops; + return g_object_new(PIDGIN_TYPE_DEBUG_UI, NULL); } void *