aboutsummaryrefslogtreecommitdiffstats
path: root/src/nsmenu.m
diff options
context:
space:
mode:
authorJoakim Verona2012-09-03 17:30:17 +0200
committerJoakim Verona2012-09-03 17:30:17 +0200
commit4a37733c693d59a9b83a3fb2d0c7f9461d149f60 (patch)
treea33402e09342f748baebf0e4f5a1e40538e620f4 /src/nsmenu.m
parent5436d1df5e2ba0b4d4f72b03a1cd09b20403654b (diff)
parentdcde497f27945c3ca4ce8c21f655ef6f627acdd2 (diff)
downloademacs-4a37733c693d59a9b83a3fb2d0c7f9461d149f60.tar.gz
emacs-4a37733c693d59a9b83a3fb2d0c7f9461d149f60.zip
upstream
Diffstat (limited to 'src/nsmenu.m')
-rw-r--r--src/nsmenu.m101
1 files changed, 67 insertions, 34 deletions
diff --git a/src/nsmenu.m b/src/nsmenu.m
index e8a0b43a01b..9e290486213 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -1497,6 +1497,8 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header)
1497 FlippedView *contentView; 1497 FlippedView *contentView;
1498 NSImage *img; 1498 NSImage *img;
1499 1499
1500 dialog_return = Qundefined;
1501 button_values = NULL;
1500 area.origin.x = 3*SPACER; 1502 area.origin.x = 3*SPACER;
1501 area.origin.y = 2*SPACER; 1503 area.origin.y = 2*SPACER;
1502 area.size.width = ICONSIZE; 1504 area.size.width = ICONSIZE;
@@ -1578,44 +1580,65 @@ ns_popup_dialog (Lisp_Object position, Lisp_Object contents, Lisp_Object header)
1578 [self setOneShot: YES]; 1580 [self setOneShot: YES];
1579 [self setReleasedWhenClosed: YES]; 1581 [self setReleasedWhenClosed: YES];
1580 [self setHidesOnDeactivate: YES]; 1582 [self setHidesOnDeactivate: YES];
1583 [self setStyleMask:
1584 NSTitledWindowMask|NSClosableWindowMask|NSUtilityWindowMask];
1585
1581 return self; 1586 return self;
1582} 1587}
1583 1588
1584 1589
1585- (BOOL)windowShouldClose: (id)sender 1590- (BOOL)windowShouldClose: (id)sender
1586{ 1591{
1587 [NSApp stopModalWithCode: XHASH (Qnil)]; // FIXME: BIG UGLY HACK!! 1592 window_closed = YES;
1593 [NSApp stop:self];
1588 return NO; 1594 return NO;
1589} 1595}
1590 1596
1597- (void)dealloc
1598{
1599 xfree (button_values);
1600 [super dealloc];
1601}
1591 1602
1592void process_dialog (id window, Lisp_Object list) 1603- (void)process_dialog: (Lisp_Object) list
1593{ 1604{
1594 Lisp_Object item; 1605 Lisp_Object item, lst = list;
1595 int row = 0; 1606 int row = 0;
1607 int buttons = 0, btnnr = 0;
1608
1609 for (; XTYPE (lst) == Lisp_Cons; lst = XCDR (lst))
1610 {
1611 item = XCAR (list);
1612 if (XTYPE (item) == Lisp_Cons)
1613 ++buttons;
1614 }
1615
1616 if (buttons > 0)
1617 button_values = (Lisp_Object *) xmalloc (buttons * sizeof (*button_values));
1596 1618
1597 for (; XTYPE (list) == Lisp_Cons; list = XCDR (list)) 1619 for (; XTYPE (list) == Lisp_Cons; list = XCDR (list))
1598 { 1620 {
1599 item = XCAR (list); 1621 item = XCAR (list);
1600 if (XTYPE (item) == Lisp_String) 1622 if (XTYPE (item) == Lisp_String)
1601 { 1623 {
1602 [window addString: SSDATA (item) row: row++]; 1624 [self addString: SSDATA (item) row: row++];
1603 } 1625 }
1604 else if (XTYPE (item) == Lisp_Cons) 1626 else if (XTYPE (item) == Lisp_Cons)
1605 { 1627 {
1606 [window addButton: SSDATA (XCAR (item)) 1628 button_values[btnnr] = XCDR (item);
1607 value: XCDR (item) row: row++]; 1629 [self addButton: SSDATA (XCAR (item)) value: btnnr row: row++];
1630 ++btnnr;
1608 } 1631 }
1609 else if (NILP (item)) 1632 else if (NILP (item))
1610 { 1633 {
1611 [window addSplit]; 1634 [self addSplit];
1612 row = 0; 1635 row = 0;
1613 } 1636 }
1614 } 1637 }
1615} 1638}
1616 1639
1617 1640
1618- addButton: (char *)str value: (Lisp_Object)val row: (int)row 1641- (void)addButton: (char *)str value: (int)tag row: (int)row
1619{ 1642{
1620 id cell; 1643 id cell;
1621 1644
@@ -1628,15 +1651,13 @@ void process_dialog (id window, Lisp_Object list)
1628 [cell setTarget: self]; 1651 [cell setTarget: self];
1629 [cell setAction: @selector (clicked: )]; 1652 [cell setAction: @selector (clicked: )];
1630 [cell setTitle: [NSString stringWithUTF8String: str]]; 1653 [cell setTitle: [NSString stringWithUTF8String: str]];
1631 [cell setTag: XHASH (val)]; // FIXME: BIG UGLY HACK!! 1654 [cell setTag: tag];
1632 [cell setBordered: YES]; 1655 [cell setBordered: YES];
1633 [cell setEnabled: YES]; 1656 [cell setEnabled: YES];
1634
1635 return self;
1636} 1657}
1637 1658
1638 1659
1639- addString: (char *)str row: (int)row 1660- (void)addString: (char *)str row: (int)row
1640{ 1661{
1641 id cell; 1662 id cell;
1642 1663
@@ -1649,32 +1670,28 @@ void process_dialog (id window, Lisp_Object list)
1649 [cell setTitle: [NSString stringWithUTF8String: str]]; 1670 [cell setTitle: [NSString stringWithUTF8String: str]];
1650 [cell setBordered: YES]; 1671 [cell setBordered: YES];
1651 [cell setEnabled: NO]; 1672 [cell setEnabled: NO];
1652
1653 return self;
1654} 1673}
1655 1674
1656 1675
1657- addSplit 1676- (void)addSplit
1658{ 1677{
1659 [matrix addColumn]; 1678 [matrix addColumn];
1660 cols++; 1679 cols++;
1661 return self;
1662} 1680}
1663 1681
1664 1682
1665- clicked: sender 1683- (void)clicked: sender
1666{ 1684{
1667 NSArray *sellist = nil; 1685 NSArray *sellist = nil;
1668 EMACS_INT seltag; 1686 EMACS_INT seltag;
1669 1687
1670 sellist = [sender selectedCells]; 1688 sellist = [sender selectedCells];
1671 if ([sellist count]<1) 1689 if ([sellist count] < 1)
1672 return self; 1690 return;
1673 1691
1674 seltag = [[sellist objectAtIndex: 0] tag]; 1692 seltag = [[sellist objectAtIndex: 0] tag];
1675 if (seltag != XHASH (Qundefined)) // FIXME: BIG UGLY HACK!! 1693 dialog_return = button_values[seltag];
1676 [NSApp stopModalWithCode: seltag]; 1694 [NSApp stop:self];
1677 return self;
1678} 1695}
1679 1696
1680 1697
@@ -1686,7 +1703,7 @@ void process_dialog (id window, Lisp_Object list)
1686 if (XTYPE (contents) == Lisp_Cons) 1703 if (XTYPE (contents) == Lisp_Cons)
1687 { 1704 {
1688 head = Fcar (contents); 1705 head = Fcar (contents);
1689 process_dialog (self, Fcdr (contents)); 1706 [self process_dialog: Fcdr (contents)];
1690 } 1707 }
1691 else 1708 else
1692 head = contents; 1709 head = contents;
@@ -1706,7 +1723,7 @@ void process_dialog (id window, Lisp_Object list)
1706 if (cols == 1 && rows > 1) /* Never told where to split */ 1723 if (cols == 1 && rows > 1) /* Never told where to split */
1707 { 1724 {
1708 [matrix addColumn]; 1725 [matrix addColumn];
1709 for (i = 0; i<rows/2; i++) 1726 for (i = 0; i < rows/2; i++)
1710 { 1727 {
1711 [matrix putCell: [matrix cellAtRow: (rows+1)/2 column: 0] 1728 [matrix putCell: [matrix cellAtRow: (rows+1)/2 column: 0]
1712 atRow: i column: 1]; 1729 atRow: i column: 1];
@@ -1756,13 +1773,27 @@ void process_dialog (id window, Lisp_Object list)
1756 1773
1757- (void)timeout_handler: (NSTimer *)timedEntry 1774- (void)timeout_handler: (NSTimer *)timedEntry
1758{ 1775{
1759 timer_fired = 1; 1776 NSEvent *nxev = [NSEvent otherEventWithType: NSApplicationDefined
1760 [NSApp abortModal]; 1777 location: NSMakePoint (0, 0)
1778 modifierFlags: 0
1779 timestamp: 0
1780 windowNumber: [[NSApp mainWindow] windowNumber]
1781 context: [NSApp context]
1782 subtype: 0
1783 data1: 0
1784 data2: 0];
1785
1786 timer_fired = YES;
1787 /* We use sto because stopModal/abortModal out of the main loop does not
1788 seem to work in 10.6. But as we use stop we must send a real event so
1789 the stop is seen and acted upon. */
1790 [NSApp stop:self];
1791 [NSApp postEvent: nxev atStart: NO];
1761} 1792}
1762 1793
1763- (Lisp_Object)runDialogAt: (NSPoint)p 1794- (Lisp_Object)runDialogAt: (NSPoint)p
1764{ 1795{
1765 NSInteger ret = 0; 1796 Lisp_Object ret = Qundefined;
1766 1797
1767 while (popup_activated_flag) 1798 while (popup_activated_flag)
1768 { 1799 {
@@ -1780,8 +1811,10 @@ void process_dialog (id window, Lisp_Object list)
1780 [[NSRunLoop currentRunLoop] addTimer: tmo 1811 [[NSRunLoop currentRunLoop] addTimer: tmo
1781 forMode: NSModalPanelRunLoopMode]; 1812 forMode: NSModalPanelRunLoopMode];
1782 } 1813 }
1783 timer_fired = 0; 1814 timer_fired = NO;
1784 ret = [NSApp runModalForWindow: self]; 1815 dialog_return = Qundefined;
1816 [NSApp runModalForWindow: self];
1817 ret = dialog_return;
1785 if (! timer_fired) 1818 if (! timer_fired)
1786 { 1819 {
1787 if (tmo != nil) [tmo invalidate]; /* Cancels timer */ 1820 if (tmo != nil) [tmo invalidate]; /* Cancels timer */
@@ -1789,11 +1822,11 @@ void process_dialog (id window, Lisp_Object list)
1789 } 1822 }
1790 } 1823 }
1791 1824
1792 { /* FIXME: BIG UGLY HACK!!! */ 1825 if (EQ (ret, Qundefined) && window_closed)
1793 Lisp_Object tmp; 1826 /* Make close button pressed equivalent to C-g. */
1794 *(EMACS_INT*)(&tmp) = ret; 1827 Fsignal (Qquit, Qnil);
1795 return tmp; 1828
1796 } 1829 return ret;
1797} 1830}
1798 1831
1799@end 1832@end