adium 3045:96c2441aa3a3: Remove a whole bunch of GTK stuff, fill...

commits at adium.im commits at adium.im
Thu Dec 10 16:49:17 UTC 2009


details:	http://hg.adium.im/adium/rev/96c2441aa3a3
revision:	3045:96c2441aa3a3
author:		Zachary West <zacw at adium.im>
date:		Thu Dec 10 11:49:08 2009 -0500

Remove a whole bunch of GTK stuff, filling it with absolutely nothing useful.

diffs (583 lines):

diff -r f134ec38f60b -r 96c2441aa3a3 Frameworks/Adium Framework/Source/AIAccount.h
--- a/Frameworks/Adium Framework/Source/AIAccount.h	Thu Dec 10 02:32:25 2009 -0500
+++ b/Frameworks/Adium Framework/Source/AIAccount.h	Thu Dec 10 11:49:08 2009 -0500
@@ -144,6 +144,15 @@
 - (void)closeMedia:(AIMedia *)media;
 
 /*!
+ * @brief Destroy a media
+ *
+ * @param media The media to be destroyed
+ *
+ * Gives the account an opportunity to teardown.
+ */
+- (void)destroyMedia:(AIMedia *)media;
+
+/*!
  * @brief Accept a pending media
  */
 - (void)incomingMedia:(AIMedia *)media acceptPendingRequest:(BOOL)accept;
diff -r f134ec38f60b -r 96c2441aa3a3 Frameworks/Adium Framework/Source/AIMedia.h
--- a/Frameworks/Adium Framework/Source/AIMedia.h	Thu Dec 10 02:32:25 2009 -0500
+++ b/Frameworks/Adium Framework/Source/AIMedia.h	Thu Dec 10 11:49:08 2009 -0500
@@ -8,16 +8,17 @@
 
 #import <Adium/AIMediaControllerProtocol.h>
 
+ at protocol AIAccount_Media;
 @class AIListContact, AIAccount;
 
 @interface AIMedia : NSObject {
-	AIAccount		*account;
-	AIListContact	*listContact;
-	id				protocolInfo;
+	AIAccount <AIAccount_Media>	*account;
+	AIListContact				*listContact;
+	id							protocolInfo;
 	
 	CGFloat			sendProgress;
 	CGFloat			receiveProgress;
-	
+
 	AIMediaType		mediaType;
 	AIMediaState	mediaState;
 }
@@ -28,12 +29,11 @@
 @property (readwrite, nonatomic) AIMediaState mediaState;
 @property (readwrite, nonatomic) CGFloat sendProgress;
 @property (readwrite, nonatomic) CGFloat receiveProgress;
- at property (readwrite, retain, nonatomic) AIAccount *account;
+
+ at property (readwrite, retain, nonatomic) AIAccount <AIAccount_Media> *account;
 @property (readwrite, retain, nonatomic) AIListContact *listContact;
 
 + (AIMedia *)mediaWithContact:(AIListContact *)inListContact
 					onAccount:(AIAccount *)inAccount;
 
-- (void)show;
-
 @end
diff -r f134ec38f60b -r 96c2441aa3a3 Frameworks/Adium Framework/Source/AIMedia.m
--- a/Frameworks/Adium Framework/Source/AIMedia.m	Thu Dec 10 02:32:25 2009 -0500
+++ b/Frameworks/Adium Framework/Source/AIMedia.m	Thu Dec 10 11:49:08 2009 -0500
@@ -12,13 +12,13 @@
 
 @interface AIMedia()
 - (id)initWithContact:(AIListContact *)inListContact
-			  onAccount:(AIAccount *)inAccount;
+			  onAccount:(AIAccount <AIAccount_Media> *)inAccount;
 @end
 
 @implementation AIMedia
 
 + (AIMedia *)mediaWithContact:(AIListContact *)inListContact
-					onAccount:(AIAccount *)inAccount
+					onAccount:(AIAccount <AIAccount_Media> *)inAccount
 {
 	return [[[self alloc] initWithContact:inListContact
 								onAccount:inAccount] autorelease];
@@ -40,8 +40,10 @@
 
 - (void)dealloc
 {
-	[account release];
-	[listContact release];
+	[account destroyMedia:self];
+	
+	self.account = nil;
+	self.listContact = nil;
 	
 	[super dealloc];
 }
@@ -53,9 +55,4 @@
 	[adium.mediaController media:self didSetState:inMediaState];
 }
 
-- (void)show
-{
-	
-}
-
 @end
diff -r f134ec38f60b -r 96c2441aa3a3 Frameworks/Adium Framework/Source/AIMediaControllerProtocol.h
--- a/Frameworks/Adium Framework/Source/AIMediaControllerProtocol.h	Thu Dec 10 02:32:25 2009 -0500
+++ b/Frameworks/Adium Framework/Source/AIMediaControllerProtocol.h	Thu Dec 10 11:49:08 2009 -0500
@@ -20,6 +20,11 @@
 	AIMediaStateRejected,		/* Rejected call */
 } AIMediaState;
 
+ at protocol AIMediaWindowController
+ at property (readwrite, retain) NSView *outgoingVideo;
+ at property (readwrite, retain) NSView *incomingVideo;
+ at end
+
 @class AIMedia, AIListContact, AIAccount;
 
 @protocol AIMediaController <AIController>
@@ -29,6 +34,8 @@
 - (AIMedia *)existingMediaWithContact:(AIListContact *)contact
 							onAccount:(AIAccount *)account;
 
+- (NSWindowController <AIMediaWindowController> *)windowControllerForMedia:(AIMedia *)media;
+
 - (void)showMedia:(AIMedia *)media;
 
 - (void)media:(AIMedia *)media didSetState:(AIMediaState)state;
diff -r f134ec38f60b -r 96c2441aa3a3 Plugins/Purple Service/CBPurpleAccount.h
--- a/Plugins/Purple Service/CBPurpleAccount.h	Thu Dec 10 02:32:25 2009 -0500
+++ b/Plugins/Purple Service/CBPurpleAccount.h	Thu Dec 10 11:49:08 2009 -0500
@@ -77,6 +77,7 @@
 - (void)media:(AIMedia *)media setInputVolume:(CGFloat)inputVolume;
 - (void)media:(AIMedia *)media setOutputVolume:(CGFloat)outputVolume;
 - (void)closeMedia:(AIMedia *)media;
+- (void)destroyMedia:(AIMedia *)media;
 - (void)incomingMedia:(AIMedia *)media acceptPendingRequest:(BOOL)accept;
 #pragma mark -
 
diff -r f134ec38f60b -r 96c2441aa3a3 Plugins/Purple Service/CBPurpleAccount.m
--- a/Plugins/Purple Service/CBPurpleAccount.m	Thu Dec 10 02:32:25 2009 -0500
+++ b/Plugins/Purple Service/CBPurpleAccount.m	Thu Dec 10 11:49:08 2009 -0500
@@ -64,6 +64,7 @@
 #import "ESiTunesPlugin.h"
 #import "AMPurpleTuneTooltip.h"
 #import "adiumPurpleRequest.h"
+#import "adiumPurpleMedia.h"
 #import "AIDualWindowInterfacePlugin.h"
 
 #ifdef HAVE_CDSA
@@ -1832,6 +1833,18 @@
 }
 
 /*!
+ * @brief Destroy a media
+ *
+ * @param media The media to be destroyed
+ *
+ * Gives the account an opportunity to teardown.
+ */
+- (void)destroyMedia:(AIMedia *)media
+{
+	adium_media_remove(media);
+}
+
+/*!
  * @brief Accept a pending media
  */
 - (void)incomingMedia:(AIMedia *)media acceptPendingRequest:(BOOL)accept
diff -r f134ec38f60b -r 96c2441aa3a3 Plugins/Purple Service/adiumPurpleMedia.h
--- a/Plugins/Purple Service/adiumPurpleMedia.h	Thu Dec 10 02:32:25 2009 -0500
+++ b/Plugins/Purple Service/adiumPurpleMedia.h	Thu Dec 10 11:49:08 2009 -0500
@@ -15,3 +15,4 @@
  */
 
 void adiumPurpleMedia_init(void);
+void adium_media_remove(AIMedia *adiumMedia);
diff -r f134ec38f60b -r 96c2441aa3a3 Plugins/Purple Service/adiumPurpleMedia.m
--- a/Plugins/Purple Service/adiumPurpleMedia.m	Thu Dec 10 02:32:25 2009 -0500
+++ b/Plugins/Purple Service/adiumPurpleMedia.m	Thu Dec 10 11:49:08 2009 -0500
@@ -38,72 +38,20 @@
 	}
 }
 
-#error Must be called when destroying AIMedia
 static void
-adium_media_disconnect_levels(PurpleMedia *media, AIMedia *adiumMedia)
+adium_media_emit_message(AIMedia *adiumMedia, const char *message)
 {
-	PurpleMediaManager *manager = purple_media_get_manager(media);
-	GstElement *element = purple_media_manager_get_pipeline(manager);
-	gulong handler_id = g_signal_handler_find(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
-						  G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, 
-						  NULL, G_CALLBACK(level_message_cb), adiumMedia);
-	if (handler_id)
-		g_signal_handler_disconnect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
-					    handler_id);
-}
-
-typedef struct
-{
-	AIMedia *adiumMedia;
-	gchar *session_id;
-	gchar *participant;
-} AdiumMediaRealizeData;
-
-static gboolean
-realize_cb_cb(AdiumMediaRealizeData *data)
-{
-	AdiumMediaPrivate *priv = data->gtkmedia->priv;
-	gulong window_id;
-
-#ifdef _WIN32
-	if (data->participant == NULL)
-		window_id = GDK_WINDOW_HWND(priv->local_video->window);
-	else
-		window_id = GDK_WINDOW_HWND(priv->remote_video->window);
-#elif defined(HAVE_X11)
-	if (data->participant == NULL)
-		window_id = GDK_WINDOW_XWINDOW(priv->local_video->window);
-	else
-		window_id = GDK_WINDOW_XWINDOW(priv->remote_video->window);
-#else
-#	error "Unsupported windowing system"
-#endif
-
-	purple_media_set_output_window(priv->media, data->session_id,
-			data->participant, window_id);
-
-	g_free(data->session_id);
-	g_free(data->participant);
-	g_free(data);
-	return FALSE;
+#warning emit message	
+	
+	NSLog(@"Media emit message: %s", message);
 }
 
 static void
-realize_cb(GtkWidget *widget, AdiumMediaRealizeData *data)
+adium_media_error_cb(AIMedia *adiumMdia, const char *message)
 {
-	g_timeout_add(0, (GSourceFunc)realize_cb_cb, data);
-}
-
-static void
-adium_media_emit_message(PurpleMedia *media, const char *message, AIMedia *adiumMedia)
-{
-#error emit message	
-}
-
-static void
-adium_media_error_cb(PurpleMedia *media, const char *error, AIMedia *adiumMedia)
-{
-#error error message
+#warning error message
+	
+	NSLog(@"Media error message: %s", message);
 }
 
 static void
@@ -112,106 +60,34 @@
 	PurpleMediaSessionType type = purple_media_get_session_type(media, sid);
 	
 	if (type & PURPLE_MEDIA_RECV_VIDEO) {
-		AdiumMediaRealizeData *data;
-		GtkWidget *aspect;
-		GtkWidget *remote_video;
-		GdkColor color = {0, 0, 0, 0};
-
-		aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE);
-		gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
-		gtk_box_pack_start(GTK_BOX(recv_widget), aspect, TRUE, TRUE, 0);
-
-		data = g_new0(AdiumMediaRealizeData, 1);
-		data->gtkmedia = gtkmedia;
-		data->session_id = g_strdup(sid);
-		data->participant = g_strdup(gtkmedia->priv->screenname);
-
-		remote_video = gtk_drawing_area_new();
-		gtk_widget_modify_bg(remote_video, GTK_STATE_NORMAL, &color);
-		g_signal_connect(G_OBJECT(remote_video), "realize",
-				G_CALLBACK(realize_cb), data);
-		gtk_container_add(GTK_CONTAINER(aspect), remote_video);
-		gtk_widget_set_size_request (GTK_WIDGET(remote_video), 320, 240);
-		gtk_widget_show(remote_video);
-		gtk_widget_show(aspect);
-
-		gtkmedia->priv->remote_video = remote_video;
+		// Setup receiving video view
+#warning Set up receiving video view
 	}
 	
 	if (type & PURPLE_MEDIA_SEND_VIDEO) {
-		AdiumMediaRealizeData *data;
-		GtkWidget *aspect;
-		GtkWidget *local_video;
-		GdkColor color = {0, 0, 0, 0};
-
-		aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE);
-		gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN);
-		gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0);
-
-		data = g_new0(AdiumMediaRealizeData, 1);
-		data->gtkmedia = gtkmedia;
-		data->session_id = g_strdup(sid);
-		data->participant = NULL;
-
-		local_video = gtk_drawing_area_new();
-		gtk_widget_modify_bg(local_video, GTK_STATE_NORMAL, &color);
-		g_signal_connect(G_OBJECT(local_video), "realize",
-				G_CALLBACK(realize_cb), data);
-		gtk_container_add(GTK_CONTAINER(aspect), local_video);
-		gtk_widget_set_size_request (GTK_WIDGET(local_video), 160, 120);
-
-		gtk_widget_show(local_video);
-		gtk_widget_show(aspect);
-
-		gtkmedia->priv->pause =
-				gtk_toggle_button_new_with_mnemonic(_("_Pause"));
-		g_signal_connect(gtkmedia->priv->pause, "toggled",
-				G_CALLBACK(adium_media_pause_toggled),
-				gtkmedia);
-		gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->pause,
-				FALSE, FALSE, 0);
-		gtk_widget_show(gtkmedia->priv->pause);
-
-		gtkmedia->priv->local_video = local_video;
+		// Set up sending video view
+#warning Set up sending video view
 	}
 
 	if (type & PURPLE_MEDIA_RECV_AUDIO) {
-		gtk_box_pack_end(GTK_BOX(recv_widget),
-				adium_media_add_audio_widget(gtkmedia,
-				PURPLE_MEDIA_RECV_AUDIO), FALSE, FALSE, 0);
+		// Set up receiving audio
+#warning Set up receiving audio
 	}
+	
 	if (type & PURPLE_MEDIA_SEND_AUDIO) {
-		gtkmedia->priv->mute =
-				gtk_toggle_button_new_with_mnemonic("_Mute");
-		g_signal_connect(gtkmedia->priv->mute, "toggled",
-				G_CALLBACK(adium_media_mute_toggled),
-				gtkmedia);
-		gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->mute,
-				FALSE, FALSE, 0);
-		gtk_widget_show(gtkmedia->priv->mute);
-
-		gtk_box_pack_end(GTK_BOX(send_widget),
-				adium_media_add_audio_widget(gtkmedia,
-				PURPLE_MEDIA_SEND_AUDIO), FALSE, FALSE, 0);
-	}
-
-
-	if (type & PURPLE_MEDIA_AUDIO &&
-			gtkmedia->priv->level_handler_id == 0) {
-		gtkmedia->priv->level_handler_id = g_signal_connect(
-				media, "level", G_CALLBACK(level_message_cb),
-				gtkmedia);
+		// Set up sending audio
+#warning Set up sending audio
 	}
 
 	if (purple_media_is_initiator(media, sid, NULL) == FALSE) {
-#error XXX Add something to accept or reject this media
+#warning Add something to accept or reject this media
 	}
 
 	/* set the window icon according to the type */
 	if (type & PURPLE_MEDIA_VIDEO) {
-		adiumMedia.mediaType = AIMediaTypeVideo;
+		adiumMedia.mediaType |= AIMediaTypeVideo;
 	} else if (type & PURPLE_MEDIA_AUDIO) {
-		adiumMedia.mediaType = AIMediaTypeAudio;
+		adiumMedia.mediaType |= AIMediaTypeAudio;
 	}
 }
 
@@ -220,9 +96,11 @@
 {
 	AILog(@"state: %d sid: %s name: %s\n", state, sid ? sid : "(null)", name ? name : "(null)");
 	
+	adiumMedia.mediaState = state;
+	
 	if (sid == NULL && name == NULL) {
 		if (state == PURPLE_MEDIA_STATE_END) {
-#error			adium_media_emit_message(adiumMedia, _("The call has been terminated."));
+			adium_media_emit_message(adiumMedia, _("The call has been terminated."));
 		}
 	} else if (state == PURPLE_MEDIA_STATE_NEW && sid != NULL && name != NULL) {
 		adium_media_ready_cb(media, adiumMedia, sid);
@@ -233,12 +111,12 @@
 adium_media_stream_info_cb(PurpleMedia *media, PurpleMediaInfoType type, gchar *sid, gchar *name, gboolean local, AIMedia *adiumMedia)
 {
 	if (type == PURPLE_MEDIA_INFO_REJECT) {
-#warning		adium_media_emit_message(gtkmedia, _("You have rejected the call."));
+		adium_media_emit_message(adiumMedia, _("You have rejected the call."));
 	} else if (type == PURPLE_MEDIA_INFO_ACCEPT) {		
 #warning Check for pending accept/deny
 		adiumMedia.mediaState = AIMediaStateAccepted;
 		
-#error		adium_media_emit_message(gtkmedia, _("Call in progress."));
+		adium_media_emit_message(adiumMedia, _("Call in progress."));
 	}
 }
 
@@ -254,7 +132,7 @@
 	adiumMedia.protocolInfo = (id)media;
 	
 	if (purple_media_is_initiator(media, NULL, NULL) == TRUE) {
-		[adiumMedia show];
+		[adium.mediaController showMedia:adiumMedia];
 		
 		adiumMedia.mediaState = AIMediaStateWaiting;
 	} else {
@@ -267,10 +145,28 @@
 					 G_CALLBACK(adium_media_state_changed_cb), adiumMedia);
 	g_signal_connect(G_OBJECT(media), "stream-info",
 					 G_CALLBACK(adium_media_stream_info_cb), adiumMedia);
+	g_signal_connect(G_OBJECT(media), "level",
+					 G_CALLBACK(level_message_cb), adiumMedia);
 	
 	return TRUE;
 }
 
+void adium_media_remove(AIMedia *adiumMedia)
+{
+	PurpleMedia *media = (PurpleMedia *)adiumMedia.protocolInfo;
+	
+	purple_media_remove_output_windows(media);
+	
+	PurpleMediaManager *manager = purple_media_get_manager(media);
+	GstElement *element = purple_media_manager_get_pipeline(manager);
+	gulong handler_id = g_signal_handler_find(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
+											  G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, 
+											  NULL, G_CALLBACK(level_message_cb), adiumMedia);
+	if (handler_id) {
+		g_signal_handler_disconnect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), handler_id);
+	}
+}
+
 static GstElement *
 create_default_video_src(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
@@ -280,25 +176,10 @@
 	GstPad *ghost;
 	GstCaps *caps;
 
-#ifdef _WIN32
-	/* autovideosrc doesn't pick ksvideosrc for some reason */
-	src = gst_element_factory_make("ksvideosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("dshowvideosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("autovideosrc", NULL);
-#else
-	src = gst_element_factory_make("gconfvideosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("autovideosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("v4l2src", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("v4lsrc", NULL);
-#endif
+	src = gst_element_factory_make("osxvideosrc", NULL);
+	
 	if (src == NULL) {
-		purple_debug_error("gtkmedia", "Unable to find a suitable "
-				"element for the default video source.\n");
+		NSLog(@"Unable to find suitable element for default video source.");
 		return NULL;
 	}
 
@@ -307,12 +188,10 @@
 	capsfilter = gst_element_factory_make("capsfilter", NULL);
 
 	/* It was recommended to set the size <= 352x288 and framerate <= 20 */
-	caps = gst_caps_from_string("video/x-raw-yuv , width=[250,352] , "
-			"height=[200,288] , framerate=[1/1,20/1]");
+	caps = gst_caps_from_string("video/x-raw-yuv , width=[250,352] , height=[200,288] , framerate=[1/1,20/1]");
 	g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
 
-	gst_bin_add_many(GST_BIN(sendbin), src,
-			videoscale, capsfilter, NULL);
+	gst_bin_add_many(GST_BIN(sendbin), src, videoscale, capsfilter, NULL);
 	gst_element_link_many(src, videoscale, capsfilter, NULL);
 
 	pad = gst_element_get_static_pad(capsfilter, "src");
@@ -324,15 +203,14 @@
 }
 
 static GstElement *
-create_default_video_sink(PurpleMedia *media,
-		const gchar *session_id, const gchar *participant)
+create_default_video_sink(PurpleMedia *media, const gchar *session_id, const gchar *participant)
 {
-	GstElement *sink = gst_element_factory_make("gconfvideosink", NULL);
-	if (sink == NULL)
-		sink = gst_element_factory_make("autovideosink", NULL);
-	if (sink == NULL)
-		purple_debug_error("gtkmedia", "Unable to find a suitable "
-				"element for the default video sink.\n");
+	GstElement *sink = gst_element_factory_make("osxvideosink", NULL);
+	
+	if (sink == NULL) {
+		NSLog(@"Unable to find suitable element for default video sink.");
+	}
+	
 	return sink;
 }
 
@@ -341,20 +219,13 @@
 		const gchar *session_id, const gchar *participant)
 {
 	GstElement *src;
-	src = gst_element_factory_make("gconfaudiosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("autoaudiosrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("alsasrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("osssrc", NULL);
-	if (src == NULL)
-		src = gst_element_factory_make("dshowaudiosrc", NULL);
+	src = gst_element_factory_make("osxaudiosrc", NULL);
+	
 	if (src == NULL) {
-		purple_debug_error("gtkmedia", "Unable to find a suitable "
-				"element for the default audio source.\n");
+		NSLog(@"Unable to find suitable element for default audio source.");
 		return NULL;
 	}
+	
 	gst_element_set_name(src, "adiumdefaultaudiosrc");
 	return src;
 }
@@ -364,19 +235,18 @@
 		const gchar *session_id, const gchar *participant)
 {
 	GstElement *sink;
-	sink = gst_element_factory_make("gconfaudiosink", NULL);
-	if (sink == NULL)
-		sink = gst_element_factory_make("autoaudiosink",NULL);
+	sink = gst_element_factory_make("osxaudiosink", NULL);
+
 	if (sink == NULL) {
-		purple_debug_error("gtkmedia", "Unable to find a suitable "
-				"element for the default audio sink.\n");
+		NSLog(@"Unable to find suitable element for default audio sink.");
 		return NULL;
 	}
+	
 	return sink;
 }
 	
 void
-adium_medias_init(void)
+adiumPurpleMedia_init(void)
 {
 	PurpleMediaManager *manager = purple_media_manager_get();
 	PurpleMediaElementInfo *default_video_src =
diff -r f134ec38f60b -r 96c2441aa3a3 Source/AIMediaController.m
--- a/Source/AIMediaController.m	Thu Dec 10 02:32:25 2009 -0500
+++ b/Source/AIMediaController.m	Thu Dec 10 11:49:08 2009 -0500
@@ -43,9 +43,19 @@
 	return nil;
 }
 
+- (NSWindowController <AIMediaWindowController> *)windowControllerForMedia:(AIMedia *)media
+{
+	return nil;
+}
+
 - (void)media:(AIMedia *)media didSetState:(AIMediaState)state
 {
 	
 }
 
+- (void)showMedia:(AIMedia *)media
+{
+	
+}
+
 @end




More information about the commits mailing list