Blame synfig-osx/launcher/X11Controller.m

Carlos Lopez a09598
/* X11Controller.m -- connect the IB ui, also the NSApp delegate
Carlos Lopez a09598
   $Id: X11Controller.m,v 1.36 2003/07/24 17:52:29 jharper Exp $
Carlos Lopez a09598
Carlos Lopez a09598
   Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
Carlos Lopez a09598
Carlos Lopez a09598
   Permission is hereby granted, free of charge, to any person
Carlos Lopez a09598
   obtaining a copy of this software and associated documentation files
Carlos Lopez a09598
   (the "Software"), to deal in the Software without restriction,
Carlos Lopez a09598
   including without limitation the rights to use, copy, modify, merge,
Carlos Lopez a09598
   publish, distribute, sublicense, and/or sell copies of the Software,
Carlos Lopez a09598
   and to permit persons to whom the Software is furnished to do so,
Carlos Lopez a09598
   subject to the following conditions:
Carlos Lopez a09598
Carlos Lopez a09598
   The above copyright notice and this permission notice shall be
Carlos Lopez a09598
   included in all copies or substantial portions of the Software.
Carlos Lopez a09598
Carlos Lopez a09598
   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Carlos Lopez a09598
   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Carlos Lopez a09598
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Carlos Lopez a09598
   NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
Carlos Lopez a09598
   HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
Carlos Lopez a09598
   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Carlos Lopez a09598
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Carlos Lopez a09598
   DEALINGS IN THE SOFTWARE.
Carlos Lopez a09598
Carlos Lopez a09598
   Except as contained in this notice, the name(s) of the above
Carlos Lopez a09598
   copyright holders shall not be used in advertising or otherwise to
Carlos Lopez a09598
   promote the sale, use or other dealings in this Software without
Carlos Lopez a09598
   prior written authorization. */
Carlos Lopez a09598
#define __DARWIN__
Carlos Lopez a09598
Carlos Lopez a09598
#import "X11Controller.h"
Carlos Lopez a09598
#import "X11Application.h"
Carlos Lopez a09598
#import <carbon carbon.h=""></carbon>
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
/* ouch! */
Carlos Lopez a09598
#define BOOL X_BOOL
Carlos Lopez a09598
# include "Xproto.h"
Carlos Lopez a09598
#define WindowPtr X_WindowPtr
Carlos Lopez a09598
#define Cursor X_Cursor
Carlos Lopez a09598
# include "quartz.h"
Carlos Lopez a09598
# define _APPLEWM_SERVER_
Carlos Lopez a09598
# include "applewm.h"
Carlos Lopez a09598
# include "X.h"
Carlos Lopez a09598
#undef Cursor
Carlos Lopez a09598
#undef WindowPtr
Carlos Lopez a09598
#undef BOOL
Carlos Lopez a09598
Carlos Lopez a09598
#include <stdio.h></stdio.h>
Carlos Lopez a09598
#include <unistd.h></unistd.h>
Carlos Lopez a09598
Carlos Lopez a09598
#define TRACE() fprintf (stderr, "%s\n", __FUNCTION__)
Carlos Lopez a09598
Carlos Lopez a09598
@implementation X11Controller
Carlos Lopez a09598
Carlos Lopez a09598
- (void) awakeFromNib
Carlos Lopez a09598
{
Carlos Lopez a09598
    X11Application *xapp = NSApp;
Carlos Lopez a09598
    NSArray *array;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Point X11Application at ourself. */
Carlos Lopez a09598
    [xapp set_controller:self];
Carlos Lopez a09598
#if 0
Carlos Lopez a09598
    array = [xapp prefs_get_array:@PREFS_APPSMENU];
Carlos Lopez a09598
    if (array != nil)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	int count;
Carlos Lopez a09598
Carlos Lopez a09598
	/* convert from [TITLE1 COMMAND1 TITLE2 COMMAND2 ...]
Carlos Lopez a09598
	   to [[TITLE1 COMMAND1] [TITLE2 COMMAND2] ...] format. */
Carlos Lopez a09598
Carlos Lopez a09598
	count = [array count];
Carlos Lopez a09598
	if (count > 0
Carlos Lopez a09598
	    && ![[array objectAtIndex:0] isKindOfClass:[NSArray class]])
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    int i;
Carlos Lopez a09598
	    NSMutableArray *copy, *sub;
Carlos Lopez a09598
Carlos Lopez a09598
	    copy = [NSMutableArray arrayWithCapacity:(count / 2)];
Carlos Lopez a09598
Carlos Lopez a09598
	    for (i = 0; i < count / 2; i++)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		sub = [[NSMutableArray alloc] initWithCapacity:3];
Carlos Lopez a09598
		[sub addObject:[array objectAtIndex:i*2]];
Carlos Lopez a09598
		[sub addObject:[array objectAtIndex:i*2+1]];
Carlos Lopez a09598
		[sub addObject:@""];
Carlos Lopez a09598
		[copy addObject:sub];
Carlos Lopez a09598
		[sub release];
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    array = copy;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	[self set_apps_menu:array];
Carlos Lopez a09598
    }
Carlos Lopez a09598
	#endif
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) item_selected:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    [NSApp activateIgnoringOtherApps:YES];
Carlos Lopez a09598
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 2,
Carlos Lopez a09598
			     AppleWMWindowMenuItem, [sender tag]);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) remove_window_menu
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu;
Carlos Lopez a09598
    int first, count, i;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Work backwards so we don't mess up the indices */
Carlos Lopez a09598
    menu = [window_separator menu];
Carlos Lopez a09598
    first = [menu indexOfItem:window_separator] + 1;
Carlos Lopez a09598
    count = [menu numberOfItems];
Carlos Lopez a09598
    for (i = count - 1; i >= first; i--)
Carlos Lopez a09598
	[menu removeItemAtIndex:i];
Carlos Lopez a09598
Carlos Lopez a09598
    menu = [dock_window_separator menu];
Carlos Lopez a09598
    count = [menu indexOfItem:dock_window_separator];
Carlos Lopez a09598
    for (i = 0; i < count; i++)
Carlos Lopez a09598
	[dock_menu removeItemAtIndex:0];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) install_window_menu:(NSArray *)list
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu;
Carlos Lopez a09598
    NSMenuItem *item;
Carlos Lopez a09598
    int first, count, i;
Carlos Lopez a09598
Carlos Lopez a09598
    menu = [window_separator menu];
Carlos Lopez a09598
    first = [menu indexOfItem:window_separator] + 1;
Carlos Lopez a09598
    count = [list count];
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < count; i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	NSString *name, *shortcut;
Carlos Lopez a09598
Carlos Lopez a09598
	name = [[list objectAtIndex:i] objectAtIndex:0];
Carlos Lopez a09598
	shortcut = [[list objectAtIndex:i] objectAtIndex:1];
Carlos Lopez a09598
Carlos Lopez a09598
	item = (NSMenuItem *) [menu addItemWithTitle:name action:@selector
Carlos Lopez a09598
			       (item_selected:) keyEquivalent:shortcut];
Carlos Lopez a09598
	[item setTarget:self];
Carlos Lopez a09598
	[item setTag:i];
Carlos Lopez a09598
	[item setEnabled:YES];
Carlos Lopez a09598
Carlos Lopez a09598
	item = (NSMenuItem *) [dock_menu insertItemWithTitle:name
Carlos Lopez a09598
			       action:@selector
Carlos Lopez a09598
			       (item_selected:) keyEquivalent:shortcut
Carlos Lopez a09598
			       atIndex:i];
Carlos Lopez a09598
	[item setTarget:self];
Carlos Lopez a09598
	[item setTag:i];
Carlos Lopez a09598
	[item setEnabled:YES];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (checked_window_item >= 0 && checked_window_item < count)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	item = (NSMenuItem *) [menu itemAtIndex:first + checked_window_item];
Carlos Lopez a09598
	[item setState:NSOnState];
Carlos Lopez a09598
	item = (NSMenuItem *) [dock_menu itemAtIndex:checked_window_item];
Carlos Lopez a09598
	[item setState:NSOnState];
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) remove_apps_menu
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu;
Carlos Lopez a09598
    NSMenuItem *item;
Carlos Lopez a09598
    int i;
Carlos Lopez a09598
Carlos Lopez a09598
    if (apps == nil || apps_separator == nil)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    menu = [apps_separator menu];
Carlos Lopez a09598
Carlos Lopez a09598
    if (menu != nil)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	for (i = [menu numberOfItems] - 1; i >= 0; i--)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    item = (NSMenuItem *) [menu itemAtIndex:i];
Carlos Lopez a09598
	    if ([item tag] != 0)
Carlos Lopez a09598
		[menu removeItemAtIndex:i];
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (dock_apps_menu != nil)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	for (i = [dock_apps_menu numberOfItems] - 1; i >= 0; i--)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    item = (NSMenuItem *) [dock_apps_menu itemAtIndex:i];
Carlos Lopez a09598
	    if ([item tag] != 0)
Carlos Lopez a09598
		[dock_apps_menu removeItemAtIndex:i];
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    [apps release];
Carlos Lopez a09598
    apps = nil;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) prepend_apps_item:(NSArray *)list index:(int)i menu:(NSMenu *)menu
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSString *title, *shortcut = @"";
Carlos Lopez a09598
    NSArray *group;
Carlos Lopez a09598
    NSMenuItem *item;
Carlos Lopez a09598
Carlos Lopez a09598
    group = [list objectAtIndex:i];
Carlos Lopez a09598
    title = [group objectAtIndex:0];
Carlos Lopez a09598
    if ([group count] >= 3)
Carlos Lopez a09598
	shortcut = [group objectAtIndex:2];
Carlos Lopez a09598
Carlos Lopez a09598
    if ([title length] != 0)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	item = (NSMenuItem *) [menu insertItemWithTitle:title
Carlos Lopez a09598
			       action:@selector (app_selected:)
Carlos Lopez a09598
			       keyEquivalent:shortcut atIndex:0];
Carlos Lopez a09598
	[item setTarget:self];
Carlos Lopez a09598
	[item setEnabled:YES];
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else
Carlos Lopez a09598
    {
Carlos Lopez a09598
	item = (NSMenuItem *) [NSMenuItem separatorItem];
Carlos Lopez a09598
	[menu insertItem:item atIndex:0];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    [item setTag:i+1];			/* can't be zero, so add one */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) install_apps_menu:(NSArray *)list
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu;
Carlos Lopez a09598
    int i, count;
Carlos Lopez a09598
Carlos Lopez a09598
    count = [list count];
Carlos Lopez a09598
Carlos Lopez a09598
    if (count == 0 || apps_separator == nil)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    menu = [apps_separator menu];
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = count - 1; i >= 0; i--)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	if (menu != nil)
Carlos Lopez a09598
	    [self prepend_apps_item:list index:i menu:menu];
Carlos Lopez a09598
	if (dock_apps_menu != nil)
Carlos Lopez a09598
	    [self prepend_apps_item:list index:i menu:dock_apps_menu];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    apps = [list retain];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) set_window_menu:(NSArray *)list
Carlos Lopez a09598
{
Carlos Lopez a09598
    [self remove_window_menu];
Carlos Lopez a09598
    [self install_window_menu:list];
Carlos Lopez a09598
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 1,
Carlos Lopez a09598
			     AppleWMWindowMenuNotify);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) set_window_menu_check:(NSNumber *)nn
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu;
Carlos Lopez a09598
    NSMenuItem *item;
Carlos Lopez a09598
    int first, count;
Carlos Lopez a09598
    int n = [nn intValue];
Carlos Lopez a09598
Carlos Lopez a09598
    menu = [window_separator menu];
Carlos Lopez a09598
    first = [menu indexOfItem:window_separator] + 1;
Carlos Lopez a09598
    count = [menu numberOfItems] - first;
Carlos Lopez a09598
Carlos Lopez a09598
    if (checked_window_item >= 0 && checked_window_item < count)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	item = (NSMenuItem *) [menu itemAtIndex:first + checked_window_item];
Carlos Lopez a09598
	[item setState:NSOffState];
Carlos Lopez a09598
	item = (NSMenuItem *) [dock_menu itemAtIndex:checked_window_item];
Carlos Lopez a09598
	[item setState:NSOffState];
Carlos Lopez a09598
    }
Carlos Lopez a09598
    if (n >= 0 && n < count)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	item = (NSMenuItem *) [menu itemAtIndex:first + n];
Carlos Lopez a09598
	[item setState:NSOnState];
Carlos Lopez a09598
	item = (NSMenuItem *) [dock_menu itemAtIndex:n];
Carlos Lopez a09598
	[item setState:NSOnState];
Carlos Lopez a09598
    }
Carlos Lopez a09598
    checked_window_item = n;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) set_apps_menu:(NSArray *)list
Carlos Lopez a09598
{
Carlos Lopez a09598
    [self remove_apps_menu];
Carlos Lopez a09598
    [self install_apps_menu:list];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) launch_client:(NSString *)command
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzRunClient ([command cString]);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) app_selected:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    int tag;
Carlos Lopez a09598
    NSString *item;
Carlos Lopez a09598
Carlos Lopez a09598
    tag = [sender tag] - 1;
Carlos Lopez a09598
    if (apps == nil || tag < 0 || tag >= [apps count])
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    item = [[apps objectAtIndex:tag] objectAtIndex:1];
Carlos Lopez a09598
Carlos Lopez a09598
    [self launch_client:item];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_show:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSArray *columns;
Carlos Lopez a09598
Carlos Lopez a09598
    if (table_apps == nil)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	table_apps = [[NSMutableArray alloc] initWithCapacity:1];
Carlos Lopez a09598
Carlos Lopez a09598
	if (apps != nil)
Carlos Lopez a09598
	    [table_apps addObjectsFromArray:apps];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    columns = [apps_table tableColumns];
Carlos Lopez a09598
    [[columns objectAtIndex:0] setIdentifier:@"0"];
Carlos Lopez a09598
    [[columns objectAtIndex:1] setIdentifier:@"1"];
Carlos Lopez a09598
    [[columns objectAtIndex:2] setIdentifier:@"2"];
Carlos Lopez a09598
Carlos Lopez a09598
    [apps_table setDataSource:self];
Carlos Lopez a09598
    [apps_table selectRow:0 byExtendingSelection:NO];
Carlos Lopez a09598
Carlos Lopez a09598
    [[apps_table window] makeKeyAndOrderFront:sender];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_cancel:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    [[apps_table window] orderOut:sender];
Carlos Lopez a09598
Carlos Lopez a09598
    [table_apps release];
Carlos Lopez a09598
    table_apps = nil;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_done:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    [apps_table deselectAll:sender];	/* flush edits? */
Carlos Lopez a09598
Carlos Lopez a09598
    [self remove_apps_menu];
Carlos Lopez a09598
    [self install_apps_menu:table_apps];
Carlos Lopez a09598
Carlos Lopez a09598
    [NSApp prefs_set_array:@PREFS_APPSMENU value:table_apps];
Carlos Lopez a09598
    [NSApp prefs_synchronize];
Carlos Lopez a09598
Carlos Lopez a09598
    [[apps_table window] orderOut:sender];
Carlos Lopez a09598
Carlos Lopez a09598
    [table_apps release];
Carlos Lopez a09598
    table_apps = nil;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_new:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMutableArray *item;
Carlos Lopez a09598
Carlos Lopez a09598
    int row = [apps_table selectedRow], i;
Carlos Lopez a09598
Carlos Lopez a09598
    if (row < 0)
Carlos Lopez a09598
	row = 0;
Carlos Lopez a09598
    else
Carlos Lopez a09598
	row = row + 1;
Carlos Lopez a09598
Carlos Lopez a09598
    i = row;
Carlos Lopez a09598
    if (i > [table_apps count])
Carlos Lopez a09598
	return;				/* avoid exceptions */
Carlos Lopez a09598
Carlos Lopez a09598
    item = [[NSMutableArray alloc] initWithCapacity:3];
Carlos Lopez a09598
    [item addObject:@""];
Carlos Lopez a09598
    [item addObject:@""];
Carlos Lopez a09598
    [item addObject:@""];
Carlos Lopez a09598
Carlos Lopez a09598
    [table_apps insertObject:item atIndex:i];
Carlos Lopez a09598
    [item release];
Carlos Lopez a09598
Carlos Lopez a09598
    [apps_table noteNumberOfRowsChanged];
Carlos Lopez a09598
    [apps_table selectRow:row byExtendingSelection:NO];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_duplicate:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    int row = [apps_table selectedRow], i;
Carlos Lopez a09598
    NSObject *a;
Carlos Lopez a09598
Carlos Lopez a09598
    if (row < 0)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	[self apps_table_new:sender];
Carlos Lopez a09598
	return;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    i = row;
Carlos Lopez a09598
    if (i > [table_apps count] - 1)
Carlos Lopez a09598
	return;				/* avoid exceptions */
Carlos Lopez a09598
Carlos Lopez a09598
    a = [table_apps objectAtIndex:i];
Carlos Lopez a09598
    [table_apps insertObject:[a copy] atIndex:i];
Carlos Lopez a09598
Carlos Lopez a09598
    [apps_table noteNumberOfRowsChanged];
Carlos Lopez a09598
    [apps_table selectRow:row+1 byExtendingSelection:NO];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) apps_table_delete:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    int row = [apps_table selectedRow];
Carlos Lopez a09598
Carlos Lopez a09598
    if (row >= 0)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	int i = row;
Carlos Lopez a09598
Carlos Lopez a09598
	if (i > [table_apps count] - 1)
Carlos Lopez a09598
	    return;			/* avoid exceptions */
Carlos Lopez a09598
Carlos Lopez a09598
	[table_apps removeObjectAtIndex:i];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    [apps_table noteNumberOfRowsChanged];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (int) numberOfRowsInTableView:(NSTableView *)tableView
Carlos Lopez a09598
{
Carlos Lopez a09598
    if (table_apps == nil)
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
Carlos Lopez a09598
    return [table_apps count];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (id) tableView:(NSTableView *)tableView
Carlos Lopez a09598
       objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSArray *item;
Carlos Lopez a09598
    int col;
Carlos Lopez a09598
Carlos Lopez a09598
    if (table_apps == nil)
Carlos Lopez a09598
	return nil;
Carlos Lopez a09598
Carlos Lopez a09598
    col = [[tableColumn identifier] intValue];
Carlos Lopez a09598
Carlos Lopez a09598
    item = [table_apps objectAtIndex:row];
Carlos Lopez a09598
    if ([item count] > col)
Carlos Lopez a09598
	return [item objectAtIndex:col];
Carlos Lopez a09598
    else
Carlos Lopez a09598
	return @"";
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) tableView:(NSTableView *)tableView setObjectValue:(id)object
Carlos Lopez a09598
         forTableColumn:(NSTableColumn *)tableColumn row:(int)row
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMutableArray *item;
Carlos Lopez a09598
    int col;
Carlos Lopez a09598
Carlos Lopez a09598
    if (table_apps == nil)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    col = [[tableColumn identifier] intValue];
Carlos Lopez a09598
Carlos Lopez a09598
    item = [table_apps objectAtIndex:row];
Carlos Lopez a09598
    [item replaceObjectAtIndex:col withObject:object];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) hide_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    if ([X11App x_active])
Carlos Lopez a09598
	QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMHideWindow);
Carlos Lopez a09598
    else
Carlos Lopez a09598
	NSBeep ();			/* FIXME: something here */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction)bring_to_front:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 1,
Carlos Lopez a09598
			     AppleWMBringAllToFront);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction)close_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    if ([X11App x_active])
Carlos Lopez a09598
	QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMCloseWindow);
Carlos Lopez a09598
    else
Carlos Lopez a09598
	[[NSApp keyWindow] performClose:sender];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction)minimize_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    if ([X11App x_active])
Carlos Lopez a09598
	QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMMinimizeWindow);
Carlos Lopez a09598
    else
Carlos Lopez a09598
	[[NSApp keyWindow] performMiniaturize:sender];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction)zoom_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    if ([X11App x_active])
Carlos Lopez a09598
	QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMZoomWindow);
Carlos Lopez a09598
    else
Carlos Lopez a09598
	[[NSApp keyWindow] performZoom:sender];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) next_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMNextWindow);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) previous_window:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify,
Carlos Lopez a09598
			     1, AppleWMPreviousWindow);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) enable_fullscreen_changed:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    int value = ![enable_fullscreen intValue];
Carlos Lopez a09598
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzSetRootless, 1, value);
Carlos Lopez a09598
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_ROOTLESS value:value];
Carlos Lopez a09598
    [NSApp prefs_synchronize];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) toggle_fullscreen:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzToggleFullscreen, 0);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) set_can_quit:(BOOL)state
Carlos Lopez a09598
{
Carlos Lopez a09598
    can_quit = state;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction)prefs_changed:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    darwinFakeButtons = [fake_buttons intValue];
Carlos Lopez a09598
    quartzUseSysBeep = [use_sysbeep intValue];
Carlos Lopez a09598
    X11EnableKeyEquivalents = [enable_keyequivs intValue];
Carlos Lopez a09598
    darwinSyncKeymap = [sync_keymap intValue];
Carlos Lopez a09598
Carlos Lopez a09598
    /* after adding prefs here, also add to [X11Application read_defaults]
Carlos Lopez a09598
       and below */
Carlos Lopez a09598
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_FAKEBUTTONS value:darwinFakeButtons];
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_SYSBEEP value:quartzUseSysBeep];
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_KEYEQUIVS value:X11EnableKeyEquivalents];
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_SYNC_KEYMAP value:darwinSyncKeymap];
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_NO_AUTH value:![enable_auth intValue]];
Carlos Lopez a09598
    [NSApp prefs_set_boolean:@PREFS_NO_TCP value:![enable_tcp intValue]];
Carlos Lopez a09598
    [NSApp prefs_set_integer:@PREFS_DEPTH value:[depth selectedTag]];
Carlos Lopez a09598
Carlos Lopez a09598
    [NSApp prefs_synchronize];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) prefs_show:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    [fake_buttons setIntValue:darwinFakeButtons];
Carlos Lopez a09598
    [use_sysbeep setIntValue:quartzUseSysBeep];
Carlos Lopez a09598
    [enable_keyequivs setIntValue:X11EnableKeyEquivalents];
Carlos Lopez a09598
    [sync_keymap setIntValue:darwinSyncKeymap];
Carlos Lopez a09598
    [sync_keymap setEnabled:darwinKeymapFile == NULL];
Carlos Lopez a09598
Carlos Lopez a09598
    [enable_auth setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_AUTH default:NO]];
Carlos Lopez a09598
    [enable_tcp setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_TCP default:NO]];
Carlos Lopez a09598
    [depth selectItemAtIndex:[depth indexOfItemWithTag:[NSApp prefs_get_integer:@PREFS_DEPTH default:-1]]];
Carlos Lopez a09598
Carlos Lopez a09598
    [enable_fullscreen setIntValue:!quartzEnableRootless];
Carlos Lopez a09598
Carlos Lopez a09598
    [prefs_panel makeKeyAndOrderFront:sender];
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) quit:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXdarwinQuit, 0);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (IBAction) x11_help:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    AHLookupAnchor (CFSTR ("Mac Help"), CFSTR ("mchlp2276"));
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (BOOL) validateMenuItem:(NSMenuItem *)item
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSMenu *menu = [item menu];
Carlos Lopez a09598
Carlos Lopez a09598
    if (item == toggle_fullscreen_item)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return !quartzEnableRootless;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else if (menu == [window_separator menu] || menu == dock_menu
Carlos Lopez a09598
	     || (menu == [x11_about_item menu] && [item tag] == 42))
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return (AppleWMSelectedEvents () & AppleWMControllerNotifyMask) != 0;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return TRUE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) applicationDidHide:(NSNotification *)notify
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMHideAll);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) applicationDidUnhide:(NSNotification *)notify
Carlos Lopez a09598
{
Carlos Lopez a09598
    QuartzMessageMainThread (kXquartzControllerNotify, 1, AppleWMShowAll);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (NSApplicationTerminateReply) applicationShouldTerminate:sender
Carlos Lopez a09598
{
Carlos Lopez a09598
    NSString *msg;
Carlos Lopez a09598
Carlos Lopez a09598
    if (can_quit || [X11App prefs_get_boolean:@PREFS_NO_QUIT_ALERT default:NO])
Carlos Lopez a09598
    {
Carlos Lopez a09598
	return NSTerminateNow;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* Make sure we're frontmost. */
Carlos Lopez a09598
    [NSApp activateIgnoringOtherApps:YES];
Carlos Lopez a09598
Carlos Lopez a09598
    msg = NSLocalizedString (@"Are you sure you want to quit X11?\n\n\
Carlos Lopez a09598
If you quit X11, any X11 applications you are running will stop immediately \
Carlos Lopez a09598
and you will lose any changes you have not saved.", @"");
Carlos Lopez a09598
Carlos Lopez a09598
    /* FIXME: safe to run the alert in here? Or should we return Later
Carlos Lopez a09598
       and then run the alert on a timer? It seems to work here, so.. */
Carlos Lopez a09598
Carlos Lopez a09598
    return (NSRunAlertPanel (nil, msg, NSLocalizedString (@"Quit", @""),
Carlos Lopez a09598
			     NSLocalizedString (@"Cancel", @""), nil)
Carlos Lopez a09598
	    == NSAlertDefaultReturn) ? NSTerminateNow : NSTerminateCancel;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) applicationWillTerminate:(NSNotification *)aNotification
Carlos Lopez a09598
{
Carlos Lopez a09598
    [X11App prefs_synchronize];
Carlos Lopez a09598
Carlos Lopez a09598
    /* shutdown the X server, it will exit () for us. */
Carlos Lopez a09598
    QuartzMessageMainThread (kXdarwinQuit, 0);
Carlos Lopez a09598
Carlos Lopez a09598
    /* In case it doesn't, exit anyway after a while. */
Carlos Lopez a09598
    while (sleep (10) != 0) ;
Carlos Lopez a09598
    exit (1);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (void) server_ready
Carlos Lopez a09598
{
Carlos Lopez a09598
    x_list *node;
Carlos Lopez a09598
Carlos Lopez a09598
    finished_launching = YES;
Carlos Lopez a09598
Carlos Lopez a09598
    for (node = pending_apps; node != NULL; node = node->next)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	NSString *filename = node->data;
Carlos Lopez a09598
	QuartzRunClient ([filename UTF8String]);
Carlos Lopez a09598
	[filename release];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    x_list_free (pending_apps);
Carlos Lopez a09598
    pending_apps = NULL;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
- (BOOL) application:(NSApplication *)app openFile:(NSString *)filename
Carlos Lopez a09598
{
Carlos Lopez a09598
#if 0
Carlos Lopez a09598
    const char *name = [filename UTF8String];
Carlos Lopez a09598
Carlos Lopez a09598
    if (finished_launching)
Carlos Lopez a09598
	QuartzRunClient (name);
Carlos Lopez a09598
    else if (name[0] != ':')		/* ignore display names */
Carlos Lopez a09598
	pending_apps = x_list_prepend (pending_apps, [filename retain]);
Carlos Lopez a09598
Carlos Lopez a09598
    /* FIXME: report failures. */
Carlos Lopez a09598
    return YES;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
	return NO;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
@end
Carlos Lopez a09598
Carlos Lopez a09598
void X11ControllerMain (int argc, const char *argv[],
Carlos Lopez a09598
			void (*server_thread) (void *), void *server_arg)
Carlos Lopez a09598
{
Carlos Lopez a09598
    X11ApplicationMain (argc, argv, server_thread, server_arg);
Carlos Lopez a09598
}