Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix drawing #5

Merged
merged 3 commits into from
Jan 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions Pidgin MacOS Integration/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ enum GTypes : UInt {
static var notificationSounds = getSystemNotificationSounds()
var selectedNotification : String?

var configuredWindows = Set<UnsafeMutablePointer<GtkWidget>?>()

enum DefaultSounds : String {
case Default
case None
Expand Down Expand Up @@ -470,6 +472,12 @@ enum GTypes : UInt {
}
return 0
}, "conversation-created", selfPtr!)
register_conversation_created_callback(instance, {conversation, data in
if let selfRef : Plugin = tryCast(data) {
return selfRef.handleConversationDestroyed(conversation: conversation)
}
return 0
}, "deleting-conversation", selfPtr!)
}

func unsetMenu() {
Expand All @@ -486,11 +494,53 @@ enum GTypes : UInt {
NSApp.delegate = nil
}

static func forceRedraw(widget: UnsafeMutablePointer<GtkWidget>?) {
gtk_widget_queue_draw(widget)
while (gtk_events_pending () != 0)
{
gtk_main_iteration()
}
}

func registerRedrawCallbacks(conversationWindow: UnsafeMutablePointer<PidginWindow>?) {
let window = conversationWindow?.pointee.window
register_configuration_event_callback(window, { window, event, data in
debug("Redraw")
gtk_widget_queue_draw(window)
return FALSE
})
let callbacks = ["switch_page", "page-added", "page-removed"]
for cb in callbacks {
register_switch_page_callback(conversationWindow?.pointee.notebook, cb, window) { (notebook, page, page_index, window) -> gboolean in
debug("Redraw")
Plugin.forceRedraw(widget: window)
return FALSE
}

}
}

func handleConversationDestroyed(conversation: UnsafeMutablePointer<PurpleConversation>?) -> gboolean {
debug("Handling destroyed conversation")
let pidginConversation = conversation?.pointee.ui_data.assumingMemoryBound(to: PidginConversation.self)
let conversationWindow = pidgin_conv_get_window(pidginConversation)
Plugin.forceRedraw(widget: conversationWindow?.pointee.window)
return 0
}

func handleConversationCreated(conversation: UnsafeMutablePointer<PurpleConversation>?) -> gboolean {
let pidginConversation = conversation?.pointee.ui_data.assumingMemoryBound(to: PidginConversation.self)
let conversationWindow = pidgin_conv_get_window(pidginConversation)
let menu = conversationWindow?.pointee.menu.menubar
syncMenuBar(menu, visible: true)
if configuredWindows.insert(conversationWindow?.pointee.window).inserted {
debug("Configuring new window. Current count: \(configuredWindows.count)")
registerRedrawCallbacks(conversationWindow: conversationWindow)
}
else {
debug("Window already registered.")
}
Plugin.forceRedraw(widget: conversationWindow?.pointee.window)
return 0
}

Expand Down
4 changes: 3 additions & 1 deletion Pidgin MacOS Integration/plugin_load.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ void register_callback_to_modify(PurplePlugin *plugin, gboolean (*function)(Purp
void register_callback(PurplePlugin *plugin, gboolean (*function)(PurpleAccount *, char *, char *, PurpleConversation *, PurpleMessageFlags *), const char* callback);
void register_conversation_created_callback(PurplePlugin *plugin, gboolean (*function)(PurpleConversation *, void *), const char* callback, void *data);
void register_buddy_list_created_callback(PurplePlugin *plugin, gboolean (*function)(PurpleBuddyList *, void *), const char* callback, void *data);
void register_switch_page_callback(GtkWidget *notebook, const char* callback, GtkWidget *window, gboolean function (GtkWidget *notebook, GtkNotebookPage *notebook_page, int page, GtkWidget *data));
void register_configuration_event_callback(GtkWidget *window, gboolean function (GtkWidget *widget, GdkEvent *event, gpointer user_data));
void set_menu(GtkWidget *menu);
GtkWindow* to_window(void* obj);

Expand All @@ -30,7 +32,7 @@ void plugin_unload_oc(PurplePlugin *plugin);
void plugin_init_oc(PurplePlugin *plugin);

void (*conv_test(void))(void);

char* get_list_value_string(GtkTreeModel* model, GtkTreeIter* iter, gint column);

struct im_image_data {
int id;
Expand Down
30 changes: 29 additions & 1 deletion Pidgin MacOS Integration/plugin_load.m
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,27 @@ void register_conversation_created_callback(PurplePlugin *plugin, gboolean (*fun
void register_buddy_list_created_callback(PurplePlugin *plugin, gboolean (*function)(PurpleBuddyList *, void *), const char* callback, void *data) {
log_callback("macos", "Registering callback %s for conversation...\n", callback);
purple_signal_connect(pidgin_blist_get_handle(), callback, plugin, PURPLE_CALLBACK(function), data);
log_all("macos", "Registered\n");
log_all("macos", "Registered");
}

void register_switch_page_callback(GtkWidget *notebook, const char* callback, GtkWidget *window, gboolean function (GtkWidget *notebook, GtkNotebookPage *notebook_page, int page, GtkWidget *data)) {
log_callback("macos", "Registering %s callback for window...\n", callback);
if(g_signal_connect_after(G_OBJECT(notebook), callback, G_CALLBACK(function), window)) {
log_all("macos", "Success.");
}
else {
log_all("macos", "Failure.");
}
}

void register_configuration_event_callback(GtkWidget *window, gboolean function (GtkWidget *widget, GdkEvent *event, gpointer user_data)) {
log_all("macos", "Registering configure-event callback for window...");
if(g_signal_connect_after(G_OBJECT(window), "configure-event", G_CALLBACK(function), NULL)) {
log_all("macos", "Success.");
}
else {
log_all("macos", "Failure.");
}
}

void log_callback(const char* category, const char* message, const char* callback) {
Expand All @@ -97,6 +117,14 @@ void set_menu(GtkWidget *menu){
gtkosx_application_set_menu_bar(gtkosx_application_get(), GTK_MENU_SHELL(menu));
}

char* get_list_value_string(GtkTreeModel* model, GtkTreeIter* iter, gint column) {
gchar* value = NULL;
gtk_tree_model_get_value(model, iter, column, value);
g_free(value);
gtk_tree_model_get(model, iter, 0, value, -1);
return value;
}

GtkWindow* to_window(void* obj) {
return GTK_WINDOW(obj);
}
Expand Down